diff --git a/plugins/channelrx/demodam/CMakeLists.txt b/plugins/channelrx/demodam/CMakeLists.txt index 7ec8181dc..0465d3345 100644 --- a/plugins/channelrx/demodam/CMakeLists.txt +++ b/plugins/channelrx/demodam/CMakeLists.txt @@ -1,5 +1,7 @@ project(am) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(am_SOURCES amdemod.cpp amdemodgui.cpp @@ -21,6 +23,7 @@ set(am_FORMS include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ) #include(${QT_USE_FILE}) diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index a227b37f8..4972e0f58 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -22,12 +22,18 @@ #include #include +#include "SWGChannelSettings.h" +#include "SWGAMDemodSettings.h" +#include "SWGChannelReport.h" +#include "SWGAMDemodReport.h" + #include "dsp/downchannelizer.h" #include "audio/audiooutput.h" #include "dsp/dspengine.h" #include "dsp/threadedbasebandsamplesink.h" #include "dsp/dspcommands.h" #include "device/devicesourceapi.h" +#include "util/db.h" MESSAGE_CLASS_DEFINITION(AMDemod::MsgConfigureAMDemod, Message) MESSAGE_CLASS_DEFINITION(AMDemod::MsgConfigureChannelizer, Message) @@ -313,3 +319,132 @@ bool AMDemod::deserialize(const QByteArray& data) } } +int AMDemod::webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage __attribute__((unused))) +{ + response.setAmDemodSettings(new SWGSDRangel::SWGAMDemodSettings()); + response.getAmDemodSettings()->init(); + webapiFormatChannelSettings(response, m_settings); + return 200; +} + +int AMDemod::webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage __attribute__((unused))) +{ + AMDemodSettings settings = m_settings; + bool frequencyOffsetChanged = false; + + if (channelSettingsKeys.contains("audioMute")) { + settings.m_audioMute = response.getAmDemodSettings()->getAudioMute() != 0; + } + if (channelSettingsKeys.contains("audioSampleRate")) { + settings.m_audioSampleRate = response.getAmDemodSettings()->getAudioSampleRate(); + } + if (channelSettingsKeys.contains("copyAudioToUDP")) { + settings.m_copyAudioToUDP = response.getAmDemodSettings()->getCopyAudioToUdp() != 0; + } + if (channelSettingsKeys.contains("copyAudioUseRTP")) { + settings.m_copyAudioUseRTP = response.getAmDemodSettings()->getCopyAudioUseRtp() != 0; + } + if (channelSettingsKeys.contains("inputFrequencyOffset")) + { + settings.m_inputFrequencyOffset = response.getAmDemodSettings()->getInputFrequencyOffset(); + frequencyOffsetChanged = true; + } + if (channelSettingsKeys.contains("rfBandwidth")) { + settings.m_rfBandwidth = response.getAmDemodSettings()->getRfBandwidth(); + } + if (channelSettingsKeys.contains("rgbColor")) { + settings.m_rgbColor = response.getAmDemodSettings()->getRgbColor(); + } + if (channelSettingsKeys.contains("squelch")) { + settings.m_squelch = response.getAmDemodSettings()->getSquelch(); + } + if (channelSettingsKeys.contains("title")) { + settings.m_title = *response.getAmDemodSettings()->getTitle(); + } + if (channelSettingsKeys.contains("udpAddress")) { + settings.m_udpAddress = *response.getAmDemodSettings()->getUdpAddress(); + } + if (channelSettingsKeys.contains("udpPort")) { + settings.m_udpPort = response.getAmDemodSettings()->getUdpPort(); + } + if (channelSettingsKeys.contains("volume")) { + settings.m_volume = response.getAmDemodSettings()->getVolume(); + } + if (channelSettingsKeys.contains("bandpassEnable")) { + settings.m_bandpassEnable = response.getAmDemodSettings()->getBandpassEnable() != 0; + } + + if (frequencyOffsetChanged) + { + MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create( + 48000, settings.m_inputFrequencyOffset); + m_inputMessageQueue.push(channelConfigMsg); + } + + MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(settings, force); + m_inputMessageQueue.push(msg); + + if (m_guiMessageQueue) // forward to GUI if any + { + MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(settings, force); + m_guiMessageQueue->push(msgToGUI); + } + + webapiFormatChannelSettings(response, settings); + + return 200; +} + +int AMDemod::webapiReportGet( + SWGSDRangel::SWGChannelReport& response, + QString& errorMessage __attribute__((unused))) +{ + response.setAmDemodReport(new SWGSDRangel::SWGAMDemodReport()); + response.getAmDemodReport()->init(); + webapiFormatChannelReport(response); + return 200; +} + +void AMDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const AMDemodSettings& settings) +{ + response.getAmDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0); + response.getAmDemodSettings()->setAudioSampleRate(settings.m_audioSampleRate); + response.getAmDemodSettings()->setCopyAudioToUdp(settings.m_copyAudioToUDP ? 1 : 0); + response.getAmDemodSettings()->setCopyAudioUseRtp(settings.m_copyAudioUseRTP ? 1 : 0); + response.getAmDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset); + response.getAmDemodSettings()->setRfBandwidth(settings.m_rfBandwidth); + response.getAmDemodSettings()->setRgbColor(settings.m_rgbColor); + response.getAmDemodSettings()->setSquelch(settings.m_squelch); + response.getAmDemodSettings()->setUdpPort(settings.m_udpPort); + response.getAmDemodSettings()->setVolume(settings.m_volume); + response.getAmDemodSettings()->setBandpassEnable(settings.m_bandpassEnable ? 1 : 0); + + if (response.getAmDemodSettings()->getTitle()) { + *response.getAmDemodSettings()->getTitle() = settings.m_title; + } else { + response.getAmDemodSettings()->setTitle(new QString(settings.m_title)); + } + + if (response.getAmDemodSettings()->getUdpAddress()) { + *response.getAmDemodSettings()->getUdpAddress() = settings.m_udpAddress; + } else { + response.getAmDemodSettings()->setUdpAddress(new QString(settings.m_udpAddress)); + } +} + +void AMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) +{ + double magsqAvg, magsqPeak; + int nbMagsqSamples; + getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples); + + response.getAmDemodReport()->setChannelPowerDb(CalcDb::dbPower(magsqAvg)); + response.getAmDemodReport()->setSquelch(m_squelchOpen ? 1 : 0); +} + diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index 5fec9042f..06e57d601 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -101,6 +101,20 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); + virtual int webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage); + + virtual int webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage); + + virtual int webapiReportGet( + SWGSDRangel::SWGChannelReport& response, + QString& errorMessage); + double getMagSq() const { return m_magsq; } bool getSquelchOpen() const { return m_squelchOpen; } @@ -162,6 +176,8 @@ private: void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false); void applySettings(const AMDemodSettings& settings, bool force = false); + void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const AMDemodSettings& settings); + void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); void processOneSample(Complex &ci) { diff --git a/plugins/channelrx/demodam/amdemodplugin.cpp b/plugins/channelrx/demodam/amdemodplugin.cpp index 09ae64f70..c3350a6aa 100644 --- a/plugins/channelrx/demodam/amdemodplugin.cpp +++ b/plugins/channelrx/demodam/amdemodplugin.cpp @@ -8,7 +8,7 @@ const PluginDescriptor AMDemodPlugin::m_pluginDescriptor = { QString("AM Demodulator"), - QString("3.12.0"), + QString("3.13.1"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/sdrbase/resources/res.qrc b/sdrbase/resources/res.qrc index 694ecf84a..a601873c7 100644 --- a/sdrbase/resources/res.qrc +++ b/sdrbase/resources/res.qrc @@ -6,6 +6,7 @@ webapi/doc/swagger/include/FileSource.yaml webapi/doc/swagger/include/HackRF.yaml webapi/doc/swagger/include/LimeSdr.yaml + webapi/doc/swagger/include/AMDemod.yaml webapi/doc/swagger/include/NFMDemod.yaml webapi/doc/swagger/include/NFMMod.yaml webapi/doc/swagger/include/RtlSdr.yaml diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 2b183443d..aeb9afb38 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -696,6 +696,72 @@ margin-bottom: 20px;