From 37de6d4bb7709da013b2ecc4327b89ca915f390e Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 6 May 2020 01:38:23 +0200 Subject: [PATCH] REST API: implemented GUI code for /sdrangel/deviceset/{deviceSetIndex}/spectrum/settings (PUT,PATCH) and /sdrangel/deviceset/{deviceSetIndex}/spectrum/server (POST,DELETE) --- sdrbase/dsp/spectrumvis.cpp | 140 ++++++++++++++++++++++++++++- sdrbase/dsp/spectrumvis.h | 12 +++ sdrgui/device/deviceuiset.cpp | 21 ++++- sdrgui/device/deviceuiset.h | 8 ++ sdrgui/gui/glspectrumgui.cpp | 80 +++++++++++------ sdrgui/gui/glspectrumgui.h | 1 + sdrgui/gui/glspectrumgui.ui | 3 + sdrgui/webapi/webapiadaptergui.cpp | 63 +++++++++++++ sdrgui/webapi/webapiadaptergui.h | 17 ++++ 9 files changed, 315 insertions(+), 30 deletions(-) diff --git a/sdrbase/dsp/spectrumvis.cpp b/sdrbase/dsp/spectrumvis.cpp index babb282d2..6f1513976 100644 --- a/sdrbase/dsp/spectrumvis.cpp +++ b/sdrbase/dsp/spectrumvis.cpp @@ -756,8 +756,32 @@ int SpectrumVis::webapiSpectrumSettingsGet(SWGSDRangel::SWGGLSpectrum& response, return 200; } +int SpectrumVis::webapiSpectrumSettingsPutPatch( + bool force, + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response, // query + response + QString& errorMessage) +{ + (void) errorMessage; + GLSpectrumSettings settings = m_settings; + webapiUpdateSpectrumSettings(settings, spectrumSettingsKeys, response); + + MsgConfigureSpectrumVis *msg = MsgConfigureSpectrumVis::create(settings, force); + m_inputMessageQueue.push(msg); + + if (getMessageQueueToGUI()) // forward to GUI if any + { + MsgConfigureSpectrumVis *msgToGUI = MsgConfigureSpectrumVis::create(settings, force); + getMessageQueueToGUI()->push(msgToGUI); + } + + webapiFormatSpectrumSettings(response, settings); + return 200; +} + int SpectrumVis::webapiSpectrumServerGet(SWGSDRangel::SWGSpectrumServer& response, QString& errorMessage) const { + (void) errorMessage; bool serverRunning = m_wsSpectrum.socketOpened(); QList peerHosts; QList peerPorts; @@ -776,6 +800,38 @@ int SpectrumVis::webapiSpectrumServerGet(SWGSDRangel::SWGSpectrumServer& respons response.getClients()->back()->setPort(peerPorts.at(i)); } } + + return 200; +} + +int SpectrumVis::webapiSpectrumServerPost(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage) +{ + (void) errorMessage; + MsgConfigureWSpectrumOpenClose *msg = MsgConfigureWSpectrumOpenClose::create(true); + m_inputMessageQueue.push(msg); + + if (getMessageQueueToGUI()) // forward to GUI if any + { + MsgConfigureWSpectrumOpenClose *msgToGui = MsgConfigureWSpectrumOpenClose::create(true); + getMessageQueueToGUI()->push(msgToGui); + } + + return 200; +} + +int SpectrumVis::webapiSpectrumServerDelete(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage) +{ + (void) errorMessage; + MsgConfigureWSpectrumOpenClose *msg = MsgConfigureWSpectrumOpenClose::create(false); + m_inputMessageQueue.push(msg); + + if (getMessageQueueToGUI()) // forward to GUI if any + { + MsgConfigureWSpectrumOpenClose *msgToGui = MsgConfigureWSpectrumOpenClose::create(false); + getMessageQueueToGUI()->push(msgToGui); + } + + return 200; } void SpectrumVis::webapiFormatSpectrumSettings(SWGSDRangel::SWGGLSpectrum& response, const GLSpectrumSettings& settings) @@ -798,7 +854,7 @@ void SpectrumVis::webapiFormatSpectrumSettings(SWGSDRangel::SWGGLSpectrum& respo response.setDisplayHistogram(settings.m_displayHistogram ? 1 : 0); response.setDisplayGrid(settings.m_displayGrid ? 1 : 0); response.setAveragingMode((int) settings.m_averagingMode); - response.setAveragingValue(settings.m_averagingNb); + response.setAveragingValue(GLSpectrumSettings::getAveragingValue(settings.m_averagingIndex, settings.m_averagingMode)); response.setLinear(settings.m_linear ? 1 : 0); response.setSsb(settings.m_ssb ? 1 : 0); response.setUsb(settings.m_usb ? 1 : 0); @@ -810,3 +866,85 @@ void SpectrumVis::webapiFormatSpectrumSettings(SWGSDRangel::SWGGLSpectrum& respo response.setWsSpectrumAddress(new QString(settings.m_wsSpectrumAddress)); } } + +void SpectrumVis::webapiUpdateSpectrumSettings( + GLSpectrumSettings& settings, + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response) +{ + if (spectrumSettingsKeys.contains("fftSize")) { + settings.m_fftSize = response.getFftSize(); + } + if (spectrumSettingsKeys.contains("fftOverlap")) { + settings.m_fftOverlap = response.getFftOverlap(); + } + if (spectrumSettingsKeys.contains("fftWindow")) { + settings.m_fftWindow = (FFTWindow::Function) response.getFftWindow(); + } + if (spectrumSettingsKeys.contains("refLevel")) { + settings.m_refLevel = response.getRefLevel(); + } + if (spectrumSettingsKeys.contains("powerRange")) { + settings.m_powerRange = response.getPowerRange(); + } + if (spectrumSettingsKeys.contains("decay")) { + settings.m_decay = response.getDecay(); + } + if (spectrumSettingsKeys.contains("decayDivisor")) { + settings.m_decayDivisor = response.getDecayDivisor(); + } + if (spectrumSettingsKeys.contains("histogramStroke")) { + settings.m_histogramStroke = response.getHistogramStroke(); + } + if (spectrumSettingsKeys.contains("displayGridIntensity")) { + settings.m_displayGridIntensity = response.getDisplayGridIntensity(); + } + if (spectrumSettingsKeys.contains("displayTraceIntensity")) { + settings.m_displayTraceIntensity = response.getDisplayTraceIntensity(); + } + if (spectrumSettingsKeys.contains("displayWaterfall")) { + settings.m_displayWaterfall = response.getDisplayWaterfall() != 0; + } + if (spectrumSettingsKeys.contains("invertedWaterfall")) { + settings.m_invertedWaterfall = response.getInvertedWaterfall() != 0; + } + if (spectrumSettingsKeys.contains("waterfallShare")) { + settings.m_waterfallShare = response.getWaterfallShare(); + } + if (spectrumSettingsKeys.contains("displayMaxHold")) { + settings.m_displayMaxHold = response.getDisplayMaxHold() != 0; + } + if (spectrumSettingsKeys.contains("displayCurrent")) { + settings.m_displayCurrent = response.getDisplayCurrent() != 0; + } + if (spectrumSettingsKeys.contains("displayHistogram")) { + settings.m_displayHistogram = response.getDisplayHistogram() != 0; + } + if (spectrumSettingsKeys.contains("displayGrid")) { + settings.m_displayGrid = response.getDisplayGrid() != 0; + } + if (spectrumSettingsKeys.contains("averagingMode")) { + settings.m_averagingMode = (GLSpectrumSettings::AveragingMode) response.getAveragingMode(); + } + if (spectrumSettingsKeys.contains("averagingValue")) + { + qint32 tmp = response.getAveragingValue(); + settings.m_averagingIndex = GLSpectrumSettings::getAveragingIndex(tmp, settings.m_averagingMode); + settings.m_averagingValue = GLSpectrumSettings::getAveragingValue(settings.m_averagingIndex, settings.m_averagingMode); + } + if (spectrumSettingsKeys.contains("linear")) { + settings.m_linear = response.getLinear() != 0; + } + if (spectrumSettingsKeys.contains("ssb")) { + settings.m_ssb = response.getSsb() != 0; + } + if (spectrumSettingsKeys.contains("usb")) { + settings.m_usb = response.getUsb() != 0; + } + if (spectrumSettingsKeys.contains("wsSpectrumAddress")) { + settings.m_wsSpectrumAddress = *response.getWsSpectrumAddress(); + } + if (spectrumSettingsKeys.contains("wsSpectrumPort")) { + settings.m_wsSpectrumPort = response.getWsSpectrumPort(); + } +} \ No newline at end of file diff --git a/sdrbase/dsp/spectrumvis.h b/sdrbase/dsp/spectrumvis.h index f73f5451e..85a443d74 100644 --- a/sdrbase/dsp/spectrumvis.h +++ b/sdrbase/dsp/spectrumvis.h @@ -40,6 +40,7 @@ class MessageQueue; namespace SWGSDRangel { class SWGGLSpectrum; class SWGSpectrumServer; + class SWGSuccessResponse; }; class SDRGUI_API SpectrumVis : public BasebandSampleSink { @@ -111,7 +112,14 @@ public: virtual bool handleMessage(const Message& message); int webapiSpectrumSettingsGet(SWGSDRangel::SWGGLSpectrum& response, QString& errorMessage) const; + int webapiSpectrumSettingsPutPatch( + bool force, + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response, // query + response + QString& errorMessage); int webapiSpectrumServerGet(SWGSDRangel::SWGSpectrumServer& response, QString& errorMessage) const; + int webapiSpectrumServerPost(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage); + int webapiSpectrumServerDelete(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage); private: class MsgConfigureScalingFactor : public Message @@ -185,6 +193,10 @@ private: void handleConfigureWSSpectrum(const QString& address, uint16_t port); static void webapiFormatSpectrumSettings(SWGSDRangel::SWGGLSpectrum& response, const GLSpectrumSettings& settings); + static void webapiUpdateSpectrumSettings( + GLSpectrumSettings& settings, + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response); }; #endif // INCLUDE_SPECTRUMVIS_H diff --git a/sdrgui/device/deviceuiset.cpp b/sdrgui/device/deviceuiset.cpp index c7ff716e7..597235019 100644 --- a/sdrgui/device/deviceuiset.cpp +++ b/sdrgui/device/deviceuiset.cpp @@ -441,7 +441,26 @@ int DeviceUISet::webapiSpectrumSettingsGet(SWGSDRangel::SWGGLSpectrum& response, return m_spectrumVis->webapiSpectrumSettingsGet(response, errorMessage); } +int DeviceUISet::webapiSpectrumSettingsPutPatch( + bool force, + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response, // query + response + QString& errorMessage) +{ + return m_spectrumVis->webapiSpectrumSettingsPutPatch(force, spectrumSettingsKeys, response, errorMessage); +} + int DeviceUISet::webapiSpectrumServerGet(SWGSDRangel::SWGSpectrumServer& response, QString& errorMessage) const { return m_spectrumVis->webapiSpectrumServerGet(response, errorMessage); -} \ No newline at end of file +} + +int DeviceUISet::webapiSpectrumServerPost(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage) +{ + return m_spectrumVis->webapiSpectrumServerPost(response, errorMessage); +} + +int DeviceUISet::webapiSpectrumServerDelete(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage) +{ + return m_spectrumVis->webapiSpectrumServerDelete(response, errorMessage); +} diff --git a/sdrgui/device/deviceuiset.h b/sdrgui/device/deviceuiset.h index 0a156aaf0..2a14ff2aa 100644 --- a/sdrgui/device/deviceuiset.h +++ b/sdrgui/device/deviceuiset.h @@ -40,6 +40,7 @@ class Preset; namespace SWGSDRangel { class SWGGLSpectrum; class SWGSpectrumServer; + class SWGSuccessResponse; }; class SDRGUI_API DeviceUISet @@ -90,7 +91,14 @@ public: // REST API int webapiSpectrumSettingsGet(SWGSDRangel::SWGGLSpectrum& response, QString& errorMessage) const; + int webapiSpectrumSettingsPutPatch( + bool force, + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response, // query + response + QString& errorMessage); int webapiSpectrumServerGet(SWGSDRangel::SWGSpectrumServer& response, QString& errorMessage) const; + int webapiSpectrumServerPost(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage); + int webapiSpectrumServerDelete(SWGSDRangel::SWGSuccessResponse& response, QString& errorMessage); private: struct ChannelInstanceRegistration diff --git a/sdrgui/gui/glspectrumgui.cpp b/sdrgui/gui/glspectrumgui.cpp index 245f3edb7..914b0ade2 100644 --- a/sdrgui/gui/glspectrumgui.cpp +++ b/sdrgui/gui/glspectrumgui.cpp @@ -159,34 +159,8 @@ void GLSpectrumGUI::applySettings() return; } - if (m_glSpectrum) - { - m_glSpectrum->setDisplayWaterfall(m_settings.m_displayWaterfall); - m_glSpectrum->setInvertedWaterfall(m_settings.m_invertedWaterfall); - m_glSpectrum->setDisplayMaxHold(m_settings.m_displayMaxHold); - m_glSpectrum->setDisplayCurrent(m_settings.m_displayCurrent); - m_glSpectrum->setDisplayHistogram(m_settings.m_displayHistogram); - m_glSpectrum->setDecay(m_settings.m_decay); - m_glSpectrum->setDecayDivisor(m_settings.m_decayDivisor); - m_glSpectrum->setHistoStroke(m_settings.m_histogramStroke); - m_glSpectrum->setDisplayGrid(m_settings.m_displayGrid); - m_glSpectrum->setDisplayGridIntensity(m_settings.m_displayGridIntensity); - m_glSpectrum->setDisplayTraceIntensity(m_settings.m_displayTraceIntensity); - - if ((m_settings.m_averagingMode == GLSpectrumSettings::AvgModeFixed) || (m_settings.m_averagingMode == GLSpectrumSettings::AvgModeMax)) { - m_glSpectrum->setTimingRate(getAveragingValue(m_settings.m_averagingIndex, m_settings.m_averagingMode) == 0 ? - 1 : - getAveragingValue(m_settings.m_averagingIndex, m_settings.m_averagingMode)); - } else { - m_glSpectrum->setTimingRate(1); - } - - Real refLevel = m_settings.m_linear ? pow(10.0, m_settings.m_refLevel/10.0) : m_settings.m_refLevel; - Real powerRange = m_settings.m_linear ? pow(10.0, m_settings.m_refLevel/10.0) : m_settings.m_powerRange; - qDebug("GLSpectrumGUI::applySettings: refLevel: %e powerRange: %e", refLevel, powerRange); - m_glSpectrum->setReferenceLevel(refLevel); - m_glSpectrum->setPowerRange(powerRange); - m_glSpectrum->setLinear(m_settings.m_linear); + if (m_glSpectrum) { + applyGLSpectrumSettings(); } if (m_spectrumVis) @@ -196,6 +170,36 @@ void GLSpectrumGUI::applySettings() } } +void GLSpectrumGUI::applyGLSpectrumSettings() +{ + m_glSpectrum->setDisplayWaterfall(m_settings.m_displayWaterfall); + m_glSpectrum->setInvertedWaterfall(m_settings.m_invertedWaterfall); + m_glSpectrum->setDisplayMaxHold(m_settings.m_displayMaxHold); + m_glSpectrum->setDisplayCurrent(m_settings.m_displayCurrent); + m_glSpectrum->setDisplayHistogram(m_settings.m_displayHistogram); + m_glSpectrum->setDecay(m_settings.m_decay); + m_glSpectrum->setDecayDivisor(m_settings.m_decayDivisor); + m_glSpectrum->setHistoStroke(m_settings.m_histogramStroke); + m_glSpectrum->setDisplayGrid(m_settings.m_displayGrid); + m_glSpectrum->setDisplayGridIntensity(m_settings.m_displayGridIntensity); + m_glSpectrum->setDisplayTraceIntensity(m_settings.m_displayTraceIntensity); + + if ((m_settings.m_averagingMode == GLSpectrumSettings::AvgModeFixed) || (m_settings.m_averagingMode == GLSpectrumSettings::AvgModeMax)) { + m_glSpectrum->setTimingRate(getAveragingValue(m_settings.m_averagingIndex, m_settings.m_averagingMode) == 0 ? + 1 : + getAveragingValue(m_settings.m_averagingIndex, m_settings.m_averagingMode)); + } else { + m_glSpectrum->setTimingRate(1); + } + + Real refLevel = m_settings.m_linear ? pow(10.0, m_settings.m_refLevel/10.0) : m_settings.m_refLevel; + Real powerRange = m_settings.m_linear ? pow(10.0, m_settings.m_refLevel/10.0) : m_settings.m_powerRange; + qDebug("GLSpectrumGUI::applySettings: refLevel: %e powerRange: %e", refLevel, powerRange); + m_glSpectrum->setReferenceLevel(refLevel); + m_glSpectrum->setPowerRange(powerRange); + m_glSpectrum->setLinear(m_settings.m_linear); +} + void GLSpectrumGUI::on_fftWindow_currentIndexChanged(int index) { qDebug("GLSpectrumGUI::on_fftWindow_currentIndexChanged: %d", index); @@ -491,6 +495,26 @@ bool GLSpectrumGUI::handleMessage(const Message& message) setAveragingToolitp(); return true; } + else if (SpectrumVis::MsgConfigureSpectrumVis::match(message)) + { + SpectrumVis::MsgConfigureSpectrumVis& cfg = (SpectrumVis::MsgConfigureSpectrumVis&) message; + m_settings = cfg.getSettings(); + displaySettings(); + + if (m_glSpectrum) { + applyGLSpectrumSettings(); + } + + return true; + } + else if (SpectrumVis::MsgConfigureWSpectrumOpenClose::match(message)) + { + SpectrumVis::MsgConfigureWSpectrumOpenClose& notif = (SpectrumVis::MsgConfigureWSpectrumOpenClose&) message; + ui->wsSpectrum->blockSignals(true); + ui->wsSpectrum->doToggle(notif.getOpenClose()); + ui->wsSpectrum->blockSignals(false); + return true; + } return false; } diff --git a/sdrgui/gui/glspectrumgui.h b/sdrgui/gui/glspectrumgui.h index 00eac0725..0954d630c 100644 --- a/sdrgui/gui/glspectrumgui.h +++ b/sdrgui/gui/glspectrumgui.h @@ -70,6 +70,7 @@ private: void blockApplySettings(bool block); void applySettings(); + void applyGLSpectrumSettings(); void displaySettings(); static int getAveragingMaxScale(GLSpectrumSettings::AveragingMode averagingMode); //!< Max power of 10 multiplier to 2,5,10 base ex: 2 -> 2,5,10,20,50,100,200,500,1000 static int getAveragingIndex(int averaging, GLSpectrumSettings::AveragingMode averagingMode); diff --git a/sdrgui/gui/glspectrumgui.ui b/sdrgui/gui/glspectrumgui.ui index ecdf8af3f..4f098600b 100644 --- a/sdrgui/gui/glspectrumgui.ui +++ b/sdrgui/gui/glspectrumgui.ui @@ -719,6 +719,9 @@ :/stream.png + + true + diff --git a/sdrgui/webapi/webapiadaptergui.cpp b/sdrgui/webapi/webapiadaptergui.cpp index cd0f7f3a9..47bd199a1 100644 --- a/sdrgui/webapi/webapiadaptergui.cpp +++ b/sdrgui/webapi/webapiadaptergui.cpp @@ -1434,6 +1434,27 @@ int WebAPIAdapterGUI::devicesetSpectrumSettingsGet( } } +int WebAPIAdapterGUI::devicesetSpectrumSettingsPutPatch( + int deviceSetIndex, + bool force, //!< true to force settings = put else patch + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response, + SWGSDRangel::SWGErrorResponse& error) +{ + if ((deviceSetIndex >= 0) && (deviceSetIndex < (int) m_mainWindow.m_deviceUIs.size())) + { + DeviceUISet *deviceSet = m_mainWindow.m_deviceUIs[deviceSetIndex]; + return deviceSet->webapiSpectrumSettingsPutPatch(force, spectrumSettingsKeys, response, *error.getMessage()); + } + else + { + error.init(); + *error.getMessage() = QString("There is no device set with index %1").arg(deviceSetIndex); + + return 404; + } +} + int WebAPIAdapterGUI::devicesetSpectrumServerGet( int deviceSetIndex, SWGSDRangel::SWGSpectrumServer& response, @@ -1455,6 +1476,48 @@ int WebAPIAdapterGUI::devicesetSpectrumServerGet( } } +int WebAPIAdapterGUI::devicesetSpectrumServerPost( + int deviceSetIndex, + SWGSDRangel::SWGSuccessResponse& response, + SWGSDRangel::SWGErrorResponse& error) +{ + if ((deviceSetIndex >= 0) && (deviceSetIndex < (int) m_mainWindow.m_deviceUIs.size())) + { + DeviceUISet *deviceSet = m_mainWindow.m_deviceUIs[deviceSetIndex]; + deviceSet->webapiSpectrumServerPost(response, *error.getMessage()); + + return 200; + } + else + { + error.init(); + *error.getMessage() = QString("There is no device set with index %1").arg(deviceSetIndex); + + return 404; + } +} + +int WebAPIAdapterGUI::devicesetSpectrumServerDelete( + int deviceSetIndex, + SWGSDRangel::SWGSuccessResponse& response, + SWGSDRangel::SWGErrorResponse& error) +{ + if ((deviceSetIndex >= 0) && (deviceSetIndex < (int) m_mainWindow.m_deviceUIs.size())) + { + DeviceUISet *deviceSet = m_mainWindow.m_deviceUIs[deviceSetIndex]; + deviceSet->webapiSpectrumServerDelete(response, *error.getMessage()); + + return 200; + } + else + { + error.init(); + *error.getMessage() = QString("There is no device set with index %1").arg(deviceSetIndex); + + return 404; + } +} + int WebAPIAdapterGUI::devicesetDevicePut( int deviceSetIndex, SWGSDRangel::SWGDeviceListItem& query, diff --git a/sdrgui/webapi/webapiadaptergui.h b/sdrgui/webapi/webapiadaptergui.h index d41d3016c..ed768bc59 100644 --- a/sdrgui/webapi/webapiadaptergui.h +++ b/sdrgui/webapi/webapiadaptergui.h @@ -217,11 +217,28 @@ public: SWGSDRangel::SWGGLSpectrum& response, SWGSDRangel::SWGErrorResponse& error); + virtual int devicesetSpectrumSettingsPutPatch( + int deviceSetIndex, + bool force, //!< true to force settings = put else patch + const QStringList& spectrumSettingsKeys, + SWGSDRangel::SWGGLSpectrum& response, + SWGSDRangel::SWGErrorResponse& error); + virtual int devicesetSpectrumServerGet( int deviceSetIndex, SWGSDRangel::SWGSpectrumServer& response, SWGSDRangel::SWGErrorResponse& error); + virtual int devicesetSpectrumServerPost( + int deviceSetIndex, + SWGSDRangel::SWGSuccessResponse& response, + SWGSDRangel::SWGErrorResponse& error); + + virtual int devicesetSpectrumServerDelete( + int deviceSetIndex, + SWGSDRangel::SWGSuccessResponse& response, + SWGSDRangel::SWGErrorResponse& error); + virtual int devicesetDevicePut( int deviceSetIndex, SWGSDRangel::SWGDeviceListItem& query,