1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-07-07 19:35:22 -04:00

Web API: use message passing to start/stop device for all the rest of device plugins

This commit is contained in:
f4exb 2017-12-14 18:02:49 +01:00
parent db86bc5813
commit 966767a44a
42 changed files with 884 additions and 389 deletions

View File

@ -211,7 +211,7 @@ bool BladerfOutput::handleMessage(const Message& message)
if (MsgConfigureBladerf::match(message)) if (MsgConfigureBladerf::match(message))
{ {
MsgConfigureBladerf& conf = (MsgConfigureBladerf&) message; MsgConfigureBladerf& conf = (MsgConfigureBladerf&) message;
qDebug() << "BladerfInput::handleMessage: MsgConfigureBladerf"; qDebug() << "BladerfOutput::handleMessage: MsgConfigureBladerf";
if (!applySettings(conf.getSettings(), conf.getForce())) if (!applySettings(conf.getSettings(), conf.getForce()))
{ {
@ -223,7 +223,7 @@ bool BladerfOutput::handleMessage(const Message& message)
else if (MsgStartStop::match(message)) else if (MsgStartStop::match(message))
{ {
MsgStartStop& cmd = (MsgStartStop&) message; MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "SDRPlayInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop"); qDebug() << "BladerfOutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop()) if (cmd.getStartStop())
{ {

View File

@ -132,6 +132,14 @@ bool BladerfOutputGui::handleMessage(const Message& message)
displaySettings(); displaySettings();
return true; return true;
} }
else if (BladerfOutput::MsgStartStop::match(message))
{
BladerfOutput::MsgStartStop& notif = (BladerfOutput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else else
{ {
return false; return false;

View File

@ -18,6 +18,7 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include <QDebug> #include <QDebug>
#include "SWGDeviceSettings.h" #include "SWGDeviceSettings.h"
@ -34,6 +35,7 @@
#include "hackrfoutputthread.h" #include "hackrfoutputthread.h"
MESSAGE_CLASS_DEFINITION(HackRFOutput::MsgConfigureHackRF, Message) MESSAGE_CLASS_DEFINITION(HackRFOutput::MsgConfigureHackRF, Message)
MESSAGE_CLASS_DEFINITION(HackRFOutput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(HackRFOutput::MsgReportHackRF, Message) MESSAGE_CLASS_DEFINITION(HackRFOutput::MsgReportHackRF, Message)
HackRFOutput::HackRFOutput(DeviceSinkAPI *deviceAPI) : HackRFOutput::HackRFOutput(DeviceSinkAPI *deviceAPI) :
@ -205,6 +207,27 @@ bool HackRFOutput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "HackRFOutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initGeneration())
{
m_deviceAPI->startGeneration();
DSPEngine::instance()->startAudioInput();
}
}
else
{
m_deviceAPI->stopGeneration();
DSPEngine::instance()->stopAudioInput();
}
return true;
}
else else
{ {
return false; return false;
@ -413,19 +436,16 @@ int HackRFOutput::webapiRun(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage __attribute__((unused))) QString& errorMessage __attribute__((unused)))
{ {
if (run) MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue)
{ {
if (m_deviceAPI->initGeneration()) MsgStartStop *messagetoGui = MsgStartStop::create(run);
{ m_guiMessageQueue->push(messagetoGui);
m_deviceAPI->startGeneration();
DSPEngine::instance()->startAudioInputImmediate();
}
}
else
{
m_deviceAPI->stopGeneration();
} }
usleep(100000);
m_deviceAPI->getDeviceEngineStateStr(*response.getState()); m_deviceAPI->getDeviceEngineStateStr(*response.getState());
return 200; return 200;
} }

View File

@ -54,6 +54,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
class MsgReportHackRF : public Message { class MsgReportHackRF : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION

View File

@ -136,6 +136,14 @@ bool HackRFOutputGui::handleMessage(const Message& message)
displaySettings(); displaySettings();
return true; return true;
} }
else if (HackRFOutput::MsgStartStop::match(message))
{
HackRFOutput::MsgStartStop& notif = (HackRFOutput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else else
{ {
return false; return false;
@ -298,25 +306,10 @@ void HackRFOutputGui::on_txvga_valueChanged(int value)
void HackRFOutputGui::on_startStop_toggled(bool checked) void HackRFOutputGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
// forcibly stop the Rx if present before starting HackRFOutput::MsgStartStop *message = HackRFOutput::MsgStartStop::create(checked);
if (m_deviceUISet->m_deviceSinkAPI->getSourceBuddies().size() > 0) m_deviceSampleSink->getInputMessageQueue()->push(message);
{
DeviceSourceAPI *buddy = m_deviceUISet->m_deviceSinkAPI->getSourceBuddies()[0];
buddy->stopAcquisition();
}
if (m_deviceUISet->m_deviceSinkAPI->initGeneration())
{
m_deviceUISet->m_deviceSinkAPI->startGeneration();
DSPEngine::instance()->startAudioInput();
}
}
else
{
m_deviceUISet->m_deviceSinkAPI->stopGeneration();
DSPEngine::instance()->startAudioInput();
} }
} }

View File

@ -18,6 +18,7 @@
#include <QDebug> #include <QDebug>
#include <cstddef> #include <cstddef>
#include <string.h> #include <string.h>
#include <unistd.h>
#include "lime/LimeSuite.h" #include "lime/LimeSuite.h"
#include "SWGDeviceSettings.h" #include "SWGDeviceSettings.h"
@ -34,6 +35,7 @@
#include "limesdroutput.h" #include "limesdroutput.h"
MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgConfigureLimeSDR, Message) MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgConfigureLimeSDR, Message)
MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgGetStreamInfo, Message) MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgGetStreamInfo, Message)
MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgGetDeviceInfo, Message) MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgGetDeviceInfo, Message)
MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgReportStreamInfo, Message) MESSAGE_CLASS_DEFINITION(LimeSDROutput::MsgReportStreamInfo, Message)
@ -467,6 +469,27 @@ bool LimeSDROutput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "LimeSDROutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initGeneration())
{
m_deviceAPI->startGeneration();
DSPEngine::instance()->startAudioInput();
}
}
else
{
m_deviceAPI->stopGeneration();
DSPEngine::instance()->stopAudioInput();
}
return true;
}
else if (DeviceLimeSDRShared::MsgReportBuddyChange::match(message)) else if (DeviceLimeSDRShared::MsgReportBuddyChange::match(message))
{ {
DeviceLimeSDRShared::MsgReportBuddyChange& report = (DeviceLimeSDRShared::MsgReportBuddyChange&) message; DeviceLimeSDRShared::MsgReportBuddyChange& report = (DeviceLimeSDRShared::MsgReportBuddyChange&) message;
@ -1093,19 +1116,16 @@ int LimeSDROutput::webapiRun(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage __attribute__((unused))) QString& errorMessage __attribute__((unused)))
{ {
if (run) MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue)
{ {
if (m_deviceAPI->initGeneration()) MsgStartStop *messagetoGui = MsgStartStop::create(run);
{ m_guiMessageQueue->push(messagetoGui);
m_deviceAPI->startGeneration();
DSPEngine::instance()->startAudioInputImmediate();
}
}
else
{
m_deviceAPI->stopGeneration();
} }
usleep(100000);
m_deviceAPI->getDeviceEngineStateStr(*response.getState()); m_deviceAPI->getDeviceEngineStateStr(*response.getState());
return 200; return 200;
} }

View File

@ -54,6 +54,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
class MsgGetStreamInfo : public Message { class MsgGetStreamInfo : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION

View File

@ -249,6 +249,14 @@ void LimeSDROutputGUI::handleInputMessages()
delete message; delete message;
} }
else if (LimeSDROutput::MsgStartStop::match(*message))
{
LimeSDROutput::MsgStartStop& notif = (LimeSDROutput::MsgStartStop&) *message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
delete message;
}
else else
{ {
if (handleMessage(*message)) { if (handleMessage(*message)) {
@ -394,18 +402,10 @@ void LimeSDROutputGUI::blockApplySettings(bool block)
void LimeSDROutputGUI::on_startStop_toggled(bool checked) void LimeSDROutputGUI::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) LimeSDROutput::MsgStartStop *message = LimeSDROutput::MsgStartStop::create(checked);
{ m_limeSDROutput->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSinkAPI->startGeneration();
DSPEngine::instance()->startAudioInput();
}
}
else
{
m_deviceUISet->m_deviceSinkAPI->stopGeneration();
DSPEngine::instance()->stopAudioInput();
} }
} }

View File

@ -15,6 +15,7 @@
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include <QDebug> #include <QDebug>
#include <unistd.h>
#include "SWGDeviceSettings.h" #include "SWGDeviceSettings.h"
#include "SWGDeviceState.h" #include "SWGDeviceState.h"
@ -32,6 +33,7 @@
#define PLUTOSDR_BLOCKSIZE_SAMPLES (16*1024) //complex samples per buffer (must be multiple of 64) #define PLUTOSDR_BLOCKSIZE_SAMPLES (16*1024) //complex samples per buffer (must be multiple of 64)
MESSAGE_CLASS_DEFINITION(PlutoSDROutput::MsgConfigurePlutoSDR, Message) MESSAGE_CLASS_DEFINITION(PlutoSDROutput::MsgConfigurePlutoSDR, Message)
MESSAGE_CLASS_DEFINITION(PlutoSDROutput::MsgStartStop, Message)
PlutoSDROutput::PlutoSDROutput(DeviceSinkAPI *deviceAPI) : PlutoSDROutput::PlutoSDROutput(DeviceSinkAPI *deviceAPI) :
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
@ -145,6 +147,27 @@ bool PlutoSDROutput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "PlutoSDROutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initGeneration())
{
m_deviceAPI->startGeneration();
DSPEngine::instance()->startAudioInput();
}
}
else
{
m_deviceAPI->stopGeneration();
DSPEngine::instance()->stopAudioInput();
}
return true;
}
else else
{ {
return false; return false;
@ -491,19 +514,16 @@ int PlutoSDROutput::webapiRun(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage __attribute__((unused))) QString& errorMessage __attribute__((unused)))
{ {
if (run) MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue)
{ {
if (m_deviceAPI->initGeneration()) MsgStartStop *messagetoGui = MsgStartStop::create(run);
{ m_guiMessageQueue->push(messagetoGui);
m_deviceAPI->startGeneration();
DSPEngine::instance()->startAudioInputImmediate();
}
}
else
{
m_deviceAPI->stopGeneration();
} }
usleep(100000);
m_deviceAPI->getDeviceEngineStateStr(*response.getState()); m_deviceAPI->getDeviceEngineStateStr(*response.getState());
return 200; return 200;
} }

View File

@ -53,6 +53,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
PlutoSDROutput(DeviceSinkAPI *deviceAPI); PlutoSDROutput(DeviceSinkAPI *deviceAPI);
~PlutoSDROutput(); ~PlutoSDROutput();
virtual void destroy(); virtual void destroy();

View File

@ -145,6 +145,14 @@ bool PlutoSDROutputGUI::handleMessage(const Message& message __attribute__((unus
return true; return true;
} }
else if (PlutoSDROutput::MsgStartStop::match(message))
{
PlutoSDROutput::MsgStartStop& notif = (PlutoSDROutput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else else
{ {
return false; return false;
@ -153,18 +161,10 @@ bool PlutoSDROutputGUI::handleMessage(const Message& message __attribute__((unus
void PlutoSDROutputGUI::on_startStop_toggled(bool checked) void PlutoSDROutputGUI::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) PlutoSDROutput::MsgStartStop *message = PlutoSDROutput::MsgStartStop::create(checked);
{ m_sampleSink->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSinkAPI->startGeneration();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSinkAPI->stopGeneration();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -177,6 +177,14 @@ bool SDRdaemonSinkGui::handleMessage(const Message& message)
updateWithStreamTime(); updateWithStreamTime();
return true; return true;
} }
else if (SDRdaemonSinkOutput::MsgStartStop::match(message))
{
SDRdaemonSinkOutput::MsgStartStop& notif = (SDRdaemonSinkOutput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else else
{ {
return false; return false;
@ -499,22 +507,10 @@ void SDRdaemonSinkGui::on_sendButton_clicked(bool checked __attribute__((unused)
void SDRdaemonSinkGui::on_startStop_toggled(bool checked) void SDRdaemonSinkGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSinkAPI->initGeneration()) SDRdaemonSinkOutput::MsgStartStop *message = SDRdaemonSinkOutput::MsgStartStop::create(checked);
{ m_deviceSampleSink->getInputMessageQueue()->push(message);
if (!m_deviceUISet->m_deviceSinkAPI->startGeneration())
{
qDebug("SDRdaemonSinkGui::on_startStop_toggled: device start failed");
}
DSPEngine::instance()->startAudioInput();
}
}
else
{
m_deviceUISet->m_deviceSinkAPI->stopGeneration();
DSPEngine::instance()->stopAudioInput();
} }
} }

View File

@ -31,6 +31,7 @@
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkWork, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkWork, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkStreamTiming, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkStreamTiming, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkChunkCorrection, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkChunkCorrection, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming, Message)
@ -145,6 +146,27 @@ bool SDRdaemonSinkOutput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "SDRdaemonSinkOutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initGeneration())
{
m_deviceAPI->startGeneration();
DSPEngine::instance()->startAudioInput();
}
}
else
{
m_deviceAPI->stopGeneration();
DSPEngine::instance()->stopAudioInput();
}
return true;
}
else if (MsgConfigureSDRdaemonSinkStreamTiming::match(message)) else if (MsgConfigureSDRdaemonSinkStreamTiming::match(message))
{ {
MsgReportSDRdaemonSinkStreamTiming *report; MsgReportSDRdaemonSinkStreamTiming *report;

View File

@ -1,161 +1,180 @@
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2017 Edouard Griffiths, F4EXB // // Copyright (C) 2017 Edouard Griffiths, F4EXB //
// // // //
// This program is free software; you can redistribute it and/or modify // // This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by // // it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or // // the Free Software Foundation as version 3 of the License, or //
// // // //
// This program is distributed in the hope that it will be useful, // // This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of // // but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. // // GNU General Public License V3 for more details. //
// // // //
// You should have received a copy of the GNU General Public License // // You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. // // along with this program. If not, see <http://www.gnu.org/licenses/>. //
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_SDRDAEMONSINKOUTPUT_H #ifndef INCLUDE_SDRDAEMONSINKOUTPUT_H
#define INCLUDE_SDRDAEMONSINKOUTPUT_H #define INCLUDE_SDRDAEMONSINKOUTPUT_H
#include <QString> #include <QString>
#include <QTimer> #include <QTimer>
#include <ctime> #include <ctime>
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include "dsp/devicesamplesink.h" #include "dsp/devicesamplesink.h"
#include "sdrdaemonsinksettings.h" #include "sdrdaemonsinksettings.h"
class SDRdaemonSinkThread; class SDRdaemonSinkThread;
class DeviceSinkAPI; class DeviceSinkAPI;
class SDRdaemonSinkOutput : public DeviceSampleSink { class SDRdaemonSinkOutput : public DeviceSampleSink {
public: public:
class MsgConfigureSDRdaemonSink : public Message { class MsgConfigureSDRdaemonSink : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
const SDRdaemonSinkSettings& getSettings() const { return m_settings; } const SDRdaemonSinkSettings& getSettings() const { return m_settings; }
bool getForce() const { return m_force; } bool getForce() const { return m_force; }
static MsgConfigureSDRdaemonSink* create(const SDRdaemonSinkSettings& settings, bool force = false) static MsgConfigureSDRdaemonSink* create(const SDRdaemonSinkSettings& settings, bool force = false)
{ {
return new MsgConfigureSDRdaemonSink(settings, force); return new MsgConfigureSDRdaemonSink(settings, force);
} }
private: private:
SDRdaemonSinkSettings m_settings; SDRdaemonSinkSettings m_settings;
bool m_force; bool m_force;
MsgConfigureSDRdaemonSink(const SDRdaemonSinkSettings& settings, bool force) : MsgConfigureSDRdaemonSink(const SDRdaemonSinkSettings& settings, bool force) :
Message(), Message(),
m_settings(settings), m_settings(settings),
m_force(force) m_force(force)
{ } { }
}; };
class MsgConfigureSDRdaemonSinkWork : public Message { class MsgConfigureSDRdaemonSinkWork : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
bool isWorking() const { return m_working; } bool isWorking() const { return m_working; }
static MsgConfigureSDRdaemonSinkWork* create(bool working) static MsgConfigureSDRdaemonSinkWork* create(bool working)
{ {
return new MsgConfigureSDRdaemonSinkWork(working); return new MsgConfigureSDRdaemonSinkWork(working);
} }
private: private:
bool m_working; bool m_working;
MsgConfigureSDRdaemonSinkWork(bool working) : MsgConfigureSDRdaemonSinkWork(bool working) :
Message(), Message(),
m_working(working) m_working(working)
{ } { }
}; };
class MsgConfigureSDRdaemonSinkChunkCorrection : public Message { class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
int getChunkCorrection() const { return m_chunkCorrection; } bool getStartStop() const { return m_startStop; }
static MsgConfigureSDRdaemonSinkChunkCorrection* create(int chunkCorrection) static MsgStartStop* create(bool startStop) {
{ return new MsgStartStop(startStop);
return new MsgConfigureSDRdaemonSinkChunkCorrection(chunkCorrection); }
}
protected:
private: bool m_startStop;
int m_chunkCorrection;
MsgStartStop(bool startStop) :
MsgConfigureSDRdaemonSinkChunkCorrection(int chunkCorrection) : Message(),
Message(), m_startStop(startStop)
m_chunkCorrection(chunkCorrection) { }
{ } };
};
class MsgConfigureSDRdaemonSinkChunkCorrection : public Message {
class MsgConfigureSDRdaemonSinkStreamTiming : public Message { MESSAGE_CLASS_DECLARATION
MESSAGE_CLASS_DECLARATION
public:
public: int getChunkCorrection() const { return m_chunkCorrection; }
static MsgConfigureSDRdaemonSinkStreamTiming* create() static MsgConfigureSDRdaemonSinkChunkCorrection* create(int chunkCorrection)
{ {
return new MsgConfigureSDRdaemonSinkStreamTiming(); return new MsgConfigureSDRdaemonSinkChunkCorrection(chunkCorrection);
} }
private: private:
int m_chunkCorrection;
MsgConfigureSDRdaemonSinkStreamTiming() :
Message() MsgConfigureSDRdaemonSinkChunkCorrection(int chunkCorrection) :
{ } Message(),
}; m_chunkCorrection(chunkCorrection)
{ }
class MsgReportSDRdaemonSinkStreamTiming : public Message { };
MESSAGE_CLASS_DECLARATION
class MsgConfigureSDRdaemonSinkStreamTiming : public Message {
public: MESSAGE_CLASS_DECLARATION
std::size_t getSamplesCount() const { return m_samplesCount; }
public:
static MsgReportSDRdaemonSinkStreamTiming* create(std::size_t samplesCount)
{ static MsgConfigureSDRdaemonSinkStreamTiming* create()
return new MsgReportSDRdaemonSinkStreamTiming(samplesCount); {
} return new MsgConfigureSDRdaemonSinkStreamTiming();
}
protected:
std::size_t m_samplesCount; private:
MsgReportSDRdaemonSinkStreamTiming(std::size_t samplesCount) : MsgConfigureSDRdaemonSinkStreamTiming() :
Message(), Message()
m_samplesCount(samplesCount) { }
{ } };
};
class MsgReportSDRdaemonSinkStreamTiming : public Message {
SDRdaemonSinkOutput(DeviceSinkAPI *deviceAPI); MESSAGE_CLASS_DECLARATION
virtual ~SDRdaemonSinkOutput();
virtual void destroy(); public:
std::size_t getSamplesCount() const { return m_samplesCount; }
virtual bool start();
virtual void stop(); static MsgReportSDRdaemonSinkStreamTiming* create(std::size_t samplesCount)
{
virtual const QString& getDeviceDescription() const; return new MsgReportSDRdaemonSinkStreamTiming(samplesCount);
virtual int getSampleRate() const; }
virtual quint64 getCenterFrequency() const;
std::time_t getStartingTimeStamp() const; protected:
std::size_t m_samplesCount;
virtual bool handleMessage(const Message& message);
MsgReportSDRdaemonSinkStreamTiming(std::size_t samplesCount) :
private: Message(),
DeviceSinkAPI *m_deviceAPI; m_samplesCount(samplesCount)
QMutex m_mutex; { }
SDRdaemonSinkSettings m_settings; };
SDRdaemonSinkThread* m_sdrDaemonSinkThread;
QString m_deviceDescription; SDRdaemonSinkOutput(DeviceSinkAPI *deviceAPI);
std::time_t m_startingTimeStamp; virtual ~SDRdaemonSinkOutput();
const QTimer& m_masterTimer; virtual void destroy();
void applySettings(const SDRdaemonSinkSettings& settings, bool force = false); virtual bool start();
}; virtual void stop();
#endif // INCLUDE_SDRDAEMONSINKOUTPUT_H virtual const QString& getDeviceDescription() const;
virtual int getSampleRate() const;
virtual quint64 getCenterFrequency() const;
std::time_t getStartingTimeStamp() const;
virtual bool handleMessage(const Message& message);
private:
DeviceSinkAPI *m_deviceAPI;
QMutex m_mutex;
SDRdaemonSinkSettings m_settings;
SDRdaemonSinkThread* m_sdrDaemonSinkThread;
QString m_deviceDescription;
std::time_t m_startingTimeStamp;
const QTimer& m_masterTimer;
void applySettings(const SDRdaemonSinkSettings& settings, bool force = false);
};
#endif // INCLUDE_SDRDAEMONSINKOUTPUT_H

View File

@ -35,6 +35,7 @@ AirspyGui::AirspyGui(DeviceUISet *deviceUISet, QWidget* parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::AirspyGui), ui(new Ui::AirspyGui),
m_deviceUISet(deviceUISet), m_deviceUISet(deviceUISet),
m_doApplySettings(true),
m_forceSettings(true), m_forceSettings(true),
m_settings(), m_settings(),
m_sampleSource(0), m_sampleSource(0),
@ -116,9 +117,21 @@ bool AirspyGui::deserialize(const QByteArray& data)
} }
} }
bool AirspyGui::handleMessage(const Message& message __attribute__((unused))) bool AirspyGui::handleMessage(const Message& message)
{ {
return false; if (AirspyInput::MsgStartStop::match(message))
{
AirspyInput::MsgStartStop& notif = (AirspyInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else
{
return false;
}
} }
void AirspyGui::handleInputMessages() void AirspyGui::handleInputMessages()
@ -340,18 +353,10 @@ void AirspyGui::on_vga_valueChanged(int value)
void AirspyGui::on_startStop_toggled(bool checked) void AirspyGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) AirspyInput::MsgStartStop *message = AirspyInput::MsgStartStop::create(checked);
{ m_sampleSource->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -58,6 +58,7 @@ private:
Ui::AirspyGui* ui; Ui::AirspyGui* ui;
DeviceUISet* m_deviceUISet; DeviceUISet* m_deviceUISet;
bool m_doApplySettings;
bool m_forceSettings; bool m_forceSettings;
AirspySettings m_settings; AirspySettings m_settings;
QTimer m_updateTimer; QTimer m_updateTimer;
@ -69,6 +70,7 @@ private:
int m_lastEngineState; int m_lastEngineState;
MessageQueue m_inputMessageQueue; MessageQueue m_inputMessageQueue;
void blockApplySettings(bool block) { m_doApplySettings = !block; }
void displaySettings(); void displaySettings();
void displaySampleRates(); void displaySampleRates();
void sendSettings(); void sendSettings();

View File

@ -29,6 +29,7 @@
#include "airspythread.h" #include "airspythread.h"
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message) MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message)
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgFileRecord, Message) MESSAGE_CLASS_DEFINITION(AirspyInput::MsgFileRecord, Message)
const qint64 AirspyInput::loLowLimitFreq = 24000000L; const qint64 AirspyInput::loLowLimitFreq = 24000000L;
@ -236,6 +237,27 @@ bool AirspyInput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "AirspyInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else if (MsgFileRecord::match(message)) else if (MsgFileRecord::match(message))
{ {
MsgFileRecord& conf = (MsgFileRecord&) message; MsgFileRecord& conf = (MsgFileRecord&) message;

View File

@ -71,6 +71,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
AirspyInput(DeviceSourceAPI *deviceAPI); AirspyInput(DeviceSourceAPI *deviceAPI);
virtual ~AirspyInput(); virtual ~AirspyInput();
virtual void destroy(); virtual void destroy();

View File

@ -210,7 +210,19 @@ bool FCDProGui::deserialize(const QByteArray& data)
bool FCDProGui::handleMessage(const Message& message __attribute__((unused))) bool FCDProGui::handleMessage(const Message& message __attribute__((unused)))
{ {
return false; if (BladerfInput::MsgStartStop::match(message))
{
BladerfInput::MsgStartStop& notif = (BladerfInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else
{
return false;
}
} }
void FCDProGui::handleInputMessages() void FCDProGui::handleInputMessages()
@ -435,18 +447,10 @@ void FCDProGui::on_setDefaults_clicked(bool checked __attribute__((unused)))
void FCDProGui::on_startStop_toggled(bool checked) void FCDProGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) BladerfInput::MsgStartStop *message = BladerfInput::MsgStartStop::create(checked);
{ m_sampleSource->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -55,6 +55,7 @@ private:
Ui::FCDProGui* ui; Ui::FCDProGui* ui;
DeviceUISet* m_deviceUISet; DeviceUISet* m_deviceUISet;
bool m_doApplySettings;
bool m_forceSettings; bool m_forceSettings;
FCDProSettings m_settings; FCDProSettings m_settings;
QTimer m_updateTimer; QTimer m_updateTimer;
@ -66,6 +67,7 @@ private:
int m_lastEngineState; int m_lastEngineState;
MessageQueue m_inputMessageQueue; MessageQueue m_inputMessageQueue;
void blockApplySettings(bool block) { m_doApplySettings = !block; }
void displaySettings(); void displaySettings();
void sendSettings(); void sendSettings();
void updateSampleRateAndFrequency(); void updateSampleRateAndFrequency();

View File

@ -34,6 +34,7 @@
#include "fcdproconst.h" #include "fcdproconst.h"
MESSAGE_CLASS_DEFINITION(FCDProInput::MsgConfigureFCD, Message) MESSAGE_CLASS_DEFINITION(FCDProInput::MsgConfigureFCD, Message)
MESSAGE_CLASS_DEFINITION(FCDProInput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(FCDProInput::MsgFileRecord, Message) MESSAGE_CLASS_DEFINITION(FCDProInput::MsgFileRecord, Message)
FCDProInput::FCDProInput(DeviceSourceAPI *deviceAPI) : FCDProInput::FCDProInput(DeviceSourceAPI *deviceAPI) :
@ -178,6 +179,27 @@ bool FCDProInput::handleMessage(const Message& message)
applySettings(conf.getSettings(), conf.getForce()); applySettings(conf.getSettings(), conf.getForce());
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "FCDProInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else if (MsgFileRecord::match(message)) else if (MsgFileRecord::match(message))
{ {
MsgFileRecord& conf = (MsgFileRecord&) message; MsgFileRecord& conf = (MsgFileRecord&) message;

View File

@ -78,6 +78,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
FCDProInput(DeviceSourceAPI *deviceAPI); FCDProInput(DeviceSourceAPI *deviceAPI);
virtual ~FCDProInput(); virtual ~FCDProInput();
virtual void destroy(); virtual void destroy();

View File

@ -128,7 +128,19 @@ bool FCDProPlusGui::deserialize(const QByteArray& data)
bool FCDProPlusGui::handleMessage(const Message& message __attribute__((unused))) bool FCDProPlusGui::handleMessage(const Message& message __attribute__((unused)))
{ {
return false; if (FCDProPlusInput::MsgStartStop::match(message))
{
FCDProPlusInput::MsgStartStop& notif = (FCDProPlusInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else
{
return false;
}
} }
void FCDProPlusGui::handleInputMessages() void FCDProPlusGui::handleInputMessages()
@ -300,18 +312,10 @@ void FCDProPlusGui::on_ppm_valueChanged(int value)
void FCDProPlusGui::on_startStop_toggled(bool checked) void FCDProPlusGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) BladerfInput::MsgStartStop *message = BladerfInput::MsgStartStop::create(checked);
{ m_sampleSource->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -54,6 +54,7 @@ private:
Ui::FCDProPlusGui* ui; Ui::FCDProPlusGui* ui;
DeviceUISet* m_deviceUISet; DeviceUISet* m_deviceUISet;
bool m_doApplySettings;
bool m_forceSettings; bool m_forceSettings;
FCDProPlusSettings m_settings; FCDProPlusSettings m_settings;
QTimer m_updateTimer; QTimer m_updateTimer;
@ -65,6 +66,7 @@ private:
int m_lastEngineState; int m_lastEngineState;
MessageQueue m_inputMessageQueue; MessageQueue m_inputMessageQueue;
void blockApplySettings(bool block) { m_doApplySettings = !block; }
void displaySettings(); void displaySettings();
void sendSettings(); void sendSettings();
void updateSampleRateAndFrequency(); void updateSampleRateAndFrequency();

View File

@ -33,6 +33,7 @@
#include "fcdproplusconst.h" #include "fcdproplusconst.h"
MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgConfigureFCD, Message) MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgConfigureFCD, Message)
MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgFileRecord, Message) MESSAGE_CLASS_DEFINITION(FCDProPlusInput::MsgFileRecord, Message)
FCDProPlusInput::FCDProPlusInput(DeviceSourceAPI *deviceAPI) : FCDProPlusInput::FCDProPlusInput(DeviceSourceAPI *deviceAPI) :
@ -172,6 +173,27 @@ bool FCDProPlusInput::handleMessage(const Message& message)
applySettings(conf.getSettings(), conf.getForce()); applySettings(conf.getSettings(), conf.getForce());
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "BladerfInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else if (MsgFileRecord::match(message)) else if (MsgFileRecord::match(message))
{ {
MsgFileRecord& conf = (MsgFileRecord&) message; MsgFileRecord& conf = (MsgFileRecord&) message;

View File

@ -58,6 +58,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
class MsgFileRecord : public Message { class MsgFileRecord : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION

View File

@ -179,6 +179,15 @@ bool FileSourceGui::handleMessage(const Message& message)
updateWithStreamTime(); updateWithStreamTime();
return true; return true;
} }
else if (FileSourceInput::MsgStartStop::match(message))
{
FileSourceInput::MsgStartStop& notif = (FileSourceInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else else
{ {
return false; return false;
@ -207,18 +216,10 @@ void FileSourceGui::on_playLoop_toggled(bool checked __attribute__((unused)))
void FileSourceGui::on_startStop_toggled(bool checked) void FileSourceGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) FileSourceInput::MsgStartStop *message = FileSourceInput::MsgStartStop::create(checked);
{ m_sampleSource->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -55,6 +55,7 @@ private:
DeviceUISet* m_deviceUISet; DeviceUISet* m_deviceUISet;
FileSourceInput::Settings m_settings; FileSourceInput::Settings m_settings;
bool m_doApplySettings;
QTimer m_statusTimer; QTimer m_statusTimer;
std::vector<int> m_gains; std::vector<int> m_gains;
DeviceSampleSource* m_sampleSource; DeviceSampleSource* m_sampleSource;
@ -72,6 +73,7 @@ private:
int m_lastEngineState; int m_lastEngineState;
MessageQueue m_inputMessageQueue; MessageQueue m_inputMessageQueue;
void blockApplySettings(bool block) { m_doApplySettings = !block; }
void displaySettings(); void displaySettings();
void displayTime(); void displayTime();
void sendSettings(); void sendSettings();

View File

@ -36,6 +36,7 @@ MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceName, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceWork, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceWork, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceSeek, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceSeek, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceStreamTiming, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgConfigureFileSourceStreamTiming, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceAcquisition, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceAcquisition, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamData, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamData, Message)
MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamTiming, Message) MESSAGE_CLASS_DEFINITION(FileSourceInput::MsgReportFileSourceStreamTiming, Message)
@ -288,6 +289,27 @@ bool FileSourceInput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "FileSourceInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else else
{ {
return false; return false;

View File

@ -155,6 +155,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
class MsgReportFileSourceStreamData : public Message { class MsgReportFileSourceStreamData : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION

View File

@ -18,6 +18,7 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include <QDebug> #include <QDebug>
#include "SWGDeviceSettings.h" #include "SWGDeviceSettings.h"
@ -38,6 +39,7 @@
MESSAGE_CLASS_DEFINITION(HackRFInput::MsgConfigureHackRF, Message) MESSAGE_CLASS_DEFINITION(HackRFInput::MsgConfigureHackRF, Message)
MESSAGE_CLASS_DEFINITION(HackRFInput::MsgReportHackRF, Message) MESSAGE_CLASS_DEFINITION(HackRFInput::MsgReportHackRF, Message)
MESSAGE_CLASS_DEFINITION(HackRFInput::MsgFileRecord, Message) MESSAGE_CLASS_DEFINITION(HackRFInput::MsgFileRecord, Message)
MESSAGE_CLASS_DEFINITION(HackRFInput::MsgStartStop, Message)
HackRFInput::HackRFInput(DeviceSourceAPI *deviceAPI) : HackRFInput::HackRFInput(DeviceSourceAPI *deviceAPI) :
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
@ -226,6 +228,27 @@ bool HackRFInput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "HackRFInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else else
{ {
return false; return false;
@ -502,19 +525,16 @@ int HackRFInput::webapiRun(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage __attribute__((unused))) QString& errorMessage __attribute__((unused)))
{ {
if (run) MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue) // forward to GUI if any
{ {
if (m_deviceAPI->initAcquisition()) MsgStartStop *msgToGUI = MsgStartStop::create(run);
{ m_guiMessageQueue->push(msgToGUI);
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutputImmediate();
}
}
else
{
m_deviceAPI->stopAcquisition();
} }
usleep(100000);
m_deviceAPI->getDeviceEngineStateStr(*response.getState()); m_deviceAPI->getDeviceEngineStateStr(*response.getState());
return 200; return 200;
} }

View File

@ -72,6 +72,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
class MsgFileRecord : public Message { class MsgFileRecord : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION

View File

@ -130,6 +130,15 @@ bool HackRFInputGui::handleMessage(const Message& message)
displaySettings(); displaySettings();
return true; return true;
} }
else if (HackRFInput::MsgStartStop::match(message))
{
HackRFInput::MsgStartStop& notif = (HackRFInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else else
{ {
return false; return false;
@ -333,25 +342,10 @@ void HackRFInputGui::on_vga_valueChanged(int value)
void HackRFInputGui::on_startStop_toggled(bool checked) void HackRFInputGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
// forcibly stop the Tx if present before starting HackRFInput::MsgStartStop *message = HackRFInput::MsgStartStop::create(checked);
if (m_deviceUISet->m_deviceSourceAPI->getSinkBuddies().size() > 0) m_sampleSource->getInputMessageQueue()->push(message);
{
DeviceSinkAPI *buddy = m_deviceUISet->m_deviceSourceAPI->getSinkBuddies()[0];
buddy->stopGeneration();
}
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition())
{
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -18,6 +18,7 @@
#include <QDebug> #include <QDebug>
#include <cstddef> #include <cstddef>
#include <string.h> #include <string.h>
#include <unistd.h>
#include "lime/LimeSuite.h" #include "lime/LimeSuite.h"
#include "SWGDeviceSettings.h" #include "SWGDeviceSettings.h"
@ -40,6 +41,7 @@ MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgGetStreamInfo, Message)
MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgGetDeviceInfo, Message) MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgGetDeviceInfo, Message)
MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgReportStreamInfo, Message) MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgReportStreamInfo, Message)
MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgFileRecord, Message) MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgFileRecord, Message)
MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgStartStop, Message)
LimeSDRInput::LimeSDRInput(DeviceSourceAPI *deviceAPI) : LimeSDRInput::LimeSDRInput(DeviceSourceAPI *deviceAPI) :
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
@ -660,6 +662,27 @@ bool LimeSDRInput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "LimeSDRInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else else
{ {
return false; return false;
@ -1258,19 +1281,16 @@ int LimeSDRInput::webapiRun(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage __attribute__((unused))) QString& errorMessage __attribute__((unused)))
{ {
if (run) MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue) // forward to GUI if any
{ {
if (m_deviceAPI->initAcquisition()) MsgStartStop *msgToGUI = MsgStartStop::create(run);
{ m_guiMessageQueue->push(msgToGUI);
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutputImmediate();
}
}
else
{
m_deviceAPI->stopAcquisition();
} }
usleep(100000);
m_deviceAPI->getDeviceEngineStateStr(*response.getState()); m_deviceAPI->getDeviceEngineStateStr(*response.getState());
return 200; return 200;
} }

View File

@ -185,6 +185,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
LimeSDRInput(DeviceSourceAPI *deviceAPI); LimeSDRInput(DeviceSourceAPI *deviceAPI);
virtual ~LimeSDRInput(); virtual ~LimeSDRInput();
virtual void destroy(); virtual void destroy();

View File

@ -219,8 +219,19 @@ bool LimeSDRInputGUI::handleMessage(const Message& message)
ui->temperatureText->setText(tr("%1C").arg(QString::number(report.getTemperature(), 'f', 0))); ui->temperatureText->setText(tr("%1C").arg(QString::number(report.getTemperature(), 'f', 0)));
return true; return true;
} }
else if (LimeSDRInput::MsgStartStop::match(message))
{
LimeSDRInput::MsgStartStop& notif = (LimeSDRInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return false; return true;
}
else
{
return false;
}
} }
void LimeSDRInputGUI::handleInputMessages() void LimeSDRInputGUI::handleInputMessages()
@ -415,18 +426,10 @@ void LimeSDRInputGUI::blockApplySettings(bool block)
void LimeSDRInputGUI::on_startStop_toggled(bool checked) void LimeSDRInputGUI::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) LimeSDRInput::MsgStartStop *message = LimeSDRInput::MsgStartStop::create(checked);
{ m_limeSDRInput->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -15,6 +15,7 @@
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include <QDebug> #include <QDebug>
#include <unistd.h>
#include "SWGDeviceSettings.h" #include "SWGDeviceSettings.h"
#include "SWGDeviceState.h" #include "SWGDeviceState.h"
@ -34,6 +35,7 @@
MESSAGE_CLASS_DEFINITION(PlutoSDRInput::MsgConfigurePlutoSDR, Message) MESSAGE_CLASS_DEFINITION(PlutoSDRInput::MsgConfigurePlutoSDR, Message)
MESSAGE_CLASS_DEFINITION(PlutoSDRInput::MsgFileRecord, Message) MESSAGE_CLASS_DEFINITION(PlutoSDRInput::MsgFileRecord, Message)
MESSAGE_CLASS_DEFINITION(PlutoSDRInput::MsgStartStop, Message)
PlutoSDRInput::PlutoSDRInput(DeviceSourceAPI *deviceAPI) : PlutoSDRInput::PlutoSDRInput(DeviceSourceAPI *deviceAPI) :
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
@ -154,6 +156,27 @@ bool PlutoSDRInput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "PlutoSDRInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else if (DevicePlutoSDRShared::MsgCrossReportToBuddy::match(message)) // message from buddy else if (DevicePlutoSDRShared::MsgCrossReportToBuddy::match(message)) // message from buddy
{ {
DevicePlutoSDRShared::MsgCrossReportToBuddy& conf = (DevicePlutoSDRShared::MsgCrossReportToBuddy&) message; DevicePlutoSDRShared::MsgCrossReportToBuddy& conf = (DevicePlutoSDRShared::MsgCrossReportToBuddy&) message;
@ -578,19 +601,16 @@ int PlutoSDRInput::webapiRun(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage __attribute__((unused))) QString& errorMessage __attribute__((unused)))
{ {
if (run) MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue) // forward to GUI if any
{ {
if (m_deviceAPI->initAcquisition()) MsgStartStop *msgToGUI = MsgStartStop::create(run);
{ m_guiMessageQueue->push(msgToGUI);
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutputImmediate();
}
}
else
{
m_deviceAPI->stopAcquisition();
} }
usleep(100000);
m_deviceAPI->getDeviceEngineStateStr(*response.getState()); m_deviceAPI->getDeviceEngineStateStr(*response.getState());
return 200; return 200;
} }

View File

@ -73,6 +73,24 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
PlutoSDRInput(DeviceSourceAPI *deviceAPI); PlutoSDRInput(DeviceSourceAPI *deviceAPI);
~PlutoSDRInput(); ~PlutoSDRInput();

View File

@ -131,7 +131,16 @@ bool PlutoSDRInputGui::deserialize(const QByteArray& data)
bool PlutoSDRInputGui::handleMessage(const Message& message __attribute__((unused))) bool PlutoSDRInputGui::handleMessage(const Message& message __attribute__((unused)))
{ {
if (DevicePlutoSDRShared::MsgCrossReportToBuddy::match(message)) // message from buddy if (PlutoSDRInput::MsgStartStop::match(message))
{
PlutoSDRInput::MsgStartStop& notif = (PlutoSDRInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else if (DevicePlutoSDRShared::MsgCrossReportToBuddy::match(message)) // message from buddy
{ {
DevicePlutoSDRShared::MsgCrossReportToBuddy& conf = (DevicePlutoSDRShared::MsgCrossReportToBuddy&) message; DevicePlutoSDRShared::MsgCrossReportToBuddy& conf = (DevicePlutoSDRShared::MsgCrossReportToBuddy&) message;
m_settings.m_devSampleRate = conf.getDevSampleRate(); m_settings.m_devSampleRate = conf.getDevSampleRate();
@ -153,18 +162,10 @@ bool PlutoSDRInputGui::handleMessage(const Message& message __attribute__((unuse
void PlutoSDRInputGui::on_startStop_toggled(bool checked) void PlutoSDRInputGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) PlutoSDRInput::MsgStartStop *message = PlutoSDRInput::MsgStartStop::create(checked);
{ m_sampleSource->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -149,6 +149,15 @@ bool RTLSDRGui::handleMessage(const Message& message)
blockApplySettings(false); blockApplySettings(false);
return true; return true;
} }
if (RTLSDRInput::MsgStartStop::match(message))
{
RTLSDRInput::MsgStartStop& notif = (RTLSDRInput::MsgStartStop&) message;
blockApplySettings(true);
ui->startStop->setChecked(notif.getStartStop());
blockApplySettings(false);
return true;
}
else else
{ {
return false; return false;
@ -320,18 +329,10 @@ void RTLSDRGui::on_gain_valueChanged(int value)
void RTLSDRGui::on_startStop_toggled(bool checked) void RTLSDRGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (m_doApplySettings)
{ {
if (m_deviceUISet->m_deviceSourceAPI->initAcquisition()) RTLSDRInput::MsgStartStop *message = RTLSDRInput::MsgStartStop::create(checked);
{ m_sampleSource->getInputMessageQueue()->push(message);
m_deviceUISet->m_deviceSourceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceUISet->m_deviceSourceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
} }
} }

View File

@ -18,6 +18,7 @@
#include <QDebug> #include <QDebug>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include "SWGDeviceSettings.h" #include "SWGDeviceSettings.h"
#include "SWGRtlSdrSettings.h" #include "SWGRtlSdrSettings.h"
@ -34,6 +35,7 @@
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgConfigureRTLSDR, Message) MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgConfigureRTLSDR, Message)
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgReportRTLSDR, Message) MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgReportRTLSDR, Message)
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgFileRecord, Message) MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgFileRecord, Message)
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgStartStop, Message)
const quint64 RTLSDRInput::frequencyLowRangeMin = 1000UL; const quint64 RTLSDRInput::frequencyLowRangeMin = 1000UL;
const quint64 RTLSDRInput::frequencyLowRangeMax = 275000UL; const quint64 RTLSDRInput::frequencyLowRangeMax = 275000UL;
@ -274,6 +276,27 @@ bool RTLSDRInput::handleMessage(const Message& message)
return true; return true;
} }
else if (MsgStartStop::match(message))
{
MsgStartStop& cmd = (MsgStartStop&) message;
qDebug() << "RTLSDRInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
if (cmd.getStartStop())
{
if (m_deviceAPI->initAcquisition())
{
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutput();
}
}
else
{
m_deviceAPI->stopAcquisition();
DSPEngine::instance()->stopAudioOutput();
}
return true;
}
else else
{ {
return false; return false;
@ -541,19 +564,16 @@ int RTLSDRInput::webapiRun(
SWGSDRangel::SWGDeviceState& response, SWGSDRangel::SWGDeviceState& response,
QString& errorMessage __attribute__((unused))) QString& errorMessage __attribute__((unused)))
{ {
if (run) MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue) // forward to GUI if any
{ {
if (m_deviceAPI->initAcquisition()) MsgStartStop *msgToGUI = MsgStartStop::create(run);
{ m_guiMessageQueue->push(msgToGUI);
m_deviceAPI->startAcquisition();
DSPEngine::instance()->startAudioOutputImmediate();
}
}
else
{
m_deviceAPI->stopAcquisition();
} }
usleep(100000);
m_deviceAPI->getDeviceEngineStateStr(*response.getState()); m_deviceAPI->getDeviceEngineStateStr(*response.getState());
return 200; return 200;
} }

View File

@ -92,6 +92,25 @@ public:
{ } { }
}; };
class MsgStartStop : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getStartStop() const { return m_startStop; }
static MsgStartStop* create(bool startStop) {
return new MsgStartStop(startStop);
}
protected:
bool m_startStop;
MsgStartStop(bool startStop) :
Message(),
m_startStop(startStop)
{ }
};
RTLSDRInput(DeviceSourceAPI *deviceAPI); RTLSDRInput(DeviceSourceAPI *deviceAPI);
virtual ~RTLSDRInput(); virtual ~RTLSDRInput();
virtual void destroy(); virtual void destroy();