From 6d124431001ccc135c205f644684991946d51d62 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 17 Dec 2017 23:15:42 +0100 Subject: [PATCH] Server: changes to support DeviceSet --- plugins/channelrx/chanalyzer/chanalyzer.h | 7 + .../channelrx/chanalyzer/chanalyzerplugin.cpp | 10 +- .../channelrx/chanalyzer/chanalyzerplugin.h | 2 + plugins/channelrx/chanalyzerng/chanalyzerng.h | 7 + .../chanalyzerng/chanalyzerngplugin.cpp | 9 + .../chanalyzerng/chanalyzerngplugin.h | 1 + plugins/channelrx/demodam/amdemod.cpp | 23 + plugins/channelrx/demodam/amdemod.h | 7 + plugins/channelrx/demodam/amdemodplugin.cpp | 10 + plugins/channelrx/demodam/amdemodplugin.h | 1 + plugins/channelrx/demodatv/atvdemod.h | 7 + plugins/channelrx/demodatv/atvdemodplugin.cpp | 9 + plugins/channelrx/demodatv/atvdemodplugin.h | 1 + plugins/channelrx/demodbfm/bfmdemod.cpp | 23 + plugins/channelrx/demodbfm/bfmdemod.h | 7 + plugins/channelrx/demodbfm/bfmplugin.cpp | 10 + plugins/channelrx/demodbfm/bfmplugin.h | 1 + plugins/channelrx/demoddsd/dsddemod.cpp | 22 + plugins/channelrx/demoddsd/dsddemod.h | 7 + plugins/channelrx/demoddsd/dsddemodplugin.cpp | 10 + plugins/channelrx/demoddsd/dsddemodplugin.h | 1 + plugins/channelrx/demodlora/lorademod.cpp | 23 + plugins/channelrx/demodlora/lorademod.h | 7 + plugins/channelrx/demodlora/loraplugin.cpp | 10 + plugins/channelrx/demodlora/loraplugin.h | 1 + plugins/channelrx/demodnfm/nfmdemod.cpp | 22 + plugins/channelrx/demodnfm/nfmdemod.h | 7 + plugins/channelrx/demodnfm/nfmplugin.cpp | 10 + plugins/channelrx/demodnfm/nfmplugin.h | 1 + plugins/channelrx/demodssb/ssbdemod.cpp | 21 + plugins/channelrx/demodssb/ssbdemod.h | 7 + plugins/channelrx/demodssb/ssbplugin.cpp | 10 + plugins/channelrx/demodssb/ssbplugin.h | 1 + plugins/channelrx/demodwfm/wfmdemod.cpp | 23 + plugins/channelrx/demodwfm/wfmdemod.h | 7 + plugins/channelrx/demodwfm/wfmplugin.cpp | 10 + plugins/channelrx/demodwfm/wfmplugin.h | 1 + plugins/channelrx/tcpsrc/tcpsrc.cpp | 23 + plugins/channelrx/tcpsrc/tcpsrc.h | 7 + plugins/channelrx/tcpsrc/tcpsrcplugin.cpp | 10 + plugins/channelrx/tcpsrc/tcpsrcplugin.h | 1 + plugins/channelrx/udpsrc/udpsrc.cpp | 22 + plugins/channelrx/udpsrc/udpsrc.h | 7 + plugins/channelrx/udpsrc/udpsrcplugin.cpp | 10 + plugins/channelrx/udpsrc/udpsrcplugin.h | 1 + plugins/channeltx/modam/ammod.cpp | 22 + plugins/channeltx/modam/ammod.h | 7 + plugins/channeltx/modam/ammodplugin.cpp | 10 + plugins/channeltx/modam/ammodplugin.h | 1 + plugins/channeltx/modatv/atvmod.cpp | 22 + plugins/channeltx/modatv/atvmod.h | 7 + plugins/channeltx/modatv/atvmodplugin.cpp | 10 + plugins/channeltx/modatv/atvmodplugin.h | 1 + plugins/channeltx/modnfm/nfmmod.cpp | 23 +- plugins/channeltx/modnfm/nfmmod.h | 7 + plugins/channeltx/modnfm/nfmmodplugin.cpp | 11 + plugins/channeltx/modnfm/nfmmodplugin.h | 1 + plugins/channeltx/modssb/ssbmod.cpp | 22 + plugins/channeltx/modssb/ssbmod.h | 7 + plugins/channeltx/modssb/ssbmodplugin.cpp | 11 + plugins/channeltx/modssb/ssbmodplugin.h | 1 + plugins/channeltx/modwfm/wfmmod.cpp | 22 + plugins/channeltx/modwfm/wfmmod.h | 7 + plugins/channeltx/modwfm/wfmmodplugin.cpp | 11 + plugins/channeltx/modwfm/wfmmodplugin.h | 1 + plugins/channeltx/udpsink/udpsink.cpp | 22 + plugins/channeltx/udpsink/udpsink.h | 7 + plugins/channeltx/udpsink/udpsinkplugin.cpp | 11 + plugins/channeltx/udpsink/udpsinkplugin.h | 1 + sdrbase/channel/channelsinkapi.h | 8 + sdrbase/channel/channelsourceapi.h | 7 + sdrbase/plugin/plugininterface.h | 16 +- sdrbase/resources/index.html | 3008 +++++++++-------- sdrbase/webapi/webapiadapterinterface.h | 9 + sdrbase/webapi/webapirequestmapper.cpp | 14 + sdrgui/device/deviceuiset.cpp | 6 +- sdrsrv/CMakeLists.txt | 4 +- sdrsrv/device/deviceset.cpp | 336 ++ sdrsrv/device/deviceset.h | 90 + sdrsrv/maincore.cpp | 38 +- sdrsrv/maincore.h | 36 +- sdrsrv/webapi/webapiadaptersrv.cpp | 129 +- sdrsrv/webapi/webapiadaptersrv.h | 12 + swagger/sdrangel/api/swagger/swagger.yaml | 20 + swagger/sdrangel/code/html2/index.html | 3008 +++++++++-------- .../code/qt5/client/SWGAudioDevice.cpp | 2 +- .../sdrangel/code/qt5/client/SWGAudioDevice.h | 2 +- .../code/qt5/client/SWGAudioDevices.cpp | 2 +- .../code/qt5/client/SWGAudioDevices.h | 2 +- .../code/qt5/client/SWGAudioDevicesSelect.cpp | 2 +- .../code/qt5/client/SWGAudioDevicesSelect.h | 2 +- .../code/qt5/client/SWGCWKeyerSettings.cpp | 2 +- .../code/qt5/client/SWGCWKeyerSettings.h | 2 +- .../sdrangel/code/qt5/client/SWGChannel.cpp | 2 +- swagger/sdrangel/code/qt5/client/SWGChannel.h | 2 +- .../code/qt5/client/SWGChannelListItem.cpp | 2 +- .../code/qt5/client/SWGChannelListItem.h | 2 +- .../code/qt5/client/SWGChannelSettings.cpp | 2 +- .../code/qt5/client/SWGChannelSettings.h | 2 +- .../code/qt5/client/SWGDVSeralDevices.cpp | 2 +- .../code/qt5/client/SWGDVSeralDevices.h | 2 +- .../code/qt5/client/SWGDVSerialDevice.cpp | 2 +- .../code/qt5/client/SWGDVSerialDevice.h | 2 +- .../code/qt5/client/SWGDeviceListItem.cpp | 2 +- .../code/qt5/client/SWGDeviceListItem.h | 2 +- .../sdrangel/code/qt5/client/SWGDeviceSet.cpp | 2 +- .../sdrangel/code/qt5/client/SWGDeviceSet.h | 2 +- .../code/qt5/client/SWGDeviceSetApi.cpp | 2 +- .../code/qt5/client/SWGDeviceSetApi.h | 2 +- .../code/qt5/client/SWGDeviceSetList.cpp | 2 +- .../code/qt5/client/SWGDeviceSetList.h | 2 +- .../code/qt5/client/SWGDeviceSettings.cpp | 2 +- .../code/qt5/client/SWGDeviceSettings.h | 2 +- .../code/qt5/client/SWGDeviceState.cpp | 2 +- .../sdrangel/code/qt5/client/SWGDeviceState.h | 2 +- .../code/qt5/client/SWGErrorResponse.cpp | 2 +- .../code/qt5/client/SWGErrorResponse.h | 2 +- .../code/qt5/client/SWGFileSourceSettings.cpp | 2 +- .../code/qt5/client/SWGFileSourceSettings.h | 2 +- .../sdrangel/code/qt5/client/SWGHelpers.cpp | 2 +- swagger/sdrangel/code/qt5/client/SWGHelpers.h | 2 +- .../code/qt5/client/SWGHttpRequest.cpp | 2 +- .../sdrangel/code/qt5/client/SWGHttpRequest.h | 2 +- .../code/qt5/client/SWGInstanceApi.cpp | 50 +- .../sdrangel/code/qt5/client/SWGInstanceApi.h | 6 +- .../client/SWGInstanceChannelsResponse.cpp | 2 +- .../qt5/client/SWGInstanceChannelsResponse.h | 2 +- .../qt5/client/SWGInstanceDevicesResponse.cpp | 2 +- .../qt5/client/SWGInstanceDevicesResponse.h | 2 +- .../qt5/client/SWGInstanceSummaryResponse.cpp | 2 +- .../qt5/client/SWGInstanceSummaryResponse.h | 2 +- .../qt5/client/SWGLimeSdrInputSettings.cpp | 2 +- .../code/qt5/client/SWGLimeSdrInputSettings.h | 2 +- .../qt5/client/SWGLimeSdrOutputSettings.cpp | 2 +- .../qt5/client/SWGLimeSdrOutputSettings.h | 2 +- .../qt5/client/SWGLocationInformation.cpp | 2 +- .../code/qt5/client/SWGLocationInformation.h | 2 +- .../code/qt5/client/SWGLoggingInfo.cpp | 2 +- .../sdrangel/code/qt5/client/SWGLoggingInfo.h | 2 +- .../code/qt5/client/SWGModelFactory.h | 2 +- .../code/qt5/client/SWGNFMDemodSettings.cpp | 2 +- .../code/qt5/client/SWGNFMDemodSettings.h | 2 +- .../code/qt5/client/SWGNFMModSettings.cpp | 2 +- .../code/qt5/client/SWGNFMModSettings.h | 2 +- swagger/sdrangel/code/qt5/client/SWGObject.h | 2 +- .../code/qt5/client/SWGPresetGroup.cpp | 2 +- .../sdrangel/code/qt5/client/SWGPresetGroup.h | 2 +- .../code/qt5/client/SWGPresetIdentifier.cpp | 2 +- .../code/qt5/client/SWGPresetIdentifier.h | 2 +- .../code/qt5/client/SWGPresetItem.cpp | 2 +- .../sdrangel/code/qt5/client/SWGPresetItem.h | 2 +- .../code/qt5/client/SWGPresetTransfer.cpp | 2 +- .../code/qt5/client/SWGPresetTransfer.h | 2 +- .../sdrangel/code/qt5/client/SWGPresets.cpp | 2 +- swagger/sdrangel/code/qt5/client/SWGPresets.h | 2 +- .../code/qt5/client/SWGRtlSdrSettings.cpp | 2 +- .../code/qt5/client/SWGRtlSdrSettings.h | 2 +- .../code/qt5/client/SWGSamplingDevice.cpp | 2 +- .../code/qt5/client/SWGSamplingDevice.h | 2 +- swagger/sdrangel/examples/stop_server.py | 72 + 160 files changed, 4880 insertions(+), 2795 deletions(-) create mode 100644 sdrsrv/device/deviceset.cpp create mode 100644 sdrsrv/device/deviceset.h create mode 100644 swagger/sdrangel/examples/stop_server.py diff --git a/plugins/channelrx/chanalyzer/chanalyzer.h b/plugins/channelrx/chanalyzer/chanalyzer.h index a6009c354..8ce8693eb 100644 --- a/plugins/channelrx/chanalyzer/chanalyzer.h +++ b/plugins/channelrx/chanalyzer/chanalyzer.h @@ -109,6 +109,7 @@ public: ChannelAnalyzer(DeviceSourceAPI *deviceAPI); virtual ~ChannelAnalyzer(); + virtual void destroy() { delete this; } void setSampleSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } void configure(MessageQueue* messageQueue, @@ -128,6 +129,12 @@ public: virtual int getDeltaFrequency() const { return m_frequency; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = objectName(); } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_frequency; } + + virtual QByteArray serialize() const { return QByteArray(); } + virtual bool deserialize(const QByteArray& data __attribute__((unused))) { return false; } static const QString m_channelIdURI; static const QString m_channelId; diff --git a/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp b/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp index cd391a3b3..d0fc77fb7 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp @@ -45,7 +45,6 @@ PluginInstanceGUI* ChannelAnalyzerPlugin::createRxChannelGUI(const QString& chan } } - BasebandSampleSink* ChannelAnalyzerPlugin::createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI) { if(channelName == ChannelAnalyzer::m_channelIdURI) @@ -56,3 +55,12 @@ BasebandSampleSink* ChannelAnalyzerPlugin::createRxChannel(const QString& channe return 0; } } + +void ChannelAnalyzerPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == ChannelAnalyzer::m_channelIdURI) { + *channelSinkAPI = new ChannelAnalyzer(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} diff --git a/plugins/channelrx/chanalyzer/chanalyzerplugin.h b/plugins/channelrx/chanalyzer/chanalyzerplugin.h index 70143d51e..885bb7c39 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerplugin.h +++ b/plugins/channelrx/chanalyzer/chanalyzerplugin.h @@ -6,6 +6,7 @@ class DeviceUISet; class BasebandSampleSink; +class ChannelSinkAPI; class ChannelAnalyzerPlugin : public QObject, PluginInterface { Q_OBJECT @@ -20,6 +21,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/chanalyzerng/chanalyzerng.h b/plugins/channelrx/chanalyzerng/chanalyzerng.h index 79b2036ae..95d79a35d 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerng.h +++ b/plugins/channelrx/chanalyzerng/chanalyzerng.h @@ -125,6 +125,7 @@ public: ChannelAnalyzerNG(DeviceSourceAPI *deviceAPI); virtual ~ChannelAnalyzerNG(); + virtual void destroy() { delete this; } void setSampleSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } void configure(MessageQueue* messageQueue, @@ -147,6 +148,12 @@ public: virtual int getDeltaFrequency() const { return m_running.m_frequency; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = objectName(); } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_running.m_frequency; } + + virtual QByteArray serialize() const { return QByteArray(); } + virtual bool deserialize(const QByteArray& data __attribute__((unused))) { return false; } static const QString m_channelIdURI; static const QString m_channelId; diff --git a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp index 66e3a80de..1b6946946 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp +++ b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.cpp @@ -71,3 +71,12 @@ BasebandSampleSink* ChannelAnalyzerNGPlugin::createRxChannel(const QString& chan } } +void ChannelAnalyzerNGPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == ChannelAnalyzerNG::m_channelIdURI) { + *channelSinkAPI = new ChannelAnalyzerNG(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h index a6b9d7855..fc9ca19d3 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h +++ b/plugins/channelrx/chanalyzerng/chanalyzerngplugin.h @@ -37,6 +37,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index a0d5de31c..e22b6bf9a 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -239,3 +239,26 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force) m_settings = settings; } + +QByteArray AMDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool AMDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index 3a5284a31..3f76af6cf 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -86,6 +86,7 @@ public: AMDemod(DeviceSourceAPI *deviceAPI); ~AMDemod(); + virtual void destroy() { delete this; } virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); virtual void start(); @@ -95,6 +96,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_magsq; } bool getSquelchOpen() const { return m_squelchOpen; } diff --git a/plugins/channelrx/demodam/amdemodplugin.cpp b/plugins/channelrx/demodam/amdemodplugin.cpp index 3092d48dd..dcd971ce8 100644 --- a/plugins/channelrx/demodam/amdemodplugin.cpp +++ b/plugins/channelrx/demodam/amdemodplugin.cpp @@ -55,3 +55,13 @@ BasebandSampleSink* AMDemodPlugin::createRxChannel(const QString& channelName, D return 0; } } + +void AMDemodPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == AMDemod::m_channelIdURI) { + *channelSinkAPI = new AMDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demodam/amdemodplugin.h b/plugins/channelrx/demodam/amdemodplugin.h index 35d8cb122..bfe9b8144 100644 --- a/plugins/channelrx/demodam/amdemodplugin.h +++ b/plugins/channelrx/demodam/amdemodplugin.h @@ -36,6 +36,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h index f0f734966..ff21821d9 100644 --- a/plugins/channelrx/demodatv/atvdemod.h +++ b/plugins/channelrx/demodatv/atvdemod.h @@ -192,6 +192,7 @@ public: ATVDemod(DeviceSourceAPI *deviceAPI); ~ATVDemod(); + virtual void destroy() { delete this; } void setScopeSink(BasebandSampleSink* scopeSink) { m_scopeSink = scopeSink; } void configure(MessageQueue* objMessageQueue, @@ -226,6 +227,12 @@ public: virtual int getDeltaFrequency() const { return m_rfRunning.m_intFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = objectName(); } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_rfRunning.m_intFrequencyOffset; } + + virtual QByteArray serialize() const { return QByteArray(); } + virtual bool deserialize(const QByteArray& data __attribute__((unused))) { return false; } void setATVScreen(ATVScreenInterface *objScreen); int getSampleRate(); diff --git a/plugins/channelrx/demodatv/atvdemodplugin.cpp b/plugins/channelrx/demodatv/atvdemodplugin.cpp index ba453aa4f..a8b09ba42 100644 --- a/plugins/channelrx/demodatv/atvdemodplugin.cpp +++ b/plugins/channelrx/demodatv/atvdemodplugin.cpp @@ -78,3 +78,12 @@ BasebandSampleSink* ATVDemodPlugin::createRxChannel(const QString& channelName, } } +void ATVDemodPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == ATVDemod::m_channelIdURI) { + *channelSinkAPI = new ATVDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demodatv/atvdemodplugin.h b/plugins/channelrx/demodatv/atvdemodplugin.h index d6a1fd070..78c38b516 100644 --- a/plugins/channelrx/demodatv/atvdemodplugin.h +++ b/plugins/channelrx/demodatv/atvdemodplugin.h @@ -38,6 +38,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& strChannelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_ptrPluginDescriptor; diff --git a/plugins/channelrx/demodbfm/bfmdemod.cpp b/plugins/channelrx/demodbfm/bfmdemod.cpp index ae91ad8ee..b109cd0e4 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.cpp +++ b/plugins/channelrx/demodbfm/bfmdemod.cpp @@ -469,3 +469,26 @@ void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force) m_settings = settings; } + +QByteArray BFMDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool BFMDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + diff --git a/plugins/channelrx/demodbfm/bfmdemod.h b/plugins/channelrx/demodbfm/bfmdemod.h index c9f321508..333c453ae 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.h +++ b/plugins/channelrx/demodbfm/bfmdemod.h @@ -114,6 +114,7 @@ public: BFMDemod(DeviceSourceAPI *deviceAPI); virtual ~BFMDemod(); + virtual void destroy() { delete this; } void setSampleSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } int getSampleRate() const { return m_settings.m_inputSampleRate; } @@ -125,6 +126,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_magsq; } diff --git a/plugins/channelrx/demodbfm/bfmplugin.cpp b/plugins/channelrx/demodbfm/bfmplugin.cpp index 65a5dafaf..55e20ba04 100644 --- a/plugins/channelrx/demodbfm/bfmplugin.cpp +++ b/plugins/channelrx/demodbfm/bfmplugin.cpp @@ -73,3 +73,13 @@ BasebandSampleSink* BFMPlugin::createRxChannel(const QString& channelName, Devic return 0; } } + +void BFMPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == BFMDemod::m_channelIdURI) { + *channelSinkAPI = new BFMDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demodbfm/bfmplugin.h b/plugins/channelrx/demodbfm/bfmplugin.h index b5175afd2..fda214bad 100644 --- a/plugins/channelrx/demodbfm/bfmplugin.h +++ b/plugins/channelrx/demodbfm/bfmplugin.h @@ -36,6 +36,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index 9e397cd0b..35fc55087 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -468,3 +468,25 @@ void DSDDemod::applySettings(DSDDemodSettings& settings, bool force) m_settings = settings; } + +QByteArray DSDDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool DSDDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index 17de5e585..486e4e31b 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -92,6 +92,7 @@ public: DSDDemod(DeviceSourceAPI *deviceAPI); ~DSDDemod(); + virtual void destroy() { delete this; } void setScopeSink(BasebandSampleSink* sampleSink) { m_scope = sampleSink; } void configureMyPosition(MessageQueue* messageQueue, float myLatitude, float myLongitude); @@ -104,6 +105,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() { return m_magsq; } bool getSquelchOpen() const { return m_squelchOpen; } diff --git a/plugins/channelrx/demoddsd/dsddemodplugin.cpp b/plugins/channelrx/demoddsd/dsddemodplugin.cpp index cc1845442..d78d0c337 100644 --- a/plugins/channelrx/demoddsd/dsddemodplugin.cpp +++ b/plugins/channelrx/demoddsd/dsddemodplugin.cpp @@ -72,3 +72,13 @@ BasebandSampleSink* DSDDemodPlugin::createRxChannel(const QString& channelName, return 0; } } + +void DSDDemodPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == DSDDemod::m_channelIdURI) { + *channelSinkAPI = new DSDDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demoddsd/dsddemodplugin.h b/plugins/channelrx/demoddsd/dsddemodplugin.h index 7e82cc8c4..62a4ba58a 100644 --- a/plugins/channelrx/demoddsd/dsddemodplugin.h +++ b/plugins/channelrx/demoddsd/dsddemodplugin.h @@ -37,6 +37,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/demodlora/lorademod.cpp b/plugins/channelrx/demodlora/lorademod.cpp index 31db66894..5a6c27f0f 100644 --- a/plugins/channelrx/demodlora/lorademod.cpp +++ b/plugins/channelrx/demodlora/lorademod.cpp @@ -358,3 +358,26 @@ bool LoRaDemod::handleMessage(const Message& cmd) } } } + +QByteArray LoRaDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool LoRaDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureLoRaDemod *msg = MsgConfigureLoRaDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureLoRaDemod *msg = MsgConfigureLoRaDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + diff --git a/plugins/channelrx/demodlora/lorademod.h b/plugins/channelrx/demodlora/lorademod.h index 204b04f29..6d677e60e 100644 --- a/plugins/channelrx/demodlora/lorademod.h +++ b/plugins/channelrx/demodlora/lorademod.h @@ -90,6 +90,7 @@ public: LoRaDemod(DeviceSourceAPI* deviceAPI); virtual ~LoRaDemod(); + virtual void destroy() { delete this; } void setSpectrumSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool pO); @@ -100,6 +101,12 @@ public: virtual int getDeltaFrequency() const { return 0; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return 0; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); static const QString m_channelIdURI; static const QString m_channelId; diff --git a/plugins/channelrx/demodlora/loraplugin.cpp b/plugins/channelrx/demodlora/loraplugin.cpp index 3c87a9a8b..228c38ef9 100644 --- a/plugins/channelrx/demodlora/loraplugin.cpp +++ b/plugins/channelrx/demodlora/loraplugin.cpp @@ -54,3 +54,13 @@ BasebandSampleSink* LoRaPlugin::createRxChannel(const QString& channelName, Devi return 0; } } + +void LoRaPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == LoRaDemod::m_channelIdURI) { + *channelSinkAPI = new LoRaDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demodlora/loraplugin.h b/plugins/channelrx/demodlora/loraplugin.h index 9617f0e52..6cc5ac048 100644 --- a/plugins/channelrx/demodlora/loraplugin.h +++ b/plugins/channelrx/demodlora/loraplugin.h @@ -20,6 +20,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index 52839dd12..bc423b920 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -458,6 +458,28 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) m_settings = settings; } +QByteArray NFMDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool NFMDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureNFMDemod *msg = MsgConfigureNFMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureNFMDemod *msg = MsgConfigureNFMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + int NFMDemod::webapiSettingsGet( SWGSDRangel::SWGChannelSettings& response, QString& errorMessage __attribute__((unused))) diff --git a/plugins/channelrx/demodnfm/nfmdemod.h b/plugins/channelrx/demodnfm/nfmdemod.h index 73b6ada11..c44da5850 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.h +++ b/plugins/channelrx/demodnfm/nfmdemod.h @@ -111,6 +111,7 @@ public: NFMDemod(DeviceSourceAPI *deviceAPI); ~NFMDemod(); + virtual void destroy() { delete this; } virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); virtual void start(); @@ -120,6 +121,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); virtual int webapiSettingsGet( SWGSDRangel::SWGChannelSettings& response, diff --git a/plugins/channelrx/demodnfm/nfmplugin.cpp b/plugins/channelrx/demodnfm/nfmplugin.cpp index 842db7945..22642c3d9 100644 --- a/plugins/channelrx/demodnfm/nfmplugin.cpp +++ b/plugins/channelrx/demodnfm/nfmplugin.cpp @@ -63,3 +63,13 @@ BasebandSampleSink* NFMPlugin::createRxChannel(const QString& channelName, Devic return 0; } } + +void NFMPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == NFMDemod::m_channelIdURI) { + *channelSinkAPI = new NFMDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demodnfm/nfmplugin.h b/plugins/channelrx/demodnfm/nfmplugin.h index 3873313b4..3a03a169e 100644 --- a/plugins/channelrx/demodnfm/nfmplugin.h +++ b/plugins/channelrx/demodnfm/nfmplugin.h @@ -20,6 +20,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/demodssb/ssbdemod.cpp b/plugins/channelrx/demodssb/ssbdemod.cpp index b13b1be82..c4c789471 100644 --- a/plugins/channelrx/demodssb/ssbdemod.cpp +++ b/plugins/channelrx/demodssb/ssbdemod.cpp @@ -479,3 +479,24 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) m_settings = settings; } +QByteArray SSBDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool SSBDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channelrx/demodssb/ssbdemod.h b/plugins/channelrx/demodssb/ssbdemod.h index c1ff3e5b4..5eb8b3592 100644 --- a/plugins/channelrx/demodssb/ssbdemod.h +++ b/plugins/channelrx/demodssb/ssbdemod.h @@ -89,6 +89,7 @@ public: SSBDemod(DeviceSourceAPI *deviceAPI); virtual ~SSBDemod(); + virtual void destroy() { delete this; } void setSampleSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } void configure(MessageQueue* messageQueue, @@ -114,6 +115,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_magsq; } bool getAudioActive() const { return m_audioActive; } diff --git a/plugins/channelrx/demodssb/ssbplugin.cpp b/plugins/channelrx/demodssb/ssbplugin.cpp index f4c8009a5..6d574c48d 100644 --- a/plugins/channelrx/demodssb/ssbplugin.cpp +++ b/plugins/channelrx/demodssb/ssbplugin.cpp @@ -55,3 +55,13 @@ BasebandSampleSink* SSBPlugin::createRxChannel(const QString& channelName, Devic return 0; } } + +void SSBPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == SSBDemod::m_channelIdURI) { + *channelSinkAPI = new SSBDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demodssb/ssbplugin.h b/plugins/channelrx/demodssb/ssbplugin.h index accb9a37e..3f2164060 100644 --- a/plugins/channelrx/demodssb/ssbplugin.h +++ b/plugins/channelrx/demodssb/ssbplugin.h @@ -20,6 +20,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/demodwfm/wfmdemod.cpp b/plugins/channelrx/demodwfm/wfmdemod.cpp index 02f23db72..19c074e7f 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.cpp +++ b/plugins/channelrx/demodwfm/wfmdemod.cpp @@ -320,3 +320,26 @@ void WFMDemod::applySettings(const WFMDemodSettings& settings, bool force) m_settings = settings; } + +QByteArray WFMDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool WFMDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + diff --git a/plugins/channelrx/demodwfm/wfmdemod.h b/plugins/channelrx/demodwfm/wfmdemod.h index 2f85aee41..ed47fae83 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.h +++ b/plugins/channelrx/demodwfm/wfmdemod.h @@ -90,6 +90,7 @@ public: WFMDemod(DeviceSourceAPI *deviceAPI); virtual ~WFMDemod(); + virtual void destroy() { delete this; } void setSampleSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); @@ -100,6 +101,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_movingAverage.average(); } bool getSquelchOpen() const { return m_squelchOpen; } diff --git a/plugins/channelrx/demodwfm/wfmplugin.cpp b/plugins/channelrx/demodwfm/wfmplugin.cpp index e8d6e0a4b..ec2dc85d5 100644 --- a/plugins/channelrx/demodwfm/wfmplugin.cpp +++ b/plugins/channelrx/demodwfm/wfmplugin.cpp @@ -55,3 +55,13 @@ BasebandSampleSink* WFMPlugin::createRxChannel(const QString& channelName, Devic return 0; } } + +void WFMPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == WFMDemod::m_channelIdURI) { + *channelSinkAPI = new WFMDemod(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/demodwfm/wfmplugin.h b/plugins/channelrx/demodwfm/wfmplugin.h index c8985db9a..b4faa04c7 100644 --- a/plugins/channelrx/demodwfm/wfmplugin.h +++ b/plugins/channelrx/demodwfm/wfmplugin.h @@ -20,6 +20,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/tcpsrc/tcpsrc.cpp b/plugins/channelrx/tcpsrc/tcpsrc.cpp index 788469176..214159a3f 100644 --- a/plugins/channelrx/tcpsrc/tcpsrc.cpp +++ b/plugins/channelrx/tcpsrc/tcpsrc.cpp @@ -459,3 +459,26 @@ void TCPSrc::onTcpServerError(QAbstractSocket::SocketError socketError __attribu { qDebug("TCPSrc::onTcpServerError: %s", qPrintable(m_tcpServer->errorString())); } + +QByteArray TCPSrc::serialize() const +{ + return m_settings.serialize(); +} + +bool TCPSrc::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureTCPSrc *msg = MsgConfigureTCPSrc::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureTCPSrc *msg = MsgConfigureTCPSrc::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + diff --git a/plugins/channelrx/tcpsrc/tcpsrc.h b/plugins/channelrx/tcpsrc/tcpsrc.h index f11210693..32c20986a 100644 --- a/plugins/channelrx/tcpsrc/tcpsrc.h +++ b/plugins/channelrx/tcpsrc/tcpsrc.h @@ -104,6 +104,7 @@ public: TCPSrc(DeviceSourceAPI* m_deviceAPI); virtual ~TCPSrc(); + virtual void destroy() { delete this; } void setSpectrum(BasebandSampleSink* spectrum) { m_spectrum = spectrum; } void setSpectrum(MessageQueue* messageQueue, bool enabled); @@ -117,6 +118,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); static const QString m_channelIdURI; static const QString m_channelId; diff --git a/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp b/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp index 81e8596d9..88b483c38 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp +++ b/plugins/channelrx/tcpsrc/tcpsrcplugin.cpp @@ -57,3 +57,13 @@ BasebandSampleSink* TCPSrcPlugin::createRxChannel(const QString& channelName, De return 0; } } + +void TCPSrcPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == TCPSrc::m_channelIdURI) { + *channelSinkAPI = new TCPSrc(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/tcpsrc/tcpsrcplugin.h b/plugins/channelrx/tcpsrc/tcpsrcplugin.h index ee0308bf3..236bc9efe 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcplugin.h +++ b/plugins/channelrx/tcpsrc/tcpsrcplugin.h @@ -20,6 +20,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channelrx/udpsrc/udpsrc.cpp b/plugins/channelrx/udpsrc/udpsrc.cpp index 611ff0fa2..13230d3e6 100644 --- a/plugins/channelrx/udpsrc/udpsrc.cpp +++ b/plugins/channelrx/udpsrc/udpsrc.cpp @@ -592,3 +592,25 @@ void UDPSrc::applySettings(const UDPSrcSettings& settings, bool force) m_settings = settings; } + +QByteArray UDPSrc::serialize() const +{ + return m_settings.serialize(); +} + +bool UDPSrc::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureUDPSrc *msg = MsgConfigureUDPSrc::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureUDPSrc *msg = MsgConfigureUDPSrc::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channelrx/udpsrc/udpsrc.h b/plugins/channelrx/udpsrc/udpsrc.h index 9d0faa584..7fc9e7240 100644 --- a/plugins/channelrx/udpsrc/udpsrc.h +++ b/plugins/channelrx/udpsrc/udpsrc.h @@ -94,6 +94,7 @@ public: UDPSrc(DeviceSourceAPI *deviceAPI); virtual ~UDPSrc(); + virtual void destroy() { delete this; } void setSpectrum(BasebandSampleSink* spectrum) { m_spectrum = spectrum; } void setSpectrum(MessageQueue* messageQueue, bool enabled); @@ -109,6 +110,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); static const QString m_channelIdURI; static const QString m_channelId; diff --git a/plugins/channelrx/udpsrc/udpsrcplugin.cpp b/plugins/channelrx/udpsrc/udpsrcplugin.cpp index c5ade4157..c76124e5b 100644 --- a/plugins/channelrx/udpsrc/udpsrcplugin.cpp +++ b/plugins/channelrx/udpsrc/udpsrcplugin.cpp @@ -74,3 +74,13 @@ BasebandSampleSink* UDPSrcPlugin::createRxChannel(const QString& channelName, De return 0; } } + +void UDPSrcPlugin::createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI) +{ + if(channelName == UDPSrc::m_channelIdURI) { + *channelSinkAPI = new UDPSrc(deviceAPI); + } else { + *channelSinkAPI = 0; + } +} + diff --git a/plugins/channelrx/udpsrc/udpsrcplugin.h b/plugins/channelrx/udpsrc/udpsrcplugin.h index 111882cad..3d58f2b82 100644 --- a/plugins/channelrx/udpsrc/udpsrcplugin.h +++ b/plugins/channelrx/udpsrc/udpsrcplugin.h @@ -37,6 +37,7 @@ public: PluginInstanceGUI* createRxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); BasebandSampleSink* createRxChannel(const QString& channelName, DeviceSourceAPI *deviceAPI); + void createRxChannel(ChannelSinkAPI **channelSinkAPI, const QString& channelName, DeviceSourceAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channeltx/modam/ammod.cpp b/plugins/channeltx/modam/ammod.cpp index 996e5d0c6..5abf5c577 100644 --- a/plugins/channeltx/modam/ammod.cpp +++ b/plugins/channeltx/modam/ammod.cpp @@ -436,3 +436,25 @@ void AMMod::applySettings(const AMModSettings& settings, bool force) m_settings = settings; } + +QByteArray AMMod::serialize() const +{ + return m_settings.serialize(); +} + +bool AMMod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureAMMod *msg = MsgConfigureAMMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureAMMod *msg = MsgConfigureAMMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channeltx/modam/ammod.h b/plugins/channeltx/modam/ammod.h index 7f5873c55..392c7b848 100644 --- a/plugins/channeltx/modam/ammod.h +++ b/plugins/channeltx/modam/ammod.h @@ -228,6 +228,7 @@ public: AMMod(DeviceSinkAPI *deviceAPI); ~AMMod(); + virtual void destroy() { delete this; } virtual void pull(Sample& sample); virtual void pullAudio(int nbSamples); @@ -238,6 +239,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_magsq; } diff --git a/plugins/channeltx/modam/ammodplugin.cpp b/plugins/channeltx/modam/ammodplugin.cpp index ea3103d62..280ceea58 100644 --- a/plugins/channeltx/modam/ammodplugin.cpp +++ b/plugins/channeltx/modam/ammodplugin.cpp @@ -71,3 +71,13 @@ BasebandSampleSource* AMModPlugin::createTxChannel(const QString& channelName, D return 0; } } + +void AMModPlugin::createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI) +{ + if(channelName == AMMod::m_channelIdURI) { + *channelSourceAPI = new AMMod(deviceAPI); + } else { + *channelSourceAPI = 0; + } +} + diff --git a/plugins/channeltx/modam/ammodplugin.h b/plugins/channeltx/modam/ammodplugin.h index cdc4aef9a..bfbfeb569 100644 --- a/plugins/channeltx/modam/ammodplugin.h +++ b/plugins/channeltx/modam/ammodplugin.h @@ -36,6 +36,7 @@ public: PluginInstanceGUI* createTxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSource *txChannel); BasebandSampleSource* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + void createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index 92a9bf096..3c5fa3972 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -1121,3 +1121,25 @@ void ATVMod::applySettings(const ATVModSettings& settings, bool force) m_settings = settings; } + +QByteArray ATVMod::serialize() const +{ + return m_settings.serialize(); +} + +bool ATVMod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureATVMod *msg = MsgConfigureATVMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureATVMod *msg = MsgConfigureATVMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h index 83bdf9d6e..0c66fd872 100644 --- a/plugins/channeltx/modatv/atvmod.h +++ b/plugins/channeltx/modatv/atvmod.h @@ -394,6 +394,7 @@ public: ATVMod(DeviceSinkAPI *deviceAPI); ~ATVMod(); + virtual void destroy() { delete this; } virtual void pull(Sample& sample); virtual void pullAudio(int nbSamples); // this is used for video signal actually @@ -404,6 +405,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); int getEffectiveSampleRate() const { return m_tvSampleRate; }; double getMagSq() const { return m_movingAverage.average(); } diff --git a/plugins/channeltx/modatv/atvmodplugin.cpp b/plugins/channeltx/modatv/atvmodplugin.cpp index 5913847c0..ea6558b57 100644 --- a/plugins/channeltx/modatv/atvmodplugin.cpp +++ b/plugins/channeltx/modatv/atvmodplugin.cpp @@ -72,4 +72,14 @@ BasebandSampleSource* ATVModPlugin::createTxChannel(const QString& channelName, } } +void ATVModPlugin::createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI) +{ + if(channelName == ATVMod::m_channelIdURI) { + *channelSourceAPI = new ATVMod(deviceAPI); + } else { + *channelSourceAPI = 0; + } +} + + diff --git a/plugins/channeltx/modatv/atvmodplugin.h b/plugins/channeltx/modatv/atvmodplugin.h index 92f771be4..1afbabd90 100644 --- a/plugins/channeltx/modatv/atvmodplugin.h +++ b/plugins/channeltx/modatv/atvmodplugin.h @@ -36,6 +36,7 @@ public: PluginInstanceGUI* createTxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSource *txChannel); BasebandSampleSource* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + void createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index 803a949a9..64ed1ec8f 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -476,6 +476,28 @@ void NFMMod::applySettings(const NFMModSettings& settings, bool force) m_settings = settings; } +QByteArray NFMMod::serialize() const +{ + return m_settings.serialize(); +} + +bool NFMMod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureNFMMod *msg = MsgConfigureNFMMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureNFMMod *msg = MsgConfigureNFMMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + int NFMMod::webapiSettingsGet( SWGSDRangel::SWGChannelSettings& response, QString& errorMessage __attribute__((unused))) @@ -555,4 +577,3 @@ int NFMMod::webapiSettingsPutPatch( return 200; } - diff --git a/plugins/channeltx/modnfm/nfmmod.h b/plugins/channeltx/modnfm/nfmmod.h index 9d1263dbb..afbab4d3c 100644 --- a/plugins/channeltx/modnfm/nfmmod.h +++ b/plugins/channeltx/modnfm/nfmmod.h @@ -230,6 +230,7 @@ public: NFMMod(DeviceSinkAPI *deviceAPI); ~NFMMod(); + virtual void destroy() { delete this; } virtual void pull(Sample& sample); virtual void pullAudio(int nbSamples); @@ -240,6 +241,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); virtual int webapiSettingsGet( SWGSDRangel::SWGChannelSettings& response, diff --git a/plugins/channeltx/modnfm/nfmmodplugin.cpp b/plugins/channeltx/modnfm/nfmmodplugin.cpp index d60343f2c..f340b8ef0 100644 --- a/plugins/channeltx/modnfm/nfmmodplugin.cpp +++ b/plugins/channeltx/modnfm/nfmmodplugin.cpp @@ -80,3 +80,14 @@ BasebandSampleSource* NFMModPlugin::createTxChannel(const QString& channelName, return 0; } } + +void NFMModPlugin::createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI) +{ + if(channelName == NFMMod::m_channelIdURI) { + *channelSourceAPI = new NFMMod(deviceAPI); + } else { + *channelSourceAPI = 0; + } +} + + diff --git a/plugins/channeltx/modnfm/nfmmodplugin.h b/plugins/channeltx/modnfm/nfmmodplugin.h index ae1c42216..31069654f 100644 --- a/plugins/channeltx/modnfm/nfmmodplugin.h +++ b/plugins/channeltx/modnfm/nfmmodplugin.h @@ -36,6 +36,7 @@ public: PluginInstanceGUI* createTxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSource *rxChannel); BasebandSampleSource* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + void createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index e21822dc1..5f6b3f74e 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -799,3 +799,25 @@ void SSBMod::applySettings(const SSBModSettings& settings, bool force) m_settings = settings; } + +QByteArray SSBMod::serialize() const +{ + return m_settings.serialize(); +} + +bool SSBMod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channeltx/modssb/ssbmod.h b/plugins/channeltx/modssb/ssbmod.h index cdd17af72..b9aefa27b 100644 --- a/plugins/channeltx/modssb/ssbmod.h +++ b/plugins/channeltx/modssb/ssbmod.h @@ -229,6 +229,7 @@ public: SSBMod(DeviceSinkAPI *deviceAPI); ~SSBMod(); + virtual void destroy() { delete this; } void setSpectrumSampleSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } @@ -241,6 +242,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_magsq; } diff --git a/plugins/channeltx/modssb/ssbmodplugin.cpp b/plugins/channeltx/modssb/ssbmodplugin.cpp index f7e9014bb..0150bd5d1 100644 --- a/plugins/channeltx/modssb/ssbmodplugin.cpp +++ b/plugins/channeltx/modssb/ssbmodplugin.cpp @@ -71,3 +71,14 @@ BasebandSampleSource* SSBModPlugin::createTxChannel(const QString& channelName, return 0; } } + +void SSBModPlugin::createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI) +{ + if(channelName == SSBMod::m_channelIdURI) { + *channelSourceAPI = new SSBMod(deviceAPI); + } else { + *channelSourceAPI = 0; + } +} + + diff --git a/plugins/channeltx/modssb/ssbmodplugin.h b/plugins/channeltx/modssb/ssbmodplugin.h index b98962acf..7f6954427 100644 --- a/plugins/channeltx/modssb/ssbmodplugin.h +++ b/plugins/channeltx/modssb/ssbmodplugin.h @@ -36,6 +36,7 @@ public: PluginInstanceGUI* createTxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSource *txChannel); BasebandSampleSource* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + void createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channeltx/modwfm/wfmmod.cpp b/plugins/channeltx/modwfm/wfmmod.cpp index fb7e00e44..0356fb64b 100644 --- a/plugins/channeltx/modwfm/wfmmod.cpp +++ b/plugins/channeltx/modwfm/wfmmod.cpp @@ -479,3 +479,25 @@ void WFMMod::applySettings(const WFMModSettings& settings, bool force) m_settings = settings; } + +QByteArray WFMMod::serialize() const +{ + return m_settings.serialize(); +} + +bool WFMMod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channeltx/modwfm/wfmmod.h b/plugins/channeltx/modwfm/wfmmod.h index 719b76881..8ef1581ee 100644 --- a/plugins/channeltx/modwfm/wfmmod.h +++ b/plugins/channeltx/modwfm/wfmmod.h @@ -229,6 +229,7 @@ public: WFMMod(DeviceSinkAPI *deviceAPI); ~WFMMod(); + virtual void destroy() { delete this; } virtual void pull(Sample& sample); virtual void pullAudio(int nbSamples); @@ -239,6 +240,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_magsq; } diff --git a/plugins/channeltx/modwfm/wfmmodplugin.cpp b/plugins/channeltx/modwfm/wfmmodplugin.cpp index 5d0c381e1..224705daa 100644 --- a/plugins/channeltx/modwfm/wfmmodplugin.cpp +++ b/plugins/channeltx/modwfm/wfmmodplugin.cpp @@ -71,3 +71,14 @@ BasebandSampleSource* WFMModPlugin::createTxChannel(const QString& channelName, return 0; } } + +void WFMModPlugin::createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI) +{ + if(channelName == WFMMod::m_channelIdURI) { + *channelSourceAPI = new WFMMod(deviceAPI); + } else { + *channelSourceAPI = 0; + } +} + + diff --git a/plugins/channeltx/modwfm/wfmmodplugin.h b/plugins/channeltx/modwfm/wfmmodplugin.h index 66c644e8f..78376f0e6 100644 --- a/plugins/channeltx/modwfm/wfmmodplugin.h +++ b/plugins/channeltx/modwfm/wfmmodplugin.h @@ -35,6 +35,7 @@ public: PluginInstanceGUI* createTxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSource *txChannel); BasebandSampleSource* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + void createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/plugins/channeltx/udpsink/udpsink.cpp b/plugins/channeltx/udpsink/udpsink.cpp index bac7a8581..9195994fa 100644 --- a/plugins/channeltx/udpsink/udpsink.cpp +++ b/plugins/channeltx/udpsink/udpsink.cpp @@ -553,3 +553,25 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force) m_settings = settings; } + +QByteArray UDPSink::serialize() const +{ + return m_settings.serialize(); +} + +bool UDPSink::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} diff --git a/plugins/channeltx/udpsink/udpsink.h b/plugins/channeltx/udpsink/udpsink.h index 85379d614..963965b13 100644 --- a/plugins/channeltx/udpsink/udpsink.h +++ b/plugins/channeltx/udpsink/udpsink.h @@ -88,6 +88,7 @@ public: UDPSink(DeviceSinkAPI *deviceAPI); virtual ~UDPSink(); + virtual void destroy() { delete this; } void setSpectrumSink(BasebandSampleSink* spectrum) { m_spectrum = spectrum; } @@ -99,6 +100,12 @@ public: virtual int getDeltaFrequency() const { return m_absoluteFrequencyOffset; } virtual void getIdentifier(QString& id) { id = objectName(); } virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual void setName(const QString& name) { setObjectName(name); } + virtual QString getName() const { return objectName(); } + virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); double getMagSq() const { return m_magsq; } double getInMagSq() const { return m_inMagsq; } diff --git a/plugins/channeltx/udpsink/udpsinkplugin.cpp b/plugins/channeltx/udpsink/udpsinkplugin.cpp index 9ef89696e..ec9d83201 100644 --- a/plugins/channeltx/udpsink/udpsinkplugin.cpp +++ b/plugins/channeltx/udpsink/udpsinkplugin.cpp @@ -73,3 +73,14 @@ BasebandSampleSource* UDPSinkPlugin::createTxChannel(const QString& channelName, return 0; } } + +void UDPSinkPlugin::createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI) +{ + if(channelName == UDPSink::m_channelIdURI) { + *channelSourceAPI = new UDPSink(deviceAPI); + } else { + *channelSourceAPI = 0; + } +} + + diff --git a/plugins/channeltx/udpsink/udpsinkplugin.h b/plugins/channeltx/udpsink/udpsinkplugin.h index 7ee211083..2246c3e8d 100644 --- a/plugins/channeltx/udpsink/udpsinkplugin.h +++ b/plugins/channeltx/udpsink/udpsinkplugin.h @@ -37,6 +37,7 @@ public: PluginInstanceGUI* createTxChannelGUI(const QString& channelName, DeviceUISet *deviceUISet, BasebandSampleSource *txChannel); BasebandSampleSource* createTxChannel(const QString& channelName, DeviceSinkAPI *deviceAPI); + void createTxChannel(ChannelSourceAPI **channelSourceAPI, const QString& channelName, DeviceSinkAPI *deviceAPI); private: static const PluginDescriptor m_pluginDescriptor; diff --git a/sdrbase/channel/channelsinkapi.h b/sdrbase/channel/channelsinkapi.h index ef1df8454..731619c9d 100644 --- a/sdrbase/channel/channelsinkapi.h +++ b/sdrbase/channel/channelsinkapi.h @@ -20,6 +20,7 @@ #define SDRBASE_CHANNEL_CHANNELSINKAPI_H_ #include +#include #include #include "util/export.h" @@ -33,10 +34,17 @@ class SDRANGEL_API ChannelSinkAPI { public: ChannelSinkAPI(); virtual ~ChannelSinkAPI() {} + virtual void destroy() = 0; virtual int getDeltaFrequency() const = 0; virtual void getIdentifier(QString& id) = 0; virtual void getTitle(QString& title) = 0; + virtual void setName(const QString& name) = 0; + virtual QString getName() const = 0; + virtual qint64 getCenterFrequency() const = 0; + + virtual QByteArray serialize() const = 0; + virtual bool deserialize(const QByteArray& data) = 0; virtual int webapiSettingsGet( SWGSDRangel::SWGChannelSettings& response __attribute__((unused)), diff --git a/sdrbase/channel/channelsourceapi.h b/sdrbase/channel/channelsourceapi.h index 383e893f4..8741a72f1 100644 --- a/sdrbase/channel/channelsourceapi.h +++ b/sdrbase/channel/channelsourceapi.h @@ -33,10 +33,17 @@ class SDRANGEL_API ChannelSourceAPI { public: ChannelSourceAPI(); virtual ~ChannelSourceAPI() {} + virtual void destroy() = 0; virtual int getDeltaFrequency() const = 0; virtual void getIdentifier(QString& id) = 0; virtual void getTitle(QString& title) = 0; + virtual void setName(const QString& name) = 0; + virtual QString getName() const = 0; + virtual qint64 getCenterFrequency() const = 0; + + virtual QByteArray serialize() const = 0; + virtual bool deserialize(const QByteArray& data) = 0; virtual int webapiSettingsGet( SWGSDRangel::SWGChannelSettings& response __attribute__((unused)), diff --git a/sdrbase/plugin/plugininterface.h b/sdrbase/plugin/plugininterface.h index 9299f08fb..6c6207327 100644 --- a/sdrbase/plugin/plugininterface.h +++ b/sdrbase/plugin/plugininterface.h @@ -24,6 +24,8 @@ class DeviceSampleSource; class DeviceSampleSink; class BasebandSampleSink; class BasebandSampleSource; +class ChannelSinkAPI; +class ChannelSourceAPI; class PluginInterface { public: @@ -87,6 +89,12 @@ public: DeviceSourceAPI *deviceAPI __attribute__((unused)) ) { return 0; } + virtual void createRxChannel( + ChannelSinkAPI **channelSinkAPI, + const QString& channelName __attribute__((unused)), + DeviceSourceAPI *deviceAPI __attribute__((unused)) ) + { *channelSinkAPI = 0; } + // channel Tx plugins virtual PluginInstanceGUI* createTxChannelGUI( @@ -100,7 +108,13 @@ public: DeviceSinkAPI *deviceAPI __attribute__((unused)) ) { return 0; } - // device source plugins only + virtual void createTxChannel( + ChannelSourceAPI **channelSourceAPI, + const QString& channelName __attribute__((unused)), + DeviceSourceAPI *deviceAPI __attribute__((unused)) ) + { *channelSourceAPI = 0; } + + // device source plugins only virtual SamplingDevices enumSampleSources() { return SamplingDevices(); } diff --git a/sdrbase/resources/index.html b/sdrbase/resources/index.html index 3cf5e0a35..fcccd846f 100644 --- a/sdrbase/resources/index.html +++ b/sdrbase/resources/index.html @@ -695,825 +695,825 @@ margin-bottom: 20px; @@ -1584,6 +1584,9 @@ margin-bottom: 20px;
  • instanceDVSerialPatch
  • +
  • + instanceDelete +
  • instanceDeviceSetsDelete
  • @@ -1646,6 +1649,7 @@ margin-bottom: 20px;

    Limitations:

    • In SDRangel GUI version there is no support for channel deletion. As a consequence the call to the API /sdrangel/deviceset/{deviceSetIndex}/channel/{channelIndex} returns with a status code of 501 (not implemented)
    • +
    • Stopping instance i.e. /sdrangel with DELETE method is a server only feature. It allows stopping the instance nicely.
    • The following channels are not implemented (status 501 is returned): ATV demodulator, Channel Analyzer, Channel Analyzer NG, LoRa demodulator, TCP source
    • The content type returned is always application/json except in the following cases:
        @@ -1951,11 +1955,11 @@ except ApiException as e:
        +
        + + + + +

        Status: 500 - Error

        + + + +
        +
        +
        + +
        + +
        +
        + +

        Status: 501 - Function not implemented

        + + + +
        +
        + + + +
        @@ -8915,11 +9219,11 @@ except ApiException as e:
        @@ -1584,6 +1584,9 @@ margin-bottom: 20px;
      • instanceDVSerialPatch
      • +
      • + instanceDelete +
      • instanceDeviceSetsDelete
      • @@ -1646,6 +1649,7 @@ margin-bottom: 20px;

        Limitations:

        • In SDRangel GUI version there is no support for channel deletion. As a consequence the call to the API /sdrangel/deviceset/{deviceSetIndex}/channel/{channelIndex} returns with a status code of 501 (not implemented)
        • +
        • Stopping instance i.e. /sdrangel with DELETE method is a server only feature. It allows stopping the instance nicely.
        • The following channels are not implemented (status 501 is returned): ATV demodulator, Channel Analyzer, Channel Analyzer NG, LoRa demodulator, TCP source
        • The content type returned is always application/json except in the following cases:
            @@ -1951,11 +1955,11 @@ except ApiException as e:
            +
            + +
        +
        + +

        Status: 500 - Error

        + + + +
        +
        +
        + +
        + +
        +
        + +

        Status: 501 - Function not implemented

        + + + +
        +
        + +
        +
        +
        @@ -8915,11 +9219,11 @@ except ApiException as e: