From 103e86c80be342fd63f7544f33b05204302ae6a9 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 31 Jan 2026 22:01:57 +0100 Subject: [PATCH 1/5] Apply atomic settings to channel Rx plugins part 1. Part of #1329 --- plugins/channelrx/chanalyzer/chanalyzer.cpp | 132 +--- plugins/channelrx/chanalyzer/chanalyzer.h | 17 +- .../chanalyzer/chanalyzerbaseband.cpp | 6 +- .../channelrx/chanalyzer/chanalyzerbaseband.h | 11 +- .../channelrx/chanalyzer/chanalyzergui.cpp | 57 +- plugins/channelrx/chanalyzer/chanalyzergui.h | 2 +- .../chanalyzer/chanalyzersettings.cpp | 174 +++++ .../channelrx/chanalyzer/chanalyzersettings.h | 2 + .../channelrx/chanalyzer/chanalyzersink.cpp | 29 +- plugins/channelrx/chanalyzer/chanalyzersink.h | 2 +- plugins/channelrx/demodais/aisdemod.cpp | 53 +- plugins/channelrx/demodais/aisdemod.h | 15 +- .../channelrx/demodais/aisdemodbaseband.cpp | 12 +- plugins/channelrx/demodais/aisdemodbaseband.h | 11 +- plugins/channelrx/demodais/aisdemodgui.cpp | 43 +- plugins/channelrx/demodais/aisdemodgui.h | 2 +- .../channelrx/demodais/aisdemodsettings.cpp | 154 ++++ plugins/channelrx/demodais/aisdemodsettings.h | 2 + plugins/channelrx/demodais/aisdemodsink.cpp | 19 +- plugins/channelrx/demodais/aisdemodsink.h | 2 +- plugins/channelrx/demodam/amdemod.cpp | 126 +--- plugins/channelrx/demodam/amdemod.h | 17 +- plugins/channelrx/demodam/amdemodbaseband.cpp | 16 +- plugins/channelrx/demodam/amdemodbaseband.h | 11 +- plugins/channelrx/demodam/amdemodgui.cpp | 47 +- plugins/channelrx/demodam/amdemodgui.h | 2 +- plugins/channelrx/demodam/amdemodsettings.cpp | 148 ++++ plugins/channelrx/demodam/amdemodsettings.h | 2 + plugins/channelrx/demodam/amdemodsink.cpp | 35 +- plugins/channelrx/demodam/amdemodsink.h | 2 +- plugins/channelrx/demodapt/aptdemod.cpp | 152 +--- plugins/channelrx/demodapt/aptdemod.h | 15 +- .../channelrx/demodapt/aptdemodbaseband.cpp | 14 +- plugins/channelrx/demodapt/aptdemodbaseband.h | 11 +- plugins/channelrx/demodapt/aptdemodgui.cpp | 76 +- plugins/channelrx/demodapt/aptdemodgui.h | 2 +- .../channelrx/demodapt/aptdemodimageworker.h | 9 +- .../channelrx/demodapt/aptdemodsettings.cpp | 256 +++++++ plugins/channelrx/demodapt/aptdemodsettings.h | 2 + plugins/channelrx/demodapt/aptdemodsink.cpp | 25 +- plugins/channelrx/demodapt/aptdemodsink.h | 2 +- plugins/channelrx/demodatv/atvdemod.cpp | 45 +- plugins/channelrx/demodatv/atvdemod.h | 13 +- .../channelrx/demodatv/atvdemodbaseband.cpp | 10 +- plugins/channelrx/demodatv/atvdemodbaseband.h | 11 +- plugins/channelrx/demodatv/atvdemodgui.cpp | 61 +- plugins/channelrx/demodatv/atvdemodgui.h | 2 +- .../channelrx/demodatv/atvdemodsettings.cpp | 192 +++++ plugins/channelrx/demodatv/atvdemodsettings.h | 2 + plugins/channelrx/demodatv/atvdemodsink.cpp | 46 +- plugins/channelrx/demodatv/atvdemodsink.h | 2 +- plugins/channelrx/demodbfm/bfmdemod.cpp | 107 +-- plugins/channelrx/demodbfm/bfmdemod.h | 17 +- .../channelrx/demodbfm/bfmdemodbaseband.cpp | 18 +- plugins/channelrx/demodbfm/bfmdemodbaseband.h | 11 +- plugins/channelrx/demodbfm/bfmdemodgui.cpp | 42 +- plugins/channelrx/demodbfm/bfmdemodgui.h | 2 +- .../channelrx/demodbfm/bfmdemodsettings.cpp | 144 ++++ plugins/channelrx/demodbfm/bfmdemodsettings.h | 2 + plugins/channelrx/demodbfm/bfmdemodsink.cpp | 30 +- plugins/channelrx/demodbfm/bfmdemodsink.h | 2 +- plugins/channelrx/demoddab/dabdemod.cpp | 51 +- plugins/channelrx/demoddab/dabdemod.h | 15 +- .../channelrx/demoddab/dabdemodbaseband.cpp | 16 +- plugins/channelrx/demoddab/dabdemodbaseband.h | 11 +- plugins/channelrx/demoddab/dabdemodgui.cpp | 33 +- plugins/channelrx/demoddab/dabdemodgui.h | 2 +- .../channelrx/demoddab/dabdemodsettings.cpp | 112 +++ plugins/channelrx/demoddab/dabdemodsettings.h | 2 + plugins/channelrx/demoddab/dabdemodsink.cpp | 11 +- plugins/channelrx/demoddab/dabdemodsink.h | 2 +- plugins/channelrx/demoddatv/datvdemod.cpp | 125 +--- plugins/channelrx/demoddatv/datvdemod.h | 17 +- .../channelrx/demoddatv/datvdemodbaseband.cpp | 21 +- .../channelrx/demoddatv/datvdemodbaseband.h | 11 +- plugins/channelrx/demoddatv/datvdemodgui.cpp | 71 +- plugins/channelrx/demoddatv/datvdemodgui.h | 2 +- .../channelrx/demoddatv/datvdemodsettings.cpp | 223 +++++- .../channelrx/demoddatv/datvdemodsettings.h | 2 + plugins/channelrx/demoddatv/datvdemodsink.cpp | 37 +- plugins/channelrx/demoddatv/datvdemodsink.h | 4 +- plugins/channelrx/demoddsc/dscdemod.cpp | 98 +-- plugins/channelrx/demoddsc/dscdemod.h | 16 +- .../channelrx/demoddsc/dscdemodbaseband.cpp | 15 +- plugins/channelrx/demoddsc/dscdemodbaseband.h | 12 +- plugins/channelrx/demoddsc/dscdemodgui.cpp | 47 +- plugins/channelrx/demoddsc/dscdemodgui.h | 3 +- .../channelrx/demoddsc/dscdemodsettings.cpp | 143 ++++ plugins/channelrx/demoddsc/dscdemodsettings.h | 2 + plugins/channelrx/demoddsc/dscdemodsink.cpp | 17 +- plugins/channelrx/demoddsc/dscdemodsink.h | 3 +- plugins/channelrx/demoddsd/dsddemod.cpp | 142 +--- plugins/channelrx/demoddsd/dsddemod.h | 17 +- .../channelrx/demoddsd/dsddemodbaseband.cpp | 16 +- plugins/channelrx/demoddsd/dsddemodbaseband.h | 11 +- plugins/channelrx/demoddsd/dsddemodgui.cpp | 68 +- plugins/channelrx/demoddsd/dsddemodgui.h | 2 +- .../channelrx/demoddsd/dsddemodsettings.cpp | 203 ++++++ plugins/channelrx/demoddsd/dsddemodsettings.h | 2 + plugins/channelrx/demoddsd/dsddemodsink.cpp | 54 +- plugins/channelrx/demoddsd/dsddemodsink.h | 2 +- plugins/channelrx/demodfreedv/freedvdemod.cpp | 94 +-- plugins/channelrx/demodfreedv/freedvdemod.h | 17 +- .../demodfreedv/freedvdemodbaseband.cpp | 19 +- .../demodfreedv/freedvdemodbaseband.h | 11 +- .../channelrx/demodfreedv/freedvdemodgui.cpp | 35 +- .../channelrx/demodfreedv/freedvdemodgui.h | 2 +- .../demodfreedv/freedvdemodsettings.cpp | 120 ++++ .../demodfreedv/freedvdemodsettings.h | 2 + .../channelrx/demodfreedv/freedvdemodsink.cpp | 30 +- .../channelrx/demodfreedv/freedvdemodsink.h | 2 +- plugins/channelrx/demodft8/ft8demod.cpp | 136 +--- plugins/channelrx/demodft8/ft8demod.h | 20 +- .../channelrx/demodft8/ft8demodbaseband.cpp | 39 +- plugins/channelrx/demodft8/ft8demodbaseband.h | 11 +- plugins/channelrx/demodft8/ft8demodgui.cpp | 37 +- plugins/channelrx/demodft8/ft8demodgui.h | 2 +- .../channelrx/demodft8/ft8demodsettings.cpp | 174 +++++ plugins/channelrx/demodft8/ft8demodsettings.h | 2 + plugins/channelrx/demodft8/ft8demodsink.cpp | 30 +- plugins/channelrx/demodft8/ft8demodsink.h | 3 +- plugins/channelrx/demodils/ilsdemod.cpp | 138 +--- plugins/channelrx/demodils/ilsdemod.h | 16 +- .../channelrx/demodils/ilsdemodbaseband.cpp | 17 +- plugins/channelrx/demodils/ilsdemodbaseband.h | 12 +- plugins/channelrx/demodils/ilsdemodgui.cpp | 76 +- plugins/channelrx/demodils/ilsdemodgui.h | 3 +- .../channelrx/demodils/ilsdemodsettings.cpp | 242 +++++++ plugins/channelrx/demodils/ilsdemodsettings.h | 3 +- plugins/channelrx/demodils/ilsdemodsink.cpp | 25 +- plugins/channelrx/demodils/ilsdemodsink.h | 3 +- plugins/channelrx/demodm17/m17demod.cpp | 19 +- .../channelrx/demodm17/m17demodsettings.cpp | 83 +++ plugins/channelrx/demodm17/m17demodsettings.h | 1 + plugins/channelrx/demodm17/m17demodsink.cpp | 20 +- plugins/channelrx/demodnavtex/navtexdemod.cpp | 96 +-- plugins/channelrx/demodnavtex/navtexdemod.h | 16 +- .../demodnavtex/navtexdemodbaseband.cpp | 15 +- .../demodnavtex/navtexdemodbaseband.h | 12 +- .../channelrx/demodnavtex/navtexdemodgui.cpp | 58 +- .../channelrx/demodnavtex/navtexdemodgui.h | 3 +- .../demodnavtex/navtexdemodsettings.cpp | 156 +++++ .../demodnavtex/navtexdemodsettings.h | 3 +- .../channelrx/demodnavtex/navtexdemodsink.cpp | 18 +- .../channelrx/demodnavtex/navtexdemodsink.h | 3 +- plugins/channelrx/demodnfm/nfmdemod.cpp | 125 +--- plugins/channelrx/demodnfm/nfmdemod.h | 19 +- .../channelrx/demodnfm/nfmdemodbaseband.cpp | 16 +- plugins/channelrx/demodnfm/nfmdemodbaseband.h | 11 +- plugins/channelrx/demodnfm/nfmdemodgui.cpp | 59 +- plugins/channelrx/demodnfm/nfmdemodgui.h | 2 +- .../channelrx/demodnfm/nfmdemodsettings.cpp | 171 +++++ plugins/channelrx/demodnfm/nfmdemodsettings.h | 2 + plugins/channelrx/demodnfm/nfmdemodsink.cpp | 47 +- plugins/channelrx/demodnfm/nfmdemodsink.h | 2 +- plugins/channelrx/demodpacket/packetdemod.cpp | 97 +-- plugins/channelrx/demodpacket/packetdemod.h | 15 +- .../demodpacket/packetdemodbaseband.cpp | 14 +- .../demodpacket/packetdemodbaseband.h | 11 +- .../channelrx/demodpacket/packetdemodgui.cpp | 49 +- .../channelrx/demodpacket/packetdemodgui.h | 2 +- .../demodpacket/packetdemodsettings.cpp | 164 ++++- .../demodpacket/packetdemodsettings.h | 2 + .../channelrx/demodpacket/packetdemodsink.cpp | 17 +- .../channelrx/demodpacket/packetdemodsink.h | 2 +- plugins/channelrx/demodpager/pagerdemod.cpp | 100 +-- plugins/channelrx/demodpager/pagerdemod.h | 15 +- .../demodpager/pagerdemodbaseband.cpp | 14 +- .../channelrx/demodpager/pagerdemodbaseband.h | 11 +- .../channelrx/demodpager/pagerdemodgui.cpp | 60 +- plugins/channelrx/demodpager/pagerdemodgui.h | 2 +- .../demodpager/pagerdemodsettings.cpp | 196 ++++++ .../channelrx/demodpager/pagerdemodsettings.h | 2 + .../channelrx/demodpager/pagerdemodsink.cpp | 22 +- plugins/channelrx/demodpager/pagerdemodsink.h | 2 +- .../demodradiosonde/radiosondedemod.cpp | 100 +-- .../demodradiosonde/radiosondedemod.h | 15 +- .../radiosondedemodbaseband.cpp | 14 +- .../demodradiosonde/radiosondedemodbaseband.h | 11 +- .../demodradiosonde/radiosondedemodgui.cpp | 43 +- .../demodradiosonde/radiosondedemodgui.h | 2 +- .../radiosondedemodsettings.cpp | 167 +++++ .../demodradiosonde/radiosondedemodsettings.h | 2 + .../demodradiosonde/radiosondedemodsink.cpp | 19 +- .../demodradiosonde/radiosondedemodsink.h | 2 +- plugins/channelrx/demodrtty/rttydemod.cpp | 57 +- plugins/channelrx/demodrtty/rttydemod.h | 16 +- .../channelrx/demodrtty/rttydemodbaseband.cpp | 15 +- .../channelrx/demodrtty/rttydemodbaseband.h | 12 +- plugins/channelrx/demodrtty/rttydemodgui.cpp | 66 +- plugins/channelrx/demodrtty/rttydemodgui.h | 3 +- .../channelrx/demodrtty/rttydemodsettings.cpp | 188 +++++ .../channelrx/demodrtty/rttydemodsettings.h | 3 +- plugins/channelrx/demodrtty/rttydemodsink.cpp | 31 +- plugins/channelrx/demodrtty/rttydemodsink.h | 3 +- plugins/channelrx/demodssb/ssbdemod.cpp | 158 +---- plugins/channelrx/demodssb/ssbdemod.h | 17 +- .../channelrx/demodssb/ssbdemodbaseband.cpp | 16 +- plugins/channelrx/demodssb/ssbdemodbaseband.h | 11 +- plugins/channelrx/demodssb/ssbdemodgui.cpp | 65 +- plugins/channelrx/demodssb/ssbdemodgui.h | 2 +- .../channelrx/demodssb/ssbdemodsettings.cpp | 192 +++++ plugins/channelrx/demodssb/ssbdemodsettings.h | 2 + plugins/channelrx/demodssb/ssbdemodsink.cpp | 65 +- plugins/channelrx/demodssb/ssbdemodsink.h | 2 +- plugins/channelrx/demodvor/vordemod.cpp | 99 +-- plugins/channelrx/demodvor/vordemod.h | 17 +- .../channelrx/demodvor/vordemodbaseband.cpp | 16 +- plugins/channelrx/demodvor/vordemodbaseband.h | 11 +- plugins/channelrx/demodvor/vordemodgui.cpp | 32 +- plugins/channelrx/demodvor/vordemodgui.h | 2 +- .../channelrx/demodvor/vordemodsettings.cpp | 133 ++++ plugins/channelrx/demodvor/vordemodsettings.h | 2 + plugins/channelrx/demodvor/vordemodsink.cpp | 27 +- plugins/channelrx/demodvor/vordemodsink.h | 2 +- plugins/channelrx/demodwfm/wfmdemod.cpp | 100 +-- plugins/channelrx/demodwfm/wfmdemod.h | 17 +- .../channelrx/demodwfm/wfmdemodbaseband.cpp | 18 +- plugins/channelrx/demodwfm/wfmdemodbaseband.h | 11 +- plugins/channelrx/demodwfm/wfmdemodgui.cpp | 30 +- plugins/channelrx/demodwfm/wfmdemodgui.h | 2 +- .../channelrx/demodwfm/wfmdemodsettings.cpp | 117 ++++ plugins/channelrx/demodwfm/wfmdemodsettings.h | 2 + plugins/channelrx/demodwfm/wfmdemodsink.cpp | 32 +- plugins/channelrx/demodwfm/wfmdemodsink.h | 2 +- plugins/channelrx/filesink/filesink.cpp | 93 +-- plugins/channelrx/filesink/filesink.h | 17 +- .../channelrx/filesink/filesinkbaseband.cpp | 28 +- plugins/channelrx/filesink/filesinkbaseband.h | 11 +- plugins/channelrx/filesink/filesinkgui.cpp | 46 +- plugins/channelrx/filesink/filesinkgui.h | 2 +- .../channelrx/filesink/filesinksettings.cpp | 125 +++- plugins/channelrx/filesink/filesinksettings.h | 2 + plugins/channelrx/filesink/filesinksink.cpp | 14 +- plugins/channelrx/filesink/filesinksink.h | 2 +- plugins/channelrx/freqtracker/freqtracker.cpp | 126 +--- plugins/channelrx/freqtracker/freqtracker.h | 17 +- .../freqtracker/freqtrackerbaseband.cpp | 16 +- .../freqtracker/freqtrackerbaseband.h | 11 +- .../channelrx/freqtracker/freqtrackergui.cpp | 41 +- .../channelrx/freqtracker/freqtrackergui.h | 2 +- .../freqtracker/freqtrackersettings.cpp | 147 ++++ .../freqtracker/freqtrackersettings.h | 2 + .../channelrx/freqtracker/freqtrackersink.cpp | 47 +- .../channelrx/freqtracker/freqtrackersink.h | 2 +- plugins/channelrx/heatmap/heatmap.cpp | 68 +- plugins/channelrx/heatmap/heatmap.h | 16 +- plugins/channelrx/heatmap/heatmapbaseband.cpp | 18 +- plugins/channelrx/heatmap/heatmapbaseband.h | 12 +- plugins/channelrx/heatmap/heatmapgui.cpp | 77 +- plugins/channelrx/heatmap/heatmapgui.h | 3 +- plugins/channelrx/heatmap/heatmapsettings.cpp | 224 ++++++ plugins/channelrx/heatmap/heatmapsettings.h | 3 +- plugins/channelrx/heatmap/heatmapsink.cpp | 29 +- plugins/channelrx/heatmap/heatmapsink.h | 3 +- plugins/channelrx/noisefigure/noisefigure.cpp | 66 +- plugins/channelrx/noisefigure/noisefigure.h | 15 +- .../noisefigure/noisefigurebaseband.cpp | 12 +- .../noisefigure/noisefigurebaseband.h | 11 +- .../channelrx/noisefigure/noisefiguregui.cpp | 40 +- .../channelrx/noisefigure/noisefiguregui.h | 2 +- .../noisefigure/noisefiguresettings.cpp | 177 +++++ .../noisefigure/noisefiguresettings.h | 2 + .../channelrx/noisefigure/noisefiguresink.cpp | 17 +- .../channelrx/noisefigure/noisefiguresink.h | 2 +- .../radioastronomy/radioastronomysettings.cpp | 661 ++++++++++++++++++ .../radioastronomy/radioastronomysettings.h | 2 + .../radioclock/radioclocksettings.cpp | 115 +++ .../channelrx/radioclock/radioclocksettings.h | 2 + .../remotesink/remotesinksettings.cpp | 114 ++- .../channelrx/remotesink/remotesinksettings.h | 2 + .../sigmffilesink/sigmffilesinksettings.cpp | 133 ++++ .../sigmffilesink/sigmffilesinksettings.h | 2 + plugins/channelrx/udpsink/udpsinksettings.cpp | 176 +++++ plugins/channelrx/udpsink/udpsinksettings.h | 2 + plugins/channelrx/wdsprx/wdsprxsettings.cpp | 393 +++++++++++ plugins/channelrx/wdsprx/wdsprxsettings.h | 2 + sdrbase/CMakeLists.txt | 2 + sdrbase/util/stringlist.cpp | 19 + sdrbase/util/stringlist.h | 13 + 280 files changed, 8736 insertions(+), 3611 deletions(-) create mode 100644 sdrbase/util/stringlist.cpp create mode 100644 sdrbase/util/stringlist.h diff --git a/plugins/channelrx/chanalyzer/chanalyzer.cpp b/plugins/channelrx/chanalyzer/chanalyzer.cpp index d93208eb7..4cd55eb5b 100644 --- a/plugins/channelrx/chanalyzer/chanalyzer.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzer.cpp @@ -56,7 +56,7 @@ ChannelAnalyzer::ChannelAnalyzer(DeviceAPI *deviceAPI) : m_basebandSink = new ChannelAnalyzerBaseband(); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(m_settings, QStringList(), true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -144,7 +144,7 @@ void ChannelAnalyzer::start() m_basebandSink->getInputMessageQueue()->push(dspMsg); ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband *msg = - ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(m_settings, true); + ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(m_settings, QStringList(), true); m_basebandSink->getInputMessageQueue()->push(msg); if (getMessageQueueToGUI()) @@ -169,7 +169,7 @@ bool ChannelAnalyzer::handleMessage(const Message& cmd) qDebug("ChannelAnalyzer::handleMessage: MsgConfigureChannelAnalyzer"); MsgConfigureChannelAnalyzer& cfg = (MsgConfigureChannelAnalyzer&) cmd; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); return true; } @@ -200,98 +200,14 @@ void ChannelAnalyzer::setCenterFrequency(qint64 frequency) { ChannelAnalyzerSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings); + applySettings(settings, QStringList({"inputFrequencyOffset"}), false); } -void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, bool force) +void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) { - qDebug() << "ChannelAnalyzer::applySettings:" - << " m_rationalDownSample: " << settings.m_rationalDownSample - << " m_rationalDownSamplerRate: " << settings.m_rationalDownSamplerRate - << " m_rcc: " << settings.m_rrc - << " m_rrcRolloff: " << settings.m_rrcRolloff / 100.0 - << " m_bandwidth: " << settings.m_bandwidth - << " m_lowCutoff: " << settings.m_lowCutoff - << " m_log2Decim: " << settings.m_log2Decim - << " m_ssb: " << settings.m_ssb - << " m_pll: " << settings.m_pll - << " m_fll: " << settings.m_fll - << " m_costasLoop: " << settings.m_costasLoop - << " m_pllPskOrder: " << settings.m_pllPskOrder - << " m_pllBandwidth: " << settings.m_pllBandwidth - << " m_pllDampingFactor: " << settings.m_pllDampingFactor - << " m_pllLoopGain: " << settings.m_pllLoopGain - << " m_inputType: " << (int) settings.m_inputType - << " m_useReverseAPI:" << settings.m_useReverseAPI - << " m_reverseAPIAddress:" << settings.m_reverseAPIAddress - << " m_reverseAPIPort:" << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex:" << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex:" << settings.m_reverseAPIChannelIndex; + qDebug() << "ChannelAnalyzer::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rationalDownSample != m_settings.m_rationalDownSample) || force) { - reverseAPIKeys.append("rationalDownSample"); - } - if ((settings.m_rationalDownSamplerRate != m_settings.m_rationalDownSamplerRate) || force) { - reverseAPIKeys.append("rationalDownSamplerRate"); - } - if ((settings.m_bandwidth != m_settings.m_bandwidth) || force) { - reverseAPIKeys.append("bandwidth"); - } - if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) { - reverseAPIKeys.append("lowCutoff"); - } - if ((settings.m_log2Decim != m_settings.m_log2Decim) || force) { - reverseAPIKeys.append("log2Decim"); - } - if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) { - reverseAPIKeys.append("lowCutoff"); - } - if ((settings.m_ssb != m_settings.m_ssb) || force) { - reverseAPIKeys.append("ssb"); - } - if ((settings.m_pll != m_settings.m_pll) || force) { - reverseAPIKeys.append("pll"); - } - if ((settings.m_fll != m_settings.m_fll) || force) { - reverseAPIKeys.append("fll"); - } - if ((settings.m_costasLoop != m_settings.m_costasLoop) || force) { - reverseAPIKeys.append("costasLoop"); - } - if ((settings.m_rrc != m_settings.m_rrc) || force) { - reverseAPIKeys.append("rrc"); - } - if ((settings.m_rrcRolloff != m_settings.m_rrcRolloff) || force) { - reverseAPIKeys.append("rrcRolloff"); - } - if ((settings.m_pllPskOrder != m_settings.m_pllPskOrder) || force) { - reverseAPIKeys.append("pllPskOrder"); - } - if ((settings.m_pllBandwidth != m_settings.m_pllBandwidth) || force) { - reverseAPIKeys.append("pllBandwidth"); - } - if ((settings.m_pllDampingFactor != m_settings.m_pllDampingFactor) || force) { - reverseAPIKeys.append("pllDampingFactor"); - } - if ((settings.m_pllLoopGain != m_settings.m_pllLoopGain) || force) { - reverseAPIKeys.append("pllLoopGain"); - } - if ((settings.m_inputType != m_settings.m_inputType) || force) { - reverseAPIKeys.append("inputType"); - } - if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex")) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -302,32 +218,34 @@ void ChannelAnalyzer::applySettings(const ChannelAnalyzerSettings& settings, boo m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband *msg - = ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(settings, force); + = ChannelAnalyzerBaseband::MsgConfigureChannelAnalyzerBaseband::create(settings, settingsKeys, force); m_basebandSink->getInputMessageQueue()->push(msg); if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = settingsKeys.contains("useReverseAPI") + || settingsKeys.contains("reverseAPIAddress") + || settingsKeys.contains("reverseAPIPort") + || settingsKeys.contains("reverseAPIDeviceIndex") + || settingsKeys.contains("reverseAPIChannelIndex"); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int ChannelAnalyzer::webapiSettingsGet( @@ -360,13 +278,13 @@ int ChannelAnalyzer::webapiSettingsPutPatch( ChannelAnalyzerSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureChannelAnalyzer *msg = MsgConfigureChannelAnalyzer::create(settings, force); + MsgConfigureChannelAnalyzer *msg = MsgConfigureChannelAnalyzer::create(settings, channelSettingsKeys, force); m_inputMessageQueue.push(msg); qDebug("ChannelAnalyzer::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureChannelAnalyzer *msgToGUI = MsgConfigureChannelAnalyzer::create(settings, force); + MsgConfigureChannelAnalyzer *msgToGUI = MsgConfigureChannelAnalyzer::create(settings, channelSettingsKeys, force); m_guiMessageQueue->push(msgToGUI); } @@ -570,7 +488,7 @@ void ChannelAnalyzer::webapiFormatChannelSettings( } void ChannelAnalyzer::webapiReverseSendSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force ) @@ -600,7 +518,7 @@ void ChannelAnalyzer::webapiReverseSendSettings( void ChannelAnalyzer::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force) { @@ -624,7 +542,7 @@ void ChannelAnalyzer::sendChannelSettings( } void ChannelAnalyzer::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const ChannelAnalyzerSettings& settings, bool force diff --git a/plugins/channelrx/chanalyzer/chanalyzer.h b/plugins/channelrx/chanalyzer/chanalyzer.h index f38e2f03f..831ec78cc 100644 --- a/plugins/channelrx/chanalyzer/chanalyzer.h +++ b/plugins/channelrx/chanalyzer/chanalyzer.h @@ -47,19 +47,22 @@ public: public: const ChannelAnalyzerSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureChannelAnalyzer* create(const ChannelAnalyzerSettings& settings, bool force) { - return new MsgConfigureChannelAnalyzer(settings, force); + static MsgConfigureChannelAnalyzer* create(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) { + return new MsgConfigureChannelAnalyzer(settings, settingsKeys, force); } private: ChannelAnalyzerSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureChannelAnalyzer(const ChannelAnalyzerSettings& settings, bool force) : + MsgConfigureChannelAnalyzer(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -149,16 +152,16 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const ChannelAnalyzerSettings& settings, bool force = false); - void webapiReverseSendSettings(QList& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force); + void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const ChannelAnalyzerSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const ChannelAnalyzerSettings& settings, bool force diff --git a/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp b/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp index 3344411f4..8169228b6 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzerbaseband.cpp @@ -125,7 +125,7 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd) MsgConfigureChannelAnalyzerBaseband& cfg = (MsgConfigureChannelAnalyzerBaseband&) cmd; qDebug() << "ChannelAnalyzerBaseband::handleMessage: MsgConfigureChannelAnalyzerBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); return true; } @@ -148,7 +148,7 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd) } } -void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, bool force) +void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) { if ((settings.m_log2Decim != m_settings.m_log2Decim) || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) @@ -160,7 +160,7 @@ void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& setti m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settings, settingsKeys, force); m_settings = settings; } diff --git a/plugins/channelrx/chanalyzer/chanalyzerbaseband.h b/plugins/channelrx/chanalyzer/chanalyzerbaseband.h index b90d5f8e5..1bc17870a 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerbaseband.h +++ b/plugins/channelrx/chanalyzer/chanalyzerbaseband.h @@ -39,20 +39,23 @@ public: public: const ChannelAnalyzerSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureChannelAnalyzerBaseband* create(const ChannelAnalyzerSettings& settings, bool force) + static MsgConfigureChannelAnalyzerBaseband* create(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) { - return new MsgConfigureChannelAnalyzerBaseband(settings, force); + return new MsgConfigureChannelAnalyzerBaseband(settings, settingsKeys, force); } private: ChannelAnalyzerSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureChannelAnalyzerBaseband(const ChannelAnalyzerSettings& settings, bool force) : + MsgConfigureChannelAnalyzerBaseband(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -85,7 +88,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const ChannelAnalyzerSettings& settings, bool force = false); + void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/chanalyzer/chanalyzergui.cpp b/plugins/channelrx/chanalyzer/chanalyzergui.cpp index 26b15643d..9d8653b6e 100644 --- a/plugins/channelrx/chanalyzer/chanalyzergui.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzergui.cpp @@ -226,14 +226,14 @@ bool ChannelAnalyzerGUI::deserialize(const QByteArray& data) if (m_settings.deserialize(data)) { displaySettings(); - applySettings(true); // will have true + applySettings(QStringList(), true); // will have true return true; } else { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); // will have true + applySettings(QStringList(), true); // will have true return false; } } @@ -291,7 +291,7 @@ void ChannelAnalyzerGUI::channelMarkerChangedByCursor() ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void ChannelAnalyzerGUI::channelMarkerHighlightedByCursor() @@ -324,7 +324,7 @@ void ChannelAnalyzerGUI::on_rationalDownSamplerRate_changed(quint64 value) { m_settings.m_rationalDownSamplerRate = value; setSinkSampleRate(); - applySettings(); + applySettings(QStringList({"rationalDownSamplerRate"})); } void ChannelAnalyzerGUI::on_pll_toggled(bool checked) @@ -335,7 +335,7 @@ void ChannelAnalyzerGUI::on_pll_toggled(bool checked) m_settings.m_pll = checked; setPLLVisibility(); - applySettings(); + applySettings(QStringList({"pll"})); } void ChannelAnalyzerGUI::on_pllType_currentIndexChanged(int index) @@ -343,7 +343,7 @@ void ChannelAnalyzerGUI::on_pllType_currentIndexChanged(int index) m_settings.m_fll = (index == 1); m_settings.m_costasLoop = (index == 2); setPLLVisibility(); - applySettings(); + applySettings(QStringList({"fll", "costasLoop"})); } void ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged(int index) @@ -352,7 +352,7 @@ void ChannelAnalyzerGUI::on_pllPskOrder_currentIndexChanged(int index) m_settings.m_pllPskOrder = (1<<(index+1)); else m_settings.m_pllPskOrder = (1<pllBandwidthText->setText(bandwidthStr); - applySettings(); + applySettings(QStringList({"pllBandwidth"})); } void ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged(int value) @@ -368,7 +368,7 @@ void ChannelAnalyzerGUI::on_pllDampingFactor_valueChanged(int value) m_settings.m_pllDampingFactor = value/10.0; QString factorStr = QString::number(m_settings.m_pllDampingFactor, 'f', 1); ui->pllDampingFactorText->setText(factorStr); - applySettings(); + applySettings(QStringList({"pllDampingFactor"})); } void ChannelAnalyzerGUI::on_pllLoopGain_valueChanged(int value) @@ -376,14 +376,14 @@ void ChannelAnalyzerGUI::on_pllLoopGain_valueChanged(int value) m_settings.m_pllLoopGain = value; QString gainStr = QString::number(m_settings.m_pllLoopGain, 'f', 0); ui->pllLoopGainText->setText(gainStr); - applySettings(); + applySettings(QStringList({"pllLoopGain"})); } void ChannelAnalyzerGUI::on_useRationalDownsampler_toggled(bool checked) { m_settings.m_rationalDownSample = checked; setSinkSampleRate(); - applySettings(); + applySettings(QStringList({"rationalDownSample"})); } void ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged(int index) @@ -397,7 +397,7 @@ void ChannelAnalyzerGUI::on_signalSelect_currentIndexChanged(int index) } ui->scopeGUI->traceLengthChange(); - applySettings(); + applySettings(QStringList({"inputType"})); } void ChannelAnalyzerGUI::on_deltaFrequency_changed(qint64 value) @@ -405,13 +405,13 @@ void ChannelAnalyzerGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void ChannelAnalyzerGUI::on_rrcFilter_toggled(bool checked) { m_settings.m_rrc = checked; - applySettings(); + applySettings(QStringList({"rrc"})); } void ChannelAnalyzerGUI::on_rrcRolloff_valueChanged(int value) @@ -419,7 +419,7 @@ void ChannelAnalyzerGUI::on_rrcRolloff_valueChanged(int value) m_settings.m_rrcRolloff = value; QString rolloffStr = QString::number(value/100.0, 'f', 2); ui->rrcRolloffText->setText(rolloffStr); - applySettings(); + applySettings(QStringList({"rrcRolloff"})); } void ChannelAnalyzerGUI::on_BW_valueChanged(int value) @@ -428,7 +428,7 @@ void ChannelAnalyzerGUI::on_BW_valueChanged(int value) setFiltersUIBoundaries(); m_settings.m_bandwidth = ui->BW->value() * 100; m_settings.m_lowCutoff = ui->lowCut->value() * 100; - applySettings(); + applySettings(QStringList({"bandwidth", "lowCutoff"})); } void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value) @@ -437,7 +437,7 @@ void ChannelAnalyzerGUI::on_lowCut_valueChanged(int value) setFiltersUIBoundaries(); m_settings.m_bandwidth = ui->BW->value() * 100; m_settings.m_lowCutoff = ui->lowCut->value() * 100; - applySettings(); + applySettings(QStringList({"bandwidth", "lowCutoff"})); } void ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged(int index) @@ -448,7 +448,7 @@ void ChannelAnalyzerGUI::on_log2Decim_currentIndexChanged(int index) m_settings.m_log2Decim = index; setSinkSampleRate(); - applySettings(); + applySettings(QStringList({"log2Decim"})); } void ChannelAnalyzerGUI::on_ssb_toggled(bool checked) @@ -460,7 +460,7 @@ void ChannelAnalyzerGUI::on_ssb_toggled(bool checked) ui->BWLabel->setText("BP"); } setFiltersUIBoundaries(); - applySettings(); + applySettings(QStringList({"ssb"})); } void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -469,7 +469,7 @@ void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList({"rollupState"})); } void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p) @@ -514,7 +514,16 @@ void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -596,7 +605,7 @@ ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *device displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); // will have true DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -704,12 +713,12 @@ void ChannelAnalyzerGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void ChannelAnalyzerGUI::applySettings(bool force) +void ChannelAnalyzerGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { ChannelAnalyzer::MsgConfigureChannelAnalyzer* message = - ChannelAnalyzer::MsgConfigureChannelAnalyzer::create( m_settings, force); + ChannelAnalyzer::MsgConfigureChannelAnalyzer::create( m_settings, settingsKeys, force); m_channelAnalyzer->getInputMessageQueue()->push(message); } } diff --git a/plugins/channelrx/chanalyzer/chanalyzergui.h b/plugins/channelrx/chanalyzer/chanalyzergui.h index 1a09c69fe..b9dc95e89 100644 --- a/plugins/channelrx/chanalyzer/chanalyzergui.h +++ b/plugins/channelrx/chanalyzer/chanalyzergui.h @@ -92,7 +92,7 @@ private: void setFiltersUIBoundaries(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displayPLLSettings(); void setPLLVisibility(); diff --git a/plugins/channelrx/chanalyzer/chanalyzersettings.cpp b/plugins/channelrx/chanalyzer/chanalyzersettings.cpp index 73d35315c..fa2691b5c 100644 --- a/plugins/channelrx/chanalyzer/chanalyzersettings.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzersettings.cpp @@ -196,3 +196,177 @@ bool ChannelAnalyzerSettings::deserialize(const QByteArray& data) return false; } } + +void ChannelAnalyzerSettings::applySettings(const QStringList& settingsKeys, const ChannelAnalyzerSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rationalDownSample")) { + m_rationalDownSample = settings.m_rationalDownSample; + } + if (settingsKeys.contains("rationalDownSamplerRate")) { + m_rationalDownSamplerRate = settings.m_rationalDownSamplerRate; + } + if (settingsKeys.contains("bandwidth")) { + m_bandwidth = settings.m_bandwidth; + } + if (settingsKeys.contains("lowCutoff")) { + m_lowCutoff = settings.m_lowCutoff; + } + if (settingsKeys.contains("log2Decim")) { + m_log2Decim = settings.m_log2Decim; + } + if (settingsKeys.contains("ssb")) { + m_ssb = settings.m_ssb; + } + if (settingsKeys.contains("pll")) { + m_pll = settings.m_pll; + } + if (settingsKeys.contains("fll")) { + m_fll = settings.m_fll; + } + if (settingsKeys.contains("costasLoop")) { + m_costasLoop = settings.m_costasLoop; + } + if (settingsKeys.contains("rrc")) { + m_rrc = settings.m_rrc; + } + if (settingsKeys.contains("rrcRolloff")) { + m_rrcRolloff = settings.m_rrcRolloff; + } + if (settingsKeys.contains("pllPskOrder")) { + m_pllPskOrder = settings.m_pllPskOrder; + } + if (settingsKeys.contains("pllBandwidth")) { + m_pllBandwidth = settings.m_pllBandwidth; + } + if (settingsKeys.contains("pllDampingFactor")) { + m_pllDampingFactor = settings.m_pllDampingFactor; + } + if (settingsKeys.contains("pllLoopGain")) { + m_pllLoopGain = settings.m_pllLoopGain; + } + if (settingsKeys.contains("inputType")) { + m_inputType = settings.m_inputType; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString ChannelAnalyzerSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rationalDownSample") || force) { + ostr << " m_rationalDownSample: " << m_rationalDownSample; + } + if (settingsKeys.contains("rationalDownSamplerRate") || force) { + ostr << " m_rationalDownSamplerRate: " << m_rationalDownSamplerRate; + } + if (settingsKeys.contains("bandwidth") || force) { + ostr << " m_bandwidth: " << m_bandwidth; + } + if (settingsKeys.contains("lowCutoff") || force) { + ostr << " m_lowCutoff: " << m_lowCutoff; + } + if (settingsKeys.contains("log2Decim") || force) { + ostr << " m_log2Decim: " << m_log2Decim; + } + if (settingsKeys.contains("ssb") || force) { + ostr << " m_ssb: " << m_ssb; + } + if (settingsKeys.contains("pll") || force) { + ostr << " m_pll: " << m_pll; + } + if (settingsKeys.contains("fll") || force) { + ostr << " m_fll: " << m_fll; + } + if (settingsKeys.contains("costasLoop") || force) { + ostr << " m_costasLoop: " << m_costasLoop; + } + if (settingsKeys.contains("rrc") || force) { + ostr << " m_rrc: " << m_rrc; + } + if (settingsKeys.contains("rrcRolloff") || force) { + ostr << " m_rrcRolloff: " << m_rrcRolloff; + } + if (settingsKeys.contains("pllPskOrder") || force) { + ostr << " m_pllPskOrder: " << m_pllPskOrder; + } + if (settingsKeys.contains("pllBandwidth") || force) { + ostr << " m_pllBandwidth: " << m_pllBandwidth; + } + if (settingsKeys.contains("pllDampingFactor") || force) { + ostr << " m_pllDampingFactor: " << m_pllDampingFactor; + } + if (settingsKeys.contains("pllLoopGain") || force) { + ostr << " m_pllLoopGain: " << m_pllLoopGain; + } + if (settingsKeys.contains("inputType") || force) { + ostr << " m_inputType: " << m_inputType; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/chanalyzer/chanalyzersettings.h b/plugins/channelrx/chanalyzer/chanalyzersettings.h index 379fe179e..8512bf77e 100644 --- a/plugins/channelrx/chanalyzer/chanalyzersettings.h +++ b/plugins/channelrx/chanalyzer/chanalyzersettings.h @@ -75,6 +75,8 @@ struct ChannelAnalyzerSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const ChannelAnalyzerSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channelrx/chanalyzer/chanalyzersink.cpp b/plugins/channelrx/chanalyzer/chanalyzersink.cpp index 20e08ddf7..fe25b1c65 100644 --- a/plugins/channelrx/chanalyzer/chanalyzersink.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzersink.cpp @@ -45,7 +45,7 @@ ChannelAnalyzerSink::ChannelAnalyzerSink() : m_costasLoop.computeCoefficients(m_settings.m_pllBandwidth); applyChannelSettings(m_channelSampleRate, m_sinkSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); + applySettings(m_settings, QStringList(), true); } ChannelAnalyzerSink::~ChannelAnalyzerSink() @@ -243,26 +243,9 @@ void ChannelAnalyzerSink::setFilters(int sampleRate, float bandwidth, float lowC RRCFilter->create_rrc_filter(bandwidth / sampleRate, m_settings.m_rrcRolloff / 100.0); } -void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, bool force) +void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force) { - qDebug() << "ChannelAnalyzerSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rcc: " << settings.m_rrc - << " m_rrcRolloff: " << settings.m_rrcRolloff / 100.0 - << " m_bandwidth: " << settings.m_bandwidth - << " m_lowCutoff: " << settings.m_lowCutoff - << " m_log2Decim: " << settings.m_log2Decim - << " m_rationalDownSample: " << settings.m_rationalDownSample - << " m_rationalDownSamplerRate: " << settings.m_rationalDownSamplerRate - << " m_ssb: " << settings.m_ssb - << " m_pll: " << settings.m_pll - << " m_fll: " << settings.m_fll - << " m_costasLoop: " << settings.m_costasLoop - << " m_pllPskOrder: " << settings.m_pllPskOrder - << " m_pllBandwidth: " << settings.m_pllBandwidth - << " m_pllDampingFactor: " << settings.m_pllDampingFactor - << " m_pllLoopGain: " << settings.m_pllLoopGain - << " m_inputType: " << (int) settings.m_inputType; + qDebug() << "ChannelAnalyzerSink::applySettings:" << settings.getDebugString(settingsKeys, force); bool doApplySampleRate = false; if ((settings.m_bandwidth != m_settings.m_bandwidth) || @@ -331,7 +314,11 @@ void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings, } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } qDebug() << "ChannelAnalyzerSink::applySettings:" << " m_rationalDownSample: " << settings.m_rationalDownSample; diff --git a/plugins/channelrx/chanalyzer/chanalyzersink.h b/plugins/channelrx/chanalyzer/chanalyzersink.h index 5850cb00f..8e8a72f19 100644 --- a/plugins/channelrx/chanalyzer/chanalyzersink.h +++ b/plugins/channelrx/chanalyzer/chanalyzersink.h @@ -43,7 +43,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int sinkSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const ChannelAnalyzerSettings& settings, bool force = false); + void applySettings(const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force = false); double getMagSq() const { return m_magsq; } double getMagSqAvg() const { return (double) m_channelPowerAvg; } diff --git a/plugins/channelrx/demodais/aisdemod.cpp b/plugins/channelrx/demodais/aisdemod.cpp index 762ad94f5..ac55bb14d 100644 --- a/plugins/channelrx/demodais/aisdemod.cpp +++ b/plugins/channelrx/demodais/aisdemod.cpp @@ -54,7 +54,7 @@ AISDemod::AISDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(m_settings, QStringList(), true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -128,7 +128,7 @@ void AISDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(m_settings, true); + AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(m_settings, QStringList(), true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -146,7 +146,7 @@ bool AISDemod::handleMessage(const Message& cmd) { MsgConfigureAISDemod& cfg = (MsgConfigureAISDemod&) cmd; qDebug() << "AISDemod::handleMessage: MsgConfigureAISDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); return true; } @@ -251,27 +251,18 @@ void AISDemod::setCenterFrequency(qint64 frequency) { AISDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(settings, QStringList({"inputFrequencyOffset"}), false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, false); + MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, QStringList({"inputFrequencyOffset"}), false); m_guiMessageQueue->push(msgToGUI); } } -void AISDemod::applySettings(const AISDemodSettings& settings, bool force) +void AISDemod::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) { - qDebug() << "AISDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "AISDemod::applySettings:" << settings.getDebugString(settingsKeys, force); QList reverseAPIKeys; @@ -311,7 +302,8 @@ void AISDemod::applySettings(const AISDemodSettings& settings, bool force) if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) { reverseAPIKeys.append("useFileTime"); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + + if (settingsKeys.contains("streamIndex")) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -326,17 +318,18 @@ void AISDemod::applySettings(const AISDemodSettings& settings, bool force) reverseAPIKeys.append("streamIndex"); } - AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(settings, force); + AISDemodBaseband::MsgConfigureAISDemodBaseband *msg = AISDemodBaseband::MsgConfigureAISDemodBaseband::create(settings, settingsKeys, force); m_basebandSink->getInputMessageQueue()->push(msg); if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = settingsKeys.contains("useReverseAPI") || + settingsKeys.contains("reverseAPIAddress") || + settingsKeys.contains("reverseAPIPort") || + settingsKeys.contains("reverseAPIDeviceIndex") || + settingsKeys.contains("reverseAPIChannelIndex") || + settingsKeys.contains("reverseAPIChannelType"); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } if ((settings.m_logEnabled != m_settings.m_logEnabled) @@ -381,14 +374,14 @@ bool AISDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, true); + MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, QStringList(), true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, true); + MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(m_settings, QStringList(), true); m_inputMessageQueue.push(msg); return false; } @@ -443,13 +436,13 @@ int AISDemod::webapiSettingsPutPatch( AISDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(settings, force); + MsgConfigureAISDemod *msg = MsgConfigureAISDemod::create(settings, channelSettingsKeys, force); m_inputMessageQueue.push(msg); qDebug("AISDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, force); + MsgConfigureAISDemod *msgToGUI = MsgConfigureAISDemod::create(settings, channelSettingsKeys, force); m_guiMessageQueue->push(msgToGUI); } @@ -612,7 +605,7 @@ void AISDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp } } -void AISDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const AISDemodSettings& settings, bool force) +void AISDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const AISDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -638,7 +631,7 @@ void AISDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co } void AISDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const AISDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodais/aisdemod.h b/plugins/channelrx/demodais/aisdemod.h index 009f3be1c..85174b033 100644 --- a/plugins/channelrx/demodais/aisdemod.h +++ b/plugins/channelrx/demodais/aisdemod.h @@ -52,20 +52,23 @@ public: public: const AISDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAISDemod* create(const AISDemodSettings& settings, bool force) + static MsgConfigureAISDemod* create(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) { - return new MsgConfigureAISDemod(settings, force); + return new MsgConfigureAISDemod(settings, settingsKeys, force); } private: AISDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAISDemod(const AISDemodSettings& settings, bool force) : + MsgConfigureAISDemod(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -184,11 +187,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const AISDemodSettings& settings, bool force = false); + void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const AISDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const AISDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const AISDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodais/aisdemodbaseband.cpp b/plugins/channelrx/demodais/aisdemodbaseband.cpp index edd29f7e1..6f57c20fa 100644 --- a/plugins/channelrx/demodais/aisdemodbaseband.cpp +++ b/plugins/channelrx/demodais/aisdemodbaseband.cpp @@ -136,7 +136,7 @@ bool AISDemodBaseband::handleMessage(const Message& cmd) MsgConfigureAISDemodBaseband& cfg = (MsgConfigureAISDemodBaseband&) cmd; qDebug() << "AISDemodBaseband::handleMessage: MsgConfigureAISDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); return true; } @@ -156,7 +156,7 @@ bool AISDemodBaseband::handleMessage(const Message& cmd) } } -void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool force) +void AISDemodBaseband::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) { if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { @@ -164,9 +164,13 @@ void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool forc m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settings, settingsKeys, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void AISDemodBaseband::setBasebandSampleRate(int sampleRate) diff --git a/plugins/channelrx/demodais/aisdemodbaseband.h b/plugins/channelrx/demodais/aisdemodbaseband.h index e6df1dee1..34a84b8e4 100644 --- a/plugins/channelrx/demodais/aisdemodbaseband.h +++ b/plugins/channelrx/demodais/aisdemodbaseband.h @@ -44,20 +44,23 @@ public: public: const AISDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAISDemodBaseband* create(const AISDemodSettings& settings, bool force) + static MsgConfigureAISDemodBaseband* create(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) { - return new MsgConfigureAISDemodBaseband(settings, force); + return new MsgConfigureAISDemodBaseband(settings, settingsKeys, force); } private: AISDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAISDemodBaseband(const AISDemodSettings& settings, bool force) : + MsgConfigureAISDemodBaseband(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -92,7 +95,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(AISDemodSink *sink); - void applySettings(const AISDemodSettings& settings, bool force = false); + void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodais/aisdemodgui.cpp b/plugins/channelrx/demodais/aisdemodgui.cpp index d21b89189..37b76143f 100644 --- a/plugins/channelrx/demodais/aisdemodgui.cpp +++ b/plugins/channelrx/demodais/aisdemodgui.cpp @@ -132,7 +132,7 @@ void AISDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray AISDemodGUI::serialize() const @@ -144,7 +144,7 @@ bool AISDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -548,7 +548,7 @@ void AISDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void AISDemodGUI::channelMarkerHighlightedByCursor() @@ -561,7 +561,7 @@ void AISDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void AISDemodGUI::on_rfBW_valueChanged(int value) @@ -570,28 +570,28 @@ void AISDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void AISDemodGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 100.0; - applySettings(); + applySettings(QStringList({"fmDeviation"})); } void AISDemodGUI::on_threshold_valueChanged(int value) { ui->thresholdText->setText(QString("%1").arg(value)); m_settings.m_correlationThreshold = value; - applySettings(); + applySettings(QStringList({"correlationThreshold"})); } void AISDemodGUI::on_filterMMSI_editingFinished() { m_settings.m_filterMMSI = ui->filterMMSI->text(); filter(); - applySettings(); + applySettings(QStringList({"filterMMSI"})); } void AISDemodGUI::on_clearTable_clicked() @@ -602,25 +602,25 @@ void AISDemodGUI::on_clearTable_clicked() void AISDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList({"udpEnabled"})); } void AISDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList({"udpAddress"})); } void AISDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList({"udpPort"})); } void AISDemodGUI::on_udpFormat_currentIndexChanged(int value) { m_settings.m_udpFormat = (AISDemodSettings::UDPFormat)value; - applySettings(); + applySettings(QStringList({"udpFormat"})); } void AISDemodGUI::on_messages_cellDoubleClicked(int row, int column) @@ -662,7 +662,7 @@ void AISDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void AISDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -707,7 +707,8 @@ void AISDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -831,7 +832,7 @@ AISDemodGUI::AISDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -864,11 +865,11 @@ void AISDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void AISDemodGUI::applySettings(bool force) +void AISDemodGUI::applySettings(const QStringList& settingsKeys, const bool force) { if (m_doApplySettings) { - AISDemod::MsgConfigureAISDemod* message = AISDemod::MsgConfigureAISDemod::create( m_settings, force); + AISDemod::MsgConfigureAISDemod* message = AISDemod::MsgConfigureAISDemod::create( m_settings, settingsKeys, force); m_aisDemod->getInputMessageQueue()->push(message); } } @@ -973,13 +974,13 @@ void AISDemodGUI::on_showSlotMap_clicked(bool checked) { ui->slotMapWidget->setVisible(checked); m_settings.m_showSlotMap = checked; - applySettings(); + applySettings(QStringList({"showSlotMap"})); } void AISDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList({"logEnabled"})); } void AISDemodGUI::on_logFilename_clicked() @@ -995,7 +996,7 @@ void AISDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList({"logFilename"})); } } } @@ -1092,7 +1093,7 @@ void AISDemodGUI::on_logOpen_clicked() void AISDemodGUI::on_useFileTime_toggled(bool checked) { m_settings.m_useFileTime = checked; - applySettings(); + applySettings(QStringList({"useFileTime"})); } void AISDemodGUI::makeUIConnections() diff --git a/plugins/channelrx/demodais/aisdemodgui.h b/plugins/channelrx/demodais/aisdemodgui.h index 738d904cc..ff198dd64 100644 --- a/plugins/channelrx/demodais/aisdemodgui.h +++ b/plugins/channelrx/demodais/aisdemodgui.h @@ -113,7 +113,7 @@ private: virtual ~AISDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void messageReceived(const QByteArray& message, const QDateTime& dateTime, int slot, int slots); bool handleMessage(const Message& message); diff --git a/plugins/channelrx/demodais/aisdemodsettings.cpp b/plugins/channelrx/demodais/aisdemodsettings.cpp index 9821d500e..5a505fdad 100644 --- a/plugins/channelrx/demodais/aisdemodsettings.cpp +++ b/plugins/channelrx/demodais/aisdemodsettings.cpp @@ -211,4 +211,158 @@ bool AISDemodSettings::deserialize(const QByteArray& data) } } +void AISDemodSettings::applySettings(const QStringList& settingsKeys, const AISDemodSettings& settings) +{ + if (settingsKeys.contains("baud")) { + m_baud = settings.m_baud; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("correlationThreshold")) { + m_correlationThreshold = settings.m_correlationThreshold; + } + if (settingsKeys.contains("filterMMSI")) { + m_filterMMSI = settings.m_filterMMSI; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("udpFormat")) { + m_udpFormat = settings.m_udpFormat; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("showSlotMap")) { + m_showSlotMap = settings.m_showSlotMap; + } + if (settingsKeys.contains("useFileTime")) { + m_useFileTime = settings.m_useFileTime; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString AISDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("baud") || force) { + ostr << " m_baud: " << m_baud; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("correlationThreshold") || force) { + ostr << " m_correlationThreshold: " << m_correlationThreshold; + } + if (settingsKeys.contains("filterMMSI") || force) { + ostr << " m_filterMMSI: " << m_filterMMSI.toStdString(); + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("udpFormat") || force) { + ostr << " m_udpFormat: " << m_udpFormat; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("showSlotMap") || force) { + ostr << " m_showSlotMap: " << m_showSlotMap; + } + if (settingsKeys.contains("useFileTime") || force) { + ostr << " m_useFileTime: " << m_useFileTime; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodais/aisdemodsettings.h b/plugins/channelrx/demodais/aisdemodsettings.h index e9572ae05..17f9c1499 100644 --- a/plugins/channelrx/demodais/aisdemodsettings.h +++ b/plugins/channelrx/demodais/aisdemodsettings.h @@ -80,6 +80,8 @@ struct AISDemodSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const AISDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_AISDEMODSETTINGS_H */ diff --git a/plugins/channelrx/demodais/aisdemodsink.cpp b/plugins/channelrx/demodais/aisdemodsink.cpp index 9d8b5411e..92a8c6b2b 100644 --- a/plugins/channelrx/demodais/aisdemodsink.cpp +++ b/plugins/channelrx/demodais/aisdemodsink.cpp @@ -50,7 +50,7 @@ AISDemodSink::AISDemodSink(AISDemod *aisDemod) : m_sampleBuffer[i].resize(m_sampleBufferSize); } - applySettings(m_settings, true); + applySettings(m_settings, QStringList(), true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -398,23 +398,22 @@ void AISDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque qDebug() << "AISDemodSink::applyChannelSettings: m_samplesPerSymbol: " << m_samplesPerSymbol; } -void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force) +void AISDemodSink::applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force) { - qDebug() << "AISDemodSink::applySettings:" - << " force: " << force; + qDebug() << "AISDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth")) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) + if ((settingsKeys.contains("fmDeviation")) || force) { m_phaseDiscri.setFMScaling(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation)); } - if ((settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("baud")) || force) { m_samplesPerSymbol = AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud; qDebug() << "AISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud; @@ -447,5 +446,9 @@ void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodais/aisdemodsink.h b/plugins/channelrx/demodais/aisdemodsink.h index aec5f10a0..c540af694 100644 --- a/plugins/channelrx/demodais/aisdemodsink.h +++ b/plugins/channelrx/demodais/aisdemodsink.h @@ -52,7 +52,7 @@ public: void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const AISDemodSettings& settings, bool force = false); + void applySettings(const AISDemodSettings& settings, const QStringList& settingsKeys, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index 55388ea49..073fac7b6 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -60,7 +60,7 @@ AMDemod::AMDemod(DeviceAPI *deviceAPI) : m_lastTs(0) { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -140,7 +140,7 @@ void AMDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(m_settings, true); + AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -164,7 +164,7 @@ bool AMDemod::handleMessage(const Message& cmd) { MsgConfigureAMDemod& cfg = (MsgConfigureAMDemod&) cmd; qDebug() << "AMDemod::handleMessage: MsgConfigureAMDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -205,92 +205,20 @@ void AMDemod::setCenterFrequency(qint64 frequency) { AMDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(settings, false); + MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void AMDemod::applySettings(const AMDemodSettings& settings, bool force) +void AMDemod::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) { - qDebug() << "AMDemod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_bandpassEnable: " << settings.m_bandpassEnable - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_pll: " << settings.m_pll - << " m_syncAMOperation: " << (int) settings.m_syncAMOperation - << " m_frequencyMode: " << settings.m_frequencyMode - << " m_frequency: " << settings.m_frequency - << " m_snap: " << settings.m_snap - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "AMDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((m_settings.m_afBandwidth != settings.m_afBandwidth) || force) { - reverseAPIKeys.append("afBandwidth"); - } - if ((m_settings.m_bandpassEnable != settings.m_bandpassEnable) || force) { - reverseAPIKeys.append("bandpassEnable"); - } - if ((m_settings.m_squelch != settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - - if ((m_settings.m_pll != settings.m_pll) || force) - { - reverseAPIKeys.append("pll"); - reverseAPIKeys.append("syncAMOperation"); - } - - if ((m_settings.m_syncAMOperation != settings.m_syncAMOperation) || force) - { - reverseAPIKeys.append("pll"); - reverseAPIKeys.append("syncAMOperation"); - } - - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - - if ((m_settings.m_audioMute != settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - - if ((m_settings.m_volume != settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - - if ((m_settings.m_frequencyMode != settings.m_frequencyMode) || force) { - reverseAPIKeys.append("frequencyMode"); - } - if ((m_settings.m_frequency != settings.m_frequency) || force) { - reverseAPIKeys.append("frequency"); - } - if ((m_settings.m_snap != settings.m_snap) || force) { - reverseAPIKeys.append("snap"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex")) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -301,34 +229,36 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(settings, force); + AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = (settingsKeys.contains("useReverseAPI")) || + (settingsKeys.contains("reverseAPIAddress")) || + (settingsKeys.contains("reverseAPIPort")) || + (settingsKeys.contains("reverseAPIDeviceIndex")) || + (settingsKeys.contains("reverseAPIChannelIndex")); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray AMDemod::serialize() const @@ -340,14 +270,14 @@ bool AMDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true); + MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(m_settings, true); + MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -402,13 +332,13 @@ int AMDemod::webapiSettingsPutPatch( AMDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(settings, force); + MsgConfigureAMDemod *msg = MsgConfigureAMDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("AMDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(settings, force); + MsgConfigureAMDemod *msgToGUI = MsgConfigureAMDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -598,7 +528,7 @@ void AMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getAmDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void AMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const AMDemodSettings& settings, bool force) +void AMDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const AMDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -625,7 +555,7 @@ void AMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, con void AMDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const AMDemodSettings& settings, bool force) { @@ -649,7 +579,7 @@ void AMDemod::sendChannelSettings( } void AMDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const AMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index 64ade14b3..99e97fd2e 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -46,20 +46,23 @@ public: public: const AMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAMDemod* create(const AMDemodSettings& settings, bool force) + static MsgConfigureAMDemod* create(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) { - return new MsgConfigureAMDemod(settings, force); + return new MsgConfigureAMDemod(settingsKeys, settings, force); } private: AMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAMDemod(const AMDemodSettings& settings, bool force) : + MsgConfigureAMDemod(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -159,18 +162,18 @@ private: qint64 m_lastTs; virtual bool handleMessage(const Message& cmd); - void applySettings(const AMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const AMDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const AMDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const AMDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const AMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodam/amdemodbaseband.cpp b/plugins/channelrx/demodam/amdemodbaseband.cpp index 6eb256498..9fbce447c 100644 --- a/plugins/channelrx/demodam/amdemodbaseband.cpp +++ b/plugins/channelrx/demodam/amdemodbaseband.cpp @@ -137,7 +137,7 @@ bool AMDemodBaseband::handleMessage(const Message& cmd) MsgConfigureAMDemodBaseband& cfg = (MsgConfigureAMDemodBaseband&) cmd; qDebug() << "AMDemodBaseband::handleMessage: MsgConfigureAMDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -164,9 +164,9 @@ bool AMDemodBaseband::handleMessage(const Message& cmd) } } -void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force) +void AMDemodBaseband::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset")) || force) { m_channelizer.setChannelization(m_sink.getAudioSampleRate(), settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset()); @@ -178,7 +178,7 @@ void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force) } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName")) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -195,9 +195,13 @@ void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force) } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int AMDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodam/amdemodbaseband.h b/plugins/channelrx/demodam/amdemodbaseband.h index 9663513e9..322f98158 100644 --- a/plugins/channelrx/demodam/amdemodbaseband.h +++ b/plugins/channelrx/demodam/amdemodbaseband.h @@ -40,20 +40,23 @@ public: public: const AMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAMDemodBaseband* create(const AMDemodSettings& settings, bool force) + static MsgConfigureAMDemodBaseband* create(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) { - return new MsgConfigureAMDemodBaseband(settings, force); + return new MsgConfigureAMDemodBaseband(settingsKeys, settings, force); } private: AMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAMDemodBaseband(const AMDemodSettings& settings, bool force) : + MsgConfigureAMDemodBaseband(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const AMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodam/amdemodgui.cpp b/plugins/channelrx/demodam/amdemodgui.cpp index 2f0c0b7da..12169ffd3 100644 --- a/plugins/channelrx/demodam/amdemodgui.cpp +++ b/plugins/channelrx/demodam/amdemodgui.cpp @@ -55,7 +55,7 @@ void AMDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray AMDemodGUI::serialize() const @@ -67,7 +67,7 @@ bool AMDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -237,7 +237,7 @@ void AMDemodGUI::on_frequencyMode_currentIndexChanged(int index) } updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("frequencyMode")); } // Calculate input frequency offset, when device center frequency changes @@ -253,7 +253,7 @@ void AMDemodGUI::calcOffset() m_channelMarker.setCenterFrequency(offset); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -285,7 +285,7 @@ void AMDemodGUI::channelMarkerChangedByCursor() ui->deltaFrequency->blockSignals(false); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset", "frequency"})); } void AMDemodGUI::on_deltaFrequency_changed(qint64 value) @@ -316,7 +316,7 @@ void AMDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(offset); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"frequency", "inputFrequencyOffset"})); } void AMDemodGUI::on_pll_toggled(bool checked) @@ -328,19 +328,19 @@ void AMDemodGUI::on_pll_toggled(bool checked) } m_settings.m_pll = checked; - applySettings(); + applySettings(QStringList("pll")); } void AMDemodGUI::on_ssb_toggled(bool checked) { m_settings.m_syncAMOperation = checked ? m_samUSB ? AMDemodSettings::SyncAMUSB : AMDemodSettings::SyncAMLSB : AMDemodSettings::SyncAMDSB; - applySettings(); + applySettings(QStringList("syncAMOperation")); } void AMDemodGUI::on_bandpassEnable_toggled(bool checked) { m_settings.m_bandpassEnable = checked; - applySettings(); + applySettings(QStringList("bandpassEnable")); } void AMDemodGUI::on_rfBW_valueChanged(int value) @@ -349,34 +349,34 @@ void AMDemodGUI::on_rfBW_valueChanged(int value) m_channelMarker.setBandwidth(value * 100); m_settings.m_rfBandwidth = value * 100; ui->afBW->setMaximum(value); - applySettings(); + applySettings(QStringList("rfBandwidth")); } void AMDemodGUI::on_afBW_valueChanged(int value) { ui->afBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1)); m_settings.m_afBandwidth = value * 100; - applySettings(); + applySettings(QStringList("afBandwidth")); } void AMDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volume = value / 10.0; - applySettings(); + applySettings(QStringList("volume")); } void AMDemodGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1 dB").arg(value)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList("squelch")); } void AMDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void AMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -389,7 +389,7 @@ void AMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) */ getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void AMDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -434,7 +434,10 @@ void AMDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", + "reverseAPIAddress", "reverseAPIPort", + "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); @@ -507,7 +510,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -521,11 +524,11 @@ void AMDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void AMDemodGUI::applySettings(bool force) +void AMDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - AMDemod::MsgConfigureAMDemod* message = AMDemod::MsgConfigureAMDemod::create( m_settings, force); + AMDemod::MsgConfigureAMDemod* message = AMDemod::MsgConfigureAMDemod::create(settingsKeys, m_settings, force); m_amDemod->getInputMessageQueue()->push(message); } } @@ -626,7 +629,7 @@ void AMDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -646,7 +649,7 @@ void AMDemodGUI::samSSBSelect(const QPoint& p) if (m_settings.m_syncAMOperation != AMDemodSettings::SyncAMDSB) { m_settings.m_syncAMOperation = m_samUSB ? AMDemodSettings::SyncAMUSB : AMDemodSettings::SyncAMLSB; - applySettings(); + applySettings(QStringList("syncAMOperation")); } } } @@ -685,7 +688,7 @@ void AMDemodGUI::snapClicked() } displaySnap(); - applySettings(); + applySettings(QStringList({"snap"})); } void AMDemodGUI::applySnap() diff --git a/plugins/channelrx/demodam/amdemodgui.h b/plugins/channelrx/demodam/amdemodgui.h index 95710ce83..e298a5a6f 100644 --- a/plugins/channelrx/demodam/amdemodgui.h +++ b/plugins/channelrx/demodam/amdemodgui.h @@ -92,7 +92,7 @@ private: virtual ~AMDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channelrx/demodam/amdemodsettings.cpp b/plugins/channelrx/demodam/amdemodsettings.cpp index d9dc2f9a1..57285ad01 100644 --- a/plugins/channelrx/demodam/amdemodsettings.cpp +++ b/plugins/channelrx/demodam/amdemodsettings.cpp @@ -178,4 +178,152 @@ bool AMDemodSettings::deserialize(const QByteArray& data) } } +void AMDemodSettings::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("bandpassEnable")) { + m_bandpassEnable = settings.m_bandpassEnable; + } + if (settingsKeys.contains("afBandwidth")) { + m_afBandwidth = settings.m_afBandwidth; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("pll")) { + m_pll = settings.m_pll; + } + if (settingsKeys.contains("syncAMOperation")) { + m_syncAMOperation = settings.m_syncAMOperation; + } + if (settingsKeys.contains("frequencyMode")) { + m_frequencyMode = settings.m_frequencyMode; + } + if (settingsKeys.contains("frequency")) { + m_frequency = settings.m_frequency; + } + if (settingsKeys.contains("snap")) { + m_snap = settings.m_snap; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString AMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("bandpassEnable") || force) { + ostr << " m_bandpassEnable: " << m_bandpassEnable; + } + if (settingsKeys.contains("afBandwidth") || force) { + ostr << " m_afBandwidth: " << m_afBandwidth; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("pll") || force) { + ostr << " m_pll: " << m_pll; + } + if (settingsKeys.contains("syncAMOperation") || force) { + ostr << " m_syncAMOperation: " << m_syncAMOperation; + } + if (settingsKeys.contains("frequencyMode") || force) { + ostr << " m_frequencyMode: " << m_frequencyMode; + } + if (settingsKeys.contains("frequency") || force) { + ostr << " m_frequency: " << m_frequency; + } + if (settingsKeys.contains("snap") || force) { + ostr << " m_snap: " << m_snap; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodam/amdemodsettings.h b/plugins/channelrx/demodam/amdemodsettings.h index 52f43884b..da7fa11fc 100644 --- a/plugins/channelrx/demodam/amdemodsettings.h +++ b/plugins/channelrx/demodam/amdemodsettings.h @@ -74,6 +74,8 @@ struct AMDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channelrx/demodam/amdemodsink.cpp b/plugins/channelrx/demodam/amdemodsink.cpp index c8d5f30c5..a86fbd9fc 100644 --- a/plugins/channelrx/demodam/amdemodsink.cpp +++ b/plugins/channelrx/demodam/amdemodsink.cpp @@ -60,7 +60,7 @@ AMDemodSink::AMDemodSink() : m_pll.computeCoefficients(0.05, 0.707, 1000); m_syncAMBuffIndex = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -264,24 +264,13 @@ void AMDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequen m_channelFrequencyOffset = channelFrequencyOffset; } -void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force) +void AMDemodSink::applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force) { - qDebug() << "AMDemodSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_bandpassEnable: " << settings.m_bandpassEnable - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_pll: " << settings.m_pll - << " m_syncAMOperation: " << (int) settings.m_syncAMOperation - << " force: " << force; + qDebug() << "AMDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || - (m_settings.m_bandpassEnable != settings.m_bandpassEnable) || - (m_settings.m_afBandwidth != settings.m_afBandwidth) || force) + if((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || + (settingsKeys.contains("bandpassEnable") && (settings.m_bandpassEnable != m_settings.m_bandpassEnable)) || + (settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2f); m_interpolatorDistanceRemain = 0; @@ -291,11 +280,11 @@ void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force) DSBFilter->create_dsb_filter((2.0f * settings.m_rfBandwidth) / (float) m_audioSampleRate); } - if ((m_settings.m_squelch != settings.m_squelch) || force) { + if ((settingsKeys.contains("squelch") && (m_settings.m_squelch != settings.m_squelch)) || force) { m_squelchLevel = CalcDb::powerFromdB(settings.m_squelch); } - if ((m_settings.m_pll != settings.m_pll) || force) + if ((settingsKeys.contains("pll") && (m_settings.m_pll != settings.m_pll)) || force) { if (settings.m_pll) { @@ -308,11 +297,15 @@ void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force) } } - if ((m_settings.m_syncAMOperation != settings.m_syncAMOperation) || force) { + if ((settingsKeys.contains("syncAMOperation") && (m_settings.m_syncAMOperation != settings.m_syncAMOperation)) || force) { m_syncAMBuffIndex = 0; } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void AMDemodSink::applyAudioSampleRate(int sampleRate) diff --git a/plugins/channelrx/demodam/amdemodsink.h b/plugins/channelrx/demodam/amdemodsink.h index d768e4c35..5059da770 100644 --- a/plugins/channelrx/demodam/amdemodsink.h +++ b/plugins/channelrx/demodam/amdemodsink.h @@ -43,7 +43,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const AMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AMDemodSettings& settings, bool force = false); void applyAudioSampleRate(int sampleRate); int getAudioSampleRate() const { return m_audioSampleRate; } diff --git a/plugins/channelrx/demodapt/aptdemod.cpp b/plugins/channelrx/demodapt/aptdemod.cpp index 693c6da8d..1f9692ca6 100644 --- a/plugins/channelrx/demodapt/aptdemod.cpp +++ b/plugins/channelrx/demodapt/aptdemod.cpp @@ -62,7 +62,7 @@ APTDemod::APTDemod(DeviceAPI *deviceAPI) : m_basebandSink->setImagWorkerMessageQueue(m_imageWorker->getInputMessageQueue()); m_imageWorker->moveToThread(&m_imageThread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -149,7 +149,7 @@ void APTDemod::startBasebandSink() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(m_settings, true); + APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -161,7 +161,7 @@ void APTDemod::startImageWorker() m_imageWorker->startWork(); m_imageThread.start(); - APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msg = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(m_settings, true); + APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msg = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(QStringList(), m_settings, true); m_imageWorker->getInputMessageQueue()->push(msg); } @@ -202,7 +202,7 @@ bool APTDemod::handleMessage(const Message& cmd) { MsgConfigureAPTDemod& cfg = (MsgConfigureAPTDemod&) cmd; qDebug() << "APTDemod::handleMessage: MsgConfigureAPTDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -239,116 +239,20 @@ void APTDemod::setCenterFrequency(qint64 frequency) { APTDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList({"inputFrequencyOffset"}), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(settings, false); + MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(QStringList({"inputFrequencyOffset"}), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void APTDemod::applySettings(const APTDemodSettings& settings, bool force) +void APTDemod::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) { - qDebug() << "APTDemod::applySettings:" - << " m_cropNoise: " << settings.m_cropNoise - << " m_denoise: " << settings.m_denoise - << " m_linearEqualise: " << settings.m_linearEqualise - << " m_histogramEqualise: " << settings.m_histogramEqualise - << " m_precipitationOverlay: " << settings.m_precipitationOverlay - << " m_flip: " << settings.m_flip - << " m_channels: " << settings.m_channels - << " m_decodeEnabled: " << settings.m_decodeEnabled - << " m_autoSave: " << settings.m_autoSave - << " m_autoSavePath: " << settings.m_autoSavePath - << " m_autoSaveMinScanLines: " << settings.m_autoSaveMinScanLines - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "APTDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_denoise != m_settings.m_denoise) || force) { - reverseAPIKeys.append("denoise"); - } - if ((settings.m_linearEqualise != m_settings.m_linearEqualise) || force) { - reverseAPIKeys.append("linearEqualise"); - } - if ((settings.m_histogramEqualise != m_settings.m_histogramEqualise) || force) { - reverseAPIKeys.append("histogramEqualise"); - } - if ((settings.m_precipitationOverlay != m_settings.m_precipitationOverlay) || force) { - reverseAPIKeys.append("precipitationOverlay"); - } - if ((settings.m_flip != m_settings.m_flip) || force) { - reverseAPIKeys.append("flip"); - } - if ((settings.m_channels != m_settings.m_channels) || force) { - reverseAPIKeys.append("channels"); - } - if ((settings.m_decodeEnabled != m_settings.m_decodeEnabled) || force) { - reverseAPIKeys.append("decodeEnabled"); - } - if ((settings.m_autoSave != m_settings.m_autoSave) || force) { - reverseAPIKeys.append("autoSave"); - } - if ((settings.m_autoSavePath != m_settings.m_autoSavePath) || force) { - reverseAPIKeys.append("autoSavePath"); - } - if ((settings.m_autoSaveMinScanLines != m_settings.m_autoSaveMinScanLines) || force) { - reverseAPIKeys.append("autoSaveMinScanLines"); - } - if ((settings.m_saveCombined != m_settings.m_saveCombined) || force) { - reverseAPIKeys.append("saveCombined"); - } - if ((settings.m_saveSeparate != m_settings.m_saveSeparate) || force) { - reverseAPIKeys.append("saveSeparate"); - } - if ((settings.m_saveProjection != m_settings.m_saveProjection) || force) { - reverseAPIKeys.append("saveProjection"); - } - if ((settings.m_scanlinesPerImageUpdate != m_settings.m_scanlinesPerImageUpdate) || force) { - reverseAPIKeys.append("scanlinesPerImageUpdate"); - } - if ((settings.m_transparencyThreshold != m_settings.m_transparencyThreshold) || force) { - reverseAPIKeys.append("transparencyThreshold"); - } - if ((settings.m_opacityThreshold != m_settings.m_opacityThreshold) || force) { - reverseAPIKeys.append("opacityThreshold"); - } - if ((settings.m_palettes != m_settings.m_palettes) || force) { - reverseAPIKeys.append("palettes"); - } - if ((settings.m_palette != m_settings.m_palette) || force) { - reverseAPIKeys.append("palette"); - } - if ((settings.m_horizontalPixelsPerDegree != m_settings.m_horizontalPixelsPerDegree) || force) { - reverseAPIKeys.append("horizontalPixelsPerDegree"); - } - if ((settings.m_verticalPixelsPerDegree != m_settings.m_verticalPixelsPerDegree) || force) { - reverseAPIKeys.append("verticalPixelsPerDegree"); - } - if ((settings.m_satTimeOffset != m_settings.m_satTimeOffset) || force) { - reverseAPIKeys.append("satTimeOffset"); - } - if ((settings.m_satYaw != m_settings.m_satYaw) || force) { - reverseAPIKeys.append("satYaw"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex")) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -359,26 +263,24 @@ void APTDemod::applySettings(const APTDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg - = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(settings, force); + = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); APTDemodImageWorker::MsgConfigureAPTDemodImageWorker *msgToImg - = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(settings, force); + = APTDemodImageWorker::MsgConfigureAPTDemodImageWorker::create(settingsKeys, settings, force); m_imageWorker->getInputMessageQueue()->push(msgToImg); if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = (settingsKeys.contains("useReverseAPI")) || + (settingsKeys.contains("reverseAPIAddress")) || + (settingsKeys.contains("reverseAPIPort")) || + (settingsKeys.contains("reverseAPIDeviceIndex")) || + (settingsKeys.contains("reverseAPIChannelIndex")); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } m_settings = settings; @@ -393,14 +295,14 @@ bool APTDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true); + MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true); + MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -436,13 +338,13 @@ int APTDemod::webapiSettingsPutPatch( APTDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(settings, force); + MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("APTDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(settings, force); + MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -645,7 +547,7 @@ void APTDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp } } -void APTDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const APTDemodSettings& settings, bool force) +void APTDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const APTDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -671,7 +573,7 @@ void APTDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co } void APTDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const APTDemodSettings& settings, bool force @@ -825,9 +727,9 @@ int APTDemod::webapiActionsPost( settings.m_aosDateTime = QDateTime::fromString(*aos->getDateTime(), Qt::ISODateWithMs); settings.m_northToSouth = aos->getNorthToSouthPass(); - m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false)); + m_inputMessageQueue.push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false)); if (m_guiMessageQueue) { - m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false)); + m_guiMessageQueue->push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false)); } } @@ -858,10 +760,10 @@ int APTDemod::webapiActionsPost( // Disable decoder APTDemodSettings settings = m_settings; settings.m_decodeEnabled = false; - m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false)); + m_inputMessageQueue.push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false)); if (m_guiMessageQueue) { - m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false)); + m_guiMessageQueue->push(MsgConfigureAPTDemod::create(channelActionsKeys, settings, false)); } } diff --git a/plugins/channelrx/demodapt/aptdemod.h b/plugins/channelrx/demodapt/aptdemod.h index 67fe1192c..0766eba36 100644 --- a/plugins/channelrx/demodapt/aptdemod.h +++ b/plugins/channelrx/demodapt/aptdemod.h @@ -48,20 +48,23 @@ public: public: const APTDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAPTDemod* create(const APTDemodSettings& settings, bool force) + static MsgConfigureAPTDemod* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) { - return new MsgConfigureAPTDemod(settings, force); + return new MsgConfigureAPTDemod(settingsKeys, settings, force); } private: APTDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAPTDemod(const APTDemodSettings& settings, bool force) : + MsgConfigureAPTDemod(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -282,10 +285,10 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const APTDemodSettings& settings, bool force = false); - void webapiReverseSendSettings(QList& channelSettingsKeys, const APTDemodSettings& settings, bool force); + void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const APTDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const APTDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodapt/aptdemodbaseband.cpp b/plugins/channelrx/demodapt/aptdemodbaseband.cpp index b19a85740..9a1d4f68d 100644 --- a/plugins/channelrx/demodapt/aptdemodbaseband.cpp +++ b/plugins/channelrx/demodapt/aptdemodbaseband.cpp @@ -129,7 +129,7 @@ bool APTDemodBaseband::handleMessage(const Message& cmd) MsgConfigureAPTDemodBaseband& cfg = (MsgConfigureAPTDemodBaseband&) cmd; qDebug() << "APTDemodBaseband::handleMessage: MsgConfigureAPTDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -154,17 +154,21 @@ bool APTDemodBaseband::handleMessage(const Message& cmd) } } -void APTDemodBaseband::applySettings(const APTDemodSettings& settings, bool force) +void APTDemodBaseband::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("m_inputFrequencyOffset")) || force) { m_channelizer->setChannelization(APTDEMOD_AUDIO_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void APTDemodBaseband::setBasebandSampleRate(int sampleRate) diff --git a/plugins/channelrx/demodapt/aptdemodbaseband.h b/plugins/channelrx/demodapt/aptdemodbaseband.h index 72cdce30f..b58da71d1 100644 --- a/plugins/channelrx/demodapt/aptdemodbaseband.h +++ b/plugins/channelrx/demodapt/aptdemodbaseband.h @@ -40,20 +40,23 @@ public: public: const APTDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAPTDemodBaseband* create(const APTDemodSettings& settings, bool force) + static MsgConfigureAPTDemodBaseband* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) { - return new MsgConfigureAPTDemodBaseband(settings, force); + return new MsgConfigureAPTDemodBaseband(settingsKeys, settings, force); } private: APTDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAPTDemodBaseband(const APTDemodSettings& settings, bool force) : + MsgConfigureAPTDemodBaseband(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -85,7 +88,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(APTDemodSink *sink); - void applySettings(const APTDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodapt/aptdemodgui.cpp b/plugins/channelrx/demodapt/aptdemodgui.cpp index cdbf3250f..ba3a8b960 100644 --- a/plugins/channelrx/demodapt/aptdemodgui.cpp +++ b/plugins/channelrx/demodapt/aptdemodgui.cpp @@ -101,7 +101,7 @@ void APTDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray APTDemodGUI::serialize() const @@ -114,7 +114,7 @@ bool APTDemodGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -296,7 +296,7 @@ void APTDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset"), false); } void APTDemodGUI::channelMarkerHighlightedByCursor() @@ -309,7 +309,7 @@ void APTDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset"), false); } void APTDemodGUI::on_rfBW_valueChanged(int value) @@ -318,14 +318,14 @@ void APTDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth"), false); } void APTDemodGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 100.0; - applySettings(); + applySettings(QStringList("fmDeviation"), false); } void APTDemodGUI::displayLabels() @@ -385,7 +385,7 @@ void APTDemodGUI::on_channels_currentIndexChanged(int index) m_settings.m_precipitationOverlay = false; } displayLabels(); - applySettings(); + applySettings(QStringList("channels"), false); } void APTDemodGUI::on_transparencyThreshold_valueChanged(int value) @@ -394,13 +394,14 @@ void APTDemodGUI::on_transparencyThreshold_valueChanged(int value) ui->transparencyThresholdText->setText(QString::number(m_settings.m_transparencyThreshold)); // Don't applySettings while tracking, as processing an image takes a long time if (!ui->transparencyThreshold->isSliderDown()) { - applySettings(); + applySettings(QStringList("transparencyThreshold"), false); } } void APTDemodGUI::on_transparencyThreshold_sliderReleased() { - applySettings(); + m_settings.m_transparencyThreshold = ui->transparencyThreshold->value(); + applySettings(QStringList("transparencyThreshold"), false); } void APTDemodGUI::on_opacityThreshold_valueChanged(int value) @@ -409,43 +410,44 @@ void APTDemodGUI::on_opacityThreshold_valueChanged(int value) ui->opacityThresholdText->setText(QString::number(m_settings.m_opacityThreshold)); // Don't applySettings while tracking, as processing an image takes a long time if (!ui->opacityThreshold->isSliderDown()) { - applySettings(); + applySettings(QStringList("opacityThreshold"), false); } } void APTDemodGUI::on_opacityThreshold_sliderReleased() { - applySettings(); + m_settings.m_opacityThreshold = ui->opacityThreshold->value(); + applySettings(QStringList("opacityThreshold"), false); } void APTDemodGUI::on_cropNoise_clicked(bool checked) { m_settings.m_cropNoise = checked; - applySettings(); + applySettings(QStringList("cropNoise"), false); } void APTDemodGUI::on_denoise_clicked(bool checked) { m_settings.m_denoise = checked; - applySettings(); + applySettings(QStringList("denoise"), false); } void APTDemodGUI::on_linear_clicked(bool checked) { m_settings.m_linearEqualise = checked; - applySettings(); + applySettings(QStringList("linearEqualise"), false); } void APTDemodGUI::on_histogram_clicked(bool checked) { m_settings.m_histogramEqualise = checked; - applySettings(); + applySettings(QStringList("histogramEqualise"), false); } void APTDemodGUI::on_precipitation_clicked(bool checked) { m_settings.m_precipitationOverlay = checked; - applySettings(); + applySettings(QStringList("precipitationOverlay"), false); } void APTDemodGUI::on_flip_clicked(bool checked) @@ -456,13 +458,13 @@ void APTDemodGUI::on_flip_clicked(bool checked) } else { ui->image->setAlignment(Qt::AlignTop | Qt::AlignHCenter); } - applySettings(); + applySettings(QStringList("flip"), false); } void APTDemodGUI::on_startStop_clicked(bool checked) { m_settings.m_decodeEnabled = checked; - applySettings(); + applySettings(QStringList("decodeEnabled"), false); } void APTDemodGUI::resetDecoder() @@ -490,7 +492,21 @@ void APTDemodGUI::on_showSettings_clicked() if (dialog.exec() == QDialog::Accepted) { displayPalettes(); - applySettings(); + applySettings(QStringList({ + "satelliteTrackerControl", + "satelliteName", + "autoSave", + "saveCombined", + "saveSeparate", + "saveProjection", + "autoSavePath", + "autoSaveMinScanLines", + "scanlinesPerImageUpdate", + "horizontalPixelsPerDegree", + "verticalPixelsPerDegree", + "satTimeOffset", + "satYaw", + }), false); } } @@ -551,7 +567,7 @@ void APTDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList(), false); } void APTDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -596,7 +612,19 @@ void APTDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList( + { + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + }), + false + ); } resetContextMenuType(); @@ -679,7 +707,7 @@ APTDemodGUI::APTDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -743,11 +771,11 @@ void APTDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void APTDemodGUI::applySettings(bool force) +void APTDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - APTDemod::MsgConfigureAPTDemod* message = APTDemod::MsgConfigureAPTDemod::create( m_settings, force); + APTDemod::MsgConfigureAPTDemod* message = APTDemod::MsgConfigureAPTDemod::create(settingsKeys, m_settings, force); m_aptDemod->getInputMessageQueue()->push(message); } } diff --git a/plugins/channelrx/demodapt/aptdemodgui.h b/plugins/channelrx/demodapt/aptdemodgui.h index e48acecc9..a5f4b738f 100644 --- a/plugins/channelrx/demodapt/aptdemodgui.h +++ b/plugins/channelrx/demodapt/aptdemodgui.h @@ -121,7 +121,7 @@ private: virtual ~APTDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displayPalettes(); void displayLabels(); diff --git a/plugins/channelrx/demodapt/aptdemodimageworker.h b/plugins/channelrx/demodapt/aptdemodimageworker.h index 31418060c..9e1ddd2c0 100644 --- a/plugins/channelrx/demodapt/aptdemodimageworker.h +++ b/plugins/channelrx/demodapt/aptdemodimageworker.h @@ -49,20 +49,23 @@ public: public: const APTDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAPTDemodImageWorker* create(const APTDemodSettings& settings, bool force) + static MsgConfigureAPTDemodImageWorker* create(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) { - return new MsgConfigureAPTDemodImageWorker(settings, force); + return new MsgConfigureAPTDemodImageWorker(settingsKeys, settings, force); } private: APTDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAPTDemodImageWorker(const APTDemodSettings& settings, bool force) : + MsgConfigureAPTDemodImageWorker(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; diff --git a/plugins/channelrx/demodapt/aptdemodsettings.cpp b/plugins/channelrx/demodapt/aptdemodsettings.cpp index 95870be89..0bce80ac3 100644 --- a/plugins/channelrx/demodapt/aptdemodsettings.cpp +++ b/plugins/channelrx/demodapt/aptdemodsettings.cpp @@ -218,4 +218,260 @@ bool APTDemodSettings::deserialize(const QByteArray& data) } } +void APTDemodSettings::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("cropNoise")) { + m_cropNoise = settings.m_cropNoise; + } + if (settingsKeys.contains("denoise")) { + m_denoise = settings.m_denoise; + } + if (settingsKeys.contains("linearEqualise")) { + m_linearEqualise = settings.m_linearEqualise; + } + if (settingsKeys.contains("histogramEqualise")) { + m_histogramEqualise = settings.m_histogramEqualise; + } + if (settingsKeys.contains("precipitationOverlay")) { + m_precipitationOverlay = settings.m_precipitationOverlay; + } + if (settingsKeys.contains("flip")) { + m_flip = settings.m_flip; + } + if (settingsKeys.contains("channels")) { + m_channels = settings.m_channels; + } + if (settingsKeys.contains("decodeEnabled")) { + m_decodeEnabled = settings.m_decodeEnabled; + } + if (settingsKeys.contains("satelliteTrackerControl")) { + m_satelliteTrackerControl = settings.m_satelliteTrackerControl; + } + if (settingsKeys.contains("satelliteName")) { + m_satelliteName = settings.m_satelliteName; + } + if (settingsKeys.contains("autoSave")) { + m_autoSave = settings.m_autoSave; + } + if (settingsKeys.contains("autoSavePath")) { + m_autoSavePath = settings.m_autoSavePath; + } + if (settingsKeys.contains("autoSaveMinScanLines")) { + m_autoSaveMinScanLines = settings.m_autoSaveMinScanLines; + } + if (settingsKeys.contains("saveCombined")) { + m_saveCombined = settings.m_saveCombined; + } + if (settingsKeys.contains("saveSeparate")) { + m_saveSeparate = settings.m_saveSeparate; + } + if (settingsKeys.contains("saveProjection")) { + m_saveProjection = settings.m_saveProjection; + } + if (settingsKeys.contains("scanlinesPerImageUpdate")) { + m_scanlinesPerImageUpdate = settings.m_scanlinesPerImageUpdate; + } + if (settingsKeys.contains("transparencyThreshold")) { + m_transparencyThreshold = settings.m_transparencyThreshold; + } + if (settingsKeys.contains("opacityThreshold")) { + m_opacityThreshold = settings.m_opacityThreshold; + } + if (settingsKeys.contains("palettes")) { + m_palettes = settings.m_palettes; + } + if (settingsKeys.contains("palette")) { + m_palette = settings.m_palette; + } + if (settingsKeys.contains("horizontalPixelsPerDegree")) { + m_horizontalPixelsPerDegree = settings.m_horizontalPixelsPerDegree; + } + if (settingsKeys.contains("verticalPixelsPerDegree")) { + m_verticalPixelsPerDegree = settings.m_verticalPixelsPerDegree; + } + if (settingsKeys.contains("satTimeOffset")) { + m_satTimeOffset = settings.m_satTimeOffset; + } + if (settingsKeys.contains("satYaw")) { + m_satYaw = settings.m_satYaw; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("tle")) { + m_tle = settings.m_tle; + } + if (settingsKeys.contains("aosDateTime")) { + m_aosDateTime = settings.m_aosDateTime; + } + if (settingsKeys.contains("northToSouth")) { + m_northToSouth = settings.m_northToSouth; + } +} +QString APTDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("cropNoise") || force) { + ostr << " m_cropNoise: " << m_cropNoise; + } + if (settingsKeys.contains("denoise") || force) { + ostr << " m_denoise: " << m_denoise; + } + if (settingsKeys.contains("linearEqualise") || force) { + ostr << " m_linearEqualise: " << m_linearEqualise; + } + if (settingsKeys.contains("histogramEqualise") || force) { + ostr << " m_histogramEqualise: " << m_histogramEqualise; + } + if (settingsKeys.contains("precipitationOverlay") || force) { + ostr << " m_precipitationOverlay: " << m_precipitationOverlay; + } + if (settingsKeys.contains("flip") || force) { + ostr << " m_flip: " << m_flip; + } + if (settingsKeys.contains("channels") || force) { + ostr << " m_channels: " << m_channels; + } + if (settingsKeys.contains("decodeEnabled") || force) { + ostr << " m_decodeEnabled: " << m_decodeEnabled; + } + if (settingsKeys.contains("satelliteTrackerControl") || force) { + ostr << " m_satelliteTrackerControl: " << m_satelliteTrackerControl; + } + if (settingsKeys.contains("satelliteName") || force) { + ostr << " m_satelliteName: " << m_satelliteName.toStdString(); + } + if (settingsKeys.contains("autoSave") || force) { + ostr << " m_autoSave: " << m_autoSave; + } + if (settingsKeys.contains("autoSavePath") || force) { + ostr << " m_autoSavePath: " << m_autoSavePath.toStdString(); + } + if (settingsKeys.contains("autoSaveMinScanLines") || force) { + ostr << " m_autoSaveMinScanLines: " << m_autoSaveMinScanLines; + } + if (settingsKeys.contains("saveCombined") || force) { + ostr << " m_saveCombined: " << m_saveCombined; + } + if (settingsKeys.contains("saveSeparate") || force) { + ostr << " m_saveSeparate: " << m_saveSeparate; + } + if (settingsKeys.contains("saveProjection") || force) { + ostr << " m_saveProjection: " << m_saveProjection; + } + if (settingsKeys.contains("scanlinesPerImageUpdate") || force) { + ostr << " m_scanlinesPerImageUpdate: " << m_scanlinesPerImageUpdate; + } + if (settingsKeys.contains("transparencyThreshold") || force) { + ostr << " m_transparencyThreshold: " << m_transparencyThreshold; + } + if (settingsKeys.contains("opacityThreshold") || force) { + ostr << " m_opacityThreshold: " << m_opacityThreshold; + } + if (settingsKeys.contains("palettes") || force) { + ostr << " m_palettes: " << m_palettes.join(";").toStdString(); + } + if (settingsKeys.contains("palette") || force) { + ostr << " m_palette: " << m_palette; + } + if (settingsKeys.contains("horizontalPixelsPerDegree") || force) { + ostr << " m_horizontalPixelsPerDegree: " << m_horizontalPixelsPerDegree; + } + if (settingsKeys.contains("verticalPixelsPerDegree") || force) { + ostr << " m_verticalPixelsPerDegree: " << m_verticalPixelsPerDegree; + } + if (settingsKeys.contains("satTimeOffset") || force) { + ostr << " m_satTimeOffset: " << m_satTimeOffset; + } + if (settingsKeys.contains("satYaw") || force) { + ostr << " m_satYaw: " << m_satYaw; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + if (settingsKeys.contains("tle") || force) { + ostr << " m_tle: " << m_tle.toStdString(); + } + if (settingsKeys.contains("aosDateTime") || force) { + ostr << " m_aosDateTime: " << m_aosDateTime.toString().toStdString(); + } + if (settingsKeys.contains("northToSouth") || force) { + ostr << " m_northToSouth: " << m_northToSouth; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodapt/aptdemodsettings.h b/plugins/channelrx/demodapt/aptdemodsettings.h index c45165b7f..479ba139b 100644 --- a/plugins/channelrx/demodapt/aptdemodsettings.h +++ b/plugins/channelrx/demodapt/aptdemodsettings.h @@ -81,6 +81,8 @@ struct APTDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_APTDEMODSETTINGS_H */ diff --git a/plugins/channelrx/demodapt/aptdemodsink.cpp b/plugins/channelrx/demodapt/aptdemodsink.cpp index dffbcd243..9c75ff285 100644 --- a/plugins/channelrx/demodapt/aptdemodsink.cpp +++ b/plugins/channelrx/demodapt/aptdemodsink.cpp @@ -35,7 +35,7 @@ APTDemodSink::APTDemodSink() : m_magsq = 0.0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); m_samplesLength = APTDEMOD_AUDIO_SAMPLE_RATE * APT_MAX_HEIGHT / 2; // APT broadcasts at 2 lines per second @@ -176,25 +176,30 @@ void APTDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque m_channelFrequencyOffset = channelFrequencyOffset; } -void APTDemodSink::applySettings(const APTDemodSettings& settings, bool force) +void APTDemodSink::applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force) { - qDebug() << "APTDemodSink::applySettings:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_decodeEnabled: " << settings.m_decodeEnabled - << " force: " << force; + qDebug() << "APTDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if (settingsKeys.contains("decodeEnabled") || force) + { + m_settings.m_decodeEnabled = settings.m_decodeEnabled; + } + + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth, 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) APTDEMOD_AUDIO_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) + if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force) { m_phaseDiscri.setFMScaling(APTDEMOD_AUDIO_SAMPLE_RATE / (2.0f * settings.m_fmDeviation)); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodapt/aptdemodsink.h b/plugins/channelrx/demodapt/aptdemodsink.h index 5afd7403e..f7eda42c7 100644 --- a/plugins/channelrx/demodapt/aptdemodsink.h +++ b/plugins/channelrx/demodapt/aptdemodsink.h @@ -50,7 +50,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const APTDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const APTDemodSettings& settings, bool force = false); void setImageWorkerMessageQueue(MessageQueue *messageQueue) { m_imageWorkerMessageQueue = messageQueue; } double getMagSq() const { return m_magsq; } diff --git a/plugins/channelrx/demodatv/atvdemod.cpp b/plugins/channelrx/demodatv/atvdemod.cpp index fa5c13cb3..b0a0b4084 100644 --- a/plugins/channelrx/demodatv/atvdemod.cpp +++ b/plugins/channelrx/demodatv/atvdemod.cpp @@ -50,7 +50,7 @@ ATVDemod::ATVDemod(DeviceAPI *deviceAPI) : ); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -106,7 +106,7 @@ void ATVDemod::start() DSPSignalNotification* notifToSink = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(notifToSink); - ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(m_settings, true); + ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -129,7 +129,7 @@ bool ATVDemod::handleMessage(const Message& cmd) if (MsgConfigureATVDemod::match(cmd)) { MsgConfigureATVDemod& cfg = (MsgConfigureATVDemod&) cmd; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -161,41 +161,20 @@ void ATVDemod::setCenterFrequency(qint64 frequency) { ATVDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (getMessageQueueToGUI()) { - MsgConfigureATVDemod *msg = MsgConfigureATVDemod::create(settings, false); + MsgConfigureATVDemod *msg = MsgConfigureATVDemod::create(QStringList("inputFrequencyOffset"), settings, false); getMessageQueueToGUI()->push(msg); } } -void ATVDemod::applySettings(const ATVDemodSettings& settings, bool force) +void ATVDemod::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) { - qDebug() << "ATVDemod::applySettings:" - << "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset - << "m_bfoFrequency:" << settings.m_bfoFrequency - << "m_atvModulation:" << settings.m_atvModulation - << "m_fmDeviation:" << settings.m_fmDeviation - << "m_fftFiltering:" << settings.m_fftFiltering - << "m_fftOppBandwidth:" << settings.m_fftOppBandwidth - << "m_fftBandwidth:" << settings.m_fftBandwidth - << "m_nbLines:" << settings.m_nbLines - << "m_fps:" << settings.m_fps - << "m_atvStd:" << settings.m_atvStd - << "m_hSync:" << settings.m_hSync - << "m_vSync:" << settings.m_vSync - << "m_invertVideo:" << settings.m_invertVideo - << "m_halfFrames:" << settings.m_halfFrames - << "m_levelSynchroTop:" << settings.m_levelSynchroTop - << "m_levelBlack:" << settings.m_levelBlack - << "m_rgbColor:" << settings.m_rgbColor - << "m_title:" << settings.m_title - << "m_udpAddress:" << settings.m_udpAddress - << "m_udpPort:" << settings.m_udpPort - << "force:" << force; + qDebug() << "ATVDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("m_streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -208,10 +187,14 @@ void ATVDemod::applySettings(const ATVDemodSettings& settings, bool force) } } - ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(settings, force); + ATVDemodBaseband::MsgConfigureATVDemodBaseband *msg = ATVDemodBaseband::MsgConfigureATVDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void ATVDemod::handleIndexInDeviceSetChanged(int index) diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h index 3844d54c1..2f2b82aec 100644 --- a/plugins/channelrx/demodatv/atvdemod.h +++ b/plugins/channelrx/demodatv/atvdemod.h @@ -43,20 +43,23 @@ public: public: const ATVDemodSettings& getSettings() const { return m_settings; } bool getForce() const { return m_force; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } - static MsgConfigureATVDemod* create(const ATVDemodSettings& settings, bool force) + static MsgConfigureATVDemod* create(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) { - return new MsgConfigureATVDemod(settings, force); + return new MsgConfigureATVDemod(settingsKeys, settings, force); } private: ATVDemodSettings m_settings; bool m_force; + QStringList m_settingsKeys; - MsgConfigureATVDemod(const ATVDemodSettings& settings, bool force) : + MsgConfigureATVDemod(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) : Message(), m_settings(settings), - m_force(force) + m_force(force), + m_settingsKeys(settingsKeys) { } }; @@ -112,7 +115,7 @@ private: int m_basebandSampleRate; //!< sample rate stored from device message used when starting baseband sink virtual bool handleMessage(const Message& cmd); - void applySettings(const ATVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false); private slots: void handleIndexInDeviceSetChanged(int index); diff --git a/plugins/channelrx/demodatv/atvdemodbaseband.cpp b/plugins/channelrx/demodatv/atvdemodbaseband.cpp index 5d2ed6810..00bad7a2b 100644 --- a/plugins/channelrx/demodatv/atvdemodbaseband.cpp +++ b/plugins/channelrx/demodatv/atvdemodbaseband.cpp @@ -126,7 +126,7 @@ bool ATVDemodBaseband::handleMessage(const Message& cmd) MsgConfigureATVDemodBaseband& cfg = (MsgConfigureATVDemodBaseband&) cmd; qDebug() << "ATVDemodBaseband::handleMessage: MsgConfigureATVDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -147,18 +147,18 @@ bool ATVDemodBaseband::handleMessage(const Message& cmd) } } -void ATVDemodBaseband::applySettings(const ATVDemodSettings& settings, bool force) +void ATVDemodBaseband::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) { - qDebug("ATVDemodBaseband::applySettings"); + qDebug() << "ATVDemodBaseband::applySettings" << settings.getDebugString(settingsKeys, force); - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)|| force) + if ((settingsKeys.contains("m_inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { unsigned int desiredSampleRate = m_channelizer->getBasebandSampleRate(); m_channelizer->setChannelization(desiredSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); m_settings = settings; } diff --git a/plugins/channelrx/demodatv/atvdemodbaseband.h b/plugins/channelrx/demodatv/atvdemodbaseband.h index e13b47913..c97df3794 100644 --- a/plugins/channelrx/demodatv/atvdemodbaseband.h +++ b/plugins/channelrx/demodatv/atvdemodbaseband.h @@ -41,20 +41,23 @@ public: public: const ATVDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureATVDemodBaseband* create(const ATVDemodSettings& settings, bool force) + static MsgConfigureATVDemodBaseband* create(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) { - return new MsgConfigureATVDemodBaseband(settings, force); + return new MsgConfigureATVDemodBaseband(settingsKeys, settings, force); } private: ATVDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureATVDemodBaseband(const ATVDemodSettings& settings, bool force) : + MsgConfigureATVDemodBaseband(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -87,7 +90,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const ATVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index cd010a55d..7f1452dbc 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -55,7 +55,7 @@ void ATVDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray ATVDemodGUI::serialize() const @@ -68,14 +68,14 @@ bool ATVDemodGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); // will have true + applySettings(QStringList(), true); // will have true return true; } else { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); // will have true + applySettings(QStringList(), true); // will have true return false; } } @@ -184,7 +184,7 @@ void ATVDemodGUI::channelMarkerChangedByCursor() qDebug("ATVDemodGUI::channelMarkerChangedByCursor"); ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset"), false); } void ATVDemodGUI::channelMarkerHighlightedByCursor() @@ -247,7 +247,16 @@ void ATVDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex" + }), + false); } resetContextMenuType(); @@ -259,7 +268,7 @@ void ATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList(), false); } ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* objParent) : @@ -343,13 +352,13 @@ ATVDemodGUI::~ATVDemodGUI() delete ui; } -void ATVDemodGUI::applySettings(bool force) +void ATVDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { qDebug() << "ATVDemodGUI::applySettings: " << force << " m_doApplySettings: " << m_doApplySettings; if (m_doApplySettings) { - ATVDemod::MsgConfigureATVDemod *msg = ATVDemod::MsgConfigureATVDemod::create(m_settings, force); + ATVDemod::MsgConfigureATVDemod *msg = ATVDemod::MsgConfigureATVDemod::create(settingsKeys, m_settings, force); m_atvDemod->getInputMessageQueue()->push(msg); } } @@ -459,58 +468,58 @@ void ATVDemodGUI::on_synchLevel_valueChanged(int value) { ui->synchLevelText->setText(QString("%1 mV").arg(value)); m_settings.m_levelSynchroTop = value / 1000.0f; - applySettings(); + applySettings(QStringList("levelSynchroTop"), false); } void ATVDemodGUI::on_blackLevel_valueChanged(int value) { ui->blackLevelText->setText(QString("%1 mV").arg(value)); m_settings.m_levelBlack = value / 1000.0f; - applySettings(); + applySettings(QStringList("levelBlack"), false); } void ATVDemodGUI::on_hSync_clicked() { m_settings.m_hSync = ui->hSync->isChecked(); - applySettings(); + applySettings(QStringList("hSync"), false); } void ATVDemodGUI::on_vSync_clicked() { m_settings.m_vSync = ui->vSync->isChecked(); - applySettings(); + applySettings(QStringList("vSync"), false); } void ATVDemodGUI::on_invertVideo_clicked() { m_settings.m_invertVideo = ui->invertVideo->isChecked(); - applySettings(); + applySettings(QStringList("invertVideo"), false); } void ATVDemodGUI::on_halfImage_clicked() { m_settings.m_halfFrames = ui->halfImage->isChecked(); - applySettings(); + applySettings(QStringList("halfFrames"), false); } void ATVDemodGUI::on_nbLines_currentIndexChanged(int index) { m_settings.m_nbLines = ATVDemodSettings::getNumberOfLines(index); applySampleRate(); - applySettings(); + applySettings(QStringList("nbLines"), false); } void ATVDemodGUI::on_fps_currentIndexChanged(int index) { m_settings.m_fps = ATVDemodSettings::getFps(index); applySampleRate(); - applySettings(); + applySettings(QStringList("fps"), false); } void ATVDemodGUI::on_standard_currentIndexChanged(int index) { m_settings.m_atvStd = (ATVDemodSettings::ATVStd) index; - applySettings(); + applySettings(QStringList("atvStd"), false); } void ATVDemodGUI::on_reset_clicked(bool checked) @@ -524,7 +533,7 @@ void ATVDemodGUI::on_modulation_currentIndexChanged(int index) m_settings.m_atvModulation = (ATVDemodSettings::ATVModulation) index; setRFFiltersSlidersRange(m_basebandSampleRate); setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("atvModulation"), false); } void ATVDemodGUI::on_rfBW_valueChanged(int value) @@ -532,7 +541,7 @@ void ATVDemodGUI::on_rfBW_valueChanged(int value) m_settings.m_fftBandwidth = value * m_rfSliderDivisor; ui->rfBWText->setText(QString("%1k").arg((value * m_rfSliderDivisor) / 1000.0, 0, 'f', 0)); setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("fftBandwidth"), false); } void ATVDemodGUI::on_rfOppBW_valueChanged(int value) @@ -540,7 +549,7 @@ void ATVDemodGUI::on_rfOppBW_valueChanged(int value) m_settings.m_fftOppBandwidth = value * m_rfSliderDivisor; ui->rfOppBWText->setText(QString("%1k").arg((value * m_rfSliderDivisor) / 1000.0, 0, 'f', 0)); setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("fftOppBandwidth"), false); } void ATVDemodGUI::on_rfFiltering_toggled(bool checked) @@ -548,7 +557,7 @@ void ATVDemodGUI::on_rfFiltering_toggled(bool checked) m_settings.m_fftFiltering = checked; setRFFiltersSlidersRange(m_basebandSampleRate); setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("fftFiltering"), false); } void ATVDemodGUI::on_deltaFrequency_changed(qint64 value) @@ -556,21 +565,21 @@ void ATVDemodGUI::on_deltaFrequency_changed(qint64 value) m_settings.m_inputFrequencyOffset = value; m_channelMarker.setCenterFrequency(value); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset"), false); } void ATVDemodGUI::on_bfo_valueChanged(int value) { m_settings.m_bfoFrequency = value; ui->bfoText->setText(QString("%1").arg(value * 1.0, 0, 'f', 0)); - applySettings(); + applySettings(QStringList("bfoFrequency"), false); } void ATVDemodGUI::on_fmDeviation_valueChanged(int value) { m_settings.m_fmDeviation = value / 1000.0f; ui->fmDeviationText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); - applySettings(); + applySettings(QStringList("fmDeviation"), false); } void ATVDemodGUI::on_amScaleFactor_valueChanged(int value) @@ -578,7 +587,7 @@ void ATVDemodGUI::on_amScaleFactor_valueChanged(int value) m_settings.m_amScalingFactor = value; ui->amScaleFactor->setValue(m_settings.m_amScalingFactor); ui->amScaleFactorText->setText(QString("%1").arg(m_settings.m_amScalingFactor)); - applySettings(); + applySettings(QStringList("amScalingFactor"), false); } void ATVDemodGUI::on_amScaleOffset_valueChanged(int value) @@ -586,7 +595,7 @@ void ATVDemodGUI::on_amScaleOffset_valueChanged(int value) m_settings.m_amOffsetFactor = value; ui->amScaleOffset->setValue(m_settings.m_amOffsetFactor); ui->amScaleOffsetText->setText(QString("%1").arg(m_settings.m_amOffsetFactor)); - applySettings(); + applySettings(QStringList("amOffsetFactor"), false); } void ATVDemodGUI::on_screenTabWidget_currentChanged(int index) diff --git a/plugins/channelrx/demodatv/atvdemodgui.h b/plugins/channelrx/demodatv/atvdemodgui.h index 4a84ec3e6..8695800ac 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.h +++ b/plugins/channelrx/demodatv/atvdemodgui.h @@ -91,7 +91,7 @@ private: explicit ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* objParent = 0); virtual ~ATVDemodGUI(); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displayRFBandwidths(); void applySampleRate(); diff --git a/plugins/channelrx/demodatv/atvdemodsettings.cpp b/plugins/channelrx/demodatv/atvdemodsettings.cpp index 6ab06474f..07cfd550c 100644 --- a/plugins/channelrx/demodatv/atvdemodsettings.cpp +++ b/plugins/channelrx/demodatv/atvdemodsettings.cpp @@ -343,6 +343,198 @@ int ATVDemodSettings::getNumberOfLinesIndex(int nbLines) } } +void ATVDemodSettings::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("bfoFrequency")) { + m_bfoFrequency = settings.m_bfoFrequency; + } + if (settingsKeys.contains("atvModulation")) { + m_atvModulation = settings.m_atvModulation; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("amScalingFactor")) { + m_amScalingFactor = settings.m_amScalingFactor; + } + if (settingsKeys.contains("amOffsetFactor")) { + m_amOffsetFactor = settings.m_amOffsetFactor; + } + if (settingsKeys.contains("fftFiltering")) { + m_fftFiltering = settings.m_fftFiltering; + } + if (settingsKeys.contains("fftOppBandwidth")) { + m_fftOppBandwidth = settings.m_fftOppBandwidth; + } + if (settingsKeys.contains("fftBandwidth")) { + m_fftBandwidth = settings.m_fftBandwidth; + } + if (settingsKeys.contains("nbLines")) { + m_nbLines = settings.m_nbLines; + } + if (settingsKeys.contains("fps")) { + m_fps = settings.m_fps; + } + if (settingsKeys.contains("atvStd")) { + m_atvStd = settings.m_atvStd; + } + if (settingsKeys.contains("hSync")) { + m_hSync = settings.m_hSync; + } + if (settingsKeys.contains("vSync")) { + m_vSync = settings.m_vSync; + } + if (settingsKeys.contains("invertVideo")) { + m_invertVideo = settings.m_invertVideo; + } + if (settingsKeys.contains("halfFrames")) { + m_halfFrames = settings.m_halfFrames; + } + if (settingsKeys.contains("levelSynchroTop")) { + m_levelSynchroTop = settings.m_levelSynchroTop; + } + if (settingsKeys.contains("levelBlack")) { + m_levelBlack = settings.m_levelBlack; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString ATVDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("bfoFrequency") || force) { + ostr << " m_bfoFrequency: " << m_bfoFrequency; + } + if (settingsKeys.contains("atvModulation") || force) { + ostr << " m_atvModulation: " << m_atvModulation; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("amScalingFactor") || force) { + ostr << " m_amScalingFactor: " << m_amScalingFactor; + } + if (settingsKeys.contains("amOffsetFactor") || force) { + ostr << " m_amOffsetFactor: " << m_amOffsetFactor; + } + if (settingsKeys.contains("fftFiltering") || force) { + ostr << " m_fftFiltering: " << m_fftFiltering; + } + if (settingsKeys.contains("fftOppBandwidth") || force) { + ostr << " m_fftOppBandwidth: " << m_fftOppBandwidth; + } + if (settingsKeys.contains("fftBandwidth") || force) { + ostr << " m_fftBandwidth: " << m_fftBandwidth; + } + if (settingsKeys.contains("nbLines") || force) { + ostr << " m_nbLines: " << m_nbLines; + } + if (settingsKeys.contains("fps") || force) { + ostr << " m_fps: " << m_fps; + } + if (settingsKeys.contains("atvStd") || force) { + ostr << " m_atvStd: " << m_atvStd; + } + if (settingsKeys.contains("hSync") || force) { + ostr << " m_hSync: " << m_hSync; + } + if (settingsKeys.contains("vSync") || force) { + ostr << " m_vSync: " << m_vSync; + } + if (settingsKeys.contains("invertVideo") || force) { + ostr << " m_invertVideo: " << m_invertVideo; + } + if (settingsKeys.contains("halfFrames") || force) { + ostr << " m_halfFrames: " << m_halfFrames; + } + if (settingsKeys.contains("levelSynchroTop") || force) { + ostr << " m_levelSynchroTop: " << m_levelSynchroTop; + } + if (settingsKeys.contains("levelBlack") || force) { + ostr << " m_levelBlack: " << m_levelBlack; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + float ATVDemodSettings::getNominalLineTime(int nbLines, int fps) { return 1.0f / ((float) nbLines * (float) fps); diff --git a/plugins/channelrx/demodatv/atvdemodsettings.h b/plugins/channelrx/demodatv/atvdemodsettings.h index db428fddb..969075663 100644 --- a/plugins/channelrx/demodatv/atvdemodsettings.h +++ b/plugins/channelrx/demodatv/atvdemodsettings.h @@ -91,6 +91,8 @@ struct ATVDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; int getRFSliderDivisor(unsigned int sampleRate); diff --git a/plugins/channelrx/demodatv/atvdemodsink.cpp b/plugins/channelrx/demodatv/atvdemodsink.cpp index faf36930f..8c8b85ba7 100644 --- a/plugins/channelrx/demodatv/atvdemodsink.cpp +++ b/plugins/channelrx/demodatv/atvdemodsink.cpp @@ -70,7 +70,7 @@ ATVDemodSink::ATVDemodSink() : m_objPhaseDiscri.setFMScaling(1.0f); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -465,33 +465,11 @@ void ATVDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque m_channelFrequencyOffset = channelFrequencyOffset; } -void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force) +void ATVDemodSink::applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force) { - qDebug() << "ATVDemodSink::applySettings:" - << "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset - << "m_bfoFrequency:" << settings.m_bfoFrequency - << "m_atvModulation:" << settings.m_atvModulation - << "m_fmDeviation:" << settings.m_fmDeviation - << "m_fftFiltering:" << settings.m_fftFiltering - << "m_fftOppBandwidth:" << settings.m_fftOppBandwidth - << "m_fftBandwidth:" << settings.m_fftBandwidth - << "m_nbLines:" << settings.m_nbLines - << "m_fps:" << settings.m_fps - << "m_atvStd:" << settings.m_atvStd - << "m_hSync:" << settings.m_hSync - << "m_vSync:" << settings.m_vSync - << "m_invertVideo:" << settings.m_invertVideo - << "m_halfFrames:" << settings.m_halfFrames - << "m_levelSynchroTop:" << settings.m_levelSynchroTop - << "m_levelBlack:" << settings.m_levelBlack - << "m_rgbColor:" << settings.m_rgbColor - << "m_title:" << settings.m_title - << "m_udpAddress:" << settings.m_udpAddress - << "m_udpPort:" << settings.m_udpPort - << "force:" << force; + qDebug() << "ATVDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_fftBandwidth != m_settings.m_fftBandwidth) - || (settings.m_fftOppBandwidth != m_settings.m_fftOppBandwidth) || force) + if (settingsKeys.contains("fftBandwidth") || settingsKeys.contains("fftOppBandwidth") || force) { m_DSBFilter->create_asym_filter( settings.m_fftOppBandwidth / (float) m_channelSampleRate, @@ -501,7 +479,7 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force) m_DSBFilterBufferIndex = 0; } - if ((settings.m_bfoFrequency != m_settings.m_bfoFrequency) || force) + if (settingsKeys.contains("bfoFrequency") || force) { m_bfoPLL.configure((float) settings.m_bfoFrequency / (float) m_channelSampleRate, 100.0 / m_channelSampleRate, @@ -509,9 +487,7 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force) m_bfoFilter.setFrequencies(m_channelSampleRate, settings.m_bfoFrequency); } - if ((settings.m_nbLines != m_settings.m_nbLines) - || (settings.m_fps != m_settings.m_fps) - || (settings.m_atvStd != m_settings.m_atvStd) || force) + if (settingsKeys.contains("nbLines") || settingsKeys.contains("fps") || settingsKeys.contains("atvStd") || force) { unsigned int samplesPerLineNom; ATVDemodSettings::getBaseValues(m_channelSampleRate, settings.m_nbLines * settings.m_fps, samplesPerLineNom); @@ -539,13 +515,17 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force) m_fieldIndex = 0; } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { + if (settingsKeys.contains("fmDeviation") || force) { m_objPhaseDiscri.setFMScaling(1.0f / settings.m_fmDeviation); } - if ((settings.m_levelBlack != m_settings.m_levelBlack) || force) { + if (settingsKeys.contains("levelBlack") || force) { m_sampleRangeCorrection = 255.0f / (1.0f - m_settings.m_levelBlack); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodatv/atvdemodsink.h b/plugins/channelrx/demodatv/atvdemodsink.h index 6af9b58df..b8bb4770e 100644 --- a/plugins/channelrx/demodatv/atvdemodsink.h +++ b/plugins/channelrx/demodatv/atvdemodsink.h @@ -54,7 +54,7 @@ public: void setVideoTabIndex(int videoTabIndex) { m_videoTabIndex = videoTabIndex; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const ATVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ATVDemodSettings& settings, bool force = false); private: struct ATVConfigPrivate diff --git a/plugins/channelrx/demodbfm/bfmdemod.cpp b/plugins/channelrx/demodbfm/bfmdemod.cpp index e4919239e..f4d2c16f3 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.cpp +++ b/plugins/channelrx/demodbfm/bfmdemod.cpp @@ -58,7 +58,7 @@ BFMDemod::BFMDemod(DeviceAPI *deviceAPI) : m_basebandSampleRate(0) { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -140,7 +140,7 @@ void BFMDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, 0); m_basebandSink->getInputMessageQueue()->push(dspMsg); - BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(m_settings, true); + BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); SpectrumSettings spectrumSettings = m_spectrumVis.getSettings(); @@ -170,7 +170,7 @@ bool BFMDemod::handleMessage(const Message& cmd) MsgConfigureBFMDemod& cfg = (MsgConfigureBFMDemod&) cmd; qDebug() << "BFMDemod::handleMessage: MsgConfigureBFMDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -202,73 +202,20 @@ void BFMDemod::setCenterFrequency(qint64 frequency) { BFMDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList({"inputFrequencyOffset"}), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(settings, false); + MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(QStringList({"inputFrequencyOffset"}), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force) +void BFMDemod::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) { - qDebug() << "BFMDemod::applySettings: MsgConfigureBFMDemod:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_deEmphasis: " << settings.getDeEmphasisTimeConstant() - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioStereo: " << settings.m_audioStereo - << " m_lsbStereo: " << settings.m_lsbStereo - << " m_showPilot: " << settings.m_showPilot - << " m_rdsActive: " << settings.m_rdsActive - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " force: " << force; + qDebug() << "BFMDemod::applySettings: MsgConfigureBFMDemod:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_volume != m_settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((settings.m_audioMute != m_settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((settings.m_audioStereo != m_settings.m_audioStereo) || force) { - reverseAPIKeys.append("audioStereo"); - } - if ((settings.m_lsbStereo != m_settings.m_lsbStereo) || force) { - reverseAPIKeys.append("lsbStereo"); - } - if ((settings.m_showPilot != m_settings.m_showPilot) || force) { - reverseAPIKeys.append("showPilot"); - } - if ((settings.m_rdsActive != m_settings.m_rdsActive) || force) { - reverseAPIKeys.append("rdsActive"); - } - if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { - reverseAPIKeys.append("afBandwidth"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_deEmphasis != m_settings.m_deEmphasis) || force) { - reverseAPIKeys.append("deEmphasis"); - } - if ((settings.m_squelch != m_settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -279,34 +226,36 @@ void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(settings, force); + BFMDemodBaseband::MsgConfigureBFMDemodBaseband *msg = BFMDemodBaseband::MsgConfigureBFMDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray BFMDemod::serialize() const @@ -318,14 +267,14 @@ bool BFMDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true); + MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(m_settings, true); + MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -361,13 +310,13 @@ int BFMDemod::webapiSettingsPutPatch( BFMDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(settings, force); + MsgConfigureBFMDemod *msg = MsgConfigureBFMDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("BFMDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(settings, force); + MsgConfigureBFMDemod *msgToGUI = MsgConfigureBFMDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -609,7 +558,7 @@ void BFMDemod::webapiFormatRDSReport(SWGSDRangel::SWGRDSReport *report) } } -void BFMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const BFMDemodSettings& settings, bool force) +void BFMDemod::webapiReverseSendSettings(const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -636,7 +585,7 @@ void BFMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co void BFMDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force) { @@ -660,7 +609,7 @@ void BFMDemod::sendChannelSettings( } void BFMDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QStringList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const BFMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodbfm/bfmdemod.h b/plugins/channelrx/demodbfm/bfmdemod.h index 6580e6ed3..c4e705ebb 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.h +++ b/plugins/channelrx/demodbfm/bfmdemod.h @@ -52,20 +52,23 @@ public: public: const BFMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureBFMDemod* create(const BFMDemodSettings& settings, bool force) + static MsgConfigureBFMDemod* create(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) { - return new MsgConfigureBFMDemod(settings, force); + return new MsgConfigureBFMDemod(settingsKeys, settings, force); } private: BFMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureBFMDemod(const BFMDemodSettings& settings, bool force) : + MsgConfigureBFMDemod(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -173,19 +176,19 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const BFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); void webapiFormatRDSReport(SWGSDRangel::SWGRDSReport *report); - void webapiReverseSendSettings(QList& channelSettingsKeys, const BFMDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QStringList& channelSettingsKeys, const BFMDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QStringList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const BFMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp b/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp index f0f6d5466..d7340cef0 100644 --- a/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp @@ -143,7 +143,7 @@ bool BFMDemodBaseband::handleMessage(const Message& cmd) MsgConfigureBFMDemodBaseband& cfg = (MsgConfigureBFMDemodBaseband&) cmd; qDebug() << "BFMDemodBaseband::handleMessage: MsgConfigureBFMDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -182,10 +182,10 @@ bool BFMDemodBaseband::handleMessage(const Message& cmd) } } -void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool force) +void BFMDemodBaseband::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) { - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) + || (settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(BFMDemodSettings::requiredBW(settings.m_rfBandwidth), settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); @@ -209,7 +209,7 @@ void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool forc } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -223,9 +223,13 @@ void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool forc } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int BFMDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodbfm/bfmdemodbaseband.h b/plugins/channelrx/demodbfm/bfmdemodbaseband.h index 92fd900cd..e0cf9849a 100644 --- a/plugins/channelrx/demodbfm/bfmdemodbaseband.h +++ b/plugins/channelrx/demodbfm/bfmdemodbaseband.h @@ -41,20 +41,23 @@ public: public: const BFMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureBFMDemodBaseband* create(const BFMDemodSettings& settings, bool force) + static MsgConfigureBFMDemodBaseband* create(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) { - return new MsgConfigureBFMDemodBaseband(settings, force); + return new MsgConfigureBFMDemodBaseband(settingsKeys, settings, force); } private: BFMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureBFMDemodBaseband(const BFMDemodSettings& settings, bool force) : + MsgConfigureBFMDemodBaseband(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -103,7 +106,7 @@ private: MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; } bool handleMessage(const Message& cmd); - void applySettings(const BFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.cpp b/plugins/channelrx/demodbfm/bfmdemodgui.cpp index 7546fd160..21d2a8804 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodgui.cpp @@ -72,7 +72,7 @@ void BFMDemodGUI::resetToDefaults() ui->g14AltFrequencies->setEnabled(false); blockApplySettings(false); - applySettings(); + applySettings(QStringList(), true); } QByteArray BFMDemodGUI::serialize() const @@ -84,7 +84,7 @@ bool BFMDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -148,7 +148,7 @@ void BFMDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void BFMDemodGUI::channelMarkerHighlightedByCursor() @@ -161,7 +161,7 @@ void BFMDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void BFMDemodGUI::on_rfBW_valueChanged(int value) @@ -169,40 +169,40 @@ void BFMDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1 kHz").arg(BFMDemodSettings::getRFBW(value) / 1000.0)); m_channelMarker.setBandwidth(BFMDemodSettings::getRFBW(value)); m_settings.m_rfBandwidth = BFMDemodSettings::getRFBW(value); - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void BFMDemodGUI::on_afBW_valueChanged(int value) { ui->afBWText->setText(QString("%1 kHz").arg(value)); m_settings.m_afBandwidth = value * 1000.0; - applySettings(); + applySettings(QStringList({"afBandwidth"})); } void BFMDemodGUI::on_deEmphasis_currentIndexChanged(int index) { m_settings.m_deEmphasis = static_cast(index); - applySettings(); + applySettings(QStringList({"deEmphasis"})); } void BFMDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volume = value / 10.0; - applySettings(); + applySettings(QStringList({"volume"})); } void BFMDemodGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1 dB").arg(value)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList({"squelch"})); } void BFMDemodGUI::on_audioMute_toggled(bool mute) { m_settings.m_audioMute = mute; - applySettings(); + applySettings(QStringList({"audioMute"})); } void BFMDemodGUI::on_audioStereo_toggled(bool stereo) @@ -213,25 +213,25 @@ void BFMDemodGUI::on_audioStereo_toggled(bool stereo) } m_settings.m_audioStereo = stereo; - applySettings(); + applySettings(QStringList({"audioStereo"})); } void BFMDemodGUI::on_lsbStereo_toggled(bool lsb) { m_settings.m_lsbStereo = lsb; - applySettings(); + applySettings(QStringList({"lsbStereo"})); } void BFMDemodGUI::on_showPilot_clicked() { m_settings.m_showPilot = ui->showPilot->isChecked(); - applySettings(); + applySettings(QStringList({"showPilot"})); } void BFMDemodGUI::on_rds_clicked() { m_settings.m_rdsActive = ui->rds->isChecked(); - applySettings(); + applySettings(QStringList({"rdsActive"})); } void BFMDemodGUI::on_clearData_clicked(bool checked) @@ -339,7 +339,7 @@ void BFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void BFMDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -384,7 +384,9 @@ void BFMDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", + "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -472,7 +474,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban rdsUpdate(true); displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -486,11 +488,11 @@ void BFMDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void BFMDemodGUI::applySettings(bool force) +void BFMDemodGUI::applySettings(const QStringList& channelSettingsKeys, bool force) { if (m_doApplySettings) { - BFMDemod::MsgConfigureBFMDemod* msgConfig = BFMDemod::MsgConfigureBFMDemod::create( m_settings, force); + BFMDemod::MsgConfigureBFMDemod* msgConfig = BFMDemod::MsgConfigureBFMDemod::create(channelSettingsKeys, m_settings, force); m_bfmDemod->getInputMessageQueue()->push(msgConfig); } } @@ -562,7 +564,7 @@ void BFMDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList({"audioDeviceName"})); } } diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.h b/plugins/channelrx/demodbfm/bfmdemodgui.h index f8b0fb2cd..f1b4c38af 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.h +++ b/plugins/channelrx/demodbfm/bfmdemodgui.h @@ -91,7 +91,7 @@ private: virtual ~BFMDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void rdsUpdate(bool force); void rdsUpdateFixedFields(); diff --git a/plugins/channelrx/demodbfm/bfmdemodsettings.cpp b/plugins/channelrx/demodbfm/bfmdemodsettings.cpp index 9b2f68fd5..23dd516c6 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsettings.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodsettings.cpp @@ -195,6 +195,150 @@ bool BFMDemodSettings::deserialize(const QByteArray& data) } } +void BFMDemodSettings::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth")) { + m_afBandwidth = settings.m_afBandwidth; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("audioStereo")) { + m_audioStereo = settings.m_audioStereo; + } + if (settingsKeys.contains("lsbStereo")) { + m_lsbStereo = settings.m_lsbStereo; + } + if (settingsKeys.contains("showPilot")) { + m_showPilot = settings.m_showPilot; + } + if (settingsKeys.contains("rdsActive")) { + m_rdsActive = settings.m_rdsActive; + } + if (settingsKeys.contains("deEmphasis")) { + m_deEmphasis = settings.m_deEmphasis; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString BFMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth") || force) { + ostr << " m_afBandwidth: " << m_afBandwidth; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("audioStereo") || force) { + ostr << " m_audioStereo: " << m_audioStereo; + } + if (settingsKeys.contains("lsbStereo") || force) { + ostr << " m_lsbStereo: " << m_lsbStereo; + } + if (settingsKeys.contains("showPilot") || force) { + ostr << " m_showPilot: " << m_showPilot; + } + if (settingsKeys.contains("rdsActive") || force) { + ostr << " m_rdsActive: " << m_rdsActive; + } + if (settingsKeys.contains("deEmphasis") || force) { + ostr << " m_deEmphasis: " << m_deEmphasis; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + int BFMDemodSettings::getRFBW(int index) { if (index < 0) { diff --git a/plugins/channelrx/demodbfm/bfmdemodsettings.h b/plugins/channelrx/demodbfm/bfmdemodsettings.h index a7ba275e4..449f50550 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsettings.h +++ b/plugins/channelrx/demodbfm/bfmdemodsettings.h @@ -71,6 +71,8 @@ struct BFMDemodSettings void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static int getRFBW(int index); static int getRFBWIndex(int rfbw); diff --git a/plugins/channelrx/demodbfm/bfmdemodsink.cpp b/plugins/channelrx/demodbfm/bfmdemodsink.cpp index 90b9b9bfe..690623de3 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsink.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodsink.cpp @@ -76,7 +76,7 @@ BFMDemodSink::BFMDemodSink() : m_demodBuffer.resize(1<<13); m_demodBufferFill = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -331,37 +331,23 @@ void BFMDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque m_channelFrequencyOffset = channelFrequencyOffset; } -void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force) +void BFMDemodSink::applySettings(const QStringList& settingsKeys, const BFMDemodSettings& settings, bool force) { - qDebug() << "BFMDemodSink::applySettings: MsgConfigureBFMDemod:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_deEmphasis: " << settings.getDeEmphasisTimeConstant() - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioStereo: " << settings.m_audioStereo - << " m_lsbStereo: " << settings.m_lsbStereo - << " m_showPilot: " << settings.m_showPilot - << " m_rdsActive: " << settings.m_rdsActive - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " force: " << force; + qDebug() << "BFMDemodSink::applySettings: MsgConfigureBFMDemod:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_audioStereo && (settings.m_audioStereo != m_settings.m_audioStereo)) || force) + if ((settingsKeys.contains("audioStereo") && (settings.m_audioStereo != m_settings.m_audioStereo)) || force) { m_pilotPLL.configure(19000.0/m_channelSampleRate, 50.0/m_channelSampleRate, 0.01); applyAudioSampleRate(m_audioSampleRate); // re-apply audio sample rate to reconfigure interpolators } - if ((settings.getDeEmphasisTimeConstant() != m_settings.getDeEmphasisTimeConstant()) || force) + if ((settingsKeys.contains("deEmphasis") && (settings.getDeEmphasisTimeConstant() != m_settings.getDeEmphasisTimeConstant())) || force) { m_deemphasisFilterX.configure(settings.getDeEmphasisTimeConstant() * m_audioSampleRate); m_deemphasisFilterY.configure(settings.getDeEmphasisTimeConstant() * m_audioSampleRate); } - if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) + if ((settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_afBandwidth); m_interpolatorDistanceRemain = (Real) m_channelSampleRate / m_audioSampleRate; @@ -378,7 +364,7 @@ void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force) m_lowpass.create(21, m_audioSampleRate, settings.m_afBandwidth); } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { Real lowCut = -(settings.m_rfBandwidth / 2.0) / m_channelSampleRate; Real hiCut = (settings.m_rfBandwidth / 2.0) / m_channelSampleRate; @@ -386,7 +372,7 @@ void BFMDemodSink::applySettings(const BFMDemodSettings& settings, bool force) m_phaseDiscri.setFMScaling(m_channelSampleRate / m_fmExcursion); } - if ((settings.m_squelch != m_settings.m_squelch) || force) { + if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || force) { m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0); } diff --git a/plugins/channelrx/demodbfm/bfmdemodsink.h b/plugins/channelrx/demodbfm/bfmdemodsink.h index 675ab31ff..88af8a2a6 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsink.h +++ b/plugins/channelrx/demodbfm/bfmdemodsink.h @@ -84,7 +84,7 @@ public: RDSParser& getRDSParser() { return m_rdsParser; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const BFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& keys, const BFMDemodSettings& settings, bool force = false); AudioFifo *getAudioFifo() { return &m_audioFifo; } void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); } diff --git a/plugins/channelrx/demoddab/dabdemod.cpp b/plugins/channelrx/demoddab/dabdemod.cpp index d75b5136d..7c62cb930 100644 --- a/plugins/channelrx/demoddab/dabdemod.cpp +++ b/plugins/channelrx/demoddab/dabdemod.cpp @@ -69,7 +69,7 @@ DABDemod::DABDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -143,7 +143,7 @@ void DABDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(m_settings, true); + DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -161,7 +161,7 @@ bool DABDemod::handleMessage(const Message& cmd) { MsgConfigureDABDemod& cfg = (MsgConfigureDABDemod&) cmd; qDebug() << "DABDemod::handleMessage: MsgConfigureDABDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -313,25 +313,18 @@ void DABDemod::setCenterFrequency(qint64 frequency) { DABDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList({"inputFrequencyOffset"}), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(settings, false); + MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(QStringList({"inputFrequencyOffset"}), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void DABDemod::applySettings(const DABDemodSettings& settings, bool force) +void DABDemod::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) { - qDebug() << "DABDemod::applySettings:" - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "DABDemod::applySettings:" << settings.getDebugString(settingsKeys, force); QList reverseAPIKeys; @@ -353,7 +346,7 @@ void DABDemod::applySettings(const DABDemodSettings& settings, bool force) if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { reverseAPIKeys.append("audioDeviceName"); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -368,17 +361,17 @@ void DABDemod::applySettings(const DABDemodSettings& settings, bool force) reverseAPIKeys.append("streamIndex"); } - DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(settings, force); + DABDemodBaseband::MsgConfigureDABDemodBaseband *msg = DABDemodBaseband::MsgConfigureDABDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } m_settings = settings; @@ -393,14 +386,14 @@ bool DABDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(m_settings, true); + MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(m_settings, true); + MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -455,13 +448,13 @@ int DABDemod::webapiSettingsPutPatch( DABDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(settings, force); + MsgConfigureDABDemod *msg = MsgConfigureDABDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("DABDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(settings, force); + MsgConfigureDABDemod *msgToGUI = MsgConfigureDABDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -583,7 +576,7 @@ void DABDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& resp } } -void DABDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const DABDemodSettings& settings, bool force) +void DABDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const DABDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -609,7 +602,7 @@ void DABDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co } void DABDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DABDemodSettings& settings, bool force diff --git a/plugins/channelrx/demoddab/dabdemod.h b/plugins/channelrx/demoddab/dabdemod.h index bce5df35b..962e2e5d3 100644 --- a/plugins/channelrx/demoddab/dabdemod.h +++ b/plugins/channelrx/demoddab/dabdemod.h @@ -44,19 +44,22 @@ public: public: const DABDemodSettings& getSettings() const { return m_settings; } bool getForce() const { return m_force; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } - static MsgConfigureDABDemod* create(const DABDemodSettings& settings, bool force) + static MsgConfigureDABDemod* create(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) { - return new MsgConfigureDABDemod(settings, force); + return new MsgConfigureDABDemod(settingsKeys, settings, force); } private: DABDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDABDemod(const DABDemodSettings& settings, bool force) : + MsgConfigureDABDemod(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -411,11 +414,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const DABDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const DABDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const DABDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DABDemodSettings& settings, bool force diff --git a/plugins/channelrx/demoddab/dabdemodbaseband.cpp b/plugins/channelrx/demoddab/dabdemodbaseband.cpp index db6bee617..0c42ccf6a 100644 --- a/plugins/channelrx/demoddab/dabdemodbaseband.cpp +++ b/plugins/channelrx/demoddab/dabdemodbaseband.cpp @@ -138,7 +138,7 @@ bool DABDemodBaseband::handleMessage(const Message& cmd) MsgConfigureDABDemodBaseband& cfg = (MsgConfigureDABDemodBaseband&) cmd; qDebug() << "DABDemodBaseband::handleMessage: MsgConfigureDABDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -174,15 +174,15 @@ bool DABDemodBaseband::handleMessage(const Message& cmd) } } -void DABDemodBaseband::applySettings(const DABDemodSettings& settings, bool force) +void DABDemodBaseband::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(DABDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -196,9 +196,13 @@ void DABDemodBaseband::applySettings(const DABDemodSettings& settings, bool forc m_sink.applyAudioSampleRate(audioSampleRate); } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void DABDemodBaseband::setBasebandSampleRate(int sampleRate) diff --git a/plugins/channelrx/demoddab/dabdemodbaseband.h b/plugins/channelrx/demoddab/dabdemodbaseband.h index 90b7eeef8..7d36bee57 100644 --- a/plugins/channelrx/demoddab/dabdemodbaseband.h +++ b/plugins/channelrx/demoddab/dabdemodbaseband.h @@ -42,20 +42,23 @@ public: public: const DABDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDABDemodBaseband* create(const DABDemodSettings& settings, bool force) + static MsgConfigureDABDemodBaseband* create(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) { - return new MsgConfigureDABDemodBaseband(settings, force); + return new MsgConfigureDABDemodBaseband(settingsKeys, settings, force); } private: DABDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDABDemodBaseband(const DABDemodSettings& settings, bool force) : + MsgConfigureDABDemodBaseband(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const DABDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demoddab/dabdemodgui.cpp b/plugins/channelrx/demoddab/dabdemodgui.cpp index 956632439..b4c95620e 100644 --- a/plugins/channelrx/demoddab/dabdemodgui.cpp +++ b/plugins/channelrx/demoddab/dabdemodgui.cpp @@ -122,7 +122,7 @@ void DABDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray DABDemodGUI::serialize() const @@ -134,7 +134,7 @@ bool DABDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -203,7 +203,7 @@ void DABDemodGUI::on_programs_cellDoubleClicked(int row, int column) double centreFreq = frequencyInHz-m_settings.m_inputFrequencyOffset; ChannelWebAPIUtils::setCenterFrequency(m_dabDemod->getDeviceSetIndex(), centreFreq); clearProgram(); - applySettings(); + applySettings(QStringList({"program"})); } // Ensemble name can sometimes be decoded after program name, so we @@ -365,7 +365,7 @@ void DABDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void DABDemodGUI::channelMarkerHighlightedByCursor() @@ -378,20 +378,20 @@ void DABDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void DABDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList({"audioMute"})); } void DABDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volume = value / 10.0; - applySettings(); + applySettings(QStringList({"volume"})); } void DABDemodGUI::on_rfBW_valueChanged(int value) @@ -400,14 +400,14 @@ void DABDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void DABDemodGUI::on_filter_editingFinished() { m_settings.m_filter = ui->filter->text(); filter(); - applySettings(); + applySettings(QStringList({"filter"})); } void DABDemodGUI::on_clearTable_clicked() @@ -446,7 +446,7 @@ void DABDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void DABDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -491,7 +491,9 @@ void DABDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); @@ -574,7 +576,7 @@ DABDemodGUI::DABDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -588,11 +590,11 @@ void DABDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void DABDemodGUI::applySettings(bool force) +void DABDemodGUI::applySettings(const QStringList& channelSettingsKeys, bool force) { if (m_doApplySettings) { - DABDemod::MsgConfigureDABDemod* message = DABDemod::MsgConfigureDABDemod::create( m_settings, force); + DABDemod::MsgConfigureDABDemod* message = DABDemod::MsgConfigureDABDemod::create(channelSettingsKeys, m_settings, force); m_dabDemod->getInputMessageQueue()->push(message); } } @@ -706,7 +708,7 @@ void DABDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList({"audioDeviceName"})); } } @@ -796,4 +798,3 @@ void DABDemodGUI::on_findOnMap_clicked() qDebug() << "Finding " << id; FeatureWebAPIUtils::mapFind(id); } - diff --git a/plugins/channelrx/demoddab/dabdemodgui.h b/plugins/channelrx/demoddab/dabdemodgui.h index 65d990053..27419b044 100644 --- a/plugins/channelrx/demoddab/dabdemodgui.h +++ b/plugins/channelrx/demoddab/dabdemodgui.h @@ -90,7 +90,7 @@ private: virtual ~DABDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& channelSettingsKeys, bool force = false); void displaySettings(); void updateEnsembleName(const QString& ensemble); int findProgramRowById(int id); diff --git a/plugins/channelrx/demoddab/dabdemodsettings.cpp b/plugins/channelrx/demoddab/dabdemodsettings.cpp index 5bd91bce4..e719de9ac 100644 --- a/plugins/channelrx/demoddab/dabdemodsettings.cpp +++ b/plugins/channelrx/demoddab/dabdemodsettings.cpp @@ -175,4 +175,116 @@ bool DABDemodSettings::deserialize(const QByteArray& data) } } +void DABDemodSettings::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("filter")) { + m_filter = settings.m_filter; + } + if (settingsKeys.contains("program")) { + m_program = settings.m_program; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString DABDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("filter") || force) { + ostr << " m_filter: " << m_filter.toStdString(); + } + if (settingsKeys.contains("program") || force) { + ostr << " m_program: " << m_program.toStdString(); + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demoddab/dabdemodsettings.h b/plugins/channelrx/demoddab/dabdemodsettings.h index b5d24e4c9..9852d0ebc 100644 --- a/plugins/channelrx/demoddab/dabdemodsettings.h +++ b/plugins/channelrx/demoddab/dabdemodsettings.h @@ -64,6 +64,8 @@ struct DABDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_DABDEMODSETTINGS_H */ diff --git a/plugins/channelrx/demoddab/dabdemodsink.cpp b/plugins/channelrx/demoddab/dabdemodsink.cpp index b599c24b5..49a9f1adb 100644 --- a/plugins/channelrx/demoddab/dabdemodsink.cpp +++ b/plugins/channelrx/demoddab/dabdemodsink.cpp @@ -507,7 +507,7 @@ DABDemodSink::DABDemodSink() : m_demodBuffer.resize(1<<13); m_demodBufferFill = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); m_api.dabMode = 1; // Latest DAB spec only has mode 1 @@ -613,19 +613,18 @@ void DABDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque m_channelFrequencyOffset = channelFrequencyOffset; } -void DABDemodSink::applySettings(const DABDemodSettings& settings, bool force) +void DABDemodSink::applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force) { - qDebug() << "DABDemodSink::applySettings:" - << " force: " << force; + qDebug() << "DABDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) DABDEMOD_CHANNEL_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_program != m_settings.m_program) || force) + if ((settingsKeys.contains("program") && (settings.m_program != m_settings.m_program)) || force) { if (!settings.m_program.isEmpty()) { setProgram(settings.m_program); diff --git a/plugins/channelrx/demoddab/dabdemodsink.h b/plugins/channelrx/demoddab/dabdemodsink.h index a808ccf7b..96c2a9617 100644 --- a/plugins/channelrx/demoddab/dabdemodsink.h +++ b/plugins/channelrx/demoddab/dabdemodsink.h @@ -49,7 +49,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const DABDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DABDemodSettings& settings, bool force = false); void applyAudioSampleRate(int sampleRate); void applyDABAudioSampleRate(int sampleRate); int getAudioSampleRate() const { return m_audioSampleRate; } diff --git a/plugins/channelrx/demoddatv/datvdemod.cpp b/plugins/channelrx/demoddatv/datvdemod.cpp index 4834f2217..55c2447fe 100644 --- a/plugins/channelrx/demoddatv/datvdemod.cpp +++ b/plugins/channelrx/demoddatv/datvdemod.cpp @@ -53,7 +53,7 @@ DATVDemod::DATVDemod(DeviceAPI *deviceAPI) : m_basebandSink = new DATVDemodBaseband(); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -123,7 +123,7 @@ void DATVDemod::start() m_basebandSink->startWork(); m_thread.start(); - DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(m_settings, true); + DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -141,7 +141,7 @@ bool DATVDemod::handleMessage(const Message& cmd) { MsgConfigureDATVDemod& objCfg = (MsgConfigureDATVDemod&) cmd; qDebug() << "DATVDemod::handleMessage: MsgConfigureDATVDemod"; - applySettings(objCfg.getSettings(), objCfg.getForce()); + applySettings(objCfg.getSettingsKeys(), objCfg.getSettings(), objCfg.getForce()); return true; } @@ -172,104 +172,21 @@ void DATVDemod::setCenterFrequency(qint64 frequency) { DATVDemodSettings settings = m_settings; settings.m_centerFrequency = frequency; - applySettings(settings, false); + applySettings(QStringList("centerFrequency"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(settings, false); + MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(QStringList("centerFrequency"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force) +void DATVDemod::applySettings(const QList& settingsKeys, const DATVDemodSettings& settings, bool force) { QString debugMsg = tr("DATVDemod::applySettings: force: %1").arg(force); settings.debug(debugMsg); - QList reverseAPIKeys; - - if (settings.m_rgbColor != m_settings.m_rgbColor) { - reverseAPIKeys.append("rgbColor"); - } - if (settings.m_title != m_settings.m_title) { - reverseAPIKeys.append("title"); - } - if (settings.m_rfBandwidth != m_settings.m_rfBandwidth) { - reverseAPIKeys.append("rfBandwidth"); - } - if (settings.m_centerFrequency != m_settings.m_centerFrequency) { - reverseAPIKeys.append("centerFrequency"); - } - if (settings.m_standard != m_settings.m_standard) { - reverseAPIKeys.append("standard"); - } - if (settings.m_modulation != m_settings.m_modulation) { - reverseAPIKeys.append("modulation"); - } - if (settings.m_fec != m_settings.m_fec) { - reverseAPIKeys.append("fec"); - } - if (settings.m_softLDPC != m_settings.m_softLDPC) { - reverseAPIKeys.append("softLDPC"); - } - if (settings.m_softLDPCMaxTrials != m_settings.m_softLDPCMaxTrials) { - reverseAPIKeys.append("softLDPCMaxTrials"); - } - if (settings.m_maxBitflips != m_settings.m_maxBitflips) { - reverseAPIKeys.append("maxBitflips"); - } - if (settings.m_audioMute != m_settings.m_audioMute) { - reverseAPIKeys.append("audioMute"); - } - if (settings.m_audioDeviceName != m_settings.m_audioDeviceName) { - reverseAPIKeys.append("audioDeviceName"); - } - if (settings.m_symbolRate != m_settings.m_symbolRate) { - reverseAPIKeys.append("symbolRate"); - } - if (settings.m_notchFilters != m_settings.m_notchFilters) { - reverseAPIKeys.append("notchFilters"); - } - if (settings.m_allowDrift != m_settings.m_allowDrift) { - reverseAPIKeys.append("allowDrift"); - } - if (settings.m_fastLock != m_settings.m_fastLock) { - reverseAPIKeys.append("fastLock"); - } - if (settings.m_filter != m_settings.m_filter) { - reverseAPIKeys.append("filter"); - } - if (settings.m_hardMetric != m_settings.m_hardMetric) { - reverseAPIKeys.append("hardMetric"); - } - if (settings.m_rollOff != m_settings.m_rollOff) { - reverseAPIKeys.append("rollOff"); - } - if (settings.m_viterbi != m_settings.m_viterbi) { - reverseAPIKeys.append("viterbi"); - } - if (settings.m_excursion != m_settings.m_excursion) { - reverseAPIKeys.append("excursion"); - } - if (settings.m_audioVolume != m_settings.m_audioVolume) { - reverseAPIKeys.append("audioVolume"); - } - if (settings.m_videoMute != m_settings.m_videoMute) { - reverseAPIKeys.append("videoMute"); - } - if (settings.m_udpTSAddress != m_settings.m_udpTSAddress) { - reverseAPIKeys.append("udpTSAddress"); - } - if (settings.m_udpTSPort != m_settings.m_udpTSPort) { - reverseAPIKeys.append("udpTSPort"); - } - if (settings.m_udpTS != m_settings.m_udpTS) { - reverseAPIKeys.append("udpTS"); - } - if (settings.m_playerEnable != m_settings.m_playerEnable) { - reverseAPIKeys.append("playerEnable"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -280,28 +197,26 @@ void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settings, force); + DATVDemodBaseband::MsgConfigureDATVDemodBaseband *msg = DATVDemodBaseband::MsgConfigureDATVDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI != m_settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (settings.m_reverseAPIAddress != m_settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (settings.m_reverseAPIPort != m_settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (settings.m_reverseAPIDeviceIndex != m_settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (settings.m_reverseAPIChannelIndex != m_settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -353,14 +268,14 @@ int DATVDemod::webapiSettingsPutPatch( DATVDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureDATVDemod *msg = MsgConfigureDATVDemod::create(settings, force); + MsgConfigureDATVDemod *msg = MsgConfigureDATVDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("DATVDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(settings, force); + MsgConfigureDATVDemod *msgToGUI = MsgConfigureDATVDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -589,7 +504,7 @@ void DATVDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons void DATVDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const DATVDemodSettings& settings, bool force) { @@ -613,7 +528,7 @@ void DATVDemod::sendChannelSettings( } void DATVDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DATVDemodSettings& settings, bool force @@ -728,7 +643,7 @@ void DATVDemod::webapiFormatChannelSettings( } } -void DATVDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const DATVDemodSettings& settings, bool force) +void DATVDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const DATVDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); diff --git a/plugins/channelrx/demoddatv/datvdemod.h b/plugins/channelrx/demoddatv/datvdemod.h index ebb7d6135..a898c235d 100644 --- a/plugins/channelrx/demoddatv/datvdemod.h +++ b/plugins/channelrx/demoddatv/datvdemod.h @@ -142,20 +142,23 @@ public: public: const DATVDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDATVDemod* create(const DATVDemodSettings& settings, bool force) + static MsgConfigureDATVDemod* create(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) { - return new MsgConfigureDATVDemod(settings, force); + return new MsgConfigureDATVDemod(settingsKeys, settings, force); } private: DATVDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDATVDemod(const DATVDemodSettings& settings, bool force) : + MsgConfigureDATVDemod(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -170,17 +173,17 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const DATVDemodSettings& settings, bool force = false); + void applySettings(const QList& settingsKeys, const DATVDemodSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const DATVDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const DATVDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const DATVDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DATVDemodSettings& settings, bool force diff --git a/plugins/channelrx/demoddatv/datvdemodbaseband.cpp b/plugins/channelrx/demoddatv/datvdemodbaseband.cpp index 33414e329..980e99d64 100644 --- a/plugins/channelrx/demoddatv/datvdemodbaseband.cpp +++ b/plugins/channelrx/demoddatv/datvdemodbaseband.cpp @@ -128,7 +128,7 @@ bool DATVDemodBaseband::handleMessage(const Message& cmd) MsgConfigureDATVDemodBaseband& cfg = (MsgConfigureDATVDemodBaseband&) cmd; qDebug() << "DATVDemodBaseband::handleMessage: MsgConfigureDATVDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -149,12 +149,12 @@ bool DATVDemodBaseband::handleMessage(const Message& cmd) } } -void DATVDemodBaseband::applySettings(const DATVDemodSettings& settings, bool force) +void DATVDemodBaseband::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) { - qDebug("DATVDemodBaseband::applySettings"); + qDebug() << "DATVDemodBaseband::applySettings" << settings.getDebugString(settingsKeys, force); - if ((settings.m_centerFrequency != m_settings.m_centerFrequency) || - (settings.m_symbolRate != m_settings.m_symbolRate) || force) + if ((settingsKeys.contains("centerFrequency") && (settings.m_centerFrequency != m_settings.m_centerFrequency)) || + (settingsKeys.contains("symbolRate") && (settings.m_symbolRate != m_settings.m_symbolRate)) || force) { unsigned int desiredSampleRate = 2 * settings.m_symbolRate; // m_channelizer->getBasebandSampleRate(); m_channelizer->setChannelization(desiredSampleRate, settings.m_centerFrequency); @@ -162,15 +162,20 @@ void DATVDemodBaseband::applySettings(const DATVDemodSettings& settings, bool fo m_sink->applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); audioDeviceManager->addAudioSink(m_sink->getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); } - m_sink->applySettings(settings, force); - m_settings = settings; + m_sink->applySettings(settingsKeys, settings, force); + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int DATVDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demoddatv/datvdemodbaseband.h b/plugins/channelrx/demoddatv/datvdemodbaseband.h index 23ca473cf..0b28c0993 100644 --- a/plugins/channelrx/demoddatv/datvdemodbaseband.h +++ b/plugins/channelrx/demoddatv/datvdemodbaseband.h @@ -41,20 +41,23 @@ public: public: const DATVDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDATVDemodBaseband* create(const DATVDemodSettings& settings, bool force) + static MsgConfigureDATVDemodBaseband* create(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) { - return new MsgConfigureDATVDemodBaseband(settings, force); + return new MsgConfigureDATVDemodBaseband(settingsKeys, settings, force); } private: DATVDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDATVDemodBaseband(const DATVDemodSettings& settings, bool force) : + MsgConfigureDATVDemodBaseband(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -106,7 +109,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const DATVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demoddatv/datvdemodgui.cpp b/plugins/channelrx/demoddatv/datvdemodgui.cpp index 6fa1805f0..b2df4bd4a 100644 --- a/plugins/channelrx/demoddatv/datvdemodgui.cpp +++ b/plugins/channelrx/demoddatv/datvdemodgui.cpp @@ -73,7 +73,7 @@ void DATVDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray DATVDemodGUI::serialize() const @@ -86,7 +86,7 @@ bool DATVDemodGUI::deserialize(const QByteArray& arrData) if (m_settings.deserialize(arrData)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else @@ -150,7 +150,7 @@ void DATVDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_centerFrequency = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("centerFrequency")); } void DATVDemodGUI::channelMarkerHighlightedByCursor() @@ -165,7 +165,7 @@ void DATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void DATVDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -210,7 +210,10 @@ void DATVDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "color", + "useReverseAPI", "reverseAPIAddress", "reverseAPIPort", + "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); @@ -481,7 +484,7 @@ void DATVDemodGUI::displaySystemConfiguration() ui->cmbFEC->blockSignals(false); } -void DATVDemodGUI::applySettings(bool force) +void DATVDemodGUI::applySettings(const QStringList& settingsKeys, const bool force) { if (m_blnDoApplySettings) { @@ -492,7 +495,7 @@ void DATVDemodGUI::applySettings(bool force) QString msg = tr("DATVDemodGUI::applySettings: force: %1").arg(force ? "true" : "false"); m_settings.debug(msg); - DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(m_settings, force); + DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(settingsKeys, m_settings, force); m_datvDemod->getInputMessageQueue()->push(message); } } @@ -524,7 +527,7 @@ void DATVDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -538,7 +541,7 @@ void DATVDemodGUI::ldpcToolSelect(const QPoint& p) if (ldpcDialog.exec() == QDialog::Accepted) { m_settings.m_softLDPCMaxTrials = ldpcDialog.getMaxTrials(); - applySettings(); + applySettings(QStringList("softLDPCMaxTrials")); } } @@ -683,7 +686,7 @@ void DATVDemodGUI::on_cmbStandard_currentIndexChanged(int index) m_settings.validateSystemConfiguration(); displaySystemConfiguration(); - applySettings(); + applySettings(QStringList("standard")); } void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1) @@ -693,7 +696,7 @@ void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1) m_settings.m_modulation = DATVDemodSettings::getModulationFromStr(strModulation); m_settings.validateSystemConfiguration(); displaySystemConfiguration(); - + applySettings(QStringList("modulation")); //Viterbi only for BPSK and QPSK if ((m_settings.m_modulation != DATVDemodSettings::BPSK) && (m_settings.m_modulation != DATVDemodSettings::QPSK)) @@ -701,7 +704,7 @@ void DATVDemodGUI::on_cmbModulation_currentIndexChanged(int arg1) ui->chkViterbi->setChecked(false); } - applySettings(); + applySettings(QStringList("modulation")); } void DATVDemodGUI::on_cmbFEC_currentIndexChanged(int arg1) @@ -709,31 +712,31 @@ void DATVDemodGUI::on_cmbFEC_currentIndexChanged(int arg1) (void) arg1; QString strFEC = ui->cmbFEC->currentText(); m_settings.m_fec = DATVDemodSettings::getCodeRateFromStr(strFEC); - applySettings(); + applySettings(QStringList("fec")); } void DATVDemodGUI::on_softLDPC_clicked() { m_settings.m_softLDPC = ui->softLDPC->isChecked(); - applySettings(); + applySettings(QStringList("softLDPC")); } void DATVDemodGUI::on_maxBitflips_valueChanged(int value) { m_settings.m_maxBitflips = value; - applySettings(); + applySettings(QStringList("maxBitflips")); } void DATVDemodGUI::on_chkViterbi_clicked() { m_settings.m_viterbi = ui->chkViterbi->isChecked(); - applySettings(); + applySettings(QStringList("viterbi")); } void DATVDemodGUI::on_chkHardMetric_clicked() { m_settings.m_hardMetric = ui->chkHardMetric->isChecked(); - applySettings(); + applySettings(QStringList("hardMetric")); } void DATVDemodGUI::on_resetDefaults_clicked() @@ -747,7 +750,7 @@ void DATVDemodGUI::on_spiSymbolRate_valueChanged(int value) ui->datvStdSR->blockSignals(true); ui->datvStdSR->setValue(indexFromSymbolRate(value)); ui->datvStdSR->blockSignals(false); - applySettings(); + applySettings(QStringList("symbolRate")); } void DATVDemodGUI::on_datvStdSR_valueChanged(int value) @@ -761,19 +764,19 @@ void DATVDemodGUI::on_datvStdSR_valueChanged(int value) m_channelMarker.setBandwidth(m_settings.m_rfBandwidth); ui->rfBandwidth->blockSignals(false); ui->spiSymbolRate->blockSignals(false); - applySettings(); + applySettings(QStringList({"symbolRate", "rfBandwidth"})); } void DATVDemodGUI::on_spiNotchFilters_valueChanged(int value) { m_settings.m_notchFilters = value; - applySettings(); + applySettings(QStringList("notchFilters")); } void DATVDemodGUI::on_chkAllowDrift_clicked() { m_settings.m_allowDrift = ui->chkAllowDrift->isChecked(); - applySettings(); + applySettings(QStringList("allowDrift")); } void DATVDemodGUI::on_fullScreen_clicked() @@ -819,45 +822,45 @@ void DATVDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_centerFrequency = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("centerFrequency")); } void DATVDemodGUI::on_rfBandwidth_changed(qint64 value) { m_channelMarker.setBandwidth(value); m_settings.m_rfBandwidth = m_channelMarker.getBandwidth(); - applySettings(); + applySettings(QStringList("rfBandwidth")); } void DATVDemodGUI::on_chkFastlock_clicked() { m_settings.m_fastLock = ui->chkFastlock->isChecked(); - applySettings(); + applySettings(QStringList("fastLock")); } void DATVDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void DATVDemodGUI::on_videoMute_toggled(bool checked) { m_settings.m_videoMute = checked; - applySettings(); + applySettings(QStringList("videoMute")); } void DATVDemodGUI::on_audioVolume_valueChanged(int value) { ui->audioVolumeText->setText(tr("%1").arg(value)); m_settings.m_audioVolume = value; - applySettings(); + applySettings(QStringList("audioVolume")); } void DATVDemodGUI::on_udpTS_clicked(bool checked) { m_settings.m_udpTS = checked; - applySettings(); + applySettings(QStringList("udpTS")); } void DATVDemodGUI::on_StreamMetaDataChanged(DataTSMetaData2 *objMetaData) @@ -907,7 +910,7 @@ void DATVDemodGUI::on_playerEnable_clicked() connect(m_datvDemod->getUDPStream(), &DATVUDPStream::fifoData, this, &DATVDemodGUI::on_StreamDataAvailable); } - applySettings(); + applySettings(QStringList("playerEnable")); } void DATVDemodGUI::displayRRCParameters(bool blnVisible) @@ -929,25 +932,25 @@ void DATVDemodGUI::on_cmbFilter_currentIndexChanged(int index) } displayRRCParameters(index == 2); - applySettings(); + applySettings(QStringList("filter")); } void DATVDemodGUI::on_spiRollOff_valueChanged(int value) { m_settings.m_rollOff = ((float) value) / 100.0f; - applySettings(); + applySettings(QStringList("rollOff")); } void DATVDemodGUI::on_spiExcursion_valueChanged(int value) { m_settings.m_excursion = value; - applySettings(); + applySettings(QStringList("excursion")); } void DATVDemodGUI::on_udpTSAddress_editingFinished() { m_settings.m_udpTSAddress = ui->udpTSAddress->text(); - applySettings(); + applySettings(QStringList("udpTSAddress")); } void DATVDemodGUI::on_udpTSPort_editingFinished() @@ -961,7 +964,7 @@ void DATVDemodGUI::on_udpTSPort_editingFinished() m_settings.m_udpTSPort = udpPort; ui->udpTSPort->setText(tr("%1").arg(udpPort)); - applySettings(); + applySettings(QStringList("udpTSPort")); } void DATVDemodGUI::makeUIConnections() diff --git a/plugins/channelrx/demoddatv/datvdemodgui.h b/plugins/channelrx/demoddatv/datvdemodgui.h index 0c0453b7f..df94e00ff 100644 --- a/plugins/channelrx/demoddatv/datvdemodgui.h +++ b/plugins/channelrx/demoddatv/datvdemodgui.h @@ -143,7 +143,7 @@ private: virtual ~DATVDemodGUI(); void blockApplySettings(bool blnBlock); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displaySystemConfiguration(); QString formatBytes(qint64 intBytes); diff --git a/plugins/channelrx/demoddatv/datvdemodsettings.cpp b/plugins/channelrx/demoddatv/datvdemodsettings.cpp index 73b9d5d26..bcb13058d 100644 --- a/plugins/channelrx/demoddatv/datvdemodsettings.cpp +++ b/plugins/channelrx/demoddatv/datvdemodsettings.cpp @@ -349,6 +349,228 @@ void DATVDemodSettings::validateSystemConfiguration() } } +void DATVDemodSettings::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings) +{ + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("centerFrequency")) { + m_centerFrequency = settings.m_centerFrequency; + } + if (settingsKeys.contains("standard")) { + m_standard = settings.m_standard; + } + if (settingsKeys.contains("modulation")) { + m_modulation = settings.m_modulation; + } + if (settingsKeys.contains("fec")) { + m_fec = settings.m_fec; + } + if (settingsKeys.contains("softLDPC")) { + m_softLDPC = settings.m_softLDPC; + } + if (settingsKeys.contains("softLDPCMaxTrials")) { + m_softLDPCMaxTrials = settings.m_softLDPCMaxTrials; + } + if (settingsKeys.contains("maxBitflips")) { + m_maxBitflips = settings.m_maxBitflips; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("symbolRate")) { + m_symbolRate = settings.m_symbolRate; + } + if (settingsKeys.contains("notchFilters")) { + m_notchFilters = settings.m_notchFilters; + } + if (settingsKeys.contains("allowDrift")) { + m_allowDrift = settings.m_allowDrift; + } + if (settingsKeys.contains("fastLock")) { + m_fastLock = settings.m_fastLock; + } + if (settingsKeys.contains("filter")) { + m_filter = settings.m_filter; + } + if (settingsKeys.contains("hardMetric")) { + m_hardMetric = settings.m_hardMetric; + } + if (settingsKeys.contains("rollOff")) { + m_rollOff = settings.m_rollOff; + } + if (settingsKeys.contains("viterbi")) { + m_viterbi = settings.m_viterbi; + } + if (settingsKeys.contains("excursion")) { + m_excursion = settings.m_excursion; + } + if (settingsKeys.contains("audioVolume")) { + m_audioVolume = settings.m_audioVolume; + } + if (settingsKeys.contains("videoMute")) { + m_videoMute = settings.m_videoMute; + } + if (settingsKeys.contains("udpTSAddress")) { + m_udpTSAddress = settings.m_udpTSAddress; + } + if (settingsKeys.contains("udpTSPort")) { + m_udpTSPort = settings.m_udpTSPort; + } + if (settingsKeys.contains("udpTS")) { + m_udpTS = settings.m_udpTS; + } + if (settingsKeys.contains("playerEnable")) { + m_playerEnable = settings.m_playerEnable; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString DATVDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("centerFrequency") || force) { + ostr << " m_centerFrequency: " << m_centerFrequency; + } + if (settingsKeys.contains("standard") || force) { + ostr << " m_standard: " << m_standard; + } + if (settingsKeys.contains("modulation") || force) { + ostr << " m_modulation: " << m_modulation; + } + if (settingsKeys.contains("fec") || force) { + ostr << " m_fec: " << m_fec; + } + if (settingsKeys.contains("softLDPC") || force) { + ostr << " m_softLDPC: " << m_softLDPC; + } + if (settingsKeys.contains("softLDPCMaxTrials") || force) { + ostr << " m_softLDPCMaxTrials: " << m_softLDPCMaxTrials; + } + if (settingsKeys.contains("maxBitflips") || force) { + ostr << " m_maxBitflips: " << m_maxBitflips; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("symbolRate") || force) { + ostr << " m_symbolRate: " << m_symbolRate; + } + if (settingsKeys.contains("notchFilters") || force) { + ostr << " m_notchFilters: " << m_notchFilters; + } + if (settingsKeys.contains("allowDrift") || force) { + ostr << " m_allowDrift: " << m_allowDrift; + } + if (settingsKeys.contains("fastLock") || force) { + ostr << " m_fastLock: " << m_fastLock; + } + if (settingsKeys.contains("filter") || force) { + ostr << " m_filter: " << m_filter; + } + if (settingsKeys.contains("hardMetric") || force) { + ostr << " m_hardMetric: " << m_hardMetric; + } + if (settingsKeys.contains("rollOff") || force) { + ostr << " m_rollOff: " << m_rollOff; + } + if (settingsKeys.contains("viterbi") || force) { + ostr << " m_viterbi: " << m_viterbi; + } + if (settingsKeys.contains("excursion") || force) { + ostr << " m_excursion: " << m_excursion; + } + if (settingsKeys.contains("audioVolume") || force) { + ostr << " m_audioVolume: " << m_audioVolume; + } + if (settingsKeys.contains("videoMute") || force) { + ostr << " m_videoMute: " << m_videoMute; + } + if (settingsKeys.contains("udpTSAddress") || force) { + ostr << " m_udpTSAddress: " << m_udpTSAddress.toStdString(); + } + if (settingsKeys.contains("udpTSPort") || force) { + ostr << " m_udpTSPort: " << m_udpTSPort; + } + if (settingsKeys.contains("udpTS") || force) { + ostr << " m_udpTS: " << m_udpTS; + } + if (settingsKeys.contains("playerEnable") || force) { + ostr << " m_playerEnable: " << m_playerEnable; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + DATVDemodSettings::DATVModulation DATVDemodSettings::getModulationFromStr(const QString& str) { if (str == "BPSK") { @@ -591,4 +813,3 @@ DATVDemodSettings::DATVModulation DATVDemodSettings::getModulationFromLeanDVBCod return DATVDemodSettings::DATVModulation::MOD_UNSET; } } - diff --git a/plugins/channelrx/demoddatv/datvdemodsettings.h b/plugins/channelrx/demoddatv/datvdemodsettings.h index 1d646bf01..d83c8ce5f 100644 --- a/plugins/channelrx/demoddatv/datvdemodsettings.h +++ b/plugins/channelrx/demoddatv/datvdemodsettings.h @@ -125,6 +125,8 @@ struct DATVDemodSettings void debug(const QString& msg) const; bool isDifferent(const DATVDemodSettings& other); // true if a change of settings should trigger DVB framework config update void validateSystemConfiguration(); + void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static DATVModulation getModulationFromStr(const QString& str); static DATVCodeRate getCodeRateFromStr(const QString& str); diff --git a/plugins/channelrx/demoddatv/datvdemodsink.cpp b/plugins/channelrx/demoddatv/datvdemodsink.cpp index 25ded47ac..0ba3033e9 100644 --- a/plugins/channelrx/demoddatv/datvdemodsink.cpp +++ b/plugins/channelrx/demoddatv/datvdemodsink.cpp @@ -31,6 +31,9 @@ #include #include "datvdemodreport.h" +#ifndef SERVER_MODE +#include "datvideorender.h" +#endif const unsigned int DATVDemodSink::m_rfFilterFftLength = 512; @@ -68,9 +71,11 @@ DATVDemodSink::~DATVDemodSink() stopVideo(); CleanUpDATVFramework(); +#ifndef SERVER_MODE if (m_videoThread) { delete m_videoThread; } +#endif } void DATVDemodSink::stopVideo() @@ -100,6 +105,8 @@ void DATVDemodSink::SetVideoRender(DATVideoRender *screen) m_videoRender->setAudioFIFO(&m_audioFifo); m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream); m_videoThread->setObjectName("vtDATVDemodSink"); +#else + (void) screen; #endif } @@ -1372,11 +1379,11 @@ void DATVDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequ m_settings.m_centerFrequency = channelFrequencyOffset; if (callApplySettings) { - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } } -void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force) +void DATVDemodSink::applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force) { QString msg = QObject::tr("DATVDemodSink::applySettings: force: %1").arg(force); settings.debug(msg); @@ -1388,21 +1395,21 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force) } #ifndef SERVER_MODE - if ((settings.m_audioVolume) != (m_settings.m_audioVolume) || force) + if ((settingsKeys.contains("audioVolume") && (settings.m_audioVolume != m_settings.m_audioVolume)) || force) { if (m_videoRender) { m_videoRender->setAudioVolume(settings.m_audioVolume); } } - if ((settings.m_audioMute) != (m_settings.m_audioMute) || force) + if ((settingsKeys.contains("audioMute") && (settings.m_audioMute != m_settings.m_audioMute)) || force) { if (m_videoRender) { m_videoRender->setAudioMute(settings.m_audioMute); } } - if ((settings.m_videoMute) != (m_settings.m_videoMute) || force) + if ((settingsKeys.contains("videoMute") && (settings.m_videoMute != m_settings.m_videoMute)) || force) { if (m_videoRender) { m_videoRender->setVideoMute(settings.m_videoMute); @@ -1410,9 +1417,9 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force) } #endif - if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) - || (m_settings.m_symbolRate != settings.m_symbolRate) - || (m_settings.m_centerFrequency != settings.m_centerFrequency) || force) + if (settingsKeys.contains("rfBandwidth") || + settingsKeys.contains("symbolRate") || + settingsKeys.contains("centerFrequency") || force) { m_interpolator.create(m_interpolatorPhaseSteps, m_channelSampleRate, settings.m_rfBandwidth / 2.2, m_interpolatorTapsPerPhase); m_interpolatorDistanceRemain = 0; @@ -1420,7 +1427,7 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force) m_nco.setFreq(-(float) settings.m_centerFrequency, (float) m_channelSampleRate); } - if ((m_settings.m_udpTS != settings.m_udpTS) || force) + if ((settingsKeys.contains("udpTS") && (m_settings.m_udpTS != settings.m_udpTS)) || force) { m_udpStream.setActive(settings.m_udpTS); @@ -1429,17 +1436,17 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force) } } - if ((m_settings.m_symbolRate != settings.m_symbolRate) || force) { + if ((settingsKeys.contains("symbolRate") && (m_settings.m_symbolRate != settings.m_symbolRate)) || force) { if (r_videoplayer) { r_videoplayer->setSymbolRate(settings.m_symbolRate); } } - if ((m_settings.m_udpTSAddress != settings.m_udpTSAddress) || force) { + if ((settingsKeys.contains("udpTSAddress") && (m_settings.m_udpTSAddress != settings.m_udpTSAddress)) || force) { m_udpStream.setAddress(settings.m_udpTSAddress); } - if ((m_settings.m_udpTSPort != settings.m_udpTSPort) || force) { + if ((settingsKeys.contains("udpTSPort") && (m_settings.m_udpTSPort != settings.m_udpTSPort)) || force) { m_udpStream.setPort(settings.m_udpTSPort); } @@ -1447,7 +1454,11 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force) m_blnNeedConfigUpdate = true; } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int DATVDemodSink::getLeanDVBCodeRateFromDATV(DATVDemodSettings::DATVCodeRate datvCodeRate) diff --git a/plugins/channelrx/demoddatv/datvdemodsink.h b/plugins/channelrx/demoddatv/datvdemodsink.h index 7670b1c9e..d4a255421 100644 --- a/plugins/channelrx/demoddatv/datvdemodsink.h +++ b/plugins/channelrx/demoddatv/datvdemodsink.h @@ -115,7 +115,7 @@ public: return r_cnrMeter ? r_cnrMeter->m_nbAvg : 1; } - void applySettings(const DATVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DATVDemodSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); private: @@ -316,7 +316,7 @@ private: leansdr::datvvideoplayer *r_videoplayer; //CONSTELLATION -#ifndef SERVER_MODE +#ifndef SERVER_MODE leansdr::datvconstellation *r_scope_symbols; leansdr::datvdvbs2constellation *r_scope_symbols_dvbs2; #endif diff --git a/plugins/channelrx/demoddsc/dscdemod.cpp b/plugins/channelrx/demoddsc/dscdemod.cpp index 41b632156..aa11eab92 100644 --- a/plugins/channelrx/demoddsc/dscdemod.cpp +++ b/plugins/channelrx/demoddsc/dscdemod.cpp @@ -58,7 +58,7 @@ DSCDemod::DSCDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -132,7 +132,7 @@ void DSCDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(m_settings, true); + DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -150,7 +150,7 @@ bool DSCDemod::handleMessage(const Message& cmd) { MsgConfigureDSCDemod& cfg = (MsgConfigureDSCDemod&) cmd; qDebug() << "DSCDemod::handleMessage: MsgConfigureDSCDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -257,64 +257,20 @@ void DSCDemod::setCenterFrequency(qint64 frequency) { DSCDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(settings, false); + MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force) +void DSCDemod::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) { - qDebug() << "DSCDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "DSCDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_filterInvalid != m_settings.m_filterInvalid) || force) { - reverseAPIKeys.append("filterInvalid"); - } - if ((settings.m_filterColumn != m_settings.m_filterColumn) || force) { - reverseAPIKeys.append("filterColumn"); - } - if ((settings.m_filter != m_settings.m_filter) || force) { - reverseAPIKeys.append("filter"); - } - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_logFilename != m_settings.m_logFilename) || force) { - reverseAPIKeys.append("logFilename"); - } - if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) { - reverseAPIKeys.append("logEnabled"); - } - if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) { - reverseAPIKeys.append("useFileTime"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -325,25 +281,23 @@ void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(settings, force); + DSCDemodBaseband::MsgConfigureDSCDemodBaseband *msg = DSCDemodBaseband::MsgConfigureDSCDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI != m_settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (settings.m_reverseAPIAddress != m_settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (settings.m_reverseAPIPort != m_settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (settings.m_reverseAPIDeviceIndex != m_settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (settings.m_reverseAPIChannelIndex != m_settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - if ((settings.m_logEnabled != m_settings.m_logEnabled) - || (settings.m_logFilename != m_settings.m_logFilename) + if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled)) + || (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename)) || force) { if (m_logFile.isOpen()) @@ -372,7 +326,11 @@ void DSCDemod::applySettings(const DSCDemodSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void DSCDemod::sendSampleRateToDemodAnalyzer() @@ -403,14 +361,14 @@ bool DSCDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(m_settings, true); + MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(m_settings, true); + MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -446,13 +404,13 @@ int DSCDemod::webapiSettingsPutPatch( DSCDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(settings, force); + MsgConfigureDSCDemod *msg = MsgConfigureDSCDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("DSCDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(settings, force); + MsgConfigureDSCDemod *msgToGUI = MsgConfigureDSCDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -631,7 +589,7 @@ void DSCDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response response.getDscDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void DSCDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const DSCDemodSettings& settings, bool force) +void DSCDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const DSCDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -657,7 +615,7 @@ void DSCDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co } void DSCDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DSCDemodSettings& settings, bool force diff --git a/plugins/channelrx/demoddsc/dscdemod.h b/plugins/channelrx/demoddsc/dscdemod.h index e06b3bde5..b374aa66c 100644 --- a/plugins/channelrx/demoddsc/dscdemod.h +++ b/plugins/channelrx/demoddsc/dscdemod.h @@ -53,20 +53,23 @@ public: public: const DSCDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDSCDemod* create(const DSCDemodSettings& settings, bool force) + static MsgConfigureDSCDemod* create(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) { - return new MsgConfigureDSCDemod(settings, force); + return new MsgConfigureDSCDemod(settingsKeys, settings, force); } private: DSCDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDSCDemod(const DSCDemodSettings& settings, bool force) : + MsgConfigureDSCDemod(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -184,11 +187,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const DSCDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const DSCDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const DSCDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DSCDemodSettings& settings, bool force @@ -202,4 +205,3 @@ private slots: }; #endif // INCLUDE_DSCDEMOD_H - diff --git a/plugins/channelrx/demoddsc/dscdemodbaseband.cpp b/plugins/channelrx/demoddsc/dscdemodbaseband.cpp index 612028414..d8eed0eda 100644 --- a/plugins/channelrx/demoddsc/dscdemodbaseband.cpp +++ b/plugins/channelrx/demoddsc/dscdemodbaseband.cpp @@ -136,7 +136,7 @@ bool DSCDemodBaseband::handleMessage(const Message& cmd) MsgConfigureDSCDemodBaseband& cfg = (MsgConfigureDSCDemodBaseband&) cmd; qDebug() << "DSCDemodBaseband::handleMessage: MsgConfigureDSCDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -157,17 +157,21 @@ bool DSCDemodBaseband::handleMessage(const Message& cmd) } } -void DSCDemodBaseband::applySettings(const DSCDemodSettings& settings, bool force) +void DSCDemodBaseband::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(DSCDemodSettings::DSCDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int DSCDemodBaseband::getChannelSampleRate() const @@ -180,4 +184,3 @@ void DSCDemodBaseband::setBasebandSampleRate(int sampleRate) m_channelizer->setBasebandSampleRate(sampleRate); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - diff --git a/plugins/channelrx/demoddsc/dscdemodbaseband.h b/plugins/channelrx/demoddsc/dscdemodbaseband.h index 28dde039f..9af9a773a 100644 --- a/plugins/channelrx/demoddsc/dscdemodbaseband.h +++ b/plugins/channelrx/demoddsc/dscdemodbaseband.h @@ -44,20 +44,23 @@ public: public: const DSCDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDSCDemodBaseband* create(const DSCDemodSettings& settings, bool force) + static MsgConfigureDSCDemodBaseband* create(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) { - return new MsgConfigureDSCDemodBaseband(settings, force); + return new MsgConfigureDSCDemodBaseband(settingsKeys, settings, force); } private: DSCDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDSCDemodBaseband(const DSCDemodSettings& settings, bool force) : + MsgConfigureDSCDemodBaseband(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -93,7 +96,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(DSCDemodSink *sink); - void applySettings(const DSCDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); @@ -101,4 +104,3 @@ private slots: }; #endif // INCLUDE_DSCDEMODBASEBAND_H - diff --git a/plugins/channelrx/demoddsc/dscdemodgui.cpp b/plugins/channelrx/demoddsc/dscdemodgui.cpp index 1869456fb..f4b7cfe1c 100644 --- a/plugins/channelrx/demoddsc/dscdemodgui.cpp +++ b/plugins/channelrx/demoddsc/dscdemodgui.cpp @@ -153,7 +153,7 @@ void DSCDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray DSCDemodGUI::serialize() const @@ -165,7 +165,7 @@ bool DSCDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -401,7 +401,7 @@ void DSCDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void DSCDemodGUI::channelMarkerHighlightedByCursor() @@ -414,28 +414,28 @@ void DSCDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void DSCDemodGUI::on_filterInvalid_clicked(bool checked) { m_settings.m_filterInvalid = checked; filter(); - applySettings(); + applySettings(QStringList({"filterInvalid"})); } void DSCDemodGUI::on_filterColumn_currentIndexChanged(int index) { m_settings.m_filterColumn = index; filter(); - applySettings(); + applySettings(QStringList({"filterColumn"})); } void DSCDemodGUI::on_filter_editingFinished() { m_settings.m_filter = ui->filter->text(); filter(); - applySettings(); + applySettings(QStringList({"filter"})); } void DSCDemodGUI::on_clearTable_clicked() @@ -446,19 +446,19 @@ void DSCDemodGUI::on_clearTable_clicked() void DSCDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList({"udpEnabled"})); } void DSCDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList({"udpAddress"})); } void DSCDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList({"udpPort"})); } void DSCDemodGUI::filterRow(int row) @@ -496,7 +496,7 @@ void DSCDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void DSCDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -541,7 +541,16 @@ void DSCDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -667,7 +676,7 @@ DSCDemodGUI::DSCDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -975,11 +984,11 @@ void DSCDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void DSCDemodGUI::applySettings(bool force) +void DSCDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - DSCDemod::MsgConfigureDSCDemod* message = DSCDemod::MsgConfigureDSCDemod::create( m_settings, force); + DSCDemod::MsgConfigureDSCDemod* message = DSCDemod::MsgConfigureDSCDemod::create(settingsKeys, m_settings, force); m_dscDemod->getInputMessageQueue()->push(message); } } @@ -1070,7 +1079,7 @@ void DSCDemodGUI::tick() void DSCDemodGUI::on_feed_clicked(bool checked) { m_settings.m_feed = checked; - applySettings(); + applySettings(QStringList({"feed"})); } void DSCDemodGUI::on_feed_rightClicked(const QPoint &point) @@ -1085,7 +1094,7 @@ void DSCDemodGUI::on_feed_rightClicked(const QPoint &point) void DSCDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList({"logEnabled"})); } void DSCDemodGUI::on_logFilename_clicked() @@ -1101,7 +1110,7 @@ void DSCDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList({"logFilename"})); } } } @@ -1179,7 +1188,7 @@ void DSCDemodGUI::on_logOpen_clicked() void DSCDemodGUI::on_useFileTime_toggled(bool checked) { m_settings.m_useFileTime = checked; - applySettings(); + applySettings(QStringList({"useFileTime"})); } void DSCDemodGUI::makeUIConnections() diff --git a/plugins/channelrx/demoddsc/dscdemodgui.h b/plugins/channelrx/demoddsc/dscdemodgui.h index fe79df7e2..127eb9dc6 100644 --- a/plugins/channelrx/demoddsc/dscdemodgui.h +++ b/plugins/channelrx/demoddsc/dscdemodgui.h @@ -121,7 +121,7 @@ private: virtual ~DSCDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void messageReceived(const DSCMessage& message, int errors, float rssi); bool handleMessage(const Message& message); @@ -168,4 +168,3 @@ private slots: }; #endif // INCLUDE_DSCDEMODGUI_H - diff --git a/plugins/channelrx/demoddsc/dscdemodsettings.cpp b/plugins/channelrx/demoddsc/dscdemodsettings.cpp index 41133af99..23d1d215f 100644 --- a/plugins/channelrx/demoddsc/dscdemodsettings.cpp +++ b/plugins/channelrx/demoddsc/dscdemodsettings.cpp @@ -208,3 +208,146 @@ bool DSCDemodSettings::deserialize(const QByteArray& data) } } +void DSCDemodSettings::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("filterInvalid")) { + m_filterInvalid = settings.m_filterInvalid; + } + if (settingsKeys.contains("filterColumn")) { + m_filterColumn = settings.m_filterColumn; + } + if (settingsKeys.contains("filter")) { + m_filter = settings.m_filter; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("feed")) { + m_feed = settings.m_feed; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("useFileTime")) { + m_useFileTime = settings.m_useFileTime; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString DSCDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("filterInvalid") || force) { + ostr << " m_filterInvalid: " << m_filterInvalid; + } + if (settingsKeys.contains("filterColumn") || force) { + ostr << " m_filterColumn: " << m_filterColumn; + } + if (settingsKeys.contains("filter") || force) { + ostr << " m_filter: " << m_filter.toStdString(); + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("feed") || force) { + ostr << " m_feed: " << m_feed; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("useFileTime") || force) { + ostr << " m_useFileTime: " << m_useFileTime; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demoddsc/dscdemodsettings.h b/plugins/channelrx/demoddsc/dscdemodsettings.h index ebbe7d30c..85d21afef 100644 --- a/plugins/channelrx/demoddsc/dscdemodsettings.h +++ b/plugins/channelrx/demoddsc/dscdemodsettings.h @@ -75,6 +75,8 @@ struct DSCDemodSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_DSCDEMODSETTINGS_H */ diff --git a/plugins/channelrx/demoddsc/dscdemodsink.cpp b/plugins/channelrx/demoddsc/dscdemodsink.cpp index 88ac70b0a..ae4f59693 100644 --- a/plugins/channelrx/demoddsc/dscdemodsink.cpp +++ b/plugins/channelrx/demoddsc/dscdemodsink.cpp @@ -45,7 +45,7 @@ DSCDemodSink::DSCDemodSink(DSCDemod *dscDemod) : m_sampleBuffer[i].resize(m_sampleBufferSize); } - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); m_lowpassComplex1.create(301, DSCDemodSettings::DSCDEMOD_CHANNEL_SAMPLE_RATE, DSCDemodSettings::DSCDEMOD_BAUD_RATE * 1.1); @@ -316,13 +316,11 @@ void DSCDemodSink::init() m_messageBuffer = ""; } -void DSCDemodSink::applySettings(const DSCDemodSettings& settings, bool force) +void DSCDemodSink::applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force) { - qDebug() << "DSCDemodSink::applySettings:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " force: " << force; + qDebug() << "DSCDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) DSCDemodSettings::DSCDEMOD_CHANNEL_SAMPLE_RATE; @@ -343,7 +341,10 @@ void DSCDemodSink::applySettings(const DSCDemodSettings& settings, bool force) m_movMax1.setSize(m_samplesPerBit * 8); m_movMax2.setSize(m_samplesPerBit * 8); + m_settings = settings; + } + else + { + m_settings.applySettings(settingsKeys, settings); } - - m_settings = settings; } diff --git a/plugins/channelrx/demoddsc/dscdemodsink.h b/plugins/channelrx/demoddsc/dscdemodsink.h index 3a6cabb25..67acb2456 100644 --- a/plugins/channelrx/demoddsc/dscdemodsink.h +++ b/plugins/channelrx/demoddsc/dscdemodsink.h @@ -49,7 +49,7 @@ public: void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const DSCDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DSCDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } @@ -152,4 +152,3 @@ private: }; #endif // INCLUDE_DSCDEMODSINK_H - diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index feaba1705..c55de76be 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -68,7 +68,7 @@ DSDDemod::DSDDemod(DeviceAPI *deviceAPI) : qDebug("DSDDemod::DSDDemod"); setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -183,7 +183,7 @@ void DSDDemod::start() m_thread->start(); - DSDDemodBaseband::MsgConfigureDSDDemodBaseband *msg = DSDDemodBaseband::MsgConfigureDSDDemodBaseband::create(m_settings, true); + DSDDemodBaseband::MsgConfigureDSDDemodBaseband *msg = DSDDemodBaseband::MsgConfigureDSDDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -220,7 +220,7 @@ bool DSDDemod::handleMessage(const Message& cmd) MsgConfigureDSDDemod& cfg = (MsgConfigureDSDDemod&) cmd; qDebug("DSDDemod::handleMessage: MsgConfigureDSDDemod: m_rfBandwidth"); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -262,111 +262,21 @@ void DSDDemod::setCenterFrequency(qint64 frequency) { DSDDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDSDDemod *msgToGUI = MsgConfigureDSDDemod::create(settings, false); + MsgConfigureDSDDemod *msgToGUI = MsgConfigureDSDDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) +void DSDDemod::applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force) { - qDebug() << "DSDDemod::applySettings: " - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_demodGain: " << settings.m_demodGain - << " m_volume: " << settings.m_volume - << " m_baudRate: " << settings.m_baudRate - << " m_squelchGate" << settings.m_squelchGate - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_enableCosineFiltering: " << settings.m_enableCosineFiltering - << " m_syncOrConstellation: " << settings.m_syncOrConstellation - << " m_slot1On: " << settings.m_slot1On - << " m_slot2On: " << settings.m_slot2On - << " m_tdmaStereo: " << settings.m_tdmaStereo - << " m_pllLock: " << settings.m_pllLock - << " m_highPassFilter: "<< settings.m_highPassFilter - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_traceLengthMutliplier: " << settings.m_traceLengthMutliplier - << " m_traceStroke: " << settings.m_traceStroke - << " m_traceDecay: " << settings.m_traceDecay - << " m_streamIndex: " << settings.m_streamIndex - << " m_ambeFeatureIndex: " << settings.m_ambeFeatureIndex - << " m_connectAMBE: " << settings.m_connectAMBE - << " force: " << force; + qDebug() << "DSDDemod::applySettings: " << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_demodGain != m_settings.m_demodGain) || force) { - reverseAPIKeys.append("demodGain"); - } - if ((settings.m_audioMute != m_settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((settings.m_syncOrConstellation != m_settings.m_syncOrConstellation) || force) { - reverseAPIKeys.append("syncOrConstellation"); - } - if ((settings.m_slot1On != m_settings.m_slot1On) || force) { - reverseAPIKeys.append("slot1On"); - } - if ((settings.m_slot2On != m_settings.m_slot2On) || force) { - reverseAPIKeys.append("slot2On"); - } - if ((settings.m_demodGain != m_settings.m_demodGain) || force) { - reverseAPIKeys.append("demodGain"); - } - if ((settings.m_traceLengthMutliplier != m_settings.m_traceLengthMutliplier) || force) { - reverseAPIKeys.append("traceLengthMutliplier"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) { - reverseAPIKeys.append("squelchGate"); - } - if ((settings.m_squelch != m_settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((settings.m_volume != m_settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((settings.m_baudRate != m_settings.m_baudRate) || force) { - reverseAPIKeys.append("baudRate"); - } - if ((settings.m_enableCosineFiltering != m_settings.m_enableCosineFiltering) || force) { - reverseAPIKeys.append("enableCosineFiltering"); - } - if ((settings.m_tdmaStereo != m_settings.m_tdmaStereo) || force) { - reverseAPIKeys.append("tdmaStereo"); - } - if ((settings.m_pllLock != m_settings.m_pllLock) || force) { - reverseAPIKeys.append("pllLock"); - } - if ((settings.m_highPassFilter != m_settings.m_highPassFilter) || force) { - reverseAPIKeys.append("highPassFilter"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((settings.m_ambeFeatureIndex != m_settings.m_ambeFeatureIndex) || force) { - reverseAPIKeys.append("ambeFeatureIndex"); - } - if ((settings.m_connectAMBE != m_settings.m_connectAMBE) || force) { - reverseAPIKeys.append("connectAMBE"); - } - - if ((m_settings.m_connectAMBE != settings.m_connectAMBE) - || (m_settings.m_ambeFeatureIndex != settings.m_ambeFeatureIndex) || force) + if ((settingsKeys.contains("connectAMBE") && (m_settings.m_connectAMBE != settings.m_connectAMBE)) + || (settingsKeys.contains("ambeFeatureIndex") && (m_settings.m_ambeFeatureIndex != settings.m_ambeFeatureIndex)) || force) { if (settings.m_connectAMBE) { @@ -385,7 +295,7 @@ void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) } } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -396,31 +306,29 @@ void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - DSDDemodBaseband::MsgConfigureDSDDemodBaseband *msg = DSDDemodBaseband::MsgConfigureDSDDemodBaseband::create(settings, force); + DSDDemodBaseband::MsgConfigureDSDDemodBaseband *msg = DSDDemodBaseband::MsgConfigureDSDDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -435,14 +343,14 @@ bool DSDDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(m_settings, true); + MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(m_settings, true); + MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -523,13 +431,13 @@ int DSDDemod::webapiSettingsPutPatch( DSDDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(settings, force); + MsgConfigureDSDDemod *msg = MsgConfigureDSDDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("DSDDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureDSDDemod *msgToGUI = MsgConfigureDSDDemod::create(settings, force); + MsgConfigureDSDDemod *msgToGUI = MsgConfigureDSDDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -755,7 +663,7 @@ void DSDDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response response.getDsdDemodReport()->setStatusText(new QString(updateAndGetStatusText())); } -void DSDDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const DSDDemodSettings& settings, bool force) +void DSDDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const DSDDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -782,7 +690,7 @@ void DSDDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co void DSDDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const DSDDemodSettings& settings, bool force) { @@ -806,7 +714,7 @@ void DSDDemod::sendChannelSettings( } void DSDDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DSDDemodSettings& settings, bool force diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index 6d47bf739..256862b71 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -47,20 +47,23 @@ public: public: const DSDDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDSDDemod* create(const DSDDemodSettings& settings, bool force) + static MsgConfigureDSDDemod* create(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force) { - return new MsgConfigureDSDDemod(settings, force); + return new MsgConfigureDSDDemod(settingsKeys, settings, force); } private: DSDDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDSDDemod(const DSDDemodSettings& settings, bool force) : + MsgConfigureDSDDemod(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -196,20 +199,20 @@ private: static const int m_udpBlockSize; virtual bool handleMessage(const Message& cmd); - void applySettings(const DSDDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force = false); void scanAvailableAMBEFeatures(); void notifyUpdateAMBEFeatures(); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const DSDDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const DSDDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const DSDDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DSDDemodSettings& settings, bool force diff --git a/plugins/channelrx/demoddsd/dsddemodbaseband.cpp b/plugins/channelrx/demoddsd/dsddemodbaseband.cpp index 55b32117b..bc8a7b236 100644 --- a/plugins/channelrx/demoddsd/dsddemodbaseband.cpp +++ b/plugins/channelrx/demoddsd/dsddemodbaseband.cpp @@ -118,7 +118,7 @@ bool DSDDemodBaseband::handleMessage(const Message& cmd) MsgConfigureDSDDemodBaseband& cfg = (MsgConfigureDSDDemodBaseband&) cmd; qDebug() << "DSDDemodBaseband::handleMessage: MsgConfigureDSDDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -145,9 +145,9 @@ bool DSDDemodBaseband::handleMessage(const Message& cmd) } } -void DSDDemodBaseband::applySettings(const DSDDemodSettings& settings, bool force) +void DSDDemodBaseband::applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer.setChannelization(48000, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset()); @@ -159,7 +159,7 @@ void DSDDemodBaseband::applySettings(const DSDDemodSettings& settings, bool forc } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -175,9 +175,13 @@ void DSDDemodBaseband::applySettings(const DSDDemodSettings& settings, bool forc } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int DSDDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demoddsd/dsddemodbaseband.h b/plugins/channelrx/demoddsd/dsddemodbaseband.h index 768ad3935..477e9b757 100644 --- a/plugins/channelrx/demoddsd/dsddemodbaseband.h +++ b/plugins/channelrx/demoddsd/dsddemodbaseband.h @@ -41,20 +41,23 @@ public: public: const DSDDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDSDDemodBaseband* create(const DSDDemodSettings& settings, bool force) + static MsgConfigureDSDDemodBaseband* create(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force) { - return new MsgConfigureDSDDemodBaseband(settings, force); + return new MsgConfigureDSDDemodBaseband(settingsKeys, settings, force); } private: DSDDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDSDDemodBaseband(const DSDDemodSettings& settings, bool force) : + MsgConfigureDSDDemodBaseband(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const DSDDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index b6be07e02..71c3b482d 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -61,7 +61,7 @@ void DSDDemodGUI::resetToDefaults() blockApplySettings(true); displaySettings(); blockApplySettings(false); - applySettings(); + applySettings(QStringList(), true); } QByteArray DSDDemodGUI::serialize() const @@ -74,7 +74,7 @@ bool DSDDemodGUI::deserialize(const QByteArray& data) if (m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else @@ -143,7 +143,7 @@ void DSDDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void DSDDemodGUI::on_rfBW_valueChanged(int value) @@ -151,46 +151,46 @@ void DSDDemodGUI::on_rfBW_valueChanged(int value) m_channelMarker.setBandwidth(value * 100); m_settings.m_rfBandwidth = value * 100.0; ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void DSDDemodGUI::on_demodGain_valueChanged(int value) { m_settings.m_demodGain = value / 100.0; ui->demodGainText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2)); - applySettings(); + applySettings(QStringList({"demodGain"})); } void DSDDemodGUI::on_fmDeviation_valueChanged(int value) { m_settings.m_fmDeviation = value * 100.0; ui->fmDeviationText->setText(QString("%1%2k").arg(QChar(0xB1, 0x00)).arg(value / 10.0, 0, 'f', 1)); - applySettings(); + applySettings(QStringList({"fmDeviation"})); } void DSDDemodGUI::on_volume_valueChanged(int value) { m_settings.m_volume= value / 10.0; ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); - applySettings(); + applySettings(QStringList({"volume"})); } void DSDDemodGUI::on_baudRate_currentIndexChanged(int index) { m_settings.m_baudRate = DSDDemodBaudRates::getRate(index); - applySettings(); + applySettings(QStringList({"baudRate"})); } void DSDDemodGUI::on_enableCosineFiltering_toggled(bool enable) { m_settings.m_enableCosineFiltering = enable; - applySettings(); + applySettings(QStringList({"enableCosineFiltering"})); } void DSDDemodGUI::on_syncOrConstellation_toggled(bool checked) { m_settings.m_syncOrConstellation = checked; - applySettings(); + applySettings(QStringList({"syncOrConstellation"})); } void DSDDemodGUI::on_traceLength_valueChanged(int value) @@ -198,6 +198,7 @@ void DSDDemodGUI::on_traceLength_valueChanged(int value) m_settings.m_traceLengthMutliplier = value; ui->traceLengthText->setText(QString("%1").arg(m_settings.m_traceLengthMutliplier*50)); m_scopeVisXY->setPixelsPerFrame(m_settings.m_traceLengthMutliplier*960); // 48000 / 50. Chunks of 50 ms. + applySettings(QStringList({"traceLengthMutliplier"})); } void DSDDemodGUI::on_traceStroke_valueChanged(int value) @@ -205,6 +206,7 @@ void DSDDemodGUI::on_traceStroke_valueChanged(int value) m_settings.m_traceStroke = value; ui->traceStrokeText->setText(QString("%1").arg(m_settings.m_traceStroke)); m_scopeVisXY->setStroke(m_settings.m_traceStroke); + applySettings(QStringList({"traceStroke"})); } void DSDDemodGUI::on_traceDecay_valueChanged(int value) @@ -212,50 +214,51 @@ void DSDDemodGUI::on_traceDecay_valueChanged(int value) m_settings.m_traceDecay = value; ui->traceDecayText->setText(QString("%1").arg(m_settings.m_traceDecay)); m_scopeVisXY->setDecay(m_settings.m_traceDecay); + applySettings(QStringList({"traceDecay"})); } void DSDDemodGUI::on_slot1On_toggled(bool checked) { m_settings.m_slot1On = checked; - applySettings(); + applySettings(QStringList({"slot1On"})); } void DSDDemodGUI::on_slot2On_toggled(bool checked) { m_settings.m_slot2On = checked; - applySettings(); + applySettings(QStringList({"slot2On"})); } void DSDDemodGUI::on_tdmaStereoSplit_toggled(bool checked) { m_settings.m_tdmaStereo = checked; - applySettings(); + applySettings(QStringList({"tdmaStereo"})); } void DSDDemodGUI::on_squelchGate_valueChanged(int value) { m_settings.m_squelchGate = value; ui->squelchGateText->setText(QString("%1").arg(value * 10.0, 0, 'f', 0)); - applySettings(); + applySettings(QStringList({"squelchGate"})); } void DSDDemodGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1").arg(value / 1.0, 0, 'f', 0)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList({"squelch"})); } void DSDDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList({"audioMute"})); } void DSDDemodGUI::on_highPassFilter_toggled(bool checked) { m_settings.m_highPassFilter = checked; - applySettings(); + applySettings(QStringList({"highPassFilter"})); } void DSDDemodGUI::on_symbolPLLLock_toggled(bool checked) @@ -266,7 +269,7 @@ void DSDDemodGUI::on_symbolPLLLock_toggled(bool checked) ui->symbolPLLLock->setStyleSheet("QToolButton { background:rgb(53,53,53); }"); } m_settings.m_pllLock = checked; - applySettings(); + applySettings(QStringList({"pllLock"})); } void DSDDemodGUI::on_ambeSupport_clicked(bool checked) @@ -277,13 +280,13 @@ void DSDDemodGUI::on_ambeSupport_clicked(bool checked) m_settings.m_connectAMBE = checked; m_settings.m_ambeFeatureIndex = m_availableAMBEFeatures[ui->ambeFeatures->currentIndex()].m_featureIndex; - applySettings(); + applySettings(QStringList({"connectAMBE", "ambeFeatureIndex"})); } void DSDDemodGUI::on_ambeFeatures_currentIndexChanged(int index) { m_settings.m_ambeFeatureIndex = m_availableAMBEFeatures[index].m_featureIndex; - applySettings(); + applySettings(QStringList({"ambeFeatureIndex"})); } void DSDDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -292,7 +295,7 @@ void DSDDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void DSDDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -337,7 +340,16 @@ void DSDDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "title", + "rgbColor", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -434,7 +446,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban updateAMBEFeaturesList(); displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -560,17 +572,17 @@ void DSDDemodGUI::updateAMBEFeaturesList() ui->ambeFeatures->blockSignals(false); if (unsetAMBE) { - applySettings(); + applySettings(QStringList({"connectAMBE"})); } } -void DSDDemodGUI::applySettings(bool force) +void DSDDemodGUI::applySettings(const QStringList& settingsKeys, const bool force) { if (m_doApplySettings) { qDebug() << "DSDDemodGUI::applySettings"; - DSDDemod::MsgConfigureDSDDemod* message = DSDDemod::MsgConfigureDSDDemod::create( m_settings, force); + DSDDemod::MsgConfigureDSDDemod* message = DSDDemod::MsgConfigureDSDDemod::create(settingsKeys, m_settings, force); m_dsdDemod->getInputMessageQueue()->push(message); } } @@ -596,7 +608,7 @@ void DSDDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void DSDDemodGUI::channelMarkerHighlightedByCursor() @@ -615,7 +627,7 @@ void DSDDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList({"audioDeviceName"})); } } diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index 9b77a5c51..ffa97d638 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -115,7 +115,7 @@ private: virtual ~DSDDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void updateAMBEFeaturesList(); void updateMyPosition(); diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.cpp b/plugins/channelrx/demoddsd/dsddemodsettings.cpp index 13d867fa9..c77813dd8 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsettings.cpp @@ -207,3 +207,206 @@ bool DSDDemodSettings::deserialize(const QByteArray& data) } } +void DSDDemodSettings::applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("demodGain")) { + m_demodGain = settings.m_demodGain; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("baudRate")) { + m_baudRate = settings.m_baudRate; + } + if (settingsKeys.contains("squelchGate")) { + m_squelchGate = settings.m_squelchGate; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("enableCosineFiltering")) { + m_enableCosineFiltering = settings.m_enableCosineFiltering; + } + if (settingsKeys.contains("syncOrConstellation")) { + m_syncOrConstellation = settings.m_syncOrConstellation; + } + if (settingsKeys.contains("slot1On")) { + m_slot1On = settings.m_slot1On; + } + if (settingsKeys.contains("slot2On")) { + m_slot2On = settings.m_slot2On; + } + if (settingsKeys.contains("tdmaStereo")) { + m_tdmaStereo = settings.m_tdmaStereo; + } + if (settingsKeys.contains("pllLock")) { + m_pllLock = settings.m_pllLock; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("highPassFilter")) { + m_highPassFilter = settings.m_highPassFilter; + } + if (settingsKeys.contains("traceLengthMutliplier")) { + m_traceLengthMutliplier = settings.m_traceLengthMutliplier; + } + if (settingsKeys.contains("traceStroke")) { + m_traceStroke = settings.m_traceStroke; + } + if (settingsKeys.contains("traceDecay")) { + m_traceDecay = settings.m_traceDecay; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("ambeFeatureIndex")) { + m_ambeFeatureIndex = settings.m_ambeFeatureIndex; + } + if (settingsKeys.contains("connectAMBE")) { + m_connectAMBE = settings.m_connectAMBE; + } +} + +QString DSDDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("demodGain") || force) { + ostr << " m_demodGain: " << m_demodGain; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("baudRate") || force) { + ostr << " m_baudRate: " << m_baudRate; + } + if (settingsKeys.contains("squelchGate") || force) { + ostr << " m_squelchGate: " << m_squelchGate; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("enableCosineFiltering") || force) { + ostr << " m_enableCosineFiltering: " << m_enableCosineFiltering; + } + if (settingsKeys.contains("syncOrConstellation") || force) { + ostr << " m_syncOrConstellation: " << m_syncOrConstellation; + } + if (settingsKeys.contains("slot1On") || force) { + ostr << " m_slot1On: " << m_slot1On; + } + if (settingsKeys.contains("slot2On") || force) { + ostr << " m_slot2On: " << m_slot2On; + } + if (settingsKeys.contains("tdmaStereo") || force) { + ostr << " m_tdmaStereo: " << m_tdmaStereo; + } + if (settingsKeys.contains("pllLock") || force) { + ostr << " m_pllLock: " << m_pllLock; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("highPassFilter") || force) { + ostr << " m_highPassFilter: " << m_highPassFilter; + } + if (settingsKeys.contains("traceLengthMutliplier") || force) { + ostr << " m_traceLengthMutliplier: " << m_traceLengthMutliplier; + } + if (settingsKeys.contains("traceStroke") || force) { + ostr << " m_traceStroke: " << m_traceStroke; + } + if (settingsKeys.contains("traceDecay") || force) { + ostr << " m_traceDecay: " << m_traceDecay; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + if (settingsKeys.contains("ambeFeatureIndex") || force) { + ostr << " m_ambeFeatureIndex: " << m_ambeFeatureIndex; + } + if (settingsKeys.contains("connectAMBE") || force) { + ostr << " m_connectAMBE: " << m_connectAMBE; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.h b/plugins/channelrx/demoddsd/dsddemodsettings.h index 24dc1479c..e85c9e580 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.h +++ b/plugins/channelrx/demoddsd/dsddemodsettings.h @@ -81,6 +81,8 @@ struct DSDDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channelrx/demoddsd/dsddemodsink.cpp b/plugins/channelrx/demoddsd/dsddemodsink.cpp index ed1be9f45..0a0b2caca 100644 --- a/plugins/channelrx/demoddsd/dsddemodsink.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsink.cpp @@ -67,7 +67,7 @@ DSDDemodSink::DSDDemodSink() : m_magsqPeak = 0.0f; m_magsqCount = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -365,33 +365,11 @@ void DSDDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque } -void DSDDemodSink::applySettings(const DSDDemodSettings& settings, bool force) +void DSDDemodSink::applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force) { - qDebug() << "DSDDemodSink::applySettings: " - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_demodGain: " << settings.m_demodGain - << " m_volume: " << settings.m_volume - << " m_baudRate: " << settings.m_baudRate - << " m_squelchGate" << settings.m_squelchGate - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_enableCosineFiltering: " << settings.m_enableCosineFiltering - << " m_syncOrConstellation: " << settings.m_syncOrConstellation - << " m_slot1On: " << settings.m_slot1On - << " m_slot2On: " << settings.m_slot2On - << " m_tdmaStereo: " << settings.m_tdmaStereo - << " m_pllLock: " << settings.m_pllLock - << " m_highPassFilter: "<< settings.m_highPassFilter - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_traceLengthMutliplier: " << settings.m_traceLengthMutliplier - << " m_traceStroke: " << settings.m_traceStroke - << " m_traceDecay: " << settings.m_traceDecay - << " m_streamIndex: " << settings.m_streamIndex - << " force: " << force; + qDebug() << "DSDDemodSink::applySettings: " << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, (settings.m_rfBandwidth) / 2.2); m_interpolatorDistanceRemain = 0; @@ -399,54 +377,58 @@ void DSDDemodSink::applySettings(const DSDDemodSettings& settings, bool force) //m_phaseDiscri.setFMScaling((float) settings.m_rfBandwidth / (float) settings.m_fmDeviation); } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) + if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force) { m_phaseDiscri.setFMScaling(48000.0f / (2.0f*settings.m_fmDeviation)); } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) + if ((settingsKeys.contains("squelchGate") && (settings.m_squelchGate != m_settings.m_squelchGate)) || force) { m_squelchGate = 480 * settings.m_squelchGate; // gate is given in 10s of ms at 48000 Hz audio sample rate m_squelchCount = 0; // reset squelch open counter } - if ((settings.m_squelch != m_settings.m_squelch) || force) + if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || force) { // input is a value in dB m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0); } - if ((settings.m_volume != m_settings.m_volume) || force) + if ((settingsKeys.contains("volume") && (settings.m_volume != m_settings.m_volume)) || force) { m_dsdDecoder.setAudioGain(settings.m_volume); } - if ((settings.m_baudRate != m_settings.m_baudRate) || force) + if ((settingsKeys.contains("baudRate") && (settings.m_baudRate != m_settings.m_baudRate)) || force) { m_dsdDecoder.setBaudRate(settings.m_baudRate); } - if ((settings.m_enableCosineFiltering != m_settings.m_enableCosineFiltering) || force) + if ((settingsKeys.contains("enableCosineFiltering") && (settings.m_enableCosineFiltering != m_settings.m_enableCosineFiltering)) || force) { m_dsdDecoder.enableCosineFiltering(settings.m_enableCosineFiltering); } - if ((settings.m_tdmaStereo != m_settings.m_tdmaStereo) || force) + if ((settingsKeys.contains("tdmaStereo") && (settings.m_tdmaStereo != m_settings.m_tdmaStereo)) || force) { m_dsdDecoder.setTDMAStereo(settings.m_tdmaStereo); } - if ((settings.m_pllLock != m_settings.m_pllLock) || force) + if ((settingsKeys.contains("pllLock") && (settings.m_pllLock != m_settings.m_pllLock)) || force) { m_dsdDecoder.setSymbolPLLLock(settings.m_pllLock); } - if ((settings.m_highPassFilter != m_settings.m_highPassFilter) || force) + if ((settingsKeys.contains("highPassFilter") && (settings.m_highPassFilter != m_settings.m_highPassFilter)) || force) { m_dsdDecoder.useHPMbelib(settings.m_highPassFilter); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void DSDDemodSink::configureMyPosition(float myLatitude, float myLongitude) diff --git a/plugins/channelrx/demoddsd/dsddemodsink.h b/plugins/channelrx/demoddsd/dsddemodsink.h index 2eeb9f0da..533a2fe39 100644 --- a/plugins/channelrx/demoddsd/dsddemodsink.h +++ b/plugins/channelrx/demoddsd/dsddemodsink.h @@ -47,7 +47,7 @@ public: void applyAudioSampleRate(int sampleRate); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const DSDDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DSDDemodSettings& settings, bool force = false); AudioFifo *getAudioFifo1() { return &m_audioFifo1; } AudioFifo *getAudioFifo2() { return &m_audioFifo2; } void setAudioFifoLabel(const QString& label) { diff --git a/plugins/channelrx/demodfreedv/freedvdemod.cpp b/plugins/channelrx/demodfreedv/freedvdemod.cpp index 4b8752e6a..5011f85a6 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemod.cpp @@ -57,7 +57,7 @@ FreeDVDemod::FreeDVDemod(DeviceAPI *deviceAPI) : m_basebandSink->setSpectrumSink(&m_spectrumVis); m_basebandSink->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -147,7 +147,7 @@ bool FreeDVDemod::handleMessage(const Message& cmd) MsgConfigureFreeDVDemod& cfg = (MsgConfigureFreeDVDemod&) cmd; qDebug("FreeDVDemod::handleMessage: MsgConfigureFreeDVDemod"); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -184,58 +184,20 @@ void FreeDVDemod::setCenterFrequency(qint64 frequency) { FreeDVDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFreeDVDemod *msgToGUI = MsgConfigureFreeDVDemod::create(settings, false); + MsgConfigureFreeDVDemod *msgToGUI = MsgConfigureFreeDVDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void FreeDVDemod::applySettings(const FreeDVDemodSettings& settings, bool force) +void FreeDVDemod::applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force) { - qDebug() << "FreeDVDemod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_freeDVMode: " << (int) settings.m_freeDVMode - << " m_volume: " << settings.m_volume - << " m_volumeIn: " << settings.m_volumeIn - << " m_spanLog2: " << settings.m_spanLog2 - << " m_audioMute: " << settings.m_audioMute - << " m_agcActive: " << settings.m_agc - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "FreeDVDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((m_settings.m_volume != settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((m_settings.m_volumeIn != settings.m_volumeIn) || force) { - reverseAPIKeys.append("volumeIn"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((m_settings.m_spanLog2 != settings.m_spanLog2) || force) { - reverseAPIKeys.append("spanLog2"); - } - if ((m_settings.m_audioMute != settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((m_settings.m_agc != settings.m_agc) || force) { - reverseAPIKeys.append("agc"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -246,12 +208,10 @@ void FreeDVDemod::applySettings(const FreeDVDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - if ((settings.m_freeDVMode != m_settings.m_freeDVMode) - || (settings.m_spanLog2 != m_settings.m_spanLog2) || force) + if ((settingsKeys.contains("freeDVMode") && (settings.m_freeDVMode != m_settings.m_freeDVMode)) + || (settingsKeys.contains("spanLog2") && (settings.m_spanLog2 != m_settings.m_spanLog2)) || force) { DSPSignalNotification *msg = new DSPSignalNotification( FreeDVDemodSettings::getModSampleRate(settings.m_freeDVMode)/(1<push(msg); } - FreeDVDemodBaseband::MsgConfigureFreeDVDemodBaseband *msg = FreeDVDemodBaseband::MsgConfigureFreeDVDemodBaseband::create(settings, force); + FreeDVDemodBaseband::MsgConfigureFreeDVDemodBaseband *msg = FreeDVDemodBaseband::MsgConfigureFreeDVDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray FreeDVDemod::serialize() const @@ -291,14 +255,14 @@ bool FreeDVDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureFreeDVDemod *msg = MsgConfigureFreeDVDemod::create(m_settings, true); + MsgConfigureFreeDVDemod *msg = MsgConfigureFreeDVDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureFreeDVDemod *msg = MsgConfigureFreeDVDemod::create(m_settings, true); + MsgConfigureFreeDVDemod *msg = MsgConfigureFreeDVDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -334,13 +298,13 @@ int FreeDVDemod::webapiSettingsPutPatch( FreeDVDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureFreeDVDemod *msg = MsgConfigureFreeDVDemod::create(settings, force); + MsgConfigureFreeDVDemod *msg = MsgConfigureFreeDVDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("FreeDVDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFreeDVDemod *msgToGUI = MsgConfigureFreeDVDemod::create(settings, force); + MsgConfigureFreeDVDemod *msgToGUI = MsgConfigureFreeDVDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -516,7 +480,7 @@ void FreeDVDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respo response.getFreeDvDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void FreeDVDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const FreeDVDemodSettings& settings, bool force) +void FreeDVDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const FreeDVDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -543,7 +507,7 @@ void FreeDVDemod::webapiReverseSendSettings(QList& channelSettingsKeys, void FreeDVDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FreeDVDemodSettings& settings, bool force) { @@ -567,7 +531,7 @@ void FreeDVDemod::sendChannelSettings( } void FreeDVDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FreeDVDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodfreedv/freedvdemod.h b/plugins/channelrx/demodfreedv/freedvdemod.h index 3e76f100d..5d4d9f607 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.h +++ b/plugins/channelrx/demodfreedv/freedvdemod.h @@ -46,20 +46,23 @@ public: public: const FreeDVDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFreeDVDemod* create(const FreeDVDemodSettings& settings, bool force) + static MsgConfigureFreeDVDemod* create(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force) { - return new MsgConfigureFreeDVDemod(settings, force); + return new MsgConfigureFreeDVDemod(settingsKeys, settings, force); } private: FreeDVDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFreeDVDemod(const FreeDVDemodSettings& settings, bool force) : + MsgConfigureFreeDVDemod(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -170,17 +173,17 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const FreeDVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const FreeDVDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const FreeDVDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FreeDVDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FreeDVDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp b/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp index ecfb47267..b83080658 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp @@ -117,7 +117,7 @@ bool FreeDVDemodBaseband::handleMessage(const Message& cmd) qDebug() << "FreeDVDemodBaseband::handleMessage: MsgConfigureFreeDVDemodBaseband"; MsgConfigureFreeDVDemodBaseband& cfg = (MsgConfigureFreeDVDemodBaseband&) cmd; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -146,15 +146,15 @@ bool FreeDVDemodBaseband::handleMessage(const Message& cmd) } } -void FreeDVDemodBaseband::applySettings(const FreeDVDemodSettings& settings, bool force) +void FreeDVDemodBaseband::applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(m_sink.getModemSampleRate(), settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -168,7 +168,7 @@ void FreeDVDemodBaseband::applySettings(const FreeDVDemodSettings& settings, boo } } - if ((settings.m_freeDVMode != m_settings.m_freeDVMode) || force) + if ((settingsKeys.contains("freeDVMode") && (settings.m_freeDVMode != m_settings.m_freeDVMode)) || force) { uint32_t modemSampleRate = FreeDVDemodSettings::getModSampleRate(settings.m_freeDVMode); @@ -187,8 +187,13 @@ void FreeDVDemodBaseband::applySettings(const FreeDVDemodSettings& settings, boo m_sink.applyFreeDVMode(settings.m_freeDVMode); } - m_sink.applySettings(settings, force); - m_settings = settings; + m_sink.applySettings(settingsKeys, settings, force); + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int FreeDVDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodfreedv/freedvdemodbaseband.h b/plugins/channelrx/demodfreedv/freedvdemodbaseband.h index 320e7ffb2..760d0bb9d 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodbaseband.h +++ b/plugins/channelrx/demodfreedv/freedvdemodbaseband.h @@ -39,20 +39,23 @@ public: public: const FreeDVDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFreeDVDemodBaseband* create(const FreeDVDemodSettings& settings, bool force) + static MsgConfigureFreeDVDemodBaseband* create(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force) { - return new MsgConfigureFreeDVDemodBaseband(settings, force); + return new MsgConfigureFreeDVDemodBaseband(settingsKeys, settings, force); } private: FreeDVDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFreeDVDemodBaseband(const FreeDVDemodSettings& settings, bool force) : + MsgConfigureFreeDVDemodBaseband(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -113,7 +116,7 @@ private: MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; } bool handleMessage(const Message& cmd); - void applySettings(const FreeDVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodfreedv/freedvdemodgui.cpp b/plugins/channelrx/demodfreedv/freedvdemodgui.cpp index cd35e0633..ddfe03d2f 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodgui.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodgui.cpp @@ -131,7 +131,7 @@ void FreeDVDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void FreeDVDemodGUI::channelMarkerHighlightedByCursor() @@ -144,7 +144,7 @@ void FreeDVDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void FreeDVDemodGUI::on_reSync_clicked(bool checked) @@ -160,34 +160,34 @@ void FreeDVDemodGUI::on_freeDVMode_currentIndexChanged(int index) m_channelMarker.setBandwidth(FreeDVDemodSettings::getHiCutoff(m_settings.m_freeDVMode) * 2); m_channelMarker.setLowCutoff(FreeDVDemodSettings::getLowCutoff(m_settings.m_freeDVMode)); m_channelMarker.setSidebands(ChannelMarker::usb); - applySettings(); + applySettings(QStringList({"freeDVMode"})); } void FreeDVDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volume = value / 10.0; - applySettings(); + applySettings(QStringList({"volume"})); } void FreeDVDemodGUI::on_volumeIn_valueChanged(int value) { ui->volumeInText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volumeIn = value / 10.0; - applySettings(); + applySettings(QStringList({"volumeIn"})); } void FreeDVDemodGUI::on_agc_toggled(bool checked) { m_settings.m_agc = checked; - applySettings(); + applySettings(QStringList({"agc"})); } void FreeDVDemodGUI::on_audioMute_toggled(bool checked) { m_audioMute = checked; m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList({"audioMute"})); } void FreeDVDemodGUI::on_spanLog2_valueChanged(int value) @@ -241,7 +241,16 @@ void FreeDVDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "title", + "rgbColor", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -253,7 +262,7 @@ void FreeDVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } FreeDVDemodGUI::FreeDVDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : @@ -350,11 +359,11 @@ bool FreeDVDemodGUI::blockApplySettings(bool block) return ret; } -void FreeDVDemodGUI::applySettings(bool force) +void FreeDVDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - FreeDVDemod::MsgConfigureFreeDVDemod* message = FreeDVDemod::MsgConfigureFreeDVDemod::create( m_settings, force); + FreeDVDemod::MsgConfigureFreeDVDemod* message = FreeDVDemod::MsgConfigureFreeDVDemod::create(settingsKeys, m_settings, force); m_freeDVDemod->getInputMessageQueue()->push(message); } } @@ -363,7 +372,7 @@ void FreeDVDemodGUI::applyBandwidths(int spanLog2, bool force) { displayBandwidths(spanLog2); m_settings.m_spanLog2 = spanLog2; - applySettings(force); + applySettings(QStringList({"spanLog2"}), force); } void FreeDVDemodGUI::displayBandwidths(int spanLog2) @@ -449,7 +458,7 @@ void FreeDVDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList({"audioDeviceName"})); } } diff --git a/plugins/channelrx/demodfreedv/freedvdemodgui.h b/plugins/channelrx/demodfreedv/freedvdemodgui.h index 4639e2c4e..ba9db172d 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodgui.h +++ b/plugins/channelrx/demodfreedv/freedvdemodgui.h @@ -97,7 +97,7 @@ private: virtual ~FreeDVDemodGUI(); bool blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applyBandwidths(int spanLog2, bool force = false); void displayBandwidths(int spanLog2); void displaySettings(); diff --git a/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp b/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp index 2d1945081..e46e8fd43 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodsettings.cpp @@ -176,6 +176,126 @@ bool FreeDVDemodSettings::deserialize(const QByteArray& data) } } +void FreeDVDemodSettings::applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("volumeIn")) { + m_volumeIn = settings.m_volumeIn; + } + if (settingsKeys.contains("spanLog2")) { + m_spanLog2 = settings.m_spanLog2; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("agc")) { + m_agc = settings.m_agc; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("freeDVMode")) { + m_freeDVMode = settings.m_freeDVMode; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString FreeDVDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("volumeIn") || force) { + ostr << " m_volumeIn: " << m_volumeIn; + } + if (settingsKeys.contains("spanLog2") || force) { + ostr << " m_spanLog2: " << m_spanLog2; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("agc") || force) { + ostr << " m_agc: " << m_agc; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("freeDVMode") || force) { + ostr << " m_freeDVMode: " << m_freeDVMode; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + int FreeDVDemodSettings::getHiCutoff(FreeDVMode freeDVMode) { switch(freeDVMode) diff --git a/plugins/channelrx/demodfreedv/freedvdemodsettings.h b/plugins/channelrx/demodfreedv/freedvdemodsettings.h index a775e6513..e66e29642 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsettings.h +++ b/plugins/channelrx/demodfreedv/freedvdemodsettings.h @@ -71,6 +71,8 @@ struct FreeDVDemodSettings void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static const int m_minPowerThresholdDB; static const float m_mminPowerThresholdDBf; diff --git a/plugins/channelrx/demodfreedv/freedvdemodsink.cpp b/plugins/channelrx/demodfreedv/freedvdemodsink.cpp index dc05bdd99..3f6ce20a1 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsink.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodsink.cpp @@ -169,7 +169,7 @@ FreeDVDemodSink::FreeDVDemodSink() : m_SSBFilterBufferIndex = 0; applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } FreeDVDemodSink::~FreeDVDemodSink() @@ -503,26 +503,11 @@ void FreeDVDemodSink::applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode) } } -void FreeDVDemodSink::applySettings(const FreeDVDemodSettings& settings, bool force) +void FreeDVDemodSink::applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force) { - qDebug() << "FreeDVDemodSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_freeDVMode: " << (int) settings.m_freeDVMode - << " m_volume: " << settings.m_volume - << " m_volumeIn: " << settings.m_volumeIn - << " m_spanLog2: " << settings.m_spanLog2 - << " m_audioMute: " << settings.m_audioMute - << " m_agcActive: " << settings.m_agc - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "FreeDVDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((m_settings.m_volume != settings.m_volume) || force) + if ((settingsKeys.contains("m_volume") && (settings.m_volume != m_settings.m_volume)) || force) { m_volume = settings.m_volume; m_volume /= 4.0; // for 3276.8 @@ -531,7 +516,12 @@ void FreeDVDemodSink::applySettings(const FreeDVDemodSettings& settings, bool fo m_spanLog2 = settings.m_spanLog2; m_audioMute = settings.m_audioMute; m_agcActive = settings.m_agc; - m_settings = settings; + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void FreeDVDemodSink::getSNRLevels(double& avg, double& peak, int& nbSamples) diff --git a/plugins/channelrx/demodfreedv/freedvdemodsink.h b/plugins/channelrx/demodfreedv/freedvdemodsink.h index 9480647d5..6255f8bf9 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsink.h +++ b/plugins/channelrx/demodfreedv/freedvdemodsink.h @@ -46,7 +46,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const FreeDVDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreeDVDemodSettings& settings, bool force = false); void applyAudioSampleRate(int sampleRate); void applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode); AudioFifo *getAudioFifo() { return &m_audioFifo; } diff --git a/plugins/channelrx/demodft8/ft8demod.cpp b/plugins/channelrx/demodft8/ft8demod.cpp index abb6d7a20..5ef40f11f 100644 --- a/plugins/channelrx/demodft8/ft8demod.cpp +++ b/plugins/channelrx/demodft8/ft8demod.cpp @@ -62,7 +62,7 @@ FT8Demod::FT8Demod(DeviceAPI *deviceAPI) : { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -187,7 +187,7 @@ void FT8Demod::start() m_thread->start(); - FT8DemodBaseband::MsgConfigureFT8DemodBaseband *msg = FT8DemodBaseband::MsgConfigureFT8DemodBaseband::create(m_settings, true); + FT8DemodBaseband::MsgConfigureFT8DemodBaseband *msg = FT8DemodBaseband::MsgConfigureFT8DemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -214,7 +214,7 @@ bool FT8Demod::handleMessage(const Message& cmd) MsgConfigureFT8Demod& cfg = (MsgConfigureFT8Demod&) cmd; qDebug("FT8Demod::handleMessage: MsgConfigureFT8Demod"); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -251,98 +251,20 @@ void FT8Demod::setCenterFrequency(qint64 frequency) { FT8DemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFT8Demod *msgToGUI = MsgConfigureFT8Demod::create(settings, false); + MsgConfigureFT8Demod *msgToGUI = MsgConfigureFT8Demod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void FT8Demod::applySettings(const FT8DemodSettings& settings, bool force) +void FT8Demod::applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force) { - qDebug() << "FT8Demod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_filterIndex: " << settings.m_filterIndex - << " [m_spanLog2: " << settings.m_filterBank[settings.m_filterIndex].m_spanLog2 - << " m_rfBandwidth: " << settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth - << " m_lowCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_lowCutoff - << " m_fftWindow: " << settings.m_filterBank[settings.m_filterIndex].m_fftWindow << "]" - << " m_volume: " << settings.m_volume - << " m_agcActive: " << settings.m_agc - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "FT8Demod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((m_settings.m_filterIndex != settings.m_filterIndex) || force) { - reverseAPIKeys.append("filterIndex"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2 != settings.m_filterBank[settings.m_filterIndex].m_spanLog2) || force) { - reverseAPIKeys.append("spanLog2"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth != settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff != settings.m_filterBank[settings.m_filterIndex].m_lowCutoff) || force) { - reverseAPIKeys.append("lowCutoff"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow != settings.m_filterBank[settings.m_filterIndex].m_fftWindow) || force) { - reverseAPIKeys.append("fftWindow"); - } - if ((m_settings.m_volume != settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((m_settings.m_agc != settings.m_agc) || force) { - reverseAPIKeys.append("agc"); - } - if ((m_settings.m_recordWav != settings.m_recordWav) || force) { - reverseAPIKeys.append("recordWav"); - } - if ((m_settings.m_logMessages != settings.m_logMessages) || force) { - reverseAPIKeys.append("logMessages"); - } - if ((m_settings.m_nbDecoderThreads != settings.m_nbDecoderThreads) || force) { - reverseAPIKeys.append("nbDecoderThreads"); - } - if ((m_settings.m_decoderTimeBudget != settings.m_decoderTimeBudget) || force) { - reverseAPIKeys.append("decoderTimeBudget"); - } - if ((m_settings.m_useOSD != settings.m_useOSD) || force) { - reverseAPIKeys.append("useOSD"); - } - if ((m_settings.m_osdDepth != settings.m_osdDepth) || force) { - reverseAPIKeys.append("osdDepth"); - } - if ((m_settings.m_osdLDPCThreshold != settings.m_osdLDPCThreshold) || force) { - reverseAPIKeys.append("osdLDPCThreshold"); - } - if ((m_settings.m_verifyOSD != settings.m_verifyOSD) || force) { - reverseAPIKeys.append("verifyOSD"); - } - if ((m_settings.m_enablePSKReporter != settings.m_enablePSKReporter) || force) { - reverseAPIKeys.append("enablePSKReporter"); - } - if ((m_settings.m_pskReporterCallsign != settings.m_pskReporterCallsign) || force) { - reverseAPIKeys.append("pskReporterCallsign"); - } - if ((m_settings.m_pskReporterLocator != settings.m_pskReporterLocator) || force) { - reverseAPIKeys.append("pskReporterLocator"); - } - if ((m_settings.m_pskReporterSoftware != settings.m_pskReporterSoftware) || force) { - reverseAPIKeys.append("pskReporterSoftware"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -353,12 +275,10 @@ void FT8Demod::applySettings(const FT8DemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - if ((settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth != m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth) - || (settings.m_filterBank[settings.m_filterIndex].m_lowCutoff != m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth != m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth)) + || (settingsKeys.contains("lowCutoff") && (settings.m_filterBank[settings.m_filterIndex].m_lowCutoff != m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff)) || force) { SpectrumSettings spectrumSettings = m_spectrumVis.getSettings(); spectrumSettings.m_usb = (settings.m_filterBank[settings.m_filterIndex].m_lowCutoff < settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth); @@ -368,28 +288,32 @@ void FT8Demod::applySettings(const FT8DemodSettings& settings, bool force) if (m_running) { - FT8DemodBaseband::MsgConfigureFT8DemodBaseband *msg = FT8DemodBaseband::MsgConfigureFT8DemodBaseband::create(settings, force); + FT8DemodBaseband::MsgConfigureFT8DemodBaseband *msg = FT8DemodBaseband::MsgConfigureFT8DemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray FT8Demod::serialize() const @@ -401,14 +325,14 @@ bool FT8Demod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureFT8Demod *msg = MsgConfigureFT8Demod::create(m_settings, true); + MsgConfigureFT8Demod *msg = MsgConfigureFT8Demod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureFT8Demod *msg = MsgConfigureFT8Demod::create(m_settings, true); + MsgConfigureFT8Demod *msg = MsgConfigureFT8Demod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -467,13 +391,13 @@ int FT8Demod::webapiSettingsPutPatch( FT8DemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureFT8Demod *msg = MsgConfigureFT8Demod::create(settings, force); + MsgConfigureFT8Demod *msg = MsgConfigureFT8Demod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("FT8Demod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFT8Demod *msgToGUI = MsgConfigureFT8Demod::create(settings, force); + MsgConfigureFT8Demod *msgToGUI = MsgConfigureFT8Demod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -696,7 +620,7 @@ void FT8Demod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response } } -void FT8Demod::webapiReverseSendSettings(QList& channelSettingsKeys, const FT8DemodSettings& settings, bool force) +void FT8Demod::webapiReverseSendSettings(const QList& channelSettingsKeys, const FT8DemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -723,7 +647,7 @@ void FT8Demod::webapiReverseSendSettings(QList& channelSettingsKeys, co void FT8Demod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FT8DemodSettings& settings, bool force) { @@ -749,7 +673,7 @@ void FT8Demod::sendChannelSettings( } void FT8Demod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FT8DemodSettings& settings, bool force diff --git a/plugins/channelrx/demodft8/ft8demod.h b/plugins/channelrx/demodft8/ft8demod.h index 7fe05bb77..2f409a21c 100644 --- a/plugins/channelrx/demodft8/ft8demod.h +++ b/plugins/channelrx/demodft8/ft8demod.h @@ -49,20 +49,23 @@ public: public: const FT8DemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFT8Demod* create(const FT8DemodSettings& settings, bool force) + static MsgConfigureFT8Demod* create(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force) { - return new MsgConfigureFT8Demod(settings, force); + return new MsgConfigureFT8Demod(settingsKeys, settings, force); } private: FT8DemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFT8Demod(const FT8DemodSettings& settings, bool force) : + MsgConfigureFT8Demod(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -164,18 +167,18 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const FT8DemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const FT8DemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const FT8DemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FT8DemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FT8DemodSettings& settings, bool force @@ -187,6 +190,3 @@ private slots: }; #endif // INCLUDE_FT8DEMOD_H - - - diff --git a/plugins/channelrx/demodft8/ft8demodbaseband.cpp b/plugins/channelrx/demodft8/ft8demodbaseband.cpp index 24c20deb5..5edf60ec3 100644 --- a/plugins/channelrx/demodft8/ft8demodbaseband.cpp +++ b/plugins/channelrx/demodft8/ft8demodbaseband.cpp @@ -174,7 +174,7 @@ bool FT8DemodBaseband::handleMessage(const Message& cmd) MsgConfigureFT8DemodBaseband& cfg = (MsgConfigureFT8DemodBaseband&) cmd; qDebug() << "FT8DemodBaseband::handleMessage: MsgConfigureFT8DemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -208,9 +208,9 @@ bool FT8DemodBaseband::handleMessage(const Message& cmd) } } -void FT8DemodBaseband::applySettings(const FT8DemodSettings& settings, bool force) +void FT8DemodBaseband::applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_ft8DemodWorker->invalidateSequence(); m_ft8DemodWorker->setBaseFrequency(m_deviceCenterFrequency + settings.m_inputFrequencyOffset); @@ -241,56 +241,61 @@ void FT8DemodBaseband::applySettings(const FT8DemodSettings& settings, bool forc m_ft8DemodWorker->setHighFrequency(settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth); } - if ((settings.m_recordWav != m_settings.m_recordWav) || force) { + if ((settingsKeys.contains("recordWav") && (settings.m_recordWav != m_settings.m_recordWav)) || force) { m_ft8DemodWorker->setRecordSamples(settings.m_recordWav); } - if ((settings.m_logMessages != m_settings.m_logMessages) || force) { + if ((settingsKeys.contains("logMessages") && (settings.m_logMessages != m_settings.m_logMessages)) || force) { m_ft8DemodWorker->setLogMessages(settings.m_logMessages); } - if ((settings.m_enablePSKReporter != m_settings.m_enablePSKReporter) || force) { + if ((settingsKeys.contains("enablePSKReporter") && (settings.m_enablePSKReporter != m_settings.m_enablePSKReporter)) || force) { m_ft8DemodWorker->setEnablePskReporter(settings.m_enablePSKReporter); } - if ((settings.m_pskReporterCallsign != m_settings.m_pskReporterCallsign) || force) { + if ((settingsKeys.contains("pskReporterCallsign") && (settings.m_pskReporterCallsign != m_settings.m_pskReporterCallsign)) || force) { m_pskReporterWorker->setMyCallsign(settings.m_pskReporterCallsign); } - if ((settings.m_pskReporterLocator != m_settings.m_pskReporterLocator) || force) { + if ((settingsKeys.contains("pskReporterLocator") && (settings.m_pskReporterLocator != m_settings.m_pskReporterLocator)) || force) { m_pskReporterWorker->setMyLocator(settings.m_pskReporterLocator); } - if ((settings.m_pskReporterSoftware != m_settings.m_pskReporterSoftware) || force) { + if ((settingsKeys.contains("pskReporterSoftware") && (settings.m_pskReporterSoftware != m_settings.m_pskReporterSoftware)) || force) { m_pskReporterWorker->setDecoderInfo(settings.m_pskReporterSoftware); } - if ((settings.m_nbDecoderThreads != m_settings.m_nbDecoderThreads) || force) { + if ((settingsKeys.contains("nbDecoderThreads") && (settings.m_nbDecoderThreads != m_settings.m_nbDecoderThreads)) || force) { m_ft8DemodWorker->setNbDecoderThreads(settings.m_nbDecoderThreads); } - if ((settings.m_decoderTimeBudget != m_settings.m_decoderTimeBudget) || force) { + if ((settingsKeys.contains("decoderTimeBudget") && (settings.m_decoderTimeBudget != m_settings.m_decoderTimeBudget)) || force) { m_ft8DemodWorker->setDecoderTimeBudget(settings.m_decoderTimeBudget); } - if ((settings.m_useOSD != m_settings.m_useOSD) || force) { + if ((settingsKeys.contains("useOSD") && (settings.m_useOSD != m_settings.m_useOSD)) || force) { m_ft8DemodWorker->setUseOSD(settings.m_useOSD); } - if ((settings.m_osdDepth != m_settings.m_osdDepth) || force) { + if ((settingsKeys.contains("osdDepth") && (settings.m_osdDepth != m_settings.m_osdDepth)) || force) { m_ft8DemodWorker->setOSDDepth(settings.m_osdDepth); } - if ((settings.m_osdLDPCThreshold != m_settings.m_osdLDPCThreshold) || force) { + if ((settingsKeys.contains("osdLDPCThreshold") && (settings.m_osdLDPCThreshold != m_settings.m_osdLDPCThreshold)) || force) { m_ft8DemodWorker->setOSDLDPCThreshold(settings.m_osdLDPCThreshold); } - if ((settings.m_verifyOSD != m_settings.m_verifyOSD) || force) { + if ((settingsKeys.contains("verifyOSD") && (settings.m_verifyOSD != m_settings.m_verifyOSD)) || force) { m_ft8DemodWorker->setVerifyOSD(settings.m_verifyOSD); } - m_sink.applySettings(settings, force); - m_settings = settings; + m_sink.applySettings(settingsKeys, settings, force); + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int FT8DemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodft8/ft8demodbaseband.h b/plugins/channelrx/demodft8/ft8demodbaseband.h index f64cffb47..60142a3b9 100644 --- a/plugins/channelrx/demodft8/ft8demodbaseband.h +++ b/plugins/channelrx/demodft8/ft8demodbaseband.h @@ -47,20 +47,23 @@ public: public: const FT8DemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFT8DemodBaseband* create(const FT8DemodSettings& settings, bool force) + static MsgConfigureFT8DemodBaseband* create(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force) { - return new MsgConfigureFT8DemodBaseband(settings, force); + return new MsgConfigureFT8DemodBaseband(settingsKeys, settings, force); } private: FT8DemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFT8DemodBaseband(const FT8DemodSettings& settings, bool force) : + MsgConfigureFT8DemodBaseband(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -110,7 +113,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const FT8DemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force = false); MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; } private slots: diff --git a/plugins/channelrx/demodft8/ft8demodgui.cpp b/plugins/channelrx/demodft8/ft8demodgui.cpp index bb3084d7e..2de33364c 100644 --- a/plugins/channelrx/demodft8/ft8demodgui.cpp +++ b/plugins/channelrx/demodft8/ft8demodgui.cpp @@ -362,7 +362,7 @@ void FT8DemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void FT8DemodGUI::channelMarkerHighlightedByCursor() @@ -375,7 +375,7 @@ void FT8DemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void FT8DemodGUI::on_BW_valueChanged(int value) @@ -395,13 +395,13 @@ void FT8DemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value)); m_settings.m_volume = CalcDb::powerFromdB(value); - applySettings(); + applySettings(QStringList("volume")); } void FT8DemodGUI::on_agc_toggled(bool checked) { m_settings.m_agc = checked; - applySettings(); + applySettings(QStringList("agc")); } void FT8DemodGUI::on_spanLog2_valueChanged(int value) @@ -418,7 +418,7 @@ void FT8DemodGUI::on_spanLog2_valueChanged(int value) void FT8DemodGUI::on_fftWindow_currentIndexChanged(int index) { m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow = (FFTWindow::Function) index; - applySettings(); + applySettings(QStringList({"filterBank", "fftWindow"})); } void FT8DemodGUI::on_filterIndex_valueChanged(int value) @@ -460,7 +460,7 @@ void FT8DemodGUI::on_applyBandPreset_clicked() { m_settings.m_inputFrequencyOffset = channelShift * 1000; // Hz displaySettings(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -473,13 +473,13 @@ void FT8DemodGUI::on_clearMessages_clicked() void FT8DemodGUI::on_recordWav_toggled(bool checked) { m_settings.m_recordWav = checked; - applySettings(); + applySettings(QStringList("recordWav")); } void FT8DemodGUI::on_logMessages_toggled(bool checked) { m_settings.m_logMessages = checked; - applySettings(); + applySettings(QStringList("logMessages")); } void FT8DemodGUI::on_settings_clicked() @@ -559,7 +559,7 @@ void FT8DemodGUI::on_settings_clicked() } if (changed) { - applySettings(); + applySettings(settingsKeys); } } } @@ -606,7 +606,16 @@ void FT8DemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -618,7 +627,7 @@ void FT8DemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } FT8DemodGUI::FT8DemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : @@ -718,11 +727,11 @@ bool FT8DemodGUI::blockApplySettings(bool block) return ret; } -void FT8DemodGUI::applySettings(bool force) +void FT8DemodGUI::applySettings(const QStringList& settingsKeys, const bool force) { if (m_doApplySettings) { - FT8Demod::MsgConfigureFT8Demod* message = FT8Demod::MsgConfigureFT8Demod::create( m_settings, force); + FT8Demod::MsgConfigureFT8Demod* message = FT8Demod::MsgConfigureFT8Demod::create(settingsKeys, m_settings, force); m_ft8Demod->getInputMessageQueue()->push(message); } } @@ -800,7 +809,7 @@ void FT8DemodGUI::applyBandwidths(unsigned int spanLog2, bool force) m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth = bw * 100; m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff = lw * 100; - applySettings(force); + applySettings(QStringList({"filterBank", "spanLog2", "lowCutoff", "rfBandwidth"}), force); bool wasBlocked = blockApplySettings(true); m_channelMarker.setBandwidth(bw * 200); diff --git a/plugins/channelrx/demodft8/ft8demodgui.h b/plugins/channelrx/demodft8/ft8demodgui.h index 1505e1f6a..73a303747 100644 --- a/plugins/channelrx/demodft8/ft8demodgui.h +++ b/plugins/channelrx/demodft8/ft8demodgui.h @@ -141,7 +141,7 @@ private: virtual ~FT8DemodGUI(); bool blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applyBandwidths(unsigned int spanLog2, bool force = false); unsigned int spanLog2Max(); void displaySettings(); diff --git a/plugins/channelrx/demodft8/ft8demodsettings.cpp b/plugins/channelrx/demodft8/ft8demodsettings.cpp index ca114f622..75f165448 100644 --- a/plugins/channelrx/demodft8/ft8demodsettings.cpp +++ b/plugins/channelrx/demodft8/ft8demodsettings.cpp @@ -252,6 +252,180 @@ bool FT8DemodSettings::deserialize(const QByteArray& data) } } +void FT8DemodSettings::applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("agc")) { + m_agc = settings.m_agc; + } + if (settingsKeys.contains("recordWav")) { + m_recordWav = settings.m_recordWav; + } + if (settingsKeys.contains("logMessages")) { + m_logMessages = settings.m_logMessages; + } + if (settingsKeys.contains("nbDecoderThreads")) { + m_nbDecoderThreads = settings.m_nbDecoderThreads; + } + if (settingsKeys.contains("decoderTimeBudget")) { + m_decoderTimeBudget = settings.m_decoderTimeBudget; + } + if (settingsKeys.contains("useOSD")) { + m_useOSD = settings.m_useOSD; + } + if (settingsKeys.contains("osdDepth")) { + m_osdDepth = settings.m_osdDepth; + } + if (settingsKeys.contains("osdLDPCThreshold")) { + m_osdLDPCThreshold = settings.m_osdLDPCThreshold; + } + if (settingsKeys.contains("verifyOSD")) { + m_verifyOSD = settings.m_verifyOSD; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("filterBank")) { + m_filterBank = settings.m_filterBank; + } + if (settingsKeys.contains("filterIndex")) { + m_filterIndex = settings.m_filterIndex; + } + if (settingsKeys.contains("bandPresets")) { + m_bandPresets = settings.m_bandPresets; + } + if (settingsKeys.contains("enablePSKReporter")) { + m_enablePSKReporter = settings.m_enablePSKReporter; + } + if (settingsKeys.contains("pskReporterCallsign")) { + m_pskReporterCallsign = settings.m_pskReporterCallsign; + } + if (settingsKeys.contains("pskReporterLocator")) { + m_pskReporterLocator = settings.m_pskReporterLocator; + } + if (settingsKeys.contains("pskReporterSoftware")) { + m_pskReporterSoftware = settings.m_pskReporterSoftware; + } +} + +QString FT8DemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("agc") || force) { + ostr << " m_agc: " << m_agc; + } + if (settingsKeys.contains("recordWav") || force) { + ostr << " m_recordWav: " << m_recordWav; + } + if (settingsKeys.contains("logMessages") || force) { + ostr << " m_logMessages: " << m_logMessages; + } + if (settingsKeys.contains("nbDecoderThreads") || force) { + ostr << " m_nbDecoderThreads: " << m_nbDecoderThreads; + } + if (settingsKeys.contains("decoderTimeBudget") || force) { + ostr << " m_decoderTimeBudget: " << m_decoderTimeBudget; + } + if (settingsKeys.contains("useOSD") || force) { + ostr << " m_useOSD: " << m_useOSD; + } + if (settingsKeys.contains("osdDepth") || force) { + ostr << " m_osdDepth: " << m_osdDepth; + } + if (settingsKeys.contains("osdLDPCThreshold") || force) { + ostr << " m_osdLDPCThreshold: " << m_osdLDPCThreshold; + } + if (settingsKeys.contains("verifyOSD") || force) { + ostr << " m_verifyOSD: " << m_verifyOSD; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + if (settingsKeys.contains("filterIndex") || force) { + ostr << " m_filterIndex: " << m_filterIndex; + } + if (settingsKeys.contains("enablePSKReporter") || force) { + ostr << " m_enablePSKReporter: " << m_enablePSKReporter; + } + if (settingsKeys.contains("pskReporterCallsign") || force) { + ostr << " m_pskReporterCallsign: " << m_pskReporterCallsign.toStdString(); + } + if (settingsKeys.contains("pskReporterLocator") || force) { + ostr << " m_pskReporterLocator: " << m_pskReporterLocator.toStdString(); + } + if (settingsKeys.contains("pskReporterSoftware") || force) { + ostr << " m_pskReporterSoftware: " << m_pskReporterSoftware.toStdString(); + } + + return QString(ostr.str().c_str()); +} + QDataStream& operator<<(QDataStream& out, const FT8DemodBandPreset& bandPreset) { out << bandPreset.m_name; diff --git a/plugins/channelrx/demodft8/ft8demodsettings.h b/plugins/channelrx/demodft8/ft8demodsettings.h index a6da8e27b..c3da7b5c8 100644 --- a/plugins/channelrx/demodft8/ft8demodsettings.h +++ b/plugins/channelrx/demodft8/ft8demodsettings.h @@ -117,6 +117,8 @@ public: QString getDefaultReporterCallsign() const; QString getDefaultReporterLocator() const; QString getDefaultReporterSoftware() const; + void applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static const int m_ft8SampleRate; static const int m_minPowerThresholdDB; diff --git a/plugins/channelrx/demodft8/ft8demodsink.cpp b/plugins/channelrx/demodft8/ft8demodsink.cpp index 8bff93045..d318760be 100644 --- a/plugins/channelrx/demodft8/ft8demodsink.cpp +++ b/plugins/channelrx/demodft8/ft8demodsink.cpp @@ -88,7 +88,7 @@ FT8DemodSink::FT8DemodSink() : SSBFilter = new fftfilt(m_LowCutoff / FT8DemodSettings::m_ft8SampleRate, m_Bandwidth / FT8DemodSettings::m_ft8SampleRate, m_ssbFftLen); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } FT8DemodSink::~FT8DemodSink() @@ -265,24 +265,9 @@ void FT8DemodSink::applyFT8SampleRate() } } -void FT8DemodSink::applySettings(const FT8DemodSettings& settings, bool force) +void FT8DemodSink::applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force) { - qDebug() << "FT8DemodSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_filterIndex: " << settings.m_filterIndex - << " [m_spanLog2: " << settings.m_filterBank[settings.m_filterIndex].m_spanLog2 - << " m_rfBandwidth: " << settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth - << " m_lowCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_lowCutoff - << " m_fftWindow: " << settings.m_filterBank[settings.m_filterIndex].m_fftWindow << "]" - << " m_volume: " << settings.m_volume - << " m_agcActive: " << settings.m_agc - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "FT8DemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); if((m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth != settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth) || (m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff != settings.m_filterBank[settings.m_filterIndex].m_lowCutoff) || @@ -317,7 +302,7 @@ void FT8DemodSink::applySettings(const FT8DemodSettings& settings, bool force) SSBFilter->create_filter(m_LowCutoff / (float) FT8DemodSettings::m_ft8SampleRate, m_Bandwidth / (float) FT8DemodSettings::m_ft8SampleRate, settings.m_filterBank[settings.m_filterIndex].m_fftWindow); } - if ((m_settings.m_volume != settings.m_volume) || force) + if ((settingsKeys.contains("volume") && (m_settings.m_volume != settings.m_volume)) || force) { m_volume = settings.m_volume; m_volume /= 4.0; // for 3276.8 @@ -325,7 +310,12 @@ void FT8DemodSink::applySettings(const FT8DemodSettings& settings, bool force) m_spanLog2 = settings.m_filterBank[settings.m_filterIndex].m_spanLog2; m_agcActive = settings.m_agc; - m_settings = settings; + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void FT8DemodSink::calculateLevel(int16_t& sample) diff --git a/plugins/channelrx/demodft8/ft8demodsink.h b/plugins/channelrx/demodft8/ft8demodsink.h index b79b2bd82..d5c5e58e4 100644 --- a/plugins/channelrx/demodft8/ft8demodsink.h +++ b/plugins/channelrx/demodft8/ft8demodsink.h @@ -42,7 +42,7 @@ public: void setSpectrumSink(SpectrumVis* spectrumSink) { m_spectrumSink = spectrumSink; } void setFT8Buffer(FT8Buffer *buffer) { m_ft8Buffer = buffer; } void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false); - void applySettings(const FT8DemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FT8DemodSettings& settings, bool force = false); void applyFT8SampleRate(); double getMagSq() const { return m_magsq; } @@ -150,4 +150,3 @@ private: }; #endif // INCLUDE_FT8DEMODSINK_H - diff --git a/plugins/channelrx/demodils/ilsdemod.cpp b/plugins/channelrx/demodils/ilsdemod.cpp index e17d2f4be..64feafc27 100644 --- a/plugins/channelrx/demodils/ilsdemod.cpp +++ b/plugins/channelrx/demodils/ilsdemod.cpp @@ -66,7 +66,7 @@ ILSDemod::ILSDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -149,7 +149,7 @@ void ILSDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - ILSDemodBaseband::MsgConfigureILSDemodBaseband *msg = ILSDemodBaseband::MsgConfigureILSDemodBaseband::create(m_settings, true); + ILSDemodBaseband::MsgConfigureILSDemodBaseband *msg = ILSDemodBaseband::MsgConfigureILSDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -174,7 +174,7 @@ bool ILSDemod::handleMessage(const Message& cmd) { MsgConfigureILSDemod& cfg = (MsgConfigureILSDemod&) cmd; qDebug() << "ILSDemod::handleMessage: MsgConfigureILSDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -287,103 +287,20 @@ void ILSDemod::setCenterFrequency(qint64 frequency) { ILSDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureILSDemod *msgToGUI = MsgConfigureILSDemod::create(settings, false); + MsgConfigureILSDemod *msgToGUI = MsgConfigureILSDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void ILSDemod::applySettings(const ILSDemodSettings& settings, bool force) +void ILSDemod::applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force) { - qDebug() << "ILSDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "ILSDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_mode != m_settings.m_mode) || force) { - reverseAPIKeys.append("mode"); - } - if ((settings.m_frequencyIndex != m_settings.m_frequencyIndex) || force) { - reverseAPIKeys.append("frequencyIndex"); - } - if ((settings.m_squelch != m_settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((settings.m_volume != m_settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((settings.m_audioMute != m_settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((settings.m_average != m_settings.m_average) || force) { - reverseAPIKeys.append("average"); - } - if ((settings.m_ddmUnits != m_settings.m_ddmUnits) || force) { - reverseAPIKeys.append("ddmUnits"); - } - if ((settings.m_identThreshold != m_settings.m_identThreshold) || force) { - reverseAPIKeys.append("identThreshold"); - } - if ((settings.m_ident != m_settings.m_ident) || force) { - reverseAPIKeys.append("ident"); - } - if ((settings.m_runway != m_settings.m_runway) || force) { - reverseAPIKeys.append("runway"); - } - if ((settings.m_trueBearing != m_settings.m_trueBearing) || force) { - reverseAPIKeys.append("trueBearing"); - } - if ((settings.m_latitude != m_settings.m_latitude) || force) { - reverseAPIKeys.append("latitude"); - } - if ((settings.m_longitude != m_settings.m_longitude) || force) { - reverseAPIKeys.append("longitude"); - } - if ((settings.m_elevation != m_settings.m_elevation) || force) { - reverseAPIKeys.append("elevation"); - } - if ((settings.m_glidePath != m_settings.m_glidePath) || force) { - reverseAPIKeys.append("glidePath"); - } - if ((settings.m_refHeight != m_settings.m_refHeight) || force) { - reverseAPIKeys.append("refHeight"); - } - if ((settings.m_courseWidth != m_settings.m_courseWidth) || force) { - reverseAPIKeys.append("courseWidth"); - } - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_logFilename != m_settings.m_logFilename) || force) { - reverseAPIKeys.append("logFilename"); - } - if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) { - reverseAPIKeys.append("logEnabled"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -394,28 +311,26 @@ void ILSDemod::applySettings(const ILSDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - ILSDemodBaseband::MsgConfigureILSDemodBaseband *msg = ILSDemodBaseband::MsgConfigureILSDemodBaseband::create(settings, force); + ILSDemodBaseband::MsgConfigureILSDemodBaseband *msg = ILSDemodBaseband::MsgConfigureILSDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - if ((settings.m_logEnabled != m_settings.m_logEnabled) - || (settings.m_logFilename != m_settings.m_logFilename) + if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled)) + || (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename)) || force) { if (m_logFile.isOpen()) @@ -444,7 +359,11 @@ void ILSDemod::applySettings(const ILSDemodSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void ILSDemod::sendSampleRateToDemodAnalyzer() @@ -475,14 +394,14 @@ bool ILSDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureILSDemod *msg = MsgConfigureILSDemod::create(m_settings, true); + MsgConfigureILSDemod *msg = MsgConfigureILSDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureILSDemod *msg = MsgConfigureILSDemod::create(m_settings, true); + MsgConfigureILSDemod *msg = MsgConfigureILSDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -518,13 +437,13 @@ int ILSDemod::webapiSettingsPutPatch( ILSDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureILSDemod *msg = MsgConfigureILSDemod::create(settings, force); + MsgConfigureILSDemod *msg = MsgConfigureILSDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("ILSDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureILSDemod *msgToGUI = MsgConfigureILSDemod::create(settings, force); + MsgConfigureILSDemod *msgToGUI = MsgConfigureILSDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -761,7 +680,7 @@ void ILSDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response response.getIlsDemodReport()->setDm150(m_dm150); } -void ILSDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const ILSDemodSettings& settings, bool force) +void ILSDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const ILSDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -787,7 +706,7 @@ void ILSDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co } void ILSDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const ILSDemodSettings& settings, bool force @@ -939,4 +858,3 @@ void ILSDemod::handleIndexInDeviceSetChanged(int index) .arg(index); m_basebandSink->setFifoLabel(fifoLabel); } - diff --git a/plugins/channelrx/demodils/ilsdemod.h b/plugins/channelrx/demodils/ilsdemod.h index 911a2d1ab..686a2dc9b 100644 --- a/plugins/channelrx/demodils/ilsdemod.h +++ b/plugins/channelrx/demodils/ilsdemod.h @@ -50,20 +50,23 @@ public: public: const ILSDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureILSDemod* create(const ILSDemodSettings& settings, bool force) + static MsgConfigureILSDemod* create(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force) { - return new MsgConfigureILSDemod(settings, force); + return new MsgConfigureILSDemod(settingsKeys, settings, force); } private: ILSDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureILSDemod(const ILSDemodSettings& settings, bool force) : + MsgConfigureILSDemod(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -210,11 +213,11 @@ private: Real m_angle; virtual bool handleMessage(const Message& cmd); - void applySettings(const ILSDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const ILSDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const ILSDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const ILSDemodSettings& settings, bool force @@ -228,4 +231,3 @@ private slots: }; #endif // INCLUDE_ILSDEMOD_H - diff --git a/plugins/channelrx/demodils/ilsdemodbaseband.cpp b/plugins/channelrx/demodils/ilsdemodbaseband.cpp index 9f43bee22..eef131ff6 100644 --- a/plugins/channelrx/demodils/ilsdemodbaseband.cpp +++ b/plugins/channelrx/demodils/ilsdemodbaseband.cpp @@ -139,7 +139,7 @@ bool ILSDemodBaseband::handleMessage(const Message& cmd) MsgConfigureILSDemodBaseband& cfg = (MsgConfigureILSDemodBaseband&) cmd; qDebug() << "ILSDemodBaseband::handleMessage: MsgConfigureILSDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -164,9 +164,9 @@ bool ILSDemodBaseband::handleMessage(const Message& cmd) } } -void ILSDemodBaseband::applySettings(const ILSDemodSettings& settings, bool force) +void ILSDemodBaseband::applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("m_inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(ILSDemodSettings::ILSDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); @@ -177,7 +177,7 @@ void ILSDemodBaseband::applySettings(const ILSDemodSettings& settings, bool forc } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("m_audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -194,9 +194,13 @@ void ILSDemodBaseband::applySettings(const ILSDemodSettings& settings, bool forc } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int ILSDemodBaseband::getChannelSampleRate() const @@ -209,4 +213,3 @@ void ILSDemodBaseband::setBasebandSampleRate(int sampleRate) m_channelizer->setBasebandSampleRate(sampleRate); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - diff --git a/plugins/channelrx/demodils/ilsdemodbaseband.h b/plugins/channelrx/demodils/ilsdemodbaseband.h index 545b6b53c..3cb60bf5f 100644 --- a/plugins/channelrx/demodils/ilsdemodbaseband.h +++ b/plugins/channelrx/demodils/ilsdemodbaseband.h @@ -45,20 +45,23 @@ public: public: const ILSDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureILSDemodBaseband* create(const ILSDemodSettings& settings, bool force) + static MsgConfigureILSDemodBaseband* create(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force) { - return new MsgConfigureILSDemodBaseband(settings, force); + return new MsgConfigureILSDemodBaseband(settingsKeys, settings, force); } private: ILSDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureILSDemodBaseband(const ILSDemodSettings& settings, bool force) : + MsgConfigureILSDemodBaseband(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -100,7 +103,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(ILSDemodSink *sink); - void applySettings(const ILSDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); @@ -108,4 +111,3 @@ private slots: }; #endif // INCLUDE_ILSDEMODBASEBAND_H - diff --git a/plugins/channelrx/demodils/ilsdemodgui.cpp b/plugins/channelrx/demodils/ilsdemodgui.cpp index 29ff38bd1..518fc91a6 100644 --- a/plugins/channelrx/demodils/ilsdemodgui.cpp +++ b/plugins/channelrx/demodils/ilsdemodgui.cpp @@ -111,7 +111,7 @@ void ILSDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray ILSDemodGUI::serialize() const @@ -124,7 +124,7 @@ bool ILSDemodGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else @@ -269,7 +269,7 @@ void ILSDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void ILSDemodGUI::channelMarkerHighlightedByCursor() @@ -282,7 +282,7 @@ void ILSDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void ILSDemodGUI::on_rfBW_valueChanged(int value) @@ -291,7 +291,7 @@ void ILSDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(formatFrequency((int)bw)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void ILSDemodGUI::on_mode_currentIndexChanged(int index) @@ -320,7 +320,7 @@ void ILSDemodGUI::on_mode_currentIndexChanged(int index) closePipes(); } ui->frequency->setCurrentIndex(freqIdx); - applySettings(); + applySettings(QStringList({"mode"})); } void ILSDemodGUI::on_frequency_currentIndexChanged(int index) @@ -337,52 +337,52 @@ void ILSDemodGUI::on_frequency_currentIndexChanged(int index) double frequency = text.toDouble() * 1e6; ChannelWebAPIUtils::setCenterFrequency(m_ilsDemod->getDeviceSetIndex(), frequency); } - applySettings(); + applySettings(QStringList({"frequencyIndex"})); } void ILSDemodGUI::on_average_clicked(bool checked) { m_settings.m_average = checked; - applySettings(); + applySettings(QStringList({"average"})); } void ILSDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volume = value / 10.0; - applySettings(); + applySettings(QStringList({"volume"})); } void ILSDemodGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1 dB").arg(value)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList({"squelch"})); } void ILSDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList({"audioMute"})); } void ILSDemodGUI::on_thresh_valueChanged(int value) { ui->threshText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_identThreshold = value / 10.0; - applySettings(); + applySettings(QStringList({"identThreshold"})); } void ILSDemodGUI::on_ddmUnits_currentIndexChanged(int index) { m_settings.m_ddmUnits = (ILSDemodSettings::DDMUnits) index; - applySettings(); + applySettings(QStringList({"ddmUnits"})); } void ILSDemodGUI::on_ident_editingFinished() { m_settings.m_ident = ui->ident->currentText(); - applySettings(); + applySettings(QStringList({"ident"})); } // 3.1.3.7.3 Note 1 @@ -418,14 +418,14 @@ void ILSDemodGUI::on_ident_currentIndexChanged(int index) m_disableDrawILS = false; } drawILSOnMap(); - applySettings(); + applySettings(QStringList({"ident"})); } void ILSDemodGUI::on_runway_editingFinished() { m_settings.m_runway = ui->runway->text(); drawILSOnMap(); - applySettings(); + applySettings(QStringList({"runway"})); } void ILSDemodGUI::on_findOnMap_clicked() @@ -852,87 +852,87 @@ void ILSDemodGUI::updateGPSAngle() void ILSDemodGUI::on_trueBearing_valueChanged(double value) { m_settings.m_trueBearing = (float) value; - applySettings(); + applySettings(QStringList({"trueBearing"})); drawILSOnMap(); } void ILSDemodGUI::on_elevation_valueChanged(int value) { m_settings.m_elevation = value; - applySettings(); + applySettings(QStringList({"elevation"})); drawILSOnMap(); } void ILSDemodGUI::on_latitude_editingFinished() { m_settings.m_latitude = ui->latitude->text(); - applySettings(); + applySettings(QStringList({"latitude"})); drawILSOnMap(); } void ILSDemodGUI::on_longitude_editingFinished() { m_settings.m_longitude = ui->longitude->text(); - applySettings(); + applySettings(QStringList({"longitude"})); drawILSOnMap(); } void ILSDemodGUI::on_glidePath_valueChanged(double value) { m_settings.m_glidePath = value; - applySettings(); + applySettings(QStringList({"glidePath"})); drawILSOnMap(); } void ILSDemodGUI::on_height_valueChanged(double value) { m_settings.m_refHeight = (float)value; - applySettings(); + applySettings(QStringList({"refHeight"})); drawILSOnMap(); } void ILSDemodGUI::on_courseWidth_valueChanged(double value) { m_settings.m_courseWidth = (float)value; - applySettings(); + applySettings(QStringList({"courseWidth"})); drawILSOnMap(); } void ILSDemodGUI::on_slope_valueChanged(double value) { m_settings.m_slope = (float)value; - applySettings(); + applySettings(QStringList({"slope"})); drawILSOnMap(); } void ILSDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList({"udpEnabled"})); } void ILSDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList({"udpAddress"})); } void ILSDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList({"udpPort"})); } void ILSDemodGUI::on_channel1_currentIndexChanged(int index) { m_settings.m_scopeCh1 = index; - applySettings(); + applySettings(QStringList({"scopeCh1"})); } void ILSDemodGUI::on_channel2_currentIndexChanged(int index) { m_settings.m_scopeCh2 = index; - applySettings(); + applySettings(QStringList({"scopeCh2"})); } void ILSDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -941,7 +941,7 @@ void ILSDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void ILSDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -986,7 +986,8 @@ void ILSDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -1101,7 +1102,7 @@ ILSDemodGUI::ILSDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); // force full settings apply m_resizer.enableChildMouseTracking(); drawILSOnMap(); @@ -1153,11 +1154,11 @@ void ILSDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void ILSDemodGUI::applySettings(bool force) +void ILSDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - ILSDemod::MsgConfigureILSDemod* message = ILSDemod::MsgConfigureILSDemod::create( m_settings, force); + ILSDemod::MsgConfigureILSDemod* message = ILSDemod::MsgConfigureILSDemod::create(settingsKeys, m_settings, force); m_ilsDemod->getInputMessageQueue()->push(message); } } @@ -1277,7 +1278,7 @@ void ILSDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList({"audioDeviceName"})); } } @@ -1329,7 +1330,7 @@ void ILSDemodGUI::tick() void ILSDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList({"logEnabled"})); } void ILSDemodGUI::on_logFilename_clicked() @@ -1345,7 +1346,7 @@ void ILSDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList({"logFilename"})); } } } @@ -1521,4 +1522,3 @@ void ILSDemodGUI::handleChannelMessageQueue(MessageQueue* messageQueue) } } } - diff --git a/plugins/channelrx/demodils/ilsdemodgui.h b/plugins/channelrx/demodils/ilsdemodgui.h index b4771d06c..95b71006b 100644 --- a/plugins/channelrx/demodils/ilsdemodgui.h +++ b/plugins/channelrx/demodils/ilsdemodgui.h @@ -149,7 +149,7 @@ private: virtual ~ILSDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); @@ -219,4 +219,3 @@ private slots: }; #endif // INCLUDE_ILSDEMODGUI_H - diff --git a/plugins/channelrx/demodils/ilsdemodsettings.cpp b/plugins/channelrx/demodils/ilsdemodsettings.cpp index dbd612f33..73460020a 100644 --- a/plugins/channelrx/demodils/ilsdemodsettings.cpp +++ b/plugins/channelrx/demodils/ilsdemodsettings.cpp @@ -233,3 +233,245 @@ bool ILSDemodSettings::deserialize(const QByteArray& data) } } +void ILSDemodSettings::applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("mode")) { + m_mode = settings.m_mode; + } + if (settingsKeys.contains("frequencyIndex")) { + m_frequencyIndex = settings.m_frequencyIndex; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("average")) { + m_average = settings.m_average; + } + if (settingsKeys.contains("ddmUnits")) { + m_ddmUnits = settings.m_ddmUnits; + } + if (settingsKeys.contains("identThreshold")) { + m_identThreshold = settings.m_identThreshold; + } + if (settingsKeys.contains("ident")) { + m_ident = settings.m_ident; + } + if (settingsKeys.contains("runway")) { + m_runway = settings.m_runway; + } + if (settingsKeys.contains("trueBearing")) { + m_trueBearing = settings.m_trueBearing; + } + if (settingsKeys.contains("slope")) { + m_slope = settings.m_slope; + } + if (settingsKeys.contains("latitude")) { + m_latitude = settings.m_latitude; + } + if (settingsKeys.contains("longitude")) { + m_longitude = settings.m_longitude; + } + if (settingsKeys.contains("elevation")) { + m_elevation = settings.m_elevation; + } + if (settingsKeys.contains("glidePath")) { + m_glidePath = settings.m_glidePath; + } + if (settingsKeys.contains("refHeight")) { + m_refHeight = settings.m_refHeight; + } + if (settingsKeys.contains("courseWidth")) { + m_courseWidth = settings.m_courseWidth; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("scopeCh1")) { + m_scopeCh1 = settings.m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2")) { + m_scopeCh2 = settings.m_scopeCh2; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString ILSDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("mode") || force) { + ostr << " m_mode: " << m_mode; + } + if (settingsKeys.contains("frequencyIndex") || force) { + ostr << " m_frequencyIndex: " << m_frequencyIndex; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("average") || force) { + ostr << " m_average: " << m_average; + } + if (settingsKeys.contains("ddmUnits") || force) { + ostr << " m_ddmUnits: " << m_ddmUnits; + } + if (settingsKeys.contains("identThreshold") || force) { + ostr << " m_identThreshold: " << m_identThreshold; + } + if (settingsKeys.contains("ident") || force) { + ostr << " m_ident: " << m_ident.toStdString(); + } + if (settingsKeys.contains("runway") || force) { + ostr << " m_runway: " << m_runway.toStdString(); + } + if (settingsKeys.contains("trueBearing") || force) { + ostr << " m_trueBearing: " << m_trueBearing; + } + if (settingsKeys.contains("slope") || force) { + ostr << " m_slope: " << m_slope; + } + if (settingsKeys.contains("latitude") || force) { + ostr << " m_latitude: " << m_latitude.toStdString(); + } + if (settingsKeys.contains("longitude") || force) { + ostr << " m_longitude: " << m_longitude.toStdString(); + } + if (settingsKeys.contains("elevation") || force) { + ostr << " m_elevation: " << m_elevation; + } + if (settingsKeys.contains("glidePath") || force) { + ostr << " m_glidePath: " << m_glidePath; + } + if (settingsKeys.contains("refHeight") || force) { + ostr << " m_refHeight: " << m_refHeight; + } + if (settingsKeys.contains("courseWidth") || force) { + ostr << " m_courseWidth: " << m_courseWidth; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("scopeCh1") || force) { + ostr << " m_scopeCh1: " << m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2") || force) { + ostr << " m_scopeCh2: " << m_scopeCh2; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodils/ilsdemodsettings.h b/plugins/channelrx/demodils/ilsdemodsettings.h index 3a50ed2a3..5ee53fb99 100644 --- a/plugins/channelrx/demodils/ilsdemodsettings.h +++ b/plugins/channelrx/demodils/ilsdemodsettings.h @@ -97,7 +97,8 @@ struct ILSDemodSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_ILSDEMODSETTINGS_H */ - diff --git a/plugins/channelrx/demodils/ilsdemodsink.cpp b/plugins/channelrx/demodils/ilsdemodsink.cpp index 939e16fa8..562491e3d 100644 --- a/plugins/channelrx/demodils/ilsdemodsink.cpp +++ b/plugins/channelrx/demodils/ilsdemodsink.cpp @@ -58,7 +58,7 @@ ILSDemodSink::ILSDemodSink() : m_sampleBuffer.resize(m_sampleBufferSize); m_spectrumSampleBuffer.resize(m_sampleBufferSize); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); FFTFactory *fftFactory = DSPEngine::instance()->getFFTFactory(); @@ -404,28 +404,22 @@ void ILSDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque } -void ILSDemodSink::applySettings(const ILSDemodSettings& settings, bool force) +void ILSDemodSink::applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force) { - qDebug() << "ILSDemodSink::applySettings:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " force: " << force; + qDebug() << "ILSDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((m_settings.m_squelch != settings.m_squelch) || force) { + if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || force) { m_squelchLevel = CalcDb::powerFromdB(settings.m_squelch); } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) ILSDemodSettings::ILSDEMOD_CHANNEL_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_identThreshold != m_settings.m_identThreshold) || force) { + if ((settingsKeys.contains("identThreshold") && (settings.m_identThreshold != m_settings.m_identThreshold)) || force) { m_morseDemod.applySettings(settings.m_identThreshold); } @@ -435,9 +429,13 @@ void ILSDemodSink::applySettings(const ILSDemodSettings& settings, bool force) m_modDepth150Average.reset(); m_ddmAverage.reset(); m_decimator.setLog2Decim(ILSDemodSettings::ILSDEMOD_SPECTRUM_DECIM_LOG2); + m_settings = settings; + } + else + { + m_settings.applySettings(settingsKeys, settings); } - m_settings = settings; } void ILSDemodSink::applyAudioSampleRate(int sampleRate) @@ -466,4 +464,3 @@ void ILSDemodSink::applyAudioSampleRate(int sampleRate) m_audioSampleRate = sampleRate; } - diff --git a/plugins/channelrx/demodils/ilsdemodsink.h b/plugins/channelrx/demodils/ilsdemodsink.h index 9eaeb5bc0..a061ee9c4 100644 --- a/plugins/channelrx/demodils/ilsdemodsink.h +++ b/plugins/channelrx/demodils/ilsdemodsink.h @@ -52,7 +52,7 @@ public: void setSpectrumSink(SpectrumVis* spectrumSink) { m_spectrumSink = spectrumSink; } void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const ILSDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ILSDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; m_morseDemod.setMessageQueueToChannel(messageQueue); } void setChannel(ChannelAPI *channel) { m_channel = channel; } void applyAudioSampleRate(int sampleRate); @@ -166,4 +166,3 @@ private: }; #endif // INCLUDE_ILSDEMODSINK_H - diff --git a/plugins/channelrx/demodm17/m17demod.cpp b/plugins/channelrx/demodm17/m17demod.cpp index da6429cbc..2cfee7581 100644 --- a/plugins/channelrx/demodm17/m17demod.cpp +++ b/plugins/channelrx/demodm17/m17demod.cpp @@ -257,24 +257,7 @@ void M17Demod::setCenterFrequency(qint64 frequency) void M17Demod::applySettings(const M17DemodSettings& settings, const QList& settingsKeys, bool force) { - qDebug() << "M17Demod::applySettings: " - << " settingsKeys: " << settingsKeys - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volume: " << settings.m_volume - << " m_baudRate: " << settings.m_baudRate - << " m_squelchGate" << settings.m_squelchGate - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_syncOrConstellation: " << settings.m_syncOrConstellation - << " m_highPassFilter: "<< settings.m_highPassFilter - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_traceLengthMutliplier: " << settings.m_traceLengthMutliplier - << " m_traceStroke: " << settings.m_traceStroke - << " m_traceDecay: " << settings.m_traceDecay - << " m_streamIndex: " << settings.m_streamIndex - << " force: " << force; + qDebug() << "M17Demod::applySettings: " << settings.getDebugString(settingsKeys, force); if (settingsKeys.contains("streamIndex")) { diff --git a/plugins/channelrx/demodm17/m17demodsettings.cpp b/plugins/channelrx/demodm17/m17demodsettings.cpp index 5dbe4d0f0..9ec47252f 100644 --- a/plugins/channelrx/demodm17/m17demodsettings.cpp +++ b/plugins/channelrx/demodm17/m17demodsettings.cpp @@ -261,3 +261,86 @@ void M17DemodSettings::applySettings(const QStringList& settingsKeys, const M17D m_channelMarker = settings.m_channelMarker; } } + +QString M17DemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("baudRate") || force) { + ostr << " m_baudRate: " << m_baudRate; + } + if (settingsKeys.contains("squelchGate") || force) { + ostr << " m_squelchGate: " << m_squelchGate; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("syncOrConstellation") || force) { + ostr << " m_syncOrConstellation: " << m_syncOrConstellation; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("highPassFilter") || force) { + ostr << " m_highPassFilter: " << m_highPassFilter; + } + if (settingsKeys.contains("traceLengthMutliplier") || force) { + ostr << " m_traceLengthMutliplier: " << m_traceLengthMutliplier; + } + if (settingsKeys.contains("traceStroke") || force) { + ostr << " m_traceStroke: " << m_traceStroke; + } + if (settingsKeys.contains("traceDecay") || force) { + ostr << " m_traceDecay: " << m_traceDecay; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("statusLogEnabled") || force) { + ostr << " m_statusLogEnabled: " << m_statusLogEnabled; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodm17/m17demodsettings.h b/plugins/channelrx/demodm17/m17demodsettings.h index 889cf35f7..69a300e6a 100644 --- a/plugins/channelrx/demodm17/m17demodsettings.h +++ b/plugins/channelrx/demodm17/m17demodsettings.h @@ -67,6 +67,7 @@ struct M17DemodSettings QByteArray serialize() const; bool deserialize(const QByteArray& data); void applySettings(const QStringList& settingsKeys, const M17DemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channelrx/demodm17/m17demodsink.cpp b/plugins/channelrx/demodm17/m17demodsink.cpp index 7fd8ad4a0..9cee85ac8 100644 --- a/plugins/channelrx/demodm17/m17demodsink.cpp +++ b/plugins/channelrx/demodm17/m17demodsink.cpp @@ -297,24 +297,7 @@ void M17DemodSink::applyChannelSettings(int channelSampleRate, int channelFreque void M17DemodSink::applySettings(const M17DemodSettings& settings, const QList& settingsKeys, bool force) { - qDebug() << "M17DemodSink::applySettings: " - << " settingsKeys: " << settingsKeys - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volume: " << settings.m_volume - << " m_baudRate: " << settings.m_baudRate - << " m_squelchGate" << settings.m_squelchGate - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_syncOrConstellation: " << settings.m_syncOrConstellation - << " m_highPassFilter: "<< settings.m_highPassFilter - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_traceLengthMutliplier: " << settings.m_traceLengthMutliplier - << " m_traceStroke: " << settings.m_traceStroke - << " m_traceDecay: " << settings.m_traceDecay - << " m_streamIndex: " << settings.m_streamIndex - << " force: " << force; + qDebug() << "M17DemodSink::applySettings: " << settings.getDebugString(settingsKeys, force); if (settingsKeys.contains("rfBandwidth") || force) { @@ -367,4 +350,3 @@ void M17DemodSink::configureMyPosition(float myLatitude, float myLongitude) m_latitude = myLatitude; m_longitude = myLongitude; } - diff --git a/plugins/channelrx/demodnavtex/navtexdemod.cpp b/plugins/channelrx/demodnavtex/navtexdemod.cpp index 94f80c98a..49c282233 100644 --- a/plugins/channelrx/demodnavtex/navtexdemod.cpp +++ b/plugins/channelrx/demodnavtex/navtexdemod.cpp @@ -58,7 +58,7 @@ NavtexDemod::NavtexDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -132,7 +132,7 @@ void NavtexDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband *msg = NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband::create(m_settings, true); + NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband *msg = NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -150,7 +150,7 @@ bool NavtexDemod::handleMessage(const Message& cmd) { MsgConfigureNavtexDemod& cfg = (MsgConfigureNavtexDemod&) cmd; qDebug() << "NavtexDemod::handleMessage: MsgConfigureNavtexDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -244,61 +244,20 @@ void NavtexDemod::setCenterFrequency(qint64 frequency) { NavtexDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNavtexDemod *msgToGUI = MsgConfigureNavtexDemod::create(settings, false); + MsgConfigureNavtexDemod *msgToGUI = MsgConfigureNavtexDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void NavtexDemod::applySettings(const NavtexDemodSettings& settings, bool force) +void NavtexDemod::applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force) { - qDebug() << "NavtexDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "NavtexDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_navArea != m_settings.m_navArea) || force) { - reverseAPIKeys.append("navArea"); - } - if ((settings.m_filterStation != m_settings.m_filterStation) || force) { - reverseAPIKeys.append("filterStation"); - } - if ((settings.m_filterType != m_settings.m_filterType) || force) { - reverseAPIKeys.append("filterType"); - } - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_logFilename != m_settings.m_logFilename) || force) { - reverseAPIKeys.append("logFilename"); - } - if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) { - reverseAPIKeys.append("logEnabled"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -309,25 +268,23 @@ void NavtexDemod::applySettings(const NavtexDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband *msg = NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband::create(settings, force); + NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband *msg = NavtexDemodBaseband::MsgConfigureNavtexDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - if ((settings.m_logEnabled != m_settings.m_logEnabled) - || (settings.m_logFilename != m_settings.m_logFilename) + if ((settingsKeys.contains("logEnabled") && (m_settings.m_logEnabled != settings.m_logEnabled)) + || (settingsKeys.contains("logFilename") && (m_settings.m_logFilename != settings.m_logFilename)) || force) { if (m_logFile.isOpen()) @@ -356,7 +313,11 @@ void NavtexDemod::applySettings(const NavtexDemodSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void NavtexDemod::sendSampleRateToDemodAnalyzer() @@ -387,14 +348,14 @@ bool NavtexDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureNavtexDemod *msg = MsgConfigureNavtexDemod::create(m_settings, true); + MsgConfigureNavtexDemod *msg = MsgConfigureNavtexDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureNavtexDemod *msg = MsgConfigureNavtexDemod::create(m_settings, true); + MsgConfigureNavtexDemod *msg = MsgConfigureNavtexDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -430,13 +391,13 @@ int NavtexDemod::webapiSettingsPutPatch( NavtexDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureNavtexDemod *msg = MsgConfigureNavtexDemod::create(settings, force); + MsgConfigureNavtexDemod *msg = MsgConfigureNavtexDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("NavtexDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNavtexDemod *msgToGUI = MsgConfigureNavtexDemod::create(settings, force); + MsgConfigureNavtexDemod *msgToGUI = MsgConfigureNavtexDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -611,7 +572,7 @@ void NavtexDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respo response.getNavtexDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void NavtexDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const NavtexDemodSettings& settings, bool force) +void NavtexDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const NavtexDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -637,7 +598,7 @@ void NavtexDemod::webapiReverseSendSettings(QList& channelSettingsKeys, } void NavtexDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const NavtexDemodSettings& settings, bool force @@ -747,4 +708,3 @@ void NavtexDemod::handleIndexInDeviceSetChanged(int index) .arg(index); m_basebandSink->setFifoLabel(fifoLabel); } - diff --git a/plugins/channelrx/demodnavtex/navtexdemod.h b/plugins/channelrx/demodnavtex/navtexdemod.h index 205cfecce..20956f09a 100644 --- a/plugins/channelrx/demodnavtex/navtexdemod.h +++ b/plugins/channelrx/demodnavtex/navtexdemod.h @@ -54,20 +54,23 @@ public: public: const NavtexDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNavtexDemod* create(const NavtexDemodSettings& settings, bool force) + static MsgConfigureNavtexDemod* create(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force) { - return new MsgConfigureNavtexDemod(settings, force); + return new MsgConfigureNavtexDemod(settingsKeys, settings, force); } private: NavtexDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNavtexDemod(const NavtexDemodSettings& settings, bool force) : + MsgConfigureNavtexDemod(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -204,11 +207,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const NavtexDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const NavtexDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const NavtexDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const NavtexDemodSettings& settings, bool force @@ -222,4 +225,3 @@ private slots: }; #endif // INCLUDE_NAVTEXDEMOD_H - diff --git a/plugins/channelrx/demodnavtex/navtexdemodbaseband.cpp b/plugins/channelrx/demodnavtex/navtexdemodbaseband.cpp index 1187365fe..633dd7637 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodbaseband.cpp +++ b/plugins/channelrx/demodnavtex/navtexdemodbaseband.cpp @@ -134,7 +134,7 @@ bool NavtexDemodBaseband::handleMessage(const Message& cmd) MsgConfigureNavtexDemodBaseband& cfg = (MsgConfigureNavtexDemodBaseband&) cmd; qDebug() << "NavtexDemodBaseband::handleMessage: MsgConfigureNavtexDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -155,17 +155,21 @@ bool NavtexDemodBaseband::handleMessage(const Message& cmd) } } -void NavtexDemodBaseband::applySettings(const NavtexDemodSettings& settings, bool force) +void NavtexDemodBaseband::applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(NavtexDemodSettings::NAVTEXDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int NavtexDemodBaseband::getChannelSampleRate() const @@ -178,4 +182,3 @@ void NavtexDemodBaseband::setBasebandSampleRate(int sampleRate) m_channelizer->setBasebandSampleRate(sampleRate); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - diff --git a/plugins/channelrx/demodnavtex/navtexdemodbaseband.h b/plugins/channelrx/demodnavtex/navtexdemodbaseband.h index c78ed23d8..c238876a9 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodbaseband.h +++ b/plugins/channelrx/demodnavtex/navtexdemodbaseband.h @@ -44,20 +44,23 @@ public: public: const NavtexDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNavtexDemodBaseband* create(const NavtexDemodSettings& settings, bool force) + static MsgConfigureNavtexDemodBaseband* create(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force) { - return new MsgConfigureNavtexDemodBaseband(settings, force); + return new MsgConfigureNavtexDemodBaseband(settingsKeys, settings, force); } private: NavtexDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNavtexDemodBaseband(const NavtexDemodSettings& settings, bool force) : + MsgConfigureNavtexDemodBaseband(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -93,7 +96,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(NavtexDemodSink *sink); - void applySettings(const NavtexDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); @@ -101,4 +104,3 @@ private slots: }; #endif // INCLUDE_NAVTEXDEMODBASEBAND_H - diff --git a/plugins/channelrx/demodnavtex/navtexdemodgui.cpp b/plugins/channelrx/demodnavtex/navtexdemodgui.cpp index c21407c8f..d08b1908c 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodgui.cpp +++ b/plugins/channelrx/demodnavtex/navtexdemodgui.cpp @@ -127,7 +127,7 @@ void NavtexDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray NavtexDemodGUI::serialize() const @@ -139,7 +139,7 @@ bool NavtexDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -303,7 +303,7 @@ void NavtexDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NavtexDemodGUI::channelMarkerHighlightedByCursor() @@ -313,9 +313,11 @@ void NavtexDemodGUI::channelMarkerHighlightedByCursor() void NavtexDemodGUI::updateTxStation() { - const NavtexTransmitter *transmitter = NavtexTransmitter::getTransmitter(QDateTime::currentDateTimeUtc().time(), - m_settings.m_navArea, - getFrequency()); + const NavtexTransmitter *transmitter = NavtexTransmitter::getTransmitter( + QDateTime::currentDateTimeUtc().time(), + m_settings.m_navArea, + getFrequency() + ); if (transmitter) { ui->txStation->setText(transmitter->m_station); @@ -339,7 +341,7 @@ void NavtexDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NavtexDemodGUI::on_rfBW_valueChanged(int value) @@ -348,7 +350,7 @@ void NavtexDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1 Hz").arg((int)bw)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void NavtexDemodGUI::on_filterStation_currentIndexChanged(int index) @@ -357,7 +359,7 @@ void NavtexDemodGUI::on_filterStation_currentIndexChanged(int index) m_settings.m_filterStation = ui->filterStation->currentText(); filter(); - applySettings(); + applySettings(QStringList("filterStation")); } void NavtexDemodGUI::on_filterType_currentIndexChanged(int index) @@ -366,7 +368,7 @@ void NavtexDemodGUI::on_filterType_currentIndexChanged(int index) m_settings.m_filterType = ui->filterType->currentText(); filter(); - applySettings(); + applySettings(QStringList("filterType")); } void NavtexDemodGUI::on_clearTable_clicked() @@ -378,19 +380,19 @@ void NavtexDemodGUI::on_clearTable_clicked() void NavtexDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void NavtexDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void NavtexDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void NavtexDemodGUI::filterRow(int row) @@ -424,19 +426,19 @@ void NavtexDemodGUI::on_navArea_currentIndexChanged(int index) { m_settings.m_navArea = index + 1; updateTxStation(); - applySettings(); + applySettings(QStringList("navArea")); } void NavtexDemodGUI::on_channel1_currentIndexChanged(int index) { m_settings.m_scopeCh1 = index; - applySettings(); + applySettings(QStringList("scopeCh1")); } void NavtexDemodGUI::on_channel2_currentIndexChanged(int index) { m_settings.m_scopeCh2 = index; - applySettings(); + applySettings(QStringList("scopeCh2")); } void NavtexDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -445,7 +447,7 @@ void NavtexDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void NavtexDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -490,7 +492,16 @@ void NavtexDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "title", + "rgbColor", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -605,7 +616,7 @@ NavtexDemodGUI::NavtexDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -652,11 +663,11 @@ void NavtexDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void NavtexDemodGUI::applySettings(bool force) +void NavtexDemodGUI::applySettings(const QStringList& settingsKeys, const bool force) { if (m_doApplySettings) { - NavtexDemod::MsgConfigureNavtexDemod* message = NavtexDemod::MsgConfigureNavtexDemod::create( m_settings, force); + NavtexDemod::MsgConfigureNavtexDemod* message = NavtexDemod::MsgConfigureNavtexDemod::create(settingsKeys, m_settings, force); m_navtexDemod->getInputMessageQueue()->push(message); } } @@ -754,7 +765,7 @@ void NavtexDemodGUI::tick() void NavtexDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList("logEnabled")); } void NavtexDemodGUI::on_logFilename_clicked() @@ -770,7 +781,7 @@ void NavtexDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList("logFilename")); } } } @@ -874,4 +885,3 @@ void NavtexDemodGUI::updateAbsoluteCenterFrequency() setStatusFrequency(m_deviceCenterFrequency + m_settings.m_inputFrequencyOffset); updateTxStation(); } - diff --git a/plugins/channelrx/demodnavtex/navtexdemodgui.h b/plugins/channelrx/demodnavtex/navtexdemodgui.h index 4c993d6fb..f52cb060a 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodgui.h +++ b/plugins/channelrx/demodnavtex/navtexdemodgui.h @@ -101,7 +101,7 @@ private: virtual ~NavtexDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void messageReceived(const NavtexMessage& message, int errors, float rssi); bool handleMessage(const Message& message); @@ -146,4 +146,3 @@ private slots: }; #endif // INCLUDE_NAVTEXDEMODGUI_H - diff --git a/plugins/channelrx/demodnavtex/navtexdemodsettings.cpp b/plugins/channelrx/demodnavtex/navtexdemodsettings.cpp index e78ae8bf6..94fd55df5 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodsettings.cpp +++ b/plugins/channelrx/demodnavtex/navtexdemodsettings.cpp @@ -208,3 +208,159 @@ bool NavtexDemodSettings::deserialize(const QByteArray& data) } } +void NavtexDemodSettings::applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("navArea")) { + m_navArea = settings.m_navArea; + } + if (settingsKeys.contains("filterStation")) { + m_filterStation = settings.m_filterStation; + } + if (settingsKeys.contains("filterType")) { + m_filterType = settings.m_filterType; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("scopeCh1")) { + m_scopeCh1 = settings.m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2")) { + m_scopeCh2 = settings.m_scopeCh2; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("columnIndexes")) { + for (int i = 0; i < NAVTEXDEMOD_COLUMNS; i++) { + m_columnIndexes[i] = settings.m_columnIndexes[i]; + } + } + if (settingsKeys.contains("columnSizes")) { + for (int i = 0; i < NAVTEXDEMOD_COLUMNS; i++) { + m_columnSizes[i] = settings.m_columnSizes[i]; + } + } +} + +QString NavtexDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("navArea") || force) { + ostr << " m_navArea: " << m_navArea; + } + if (settingsKeys.contains("filterStation") || force) { + ostr << " m_filterStation: " << m_filterStation.toStdString(); + } + if (settingsKeys.contains("filterType") || force) { + ostr << " m_filterType: " << m_filterType.toStdString(); + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("scopeCh1") || force) { + ostr << " m_scopeCh1: " << m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2") || force) { + ostr << " m_scopeCh2: " << m_scopeCh2; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodnavtex/navtexdemodsettings.h b/plugins/channelrx/demodnavtex/navtexdemodsettings.h index e7e324fc0..dbdc7bd14 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodsettings.h +++ b/plugins/channelrx/demodnavtex/navtexdemodsettings.h @@ -77,7 +77,8 @@ struct NavtexDemodSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_NAVTEXDEMODSETTINGS_H */ - diff --git a/plugins/channelrx/demodnavtex/navtexdemodsink.cpp b/plugins/channelrx/demodnavtex/navtexdemodsink.cpp index 81a8be5d8..213057c4c 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodsink.cpp +++ b/plugins/channelrx/demodnavtex/navtexdemodsink.cpp @@ -41,7 +41,7 @@ NavtexDemodSink::NavtexDemodSink() : m_sampleBuffer.resize(m_sampleBufferSize); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); m_lowpassComplex1.create(301, NavtexDemodSettings::NAVTEXDEMOD_CHANNEL_SAMPLE_RATE, NavtexDemodSettings::NAVTEXDEMOD_BAUD_RATE * 1.1); @@ -457,13 +457,11 @@ void NavtexDemodSink::init() m_messageBuffer = ""; } -void NavtexDemodSink::applySettings(const NavtexDemodSettings& settings, bool force) +void NavtexDemodSink::applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force) { - qDebug() << "NavtexDemodSink::applySettings:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " force: " << force; + qDebug() << "NavtexDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) NavtexDemodSettings::NAVTEXDEMOD_CHANNEL_SAMPLE_RATE; @@ -485,8 +483,10 @@ void NavtexDemodSink::applySettings(const NavtexDemodSettings& settings, bool fo // while something is being transmitted m_movMax1.setSize(m_samplesPerBit * 8); m_movMax2.setSize(m_samplesPerBit * 8); + m_settings = settings; + } + else + { + m_settings.applySettings(settingsKeys, settings); } - - m_settings = settings; } - diff --git a/plugins/channelrx/demodnavtex/navtexdemodsink.h b/plugins/channelrx/demodnavtex/navtexdemodsink.h index 0a9ffdd2c..67df78328 100644 --- a/plugins/channelrx/demodnavtex/navtexdemodsink.h +++ b/plugins/channelrx/demodnavtex/navtexdemodsink.h @@ -46,7 +46,7 @@ public: void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const NavtexDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NavtexDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } @@ -142,4 +142,3 @@ private: }; #endif // INCLUDE_NAVTEXDEMODSINK_H - diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index ce6c2267e..44e92792c 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -60,7 +60,7 @@ NFMDemod::NFMDemod(DeviceAPI *devieAPI) : { qDebug("NFMDemod::NFMDemod"); setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -155,7 +155,7 @@ void NFMDemod::start() m_thread->start(); - NFMDemodBaseband::MsgConfigureNFMDemodBaseband *msg = NFMDemodBaseband::MsgConfigureNFMDemodBaseband::create(m_settings, true); + NFMDemodBaseband::MsgConfigureNFMDemodBaseband *msg = NFMDemodBaseband::MsgConfigureNFMDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -180,7 +180,7 @@ bool NFMDemod::handleMessage(const Message& cmd) MsgConfigureNFMDemod& cfg = (MsgConfigureNFMDemod&) cmd; qDebug() << "NFMDemod::handleMessage: MsgConfigureNFMDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -218,91 +218,20 @@ void NFMDemod::setCenterFrequency(qint64 frequency) { NFMDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNFMDemod *msgToGUI = MsgConfigureNFMDemod::create(settings, false); + MsgConfigureNFMDemod *msgToGUI = MsgConfigureNFMDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) +void NFMDemod::applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force) { - qDebug() << "NFMDemod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volume: " << settings.m_volume - << " m_squelchGate: " << settings.m_squelchGate - << " m_deltaSquelch: " << settings.m_deltaSquelch - << " m_squelch: " << settings.m_squelch - << " m_ctcssIndex: " << settings.m_ctcssIndex - << " m_ctcssOn: " << settings.m_ctcssOn - << " m_dcsOn: " << settings.m_dcsOn - << " m_dcsCode: " << Qt::oct << settings.m_dcsCode << Qt::dec - << " m_dcsPositive: " << settings.m_dcsPositive - << " m_highPass: " << settings.m_highPass - << " m_audioMute: " << settings.m_audioMute - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "NFMDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_volume != m_settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((settings.m_ctcssOn != m_settings.m_ctcssOn) || force) { - reverseAPIKeys.append("ctcssOn"); - } - if ((settings.m_audioMute != m_settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { - reverseAPIKeys.append("afBandwidth"); - } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) { - reverseAPIKeys.append("squelchGate"); - } - if ((settings.m_squelch != m_settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((settings.m_deltaSquelch != m_settings.m_deltaSquelch) || force) { - reverseAPIKeys.append("deltaSquelch"); - } - if ((settings.m_ctcssIndex != m_settings.m_ctcssIndex) || force) { - reverseAPIKeys.append("ctcssIndex"); - } - if ((settings.m_highPass != m_settings.m_highPass) || force) { - reverseAPIKeys.append("highPass"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -313,34 +242,36 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - NFMDemodBaseband::MsgConfigureNFMDemodBaseband *msg = NFMDemodBaseband::MsgConfigureNFMDemodBaseband::create(settings, force); + NFMDemodBaseband::MsgConfigureNFMDemodBaseband *msg = NFMDemodBaseband::MsgConfigureNFMDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray NFMDemod::serialize() const @@ -358,7 +289,7 @@ bool NFMDemod::deserialize(const QByteArray& data) success = false; } - MsgConfigureNFMDemod *msg = MsgConfigureNFMDemod::create(m_settings, true); + MsgConfigureNFMDemod *msg = MsgConfigureNFMDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return success; @@ -413,12 +344,12 @@ int NFMDemod::webapiSettingsPutPatch( NFMDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureNFMDemod *msg = MsgConfigureNFMDemod::create(settings, force); + MsgConfigureNFMDemod *msg = MsgConfigureNFMDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNFMDemod *msgToGUI = MsgConfigureNFMDemod::create(settings, force); + MsgConfigureNFMDemod *msgToGUI = MsgConfigureNFMDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -611,7 +542,7 @@ void NFMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response } } -void NFMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const NFMDemodSettings& settings, bool force) +void NFMDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const NFMDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -638,7 +569,7 @@ void NFMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co void NFMDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const NFMDemodSettings& settings, bool force) { @@ -662,7 +593,7 @@ void NFMDemod::sendChannelSettings( } void NFMDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const NFMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodnfm/nfmdemod.h b/plugins/channelrx/demodnfm/nfmdemod.h index afa003127..31059baf4 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.h +++ b/plugins/channelrx/demodnfm/nfmdemod.h @@ -46,22 +46,25 @@ public: public: const NFMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNFMDemod* create(const NFMDemodSettings& settings, bool force) + static MsgConfigureNFMDemod* create(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force) { - return new MsgConfigureNFMDemod(settings, force); + return new MsgConfigureNFMDemod(settingsKeys, settings, force); } private: NFMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNFMDemod(const NFMDemodSettings& settings, bool force) : + MsgConfigureNFMDemod(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) - { } + {} }; NFMDemod(DeviceAPI *deviceAPI); @@ -156,18 +159,18 @@ private: static const int m_udpBlockSize; virtual bool handleMessage(const Message& cmd); - void applySettings(const NFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const NFMDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const NFMDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const NFMDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const NFMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp b/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp index 9de80bac1..11edfbb78 100644 --- a/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp @@ -121,7 +121,7 @@ bool NFMDemodBaseband::handleMessage(const Message& cmd) MsgConfigureNFMDemodBaseband& cfg = (MsgConfigureNFMDemodBaseband&) cmd; qDebug() << "NFMDemodBaseband::handleMessage: MsgConfigureNFMDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -148,9 +148,9 @@ bool NFMDemodBaseband::handleMessage(const Message& cmd) } } -void NFMDemodBaseband::applySettings(const NFMDemodSettings& settings, bool force) +void NFMDemodBaseband::applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings, const bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer.setChannelization(m_sink.getAudioSampleRate(), settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset()); @@ -162,7 +162,7 @@ void NFMDemodBaseband::applySettings(const NFMDemodSettings& settings, bool forc } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -179,9 +179,13 @@ void NFMDemodBaseband::applySettings(const NFMDemodSettings& settings, bool forc } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int NFMDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodnfm/nfmdemodbaseband.h b/plugins/channelrx/demodnfm/nfmdemodbaseband.h index 9e5505ee8..f4d1a81e8 100644 --- a/plugins/channelrx/demodnfm/nfmdemodbaseband.h +++ b/plugins/channelrx/demodnfm/nfmdemodbaseband.h @@ -40,20 +40,23 @@ public: public: const NFMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNFMDemodBaseband* create(const NFMDemodSettings& settings, bool force) + static MsgConfigureNFMDemodBaseband* create(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force) { - return new MsgConfigureNFMDemodBaseband(settings, force); + return new MsgConfigureNFMDemodBaseband(settingsKeys, settings, force); } private: NFMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNFMDemodBaseband(const NFMDemodSettings& settings, bool force) : + MsgConfigureNFMDemodBaseband(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -83,7 +86,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const NFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.cpp b/plugins/channelrx/demodnfm/nfmdemodgui.cpp index 2d832894a..cf315619c 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodgui.cpp @@ -55,7 +55,7 @@ void NFMDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(); + applySettings(QStringList(), true); } QByteArray NFMDemodGUI::serialize() const @@ -67,7 +67,7 @@ bool NFMDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -132,7 +132,7 @@ void NFMDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NFMDemodGUI::channelMarkerHighlightedByCursor() @@ -145,7 +145,7 @@ void NFMDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NFMDemodGUI::on_channelSpacingApply_clicked() @@ -168,7 +168,7 @@ void NFMDemodGUI::on_channelSpacingApply_clicked() ui->rfBW->blockSignals(false); ui->afBW->blockSignals(false); ui->fmDev->blockSignals(false); - applySettings(); + applySettings(QStringList({"rfBandwidth", "afBandwidth", "fmDeviation"})); } void NFMDemodGUI::on_rfBW_valueChanged(int value) @@ -182,35 +182,35 @@ void NFMDemodGUI::on_rfBW_valueChanged(int value) ui->channelSpacing->update(); ui->channelSpacing->blockSignals(false); - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void NFMDemodGUI::on_afBW_valueChanged(int value) { ui->afBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_afBandwidth = value * 100.0; - applySettings(); + applySettings(QStringList({"afBandwidth"})); } void NFMDemodGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1%2k").arg(QChar(0xB1, 0x00)).arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 200.0; - applySettings(); + applySettings(QStringList({"fmDeviation"})); } void NFMDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value)); m_settings.m_volume = value / 100.0; - applySettings(); + applySettings(QStringList({"volume"})); } void NFMDemodGUI::on_squelchGate_valueChanged(int value) { ui->squelchGateText->setText(QString("%1").arg(value * 10.0f, 0, 'f', 0)); m_settings.m_squelchGate = value; - applySettings(); + applySettings(QStringList({"squelchGate"})); } void NFMDemodGUI::on_deltaSquelch_toggled(bool checked) @@ -228,7 +228,7 @@ void NFMDemodGUI::on_deltaSquelch_toggled(bool checked) ui->squelch->setToolTip(tr("Squelch power threshold (dB)")); } m_settings.m_deltaSquelch = checked; - applySettings(); + applySettings(QStringList({"deltaSquelch"})); } void NFMDemodGUI::on_squelch_valueChanged(int value) @@ -246,19 +246,19 @@ void NFMDemodGUI::on_squelch_valueChanged(int value) ui->squelch->setToolTip(tr("Squelch power threshold (dB)")); } m_settings.m_squelch = value * 1.0; - applySettings(); + applySettings(QStringList({"squelch"})); } void NFMDemodGUI::on_ctcssOn_toggled(bool checked) { m_settings.m_ctcssOn = checked; - applySettings(); + applySettings(QStringList({"ctcssOn"})); } void NFMDemodGUI::on_dcsOn_toggled(bool checked) { m_settings.m_dcsOn = checked; - applySettings(); + applySettings(QStringList({"dcsOn"})); } void NFMDemodGUI::on_dcsCode_currentIndexChanged(int index) @@ -266,7 +266,7 @@ void NFMDemodGUI::on_dcsCode_currentIndexChanged(int index) if (index == 0) { m_settings.m_dcsCode = 0; - applySettings(); + applySettings(QStringList({"dcsCode"})); } else { @@ -280,7 +280,7 @@ void NFMDemodGUI::on_dcsCode_currentIndexChanged(int index) { m_settings.m_dcsCode = dcsCode; m_settings.m_dcsPositive = positive; - applySettings(); + applySettings(QStringList({"dcsCode", "dcsPositive"})); } } } @@ -288,19 +288,19 @@ void NFMDemodGUI::on_dcsCode_currentIndexChanged(int index) void NFMDemodGUI::on_highPassFilter_toggled(bool checked) { m_settings.m_highPass = checked; - applySettings(); + applySettings(QStringList({"highPass"})); } void NFMDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList({"audioMute"})); } void NFMDemodGUI::on_ctcss_currentIndexChanged(int index) { m_settings.m_ctcssIndex = index; - applySettings(); + applySettings(QStringList({"ctcssIndex"})); } void NFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -313,7 +313,7 @@ void NFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) */ getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void NFMDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -358,7 +358,16 @@ void NFMDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "title", + "rgbColor", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -462,7 +471,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -472,13 +481,13 @@ NFMDemodGUI::~NFMDemodGUI() delete ui; } -void NFMDemodGUI::applySettings(bool force) +void NFMDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { qDebug() << "NFMDemodGUI::applySettings"; - NFMDemod::MsgConfigureNFMDemod* message = NFMDemod::MsgConfigureNFMDemod::create( m_settings, force); + NFMDemod::MsgConfigureNFMDemod* message = NFMDemod::MsgConfigureNFMDemod::create(settingsKeys, m_settings, force); m_nfmDemod->getInputMessageQueue()->push(message); } } @@ -612,7 +621,7 @@ void NFMDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList({"audioDeviceName"})); } } diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.h b/plugins/channelrx/demodnfm/nfmdemodgui.h index 6a592e79b..f1c6a5bcc 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.h +++ b/plugins/channelrx/demodnfm/nfmdemodgui.h @@ -88,7 +88,7 @@ private: virtual ~NFMDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void setCtcssFreq(Real ctcssFreq); void setDcsCode(unsigned int dcsCode); diff --git a/plugins/channelrx/demodnfm/nfmdemodsettings.cpp b/plugins/channelrx/demodnfm/nfmdemodsettings.cpp index 7c4487253..c3aedcbd7 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsettings.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodsettings.cpp @@ -204,6 +204,177 @@ bool NFMDemodSettings::deserialize(const QByteArray& data) } } +void NFMDemodSettings::applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth")) { + m_afBandwidth = settings.m_afBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("squelchGate")) { + m_squelchGate = settings.m_squelchGate; + } + if (settingsKeys.contains("deltaSquelch")) { + m_deltaSquelch = settings.m_deltaSquelch; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("ctcssOn")) { + m_ctcssOn = settings.m_ctcssOn; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("ctcssIndex")) { + m_ctcssIndex = settings.m_ctcssIndex; + } + if (settingsKeys.contains("dcsOn")) { + m_dcsOn = settings.m_dcsOn; + } + if (settingsKeys.contains("dcsCode")) { + m_dcsCode = settings.m_dcsCode; + } + if (settingsKeys.contains("dcsPositive")) { + m_dcsPositive = settings.m_dcsPositive; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("highPass")) { + m_highPass = settings.m_highPass; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString NFMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth") || force) { + ostr << " m_afBandwidth: " << m_afBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("squelchGate") || force) { + ostr << " m_squelchGate: " << m_squelchGate; + } + if (settingsKeys.contains("deltaSquelch") || force) { + ostr << " m_deltaSquelch: " << m_deltaSquelch; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("ctcssOn") || force) { + ostr << " m_ctcssOn: " << m_ctcssOn; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("ctcssIndex") || force) { + ostr << " m_ctcssIndex: " << m_ctcssIndex; + } + if (settingsKeys.contains("dcsOn") || force) { + ostr << " m_dcsOn: " << m_dcsOn; + } + if (settingsKeys.contains("dcsCode") || force) { + ostr << " m_dcsCode: " << m_dcsCode; + } + if (settingsKeys.contains("dcsPositive") || force) { + ostr << " m_dcsPositive: " << m_dcsPositive; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("highPass") || force) { + ostr << " m_highPass: " << m_highPass; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + int NFMDemodSettings::getChannelSpacing(int index) { if (index < 0) { diff --git a/plugins/channelrx/demodnfm/nfmdemodsettings.h b/plugins/channelrx/demodnfm/nfmdemodsettings.h index be65ec9a6..bd48d114d 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsettings.h +++ b/plugins/channelrx/demodnfm/nfmdemodsettings.h @@ -72,6 +72,8 @@ struct NFMDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static int getChannelSpacing(int index); static int getChannelSpacingIndex(int channelSpacing); diff --git a/plugins/channelrx/demodnfm/nfmdemodsink.cpp b/plugins/channelrx/demodnfm/nfmdemodsink.cpp index 71ec39b11..a48bb48b4 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsink.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodsink.cpp @@ -66,7 +66,7 @@ NFMDemodSink::NFMDemodSink() : m_dcsDetector.setSampleRate(CTCSS_DETECTOR_RATE); m_dcsDetector.setEqWindow(23); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -302,55 +302,38 @@ void NFMDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque m_channelFrequencyOffset = channelFrequencyOffset; } -void NFMDemodSink::applySettings(const NFMDemodSettings& settings, bool force) +void NFMDemodSink::applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force) { - qDebug() << "NFMDemodSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volume: " << settings.m_volume - << " m_squelchGate: " << settings.m_squelchGate - << " m_deltaSquelch: " << settings.m_deltaSquelch - << " m_squelch: " << settings.m_squelch - << " m_ctcssIndex: " << settings.m_ctcssIndex - << " m_ctcssOn: " << settings.m_ctcssOn - << " m_dcsOn: " << settings.m_dcsOn - << " m_dcsCode: " << settings.m_dcsCode - << " m_dcsPositive: " << settings.m_dcsPositive - << " m_highPass: " << settings.m_highPass - << " m_audioMute: " << settings.m_audioMute - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " force: " << force; + qDebug() << "NFMDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = Real(m_channelSampleRate) / Real(m_audioSampleRate); m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { + if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force) { Real lowCut = -Real(settings.m_fmDeviation) / m_channelSampleRate; Real hiCut = Real(settings.m_fmDeviation) / m_channelSampleRate; m_rfFilter.create_filter(lowCut, hiCut); m_phaseDiscri.setFMScaling(Real(m_audioSampleRate) / (2.0f * settings.m_fmDeviation)); } - if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) + if ((settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force) { m_bandpass.create(m_filterTaps, m_audioSampleRate, 300.0, settings.m_afBandwidth); m_lowpass.create(m_filterTaps, m_audioSampleRate, settings.m_afBandwidth); } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) + if ((settingsKeys.contains("squelchGate") && (settings.m_squelchGate != m_settings.m_squelchGate)) || force) { m_squelchGate = (m_audioSampleRate / 100) * settings.m_squelchGate; // gate is given in 10s of ms at 48000 Hz audio sample rate m_squelchCount = 0; // reset squelch open counter } - if ((settings.m_squelch != m_settings.m_squelch) || - (settings.m_deltaSquelch != m_settings.m_deltaSquelch) || force) + if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || + (settingsKeys.contains("deltaSquelch") && (settings.m_deltaSquelch != m_settings.m_deltaSquelch)) || force) { if (settings.m_deltaSquelch) { // input is a value in negative centis @@ -367,17 +350,21 @@ void NFMDemodSink::applySettings(const NFMDemodSettings& settings, bool force) m_squelchCount = 0; // reset squelch open counter } - if ((settings.m_ctcssIndex != m_settings.m_ctcssIndex) || force) { + if ((settingsKeys.contains("ctcssIndex") && (settings.m_ctcssIndex != m_settings.m_ctcssIndex)) || force) { setSelectedCtcssIndex(settings.m_ctcssIndex); } - if ((settings.m_dcsCode != m_settings.m_dcsCode) || - (settings.m_dcsPositive != m_settings.m_dcsPositive) || force) + if ((settingsKeys.contains("dcsCode") && (settings.m_dcsCode != m_settings.m_dcsCode)) || + (settingsKeys.contains("dcsPositive") && (settings.m_dcsPositive != m_settings.m_dcsPositive)) || force) { setSelectedDcsCode(settings.m_dcsCode, settings.m_dcsPositive); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void NFMDemodSink::applyAudioSampleRate(unsigned int sampleRate) diff --git a/plugins/channelrx/demodnfm/nfmdemodsink.h b/plugins/channelrx/demodnfm/nfmdemodsink.h index 5a1ae19ee..07ebde5ed 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsink.h +++ b/plugins/channelrx/demodnfm/nfmdemodsink.h @@ -66,7 +66,7 @@ public: } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const NFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NFMDemodSettings& settings, bool force = false); void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; } AudioFifo *getAudioFifo() { return &m_audioFifo; } diff --git a/plugins/channelrx/demodpacket/packetdemod.cpp b/plugins/channelrx/demodpacket/packetdemod.cpp index 43d7026b0..446dbe98d 100644 --- a/plugins/channelrx/demodpacket/packetdemod.cpp +++ b/plugins/channelrx/demodpacket/packetdemod.cpp @@ -57,7 +57,7 @@ PacketDemod::PacketDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -131,7 +131,7 @@ void PacketDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - PacketDemodBaseband::MsgConfigurePacketDemodBaseband *msg = PacketDemodBaseband::MsgConfigurePacketDemodBaseband::create(m_settings, true); + PacketDemodBaseband::MsgConfigurePacketDemodBaseband *msg = PacketDemodBaseband::MsgConfigurePacketDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -149,7 +149,7 @@ bool PacketDemod::handleMessage(const Message& cmd) { MsgConfigurePacketDemod& cfg = (MsgConfigurePacketDemod&) cmd; qDebug() << "PacketDemod::handleMessage: MsgConfigurePacketDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -243,61 +243,20 @@ void PacketDemod::setCenterFrequency(qint64 frequency) { PacketDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePacketDemod *msgToGUI = MsgConfigurePacketDemod::create(settings, false); + MsgConfigurePacketDemod *msgToGUI = MsgConfigurePacketDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void PacketDemod::applySettings(const PacketDemodSettings& settings, bool force) +void PacketDemod::applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force) { - qDebug() << "PacketDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "PacketDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_mode != m_settings.m_mode) || force) { - reverseAPIKeys.append("mode"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_logFilename != m_settings.m_logFilename) || force) { - reverseAPIKeys.append("logFilename"); - } - if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) { - reverseAPIKeys.append("logEnabled"); - } - if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) { - reverseAPIKeys.append("useFileTime"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -308,25 +267,23 @@ void PacketDemod::applySettings(const PacketDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - PacketDemodBaseband::MsgConfigurePacketDemodBaseband *msg = PacketDemodBaseband::MsgConfigurePacketDemodBaseband::create(settings, force); + PacketDemodBaseband::MsgConfigurePacketDemodBaseband *msg = PacketDemodBaseband::MsgConfigurePacketDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - if ((settings.m_logEnabled != m_settings.m_logEnabled) - || (settings.m_logFilename != m_settings.m_logFilename) + if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled)) + || (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename)) || force) { if (m_logFile.isOpen()) @@ -355,7 +312,11 @@ void PacketDemod::applySettings(const PacketDemodSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void PacketDemod::sendSampleRateToDemodAnalyzer() @@ -386,14 +347,14 @@ bool PacketDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigurePacketDemod *msg = MsgConfigurePacketDemod::create(m_settings, true); + MsgConfigurePacketDemod *msg = MsgConfigurePacketDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigurePacketDemod *msg = MsgConfigurePacketDemod::create(m_settings, true); + MsgConfigurePacketDemod *msg = MsgConfigurePacketDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -429,13 +390,13 @@ int PacketDemod::webapiSettingsPutPatch( PacketDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigurePacketDemod *msg = MsgConfigurePacketDemod::create(settings, force); + MsgConfigurePacketDemod *msg = MsgConfigurePacketDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("PacketDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePacketDemod *msgToGUI = MsgConfigurePacketDemod::create(settings, force); + MsgConfigurePacketDemod *msgToGUI = MsgConfigurePacketDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -594,7 +555,7 @@ void PacketDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respo response.getPacketDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void PacketDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const PacketDemodSettings& settings, bool force) +void PacketDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const PacketDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -620,7 +581,7 @@ void PacketDemod::webapiReverseSendSettings(QList& channelSettingsKeys, } void PacketDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PacketDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodpacket/packetdemod.h b/plugins/channelrx/demodpacket/packetdemod.h index 29763cb08..043d78da4 100644 --- a/plugins/channelrx/demodpacket/packetdemod.h +++ b/plugins/channelrx/demodpacket/packetdemod.h @@ -50,20 +50,23 @@ public: public: const PacketDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePacketDemod* create(const PacketDemodSettings& settings, bool force) + static MsgConfigurePacketDemod* create(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force) { - return new MsgConfigurePacketDemod(settings, force); + return new MsgConfigurePacketDemod(settingsKeys, settings, force); } private: PacketDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePacketDemod(const PacketDemodSettings& settings, bool force) : + MsgConfigurePacketDemod(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -155,11 +158,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const PacketDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const PacketDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const PacketDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PacketDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodpacket/packetdemodbaseband.cpp b/plugins/channelrx/demodpacket/packetdemodbaseband.cpp index e943a78f8..874dcee12 100644 --- a/plugins/channelrx/demodpacket/packetdemodbaseband.cpp +++ b/plugins/channelrx/demodpacket/packetdemodbaseband.cpp @@ -134,7 +134,7 @@ bool PacketDemodBaseband::handleMessage(const Message& cmd) MsgConfigurePacketDemodBaseband& cfg = (MsgConfigurePacketDemodBaseband&) cmd; qDebug() << "PacketDemodBaseband::handleMessage: MsgConfigurePacketDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -154,17 +154,21 @@ bool PacketDemodBaseband::handleMessage(const Message& cmd) } } -void PacketDemodBaseband::applySettings(const PacketDemodSettings& settings, bool force) +void PacketDemodBaseband::applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int PacketDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodpacket/packetdemodbaseband.h b/plugins/channelrx/demodpacket/packetdemodbaseband.h index 28d26f17f..c67be9169 100644 --- a/plugins/channelrx/demodpacket/packetdemodbaseband.h +++ b/plugins/channelrx/demodpacket/packetdemodbaseband.h @@ -42,20 +42,23 @@ public: public: const PacketDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePacketDemodBaseband* create(const PacketDemodSettings& settings, bool force) + static MsgConfigurePacketDemodBaseband* create(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force) { - return new MsgConfigurePacketDemodBaseband(settings, force); + return new MsgConfigurePacketDemodBaseband(settingsKeys, settings, force); } private: PacketDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePacketDemodBaseband(const PacketDemodSettings& settings, bool force) : + MsgConfigurePacketDemodBaseband(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(PacketDemodSink *sink); - void applySettings(const PacketDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodpacket/packetdemodgui.cpp b/plugins/channelrx/demodpacket/packetdemodgui.cpp index 7d6608c5a..5764828ba 100644 --- a/plugins/channelrx/demodpacket/packetdemodgui.cpp +++ b/plugins/channelrx/demodpacket/packetdemodgui.cpp @@ -120,7 +120,7 @@ void PacketDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray PacketDemodGUI::serialize() const @@ -132,7 +132,7 @@ bool PacketDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -242,7 +242,7 @@ void PacketDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void PacketDemodGUI::channelMarkerHighlightedByCursor() @@ -255,7 +255,7 @@ void PacketDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void PacketDemodGUI::on_mode_currentIndexChanged(int value) @@ -271,35 +271,35 @@ void PacketDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void PacketDemodGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 100.0; - applySettings(); + applySettings(QStringList({"fmDeviation"})); } void PacketDemodGUI::on_filterFrom_editingFinished() { m_settings.m_filterFrom = ui->filterFrom->text(); filter(); - applySettings(); + applySettings(QStringList({"filterFrom"})); } void PacketDemodGUI::on_filterTo_editingFinished() { m_settings.m_filterTo = ui->filterTo->text(); filter(); - applySettings(); + applySettings(QStringList({"filterTo"})); } void PacketDemodGUI::on_filterPID_stateChanged(int state) { m_settings.m_filterPID = state==Qt::Checked ? "f0" : ""; filter(); - applySettings(); + applySettings(QStringList({"filterPID"})); } void PacketDemodGUI::on_clearTable_clicked() @@ -310,19 +310,19 @@ void PacketDemodGUI::on_clearTable_clicked() void PacketDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList({"udpEnabled"})); } void PacketDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList({"udpAddress"})); } void PacketDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList({"udpPort"})); } void PacketDemodGUI::filterRow(int row) @@ -367,7 +367,7 @@ void PacketDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void PacketDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -412,7 +412,16 @@ void PacketDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -486,7 +495,7 @@ PacketDemodGUI::PacketDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -500,11 +509,11 @@ void PacketDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void PacketDemodGUI::applySettings(bool force) +void PacketDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - PacketDemod::MsgConfigurePacketDemod* message = PacketDemod::MsgConfigurePacketDemod::create( m_settings, force); + PacketDemod::MsgConfigurePacketDemod* message = PacketDemod::MsgConfigurePacketDemod::create(settingsKeys, m_settings, force); m_packetDemod->getInputMessageQueue()->push(message); } } @@ -601,7 +610,7 @@ void PacketDemodGUI::tick() void PacketDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList({"logEnabled"})); } void PacketDemodGUI::on_logFilename_clicked() @@ -617,7 +626,7 @@ void PacketDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList({"logFilename"})); } } } @@ -689,7 +698,7 @@ void PacketDemodGUI::on_logOpen_clicked() void PacketDemodGUI::on_useFileTime_toggled(bool checked) { m_settings.m_useFileTime = checked; - applySettings(); + applySettings(QStringList({"useFileTime"})); } void PacketDemodGUI::makeUIConnections() diff --git a/plugins/channelrx/demodpacket/packetdemodgui.h b/plugins/channelrx/demodpacket/packetdemodgui.h index 58c74b3e6..df58eab41 100644 --- a/plugins/channelrx/demodpacket/packetdemodgui.h +++ b/plugins/channelrx/demodpacket/packetdemodgui.h @@ -94,7 +94,7 @@ private: virtual ~PacketDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void packetReceived(const QByteArray& packet, QDateTime dateTime); bool handleMessage(const Message& message); diff --git a/plugins/channelrx/demodpacket/packetdemodsettings.cpp b/plugins/channelrx/demodpacket/packetdemodsettings.cpp index 1705a7541..9a5476b9e 100644 --- a/plugins/channelrx/demodpacket/packetdemodsettings.cpp +++ b/plugins/channelrx/demodpacket/packetdemodsettings.cpp @@ -206,8 +206,170 @@ bool PacketDemodSettings::deserialize(const QByteArray& data) } } +void PacketDemodSettings::applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("mode")) { + m_mode = settings.m_mode; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("filterFrom")) { + m_filterFrom = settings.m_filterFrom; + } + if (settingsKeys.contains("filterTo")) { + m_filterTo = settings.m_filterTo; + } + if (settingsKeys.contains("filterPID")) { + m_filterPID = settings.m_filterPID; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("useFileTime")) { + m_useFileTime = settings.m_useFileTime; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("columnIndexes")) { + for (int i = 0; i < PACKETDEMOD_COLUMNS; i++) { + m_columnIndexes[i] = settings.m_columnIndexes[i]; + } + } + if (settingsKeys.contains("columnSizes")) { + for (int i = 0; i < PACKETDEMOD_COLUMNS; i++) { + m_columnSizes[i] = settings.m_columnSizes[i]; + } + } +} + +QString PacketDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("mode") || force) { + ostr << " m_mode: " << m_mode; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("filterFrom") || force) { + ostr << " m_filterFrom: " << m_filterFrom.toStdString(); + } + if (settingsKeys.contains("filterTo") || force) { + ostr << " m_filterTo: " << m_filterTo.toStdString(); + } + if (settingsKeys.contains("filterPID") || force) { + ostr << " m_filterPID: " << m_filterPID.toStdString(); + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("useFileTime") || force) { + ostr << " m_useFileTime: " << m_useFileTime; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + int PacketDemodSettings::getBaudRate() const { return 1200; } - diff --git a/plugins/channelrx/demodpacket/packetdemodsettings.h b/plugins/channelrx/demodpacket/packetdemodsettings.h index a5eef7f7a..95718c168 100644 --- a/plugins/channelrx/demodpacket/packetdemodsettings.h +++ b/plugins/channelrx/demodpacket/packetdemodsettings.h @@ -77,6 +77,8 @@ struct PacketDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; int getBaudRate() const; }; diff --git a/plugins/channelrx/demodpacket/packetdemodsink.cpp b/plugins/channelrx/demodpacket/packetdemodsink.cpp index 7aab705c9..1c94d9d01 100644 --- a/plugins/channelrx/demodpacket/packetdemodsink.cpp +++ b/plugins/channelrx/demodpacket/packetdemodsink.cpp @@ -47,7 +47,7 @@ PacketDemodSink::PacketDemodSink(PacketDemod *packetDemod) : m_demodBuffer.resize(1<<12); m_demodBufferFill = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -305,18 +305,17 @@ void PacketDemodSink::applyChannelSettings(int channelSampleRate, int channelFre m_channelFrequencyOffset = channelFrequencyOffset; } -void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool force) +void PacketDemodSink::applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force) { - qDebug() << "PacketDemodSink::applySettings:" - << " force: " << force; + qDebug() << "PacketDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) + if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force) { m_phaseDiscri.setFMScaling(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation)); } @@ -352,7 +351,11 @@ void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool fo m_onesCount = 0; m_gotSOP = false; m_byteCount = 0; + m_settings = settings; + } + else + { + m_settings.applySettings(settingsKeys, settings); } - m_settings = settings; } diff --git a/plugins/channelrx/demodpacket/packetdemodsink.h b/plugins/channelrx/demodpacket/packetdemodsink.h index 561f9bd6c..2b691a58e 100644 --- a/plugins/channelrx/demodpacket/packetdemodsink.h +++ b/plugins/channelrx/demodpacket/packetdemodsink.h @@ -48,7 +48,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const PacketDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PacketDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } diff --git a/plugins/channelrx/demodpager/pagerdemod.cpp b/plugins/channelrx/demodpager/pagerdemod.cpp index e37555b86..43496dfbb 100644 --- a/plugins/channelrx/demodpager/pagerdemod.cpp +++ b/plugins/channelrx/demodpager/pagerdemod.cpp @@ -52,7 +52,7 @@ PagerDemod::PagerDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -126,7 +126,7 @@ void PagerDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - PagerDemodBaseband::MsgConfigurePagerDemodBaseband *msg = PagerDemodBaseband::MsgConfigurePagerDemodBaseband::create(m_settings, true); + PagerDemodBaseband::MsgConfigurePagerDemodBaseband *msg = PagerDemodBaseband::MsgConfigurePagerDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -144,7 +144,7 @@ bool PagerDemod::handleMessage(const Message& cmd) { const MsgConfigurePagerDemod& cfg = (const MsgConfigurePagerDemod&) cmd; qDebug() << "PagerDemod::handleMessage: MsgConfigurePagerDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -232,64 +232,20 @@ void PagerDemod::setCenterFrequency(qint64 frequency) { PagerDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePagerDemod *msgToGUI = MsgConfigurePagerDemod::create(settings, false); + MsgConfigurePagerDemod *msgToGUI = MsgConfigurePagerDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void PagerDemod::applySettings(const PagerDemodSettings& settings, bool force) +void PagerDemod::applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force) { - qDebug() << "PagerDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "PagerDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_baud != m_settings.m_baud) || force) { - reverseAPIKeys.append("baud"); - } - if ((settings.m_decode != m_settings.m_decode) || force) { - reverseAPIKeys.append("decode"); - } - if ((settings.m_reverse != m_settings.m_reverse) || force) { - reverseAPIKeys.append("reverse"); - } - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_logFilename != m_settings.m_logFilename) || force) { - reverseAPIKeys.append("logFilename"); - } - if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) { - reverseAPIKeys.append("logEnabled"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -300,25 +256,23 @@ void PagerDemod::applySettings(const PagerDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - PagerDemodBaseband::MsgConfigurePagerDemodBaseband *msg = PagerDemodBaseband::MsgConfigurePagerDemodBaseband::create(settings, force); + PagerDemodBaseband::MsgConfigurePagerDemodBaseband *msg = PagerDemodBaseband::MsgConfigurePagerDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - if ((settings.m_logEnabled != m_settings.m_logEnabled) - || (settings.m_logFilename != m_settings.m_logFilename) + if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled)) + || (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename)) || force) { if (m_logFile.isOpen()) @@ -347,7 +301,11 @@ void PagerDemod::applySettings(const PagerDemodSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray PagerDemod::serialize() const @@ -359,14 +317,14 @@ bool PagerDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigurePagerDemod *msg = MsgConfigurePagerDemod::create(m_settings, true); + MsgConfigurePagerDemod *msg = MsgConfigurePagerDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigurePagerDemod *msg = MsgConfigurePagerDemod::create(m_settings, true); + MsgConfigurePagerDemod *msg = MsgConfigurePagerDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -421,13 +379,13 @@ int PagerDemod::webapiSettingsPutPatch( PagerDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigurePagerDemod *msg = MsgConfigurePagerDemod::create(settings, force); + MsgConfigurePagerDemod *msg = MsgConfigurePagerDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("PagerDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePagerDemod *msgToGUI = MsgConfigurePagerDemod::create(settings, force); + MsgConfigurePagerDemod *msgToGUI = MsgConfigurePagerDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -607,7 +565,7 @@ void PagerDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respon response.getPagerDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void PagerDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const PagerDemodSettings& settings, bool force) +void PagerDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const PagerDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -633,7 +591,7 @@ void PagerDemod::webapiReverseSendSettings(QList& channelSettingsKeys, } void PagerDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PagerDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodpager/pagerdemod.h b/plugins/channelrx/demodpager/pagerdemod.h index c59bddbb3..9e005bf06 100644 --- a/plugins/channelrx/demodpager/pagerdemod.h +++ b/plugins/channelrx/demodpager/pagerdemod.h @@ -52,19 +52,22 @@ public: public: const PagerDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePagerDemod* create(const PagerDemodSettings& settings, bool force) { - return new MsgConfigurePagerDemod(settings, force); + static MsgConfigurePagerDemod* create(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force) { + return new MsgConfigurePagerDemod(settingsKeys, settings, force); } private: PagerDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePagerDemod(const PagerDemodSettings& settings, bool force) : + MsgConfigurePagerDemod(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -211,11 +214,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const PagerDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const PagerDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const PagerDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PagerDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodpager/pagerdemodbaseband.cpp b/plugins/channelrx/demodpager/pagerdemodbaseband.cpp index e6b870d6e..4066a75dd 100644 --- a/plugins/channelrx/demodpager/pagerdemodbaseband.cpp +++ b/plugins/channelrx/demodpager/pagerdemodbaseband.cpp @@ -134,7 +134,7 @@ bool PagerDemodBaseband::handleMessage(const Message& cmd) const MsgConfigurePagerDemodBaseband& cfg = (const MsgConfigurePagerDemodBaseband&) cmd; qDebug() << "PagerDemodBaseband::handleMessage: MsgConfigurePagerDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -154,17 +154,21 @@ bool PagerDemodBaseband::handleMessage(const Message& cmd) } } -void PagerDemodBaseband::applySettings(const PagerDemodSettings& settings, bool force) +void PagerDemodBaseband::applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { m_channelizer->setChannelization(PagerDemodSettings::m_channelSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int PagerDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodpager/pagerdemodbaseband.h b/plugins/channelrx/demodpager/pagerdemodbaseband.h index 3c8a66735..8130874fc 100644 --- a/plugins/channelrx/demodpager/pagerdemodbaseband.h +++ b/plugins/channelrx/demodpager/pagerdemodbaseband.h @@ -44,20 +44,23 @@ public: public: const PagerDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePagerDemodBaseband* create(const PagerDemodSettings& settings, bool force) + static MsgConfigurePagerDemodBaseband* create(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force) { - return new MsgConfigurePagerDemodBaseband(settings, force); + return new MsgConfigurePagerDemodBaseband(settingsKeys, settings, force); } private: PagerDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePagerDemodBaseband(const PagerDemodSettings& settings, bool force) : + MsgConfigurePagerDemodBaseband(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -93,7 +96,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(PagerDemodSink *sink); - void applySettings(const PagerDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodpager/pagerdemodgui.cpp b/plugins/channelrx/demodpager/pagerdemodgui.cpp index c0a27b9d3..6829de94f 100644 --- a/plugins/channelrx/demodpager/pagerdemodgui.cpp +++ b/plugins/channelrx/demodpager/pagerdemodgui.cpp @@ -129,7 +129,7 @@ void PagerDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray PagerDemodGUI::serialize() const @@ -141,7 +141,7 @@ bool PagerDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -341,7 +341,7 @@ void PagerDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void PagerDemodGUI::channelMarkerHighlightedByCursor() @@ -354,7 +354,7 @@ void PagerDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void PagerDemodGUI::on_rfBW_valueChanged(int value) @@ -363,34 +363,34 @@ void PagerDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void PagerDemodGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 100.0; - applySettings(); + applySettings(QStringList("fmDeviation")); } void PagerDemodGUI::on_baud_currentIndexChanged(int index) { (void)index; m_settings.m_baud = ui->baud->currentText().toInt(); - applySettings(); + applySettings(QStringList("baud")); } void PagerDemodGUI::on_decode_currentIndexChanged(int index) { m_settings.m_decode = (PagerDemodSettings::Decode)index; - applySettings(); + applySettings(QStringList("decode")); } void PagerDemodGUI::on_filterAddress_editingFinished() { m_settings.m_filterAddress = ui->filterAddress->text(); filter(); - applySettings(); + applySettings(QStringList("filterAddress")); } void PagerDemodGUI::on_clearTable_clicked() @@ -401,31 +401,31 @@ void PagerDemodGUI::on_clearTable_clicked() void PagerDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void PagerDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void PagerDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void PagerDemodGUI::on_channel1_currentIndexChanged(int index) { m_settings.m_scopeCh1 = index; - applySettings(); + applySettings(QStringList("scopeCh1")); } void PagerDemodGUI::on_channel2_currentIndexChanged(int index) { m_settings.m_scopeCh2 = index; - applySettings(); + applySettings(QStringList("scopeCh2")); } void PagerDemodGUI::filterRow(int row) @@ -455,7 +455,7 @@ void PagerDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void PagerDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -500,7 +500,8 @@ void PagerDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -515,8 +516,10 @@ PagerDemodGUI::PagerDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas m_deviceCenterFrequency(0), m_basebandSampleRate(1), m_doApplySettings(true), - m_tickCount(0), - m_speech(nullptr) + m_tickCount(0) +#ifdef QT_TEXTTOSPEECH_FOUND + , m_speech(nullptr) +#endif { setAttribute(Qt::WA_DeleteOnClose, true); m_helpURL = "plugins/channelrx/demodpager/readme.md"; @@ -591,7 +594,7 @@ PagerDemodGUI::PagerDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -624,11 +627,11 @@ void PagerDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void PagerDemodGUI::applySettings(bool force) +void PagerDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - PagerDemod::MsgConfigurePagerDemod* message = PagerDemod::MsgConfigurePagerDemod::create( m_settings, force); + PagerDemod::MsgConfigurePagerDemod* message = PagerDemod::MsgConfigurePagerDemod::create(settingsKeys, m_settings, force); m_pagerDemod->getInputMessageQueue()->push(message); } } @@ -738,8 +741,9 @@ void PagerDemodGUI::on_charset_clicked() { PagerDemodCharsetDialog dialog(&m_settings); new DialogPositioner(&dialog, true); + if (dialog.exec() == QDialog::Accepted) { - applySettings(); + applySettings(QStringList({"sevenbit", "unicode", "reverse"})); } } @@ -747,17 +751,18 @@ void PagerDemodGUI::on_notifications_clicked() { PagerDemodNotificationDialog dialog(&m_settings); new DialogPositioner(&dialog, true); + if (dialog.exec() == QDialog::Accepted) { enableSpeechIfNeeded(); - applySettings(); + applySettings(QStringList({"notificationSettings"})); } } void PagerDemodGUI::on_filterDuplicates_clicked(bool checked) { m_settings.m_filterDuplicates = checked; - applySettings(); + applySettings(QStringList({"filterDuplicates"})); } void PagerDemodGUI::on_filterDuplicates_rightClicked(const QPoint &p) @@ -766,15 +771,16 @@ void PagerDemodGUI::on_filterDuplicates_rightClicked(const QPoint &p) PagerDemodFilterDialog dialog(&m_settings); new DialogPositioner(&dialog, true); + if (dialog.exec() == QDialog::Accepted) { - applySettings(); + applySettings(QStringList({"duplicateMatchLastOnly", "duplicateMatchMessageOnly"})); } } void PagerDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList({"logEnabled"})); } void PagerDemodGUI::on_logFilename_clicked() @@ -790,7 +796,7 @@ void PagerDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList({"logFilename"})); } } } diff --git a/plugins/channelrx/demodpager/pagerdemodgui.h b/plugins/channelrx/demodpager/pagerdemodgui.h index 346f9fcae..39aab0142 100644 --- a/plugins/channelrx/demodpager/pagerdemodgui.h +++ b/plugins/channelrx/demodpager/pagerdemodgui.h @@ -97,7 +97,7 @@ private: virtual ~PagerDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); QString selectMessage(int functionBits, const QString &numericMessage, const QString &alphaMessage) const; void messageReceived(const QDateTime dateTime, int address, int functionBits, diff --git a/plugins/channelrx/demodpager/pagerdemodsettings.cpp b/plugins/channelrx/demodpager/pagerdemodsettings.cpp index e329a56b8..53b112ea9 100644 --- a/plugins/channelrx/demodpager/pagerdemodsettings.cpp +++ b/plugins/channelrx/demodpager/pagerdemodsettings.cpp @@ -237,6 +237,202 @@ bool PagerDemodSettings::deserialize(const QByteArray& data) } } +void PagerDemodSettings::applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings) +{ + if (settingsKeys.contains("baud")) { + m_baud = settings.m_baud; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("decode")) { + m_decode = settings.m_decode; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("filterAddress")) { + m_filterAddress = settings.m_filterAddress; + } + if (settingsKeys.contains("scopeCh1")) { + m_scopeCh1 = settings.m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2")) { + m_scopeCh2 = settings.m_scopeCh2; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("reverse")) { + m_reverse = settings.m_reverse; + } + if (settingsKeys.contains("sevenbit")) { + m_sevenbit = settings.m_sevenbit; + } + if (settingsKeys.contains("unicode")) { + m_unicode = settings.m_unicode; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("notificationSettings")) { + m_notificationSettings = settings.m_notificationSettings; + } + if (settingsKeys.contains("filterDuplicates")) { + m_filterDuplicates = settings.m_filterDuplicates; + } + if (settingsKeys.contains("duplicateMatchMessageOnly")) { + m_duplicateMatchMessageOnly = settings.m_duplicateMatchMessageOnly; + } + if (settingsKeys.contains("duplicateMatchLastOnly")) { + m_duplicateMatchLastOnly = settings.m_duplicateMatchLastOnly; + } + if (settingsKeys.contains("messageColumnIndexes")) { + for (int i = 0; i < PAGERDEMOD_MESSAGE_COLUMNS; i++) { + m_messageColumnIndexes[i] = settings.m_messageColumnIndexes[i]; + } + } + if (settingsKeys.contains("messageColumnSizes")) { + for (int i = 0; i < PAGERDEMOD_MESSAGE_COLUMNS; i++) { + m_messageColumnSizes[i] = settings.m_messageColumnSizes[i]; + } + } +} + +QString PagerDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("baud") || force) { + ostr << " m_baud: " << m_baud; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("decode") || force) { + ostr << " m_decode: " << m_decode; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("filterAddress") || force) { + ostr << " m_filterAddress: " << m_filterAddress.toStdString(); + } + if (settingsKeys.contains("scopeCh1") || force) { + ostr << " m_scopeCh1: " << m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2") || force) { + ostr << " m_scopeCh2: " << m_scopeCh2; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("reverse") || force) { + ostr << " m_reverse: " << m_reverse; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + if (settingsKeys.contains("filterDuplicates") || force) { + ostr << " m_filterDuplicates: " << m_filterDuplicates; + } + if (settingsKeys.contains("duplicateMatchMessageOnly") || force) { + ostr << " m_duplicateMatchMessageOnly: " << m_duplicateMatchMessageOnly; + } + if (settingsKeys.contains("duplicateMatchLastOnly") || force) { + ostr << " m_duplicateMatchLastOnly: " << m_duplicateMatchLastOnly; + } + + return QString(ostr.str().c_str()); +} + QByteArray PagerDemodSettings::serializeIntList(const QList& ints) const { QByteArray data; diff --git a/plugins/channelrx/demodpager/pagerdemodsettings.h b/plugins/channelrx/demodpager/pagerdemodsettings.h index 6f7a91b90..f44e0d4e6 100644 --- a/plugins/channelrx/demodpager/pagerdemodsettings.h +++ b/plugins/channelrx/demodpager/pagerdemodsettings.h @@ -121,6 +121,8 @@ struct PagerDemodSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; QByteArray serializeIntList(const QList& ints) const; void deserializeIntList(const QByteArray& data, QList& ints); }; diff --git a/plugins/channelrx/demodpager/pagerdemodsink.cpp b/plugins/channelrx/demodpager/pagerdemodsink.cpp index 1f72d8d89..dfc80e49b 100644 --- a/plugins/channelrx/demodpager/pagerdemodsink.cpp +++ b/plugins/channelrx/demodpager/pagerdemodsink.cpp @@ -54,7 +54,7 @@ PagerDemodSink::PagerDemodSink() : m_demodBuffer.resize(1<<12); m_demodBufferFill = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); m_sampleBuffer.resize(m_sampleBufferSize); } @@ -633,15 +633,11 @@ void PagerDemodSink::applyChannelSettings(int channelSampleRate, int channelFreq m_channelFrequencyOffset = channelFrequencyOffset; } -void PagerDemodSink::applySettings(const PagerDemodSettings& settings, bool force) +void PagerDemodSink::applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force) { - qDebug() << "PagerDemodSink::applySettings:" - << " rfBandwidth: " << settings.m_rfBandwidth - << " fmDeviation: " << settings.m_fmDeviation - << " baud: " << settings.m_baud - << " force: " << force; + qDebug() << "PagerDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) PagerDemodSettings::m_channelSampleRate; @@ -649,12 +645,12 @@ void PagerDemodSink::applySettings(const PagerDemodSettings& settings, bool forc m_lowpass.create(301, PagerDemodSettings::m_channelSampleRate, settings.m_rfBandwidth / 2.0f); } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) + if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force) { m_phaseDiscri.setFMScaling(PagerDemodSettings::m_channelSampleRate / (2.0f * settings.m_fmDeviation)); } - if ((settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { m_samplesPerSymbol = PagerDemodSettings::m_channelSampleRate / settings.m_baud; qDebug() << "PagerDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol; @@ -663,5 +659,9 @@ void PagerDemodSink::applySettings(const PagerDemodSettings& settings, bool forc m_lowpassBaud.create(301, PagerDemodSettings::m_channelSampleRate, settings.m_baud * 5.0f); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodpager/pagerdemodsink.h b/plugins/channelrx/demodpager/pagerdemodsink.h index 840f547ee..569c1270d 100644 --- a/plugins/channelrx/demodpager/pagerdemodsink.h +++ b/plugins/channelrx/demodpager/pagerdemodsink.h @@ -52,7 +52,7 @@ public: void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const PagerDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PagerDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } diff --git a/plugins/channelrx/demodradiosonde/radiosondedemod.cpp b/plugins/channelrx/demodradiosonde/radiosondedemod.cpp index a1dfd6d20..ced5182f4 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemod.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemod.cpp @@ -53,7 +53,7 @@ RadiosondeDemod::RadiosondeDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -127,7 +127,7 @@ void RadiosondeDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband *msg = RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband::create(m_settings, true); + RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband *msg = RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -145,7 +145,7 @@ bool RadiosondeDemod::handleMessage(const Message& cmd) { MsgConfigureRadiosondeDemod& cfg = (MsgConfigureRadiosondeDemod&) cmd; qDebug() << "RadiosondeDemod::handleMessage: MsgConfigureRadiosondeDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -279,64 +279,20 @@ void RadiosondeDemod::setCenterFrequency(qint64 frequency) { RadiosondeDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRadiosondeDemod *msgToGUI = MsgConfigureRadiosondeDemod::create(settings, false); + MsgConfigureRadiosondeDemod *msgToGUI = MsgConfigureRadiosondeDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void RadiosondeDemod::applySettings(const RadiosondeDemodSettings& settings, bool force) +void RadiosondeDemod::applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force) { - qDebug() << "RadiosondeDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "RadiosondeDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_baud != m_settings.m_baud) || force) { - reverseAPIKeys.append("baud"); - } - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_correlationThreshold != m_settings.m_correlationThreshold) || force) { - reverseAPIKeys.append("correlationThreshold"); - } - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_logFilename != m_settings.m_logFilename) || force) { - reverseAPIKeys.append("logFilename"); - } - if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) { - reverseAPIKeys.append("logEnabled"); - } - if ((settings.m_useFileTime != m_settings.m_useFileTime) || force) { - reverseAPIKeys.append("useFileTime"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -347,25 +303,23 @@ void RadiosondeDemod::applySettings(const RadiosondeDemodSettings& settings, boo m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband *msg = RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband::create(settings, force); + RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband *msg = RadiosondeDemodBaseband::MsgConfigureRadiosondeDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - if ((settings.m_logEnabled != m_settings.m_logEnabled) - || (settings.m_logFilename != m_settings.m_logFilename) + if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled)) + || (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename)) || force) { if (m_logFile.isOpen()) @@ -394,7 +348,11 @@ void RadiosondeDemod::applySettings(const RadiosondeDemodSettings& settings, boo } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray RadiosondeDemod::serialize() const @@ -406,14 +364,14 @@ bool RadiosondeDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureRadiosondeDemod *msg = MsgConfigureRadiosondeDemod::create(m_settings, true); + MsgConfigureRadiosondeDemod *msg = MsgConfigureRadiosondeDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureRadiosondeDemod *msg = MsgConfigureRadiosondeDemod::create(m_settings, true); + MsgConfigureRadiosondeDemod *msg = MsgConfigureRadiosondeDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -465,13 +423,13 @@ int RadiosondeDemod::webapiSettingsPutPatch( RadiosondeDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureRadiosondeDemod *msg = MsgConfigureRadiosondeDemod::create(settings, force); + MsgConfigureRadiosondeDemod *msg = MsgConfigureRadiosondeDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("RadiosondeDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRadiosondeDemod *msgToGUI = MsgConfigureRadiosondeDemod::create(settings, force); + MsgConfigureRadiosondeDemod *msgToGUI = MsgConfigureRadiosondeDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -630,7 +588,7 @@ void RadiosondeDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSetting } } -void RadiosondeDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const RadiosondeDemodSettings& settings, bool force) +void RadiosondeDemod::webapiReverseSendSettings(const QStringList& channelSettingsKeys, const RadiosondeDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -656,7 +614,7 @@ void RadiosondeDemod::webapiReverseSendSettings(QList& channelSettingsK } void RadiosondeDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QStringList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RadiosondeDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodradiosonde/radiosondedemod.h b/plugins/channelrx/demodradiosonde/radiosondedemod.h index e8843d719..093fae449 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemod.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemod.h @@ -56,19 +56,22 @@ public: public: const RadiosondeDemodSettings& getSettings() const { return m_settings; } bool getForce() const { return m_force; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } - static MsgConfigureRadiosondeDemod* create(const RadiosondeDemodSettings& settings, bool force) + static MsgConfigureRadiosondeDemod* create(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force) { - return new MsgConfigureRadiosondeDemod(settings, force); + return new MsgConfigureRadiosondeDemod(settingsKeys, settings, force); } private: RadiosondeDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRadiosondeDemod(const RadiosondeDemodSettings& settings, bool force) : + MsgConfigureRadiosondeDemod(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -189,11 +192,11 @@ private: QHash m_subframes; // Hash of serial to subframes virtual bool handleMessage(const Message& cmd); - void applySettings(const RadiosondeDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const RadiosondeDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QStringList& channelSettingsKeys, const RadiosondeDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QStringList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RadiosondeDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.cpp b/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.cpp index 9b0809a56..fca7a4b3a 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.cpp @@ -135,7 +135,7 @@ bool RadiosondeDemodBaseband::handleMessage(const Message& cmd) MsgConfigureRadiosondeDemodBaseband& cfg = (MsgConfigureRadiosondeDemodBaseband&) cmd; qDebug() << "RadiosondeDemodBaseband::handleMessage: MsgConfigureRadiosondeDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -155,17 +155,21 @@ bool RadiosondeDemodBaseband::handleMessage(const Message& cmd) } } -void RadiosondeDemodBaseband::applySettings(const RadiosondeDemodSettings& settings, bool force) +void RadiosondeDemodBaseband::applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(RadiosondeDemodSettings::RADIOSONDEDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void RadiosondeDemodBaseband::setBasebandSampleRate(int sampleRate) diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.h b/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.h index 0435144bc..37854b178 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemodbaseband.h @@ -44,20 +44,23 @@ public: public: const RadiosondeDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRadiosondeDemodBaseband* create(const RadiosondeDemodSettings& settings, bool force) + static MsgConfigureRadiosondeDemodBaseband* create(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force) { - return new MsgConfigureRadiosondeDemodBaseband(settings, force); + return new MsgConfigureRadiosondeDemodBaseband(settingsKeys, settings, force); } private: RadiosondeDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRadiosondeDemodBaseband(const RadiosondeDemodSettings& settings, bool force) : + MsgConfigureRadiosondeDemodBaseband(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -92,7 +95,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(RadiosondeDemodSink *sink); - void applySettings(const RadiosondeDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp b/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp index 0130ffef2..88e18df57 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp @@ -148,7 +148,7 @@ void RadiosondeDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray RadiosondeDemodGUI::serialize() const @@ -160,7 +160,7 @@ bool RadiosondeDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -371,7 +371,7 @@ void RadiosondeDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void RadiosondeDemodGUI::channelMarkerHighlightedByCursor() @@ -384,7 +384,7 @@ void RadiosondeDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void RadiosondeDemodGUI::on_rfBW_valueChanged(int value) @@ -393,28 +393,28 @@ void RadiosondeDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void RadiosondeDemodGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 100.0; - applySettings(); + applySettings(QStringList("fmDeviation")); } void RadiosondeDemodGUI::on_threshold_valueChanged(int value) { ui->thresholdText->setText(QString("%1").arg(value)); m_settings.m_correlationThreshold = value; - applySettings(); + applySettings(QStringList("correlationThreshold")); } void RadiosondeDemodGUI::on_filterSerial_editingFinished() { m_settings.m_filterSerial = ui->filterSerial->text(); filter(); - applySettings(); + applySettings(QStringList("filterSerial")); } void RadiosondeDemodGUI::on_clearTable_clicked() @@ -425,31 +425,31 @@ void RadiosondeDemodGUI::on_clearTable_clicked() void RadiosondeDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void RadiosondeDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void RadiosondeDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void RadiosondeDemodGUI::on_channel1_currentIndexChanged(int index) { m_settings.m_scopeCh1 = index; - applySettings(); + applySettings(QStringList("scopeCh1")); } void RadiosondeDemodGUI::on_channel2_currentIndexChanged(int index) { m_settings.m_scopeCh2 = index; - applySettings(); + applySettings(QStringList("scopeCh2")); } void RadiosondeDemodGUI::on_frames_cellDoubleClicked(int row, int column) @@ -496,7 +496,7 @@ void RadiosondeDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void RadiosondeDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -541,7 +541,8 @@ void RadiosondeDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -663,7 +664,7 @@ RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI* pluginAPI, DeviceUISet *device displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -718,11 +719,11 @@ void RadiosondeDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void RadiosondeDemodGUI::applySettings(bool force) +void RadiosondeDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - RadiosondeDemod::MsgConfigureRadiosondeDemod* frame = RadiosondeDemod::MsgConfigureRadiosondeDemod::create( m_settings, force); + RadiosondeDemod::MsgConfigureRadiosondeDemod* frame = RadiosondeDemod::MsgConfigureRadiosondeDemod::create(settingsKeys, m_settings, force); m_radiosondeDemod->getInputMessageQueue()->push(frame); } } @@ -823,7 +824,7 @@ void RadiosondeDemodGUI::tick() void RadiosondeDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList("logEnabled")); } void RadiosondeDemodGUI::on_logFilename_clicked() @@ -839,7 +840,7 @@ void RadiosondeDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList("logFilename")); } } } @@ -926,7 +927,7 @@ void RadiosondeDemodGUI::on_logOpen_clicked() void RadiosondeDemodGUI::on_useFileTime_toggled(bool checked) { m_settings.m_useFileTime = checked; - applySettings(); + applySettings(QStringList("useFileTime")); } void RadiosondeDemodGUI::makeUIConnections() diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodgui.h b/plugins/channelrx/demodradiosonde/radiosondedemodgui.h index f1c952ca4..11e68feb2 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodgui.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemodgui.h @@ -94,7 +94,7 @@ private: virtual ~RadiosondeDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void frameReceived(const QByteArray& frame, const QDateTime& dateTime, int errorsCorrected, int threshold, bool loadCSV); bool handleMessage(const Message& message); diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp index e01956bd0..ddffab323 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp @@ -213,4 +213,171 @@ bool RadiosondeDemodSettings::deserialize(const QByteArray& data) } } +void RadiosondeDemodSettings::applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings) +{ + if (settingsKeys.contains("baud")) { + m_baud = settings.m_baud; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("correlationThreshold")) { + m_correlationThreshold = settings.m_correlationThreshold; + } + if (settingsKeys.contains("filterSerial")) { + m_filterSerial = settings.m_filterSerial; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("scopeCh1")) { + m_scopeCh1 = settings.m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2")) { + m_scopeCh2 = settings.m_scopeCh2; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("useFileTime")) { + m_useFileTime = settings.m_useFileTime; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("frameColumnIndexes")) { + for (int i = 0; i < RADIOSONDEDEMOD_FRAME_COLUMNS; i++) { + m_frameColumnIndexes[i] = settings.m_frameColumnIndexes[i]; + } + } + if (settingsKeys.contains("frameColumnSizes")) { + for (int i = 0; i < RADIOSONDEDEMOD_FRAME_COLUMNS; i++) { + m_frameColumnSizes[i] = settings.m_frameColumnSizes[i]; + } + } +} +QString RadiosondeDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("baud") || force) { + ostr << " m_baud: " << m_baud; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("correlationThreshold") || force) { + ostr << " m_correlationThreshold: " << m_correlationThreshold; + } + if (settingsKeys.contains("filterSerial") || force) { + ostr << " m_filterSerial: " << m_filterSerial.toStdString(); + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("scopeCh1") || force) { + ostr << " m_scopeCh1: " << m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2") || force) { + ostr << " m_scopeCh2: " << m_scopeCh2; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("useFileTime") || force) { + ostr << " m_useFileTime: " << m_useFileTime; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h index a79a1199d..fa9f83f58 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h @@ -76,6 +76,8 @@ struct RadiosondeDemodSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_RADIOSONDEDEMODSETTINGS_H */ diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp b/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp index 16f02ade0..b353fe7ef 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp @@ -60,7 +60,7 @@ RadiosondeDemodSink::RadiosondeDemodSink(RadiosondeDemod *radiosondeDemod) : m_demodBufferFill = 0; m_sampleBuffer.resize(m_sampleBufferSize); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -525,24 +525,23 @@ void RadiosondeDemodSink::applyChannelSettings(int channelSampleRate, int channe qDebug() << "RadiosondeDemodSink::applyChannelSettings: m_samplesPerSymbol: " << m_samplesPerSymbol; } -void RadiosondeDemodSink::applySettings(const RadiosondeDemodSettings& settings, bool force) +void RadiosondeDemodSink::applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force) { - qDebug() << "RadiosondeDemodSink::applySettings:" - << " force: " << force; + qDebug() << "RadiosondeDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) RadiosondeDemodSettings::RADIOSONDEDEMOD_CHANNEL_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; m_lowpass.create(301, RadiosondeDemodSettings::RADIOSONDEDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f); } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) + if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force) { m_phaseDiscri.setFMScaling(RadiosondeDemodSettings::RADIOSONDEDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation)); } - if ((settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { m_samplesPerSymbol = RadiosondeDemodSettings::RADIOSONDEDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud; qDebug() << "RadiosondeDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud; @@ -579,5 +578,9 @@ void RadiosondeDemodSink::applySettings(const RadiosondeDemodSettings& settings, } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodsink.h b/plugins/channelrx/demodradiosonde/radiosondedemodsink.h index 9b8021967..0449e4cc0 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodsink.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemodsink.h @@ -50,7 +50,7 @@ public: void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const RadiosondeDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadiosondeDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } diff --git a/plugins/channelrx/demodrtty/rttydemod.cpp b/plugins/channelrx/demodrtty/rttydemod.cpp index 84c0ad345..28018e042 100644 --- a/plugins/channelrx/demodrtty/rttydemod.cpp +++ b/plugins/channelrx/demodrtty/rttydemod.cpp @@ -58,7 +58,7 @@ RttyDemod::RttyDemod(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -132,7 +132,7 @@ void RttyDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - RttyDemodBaseband::MsgConfigureRttyDemodBaseband *msg = RttyDemodBaseband::MsgConfigureRttyDemodBaseband::create(m_settings, true); + RttyDemodBaseband::MsgConfigureRttyDemodBaseband *msg = RttyDemodBaseband::MsgConfigureRttyDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -150,8 +150,7 @@ bool RttyDemod::handleMessage(const Message& cmd) { MsgConfigureRttyDemod& cfg = (MsgConfigureRttyDemod&) cmd; qDebug() << "RttyDemod::handleMessage: MsgConfigureRttyDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); - + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } else if (DSPSignalNotification::match(cmd)) @@ -229,27 +228,18 @@ void RttyDemod::setCenterFrequency(qint64 frequency) { RttyDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList({"inputFrequencyOffset"}), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRttyDemod *msgToGUI = MsgConfigureRttyDemod::create(settings, false); + MsgConfigureRttyDemod *msgToGUI = MsgConfigureRttyDemod::create(QStringList({"inputFrequencyOffset"}), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void RttyDemod::applySettings(const RttyDemodSettings& settings, bool force) +void RttyDemod::applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force) { - qDebug() << "RttyDemod::applySettings:" - << " m_logEnabled: " << settings.m_logEnabled - << " m_logFilename: " << settings.m_logFilename - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "RttyDemod::applySettings:" << settings.getDebugString(settingsKeys, force); QList reverseAPIKeys; @@ -298,7 +288,7 @@ void RttyDemod::applySettings(const RttyDemodSettings& settings, bool force) if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) { reverseAPIKeys.append("logEnabled"); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (settings.m_streamIndex != m_settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -313,21 +303,21 @@ void RttyDemod::applySettings(const RttyDemodSettings& settings, bool force) reverseAPIKeys.append("streamIndex"); } - RttyDemodBaseband::MsgConfigureRttyDemodBaseband *msg = RttyDemodBaseband::MsgConfigureRttyDemodBaseband::create(settings, force); + RttyDemodBaseband::MsgConfigureRttyDemodBaseband *msg = RttyDemodBaseband::MsgConfigureRttyDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + bool fullUpdate = (settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } - if ((settings.m_logEnabled != m_settings.m_logEnabled) - || (settings.m_logFilename != m_settings.m_logFilename) + if ((settingsKeys.contains("logEnabled") && (settings.m_logEnabled != m_settings.m_logEnabled)) + || (settingsKeys.contains("logFilename") && (settings.m_logFilename != m_settings.m_logFilename)) || force) { if (m_logFile.isOpen()) @@ -381,14 +371,14 @@ bool RttyDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureRttyDemod *msg = MsgConfigureRttyDemod::create(m_settings, true); + MsgConfigureRttyDemod *msg = MsgConfigureRttyDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureRttyDemod *msg = MsgConfigureRttyDemod::create(m_settings, true); + MsgConfigureRttyDemod *msg = MsgConfigureRttyDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -424,13 +414,13 @@ int RttyDemod::webapiSettingsPutPatch( RttyDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureRttyDemod *msg = MsgConfigureRttyDemod::create(settings, force); + MsgConfigureRttyDemod *msg = MsgConfigureRttyDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("RttyDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRttyDemod *msgToGUI = MsgConfigureRttyDemod::create(settings, force); + MsgConfigureRttyDemod *msgToGUI = MsgConfigureRttyDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -625,7 +615,7 @@ void RttyDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons response.getRttyDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void RttyDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const RttyDemodSettings& settings, bool force) +void RttyDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const RttyDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -651,7 +641,7 @@ void RttyDemod::webapiReverseSendSettings(QList& channelSettingsKeys, c } void RttyDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RttyDemodSettings& settings, bool force @@ -776,4 +766,3 @@ void RttyDemod::handleIndexInDeviceSetChanged(int index) .arg(index); m_basebandSink->setFifoLabel(fifoLabel); } - diff --git a/plugins/channelrx/demodrtty/rttydemod.h b/plugins/channelrx/demodrtty/rttydemod.h index 849579bac..518566392 100644 --- a/plugins/channelrx/demodrtty/rttydemod.h +++ b/plugins/channelrx/demodrtty/rttydemod.h @@ -49,20 +49,23 @@ public: public: const RttyDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRttyDemod* create(const RttyDemodSettings& settings, bool force) + static MsgConfigureRttyDemod* create(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force) { - return new MsgConfigureRttyDemod(settings, force); + return new MsgConfigureRttyDemod(settingsKeys, settings, force); } private: RttyDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRttyDemod(const RttyDemodSettings& settings, bool force) : + MsgConfigureRttyDemod(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -198,11 +201,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const RttyDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); - void webapiReverseSendSettings(QList& channelSettingsKeys, const RttyDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const RttyDemodSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RttyDemodSettings& settings, bool force @@ -216,4 +219,3 @@ private slots: }; #endif // INCLUDE_RTTYDEMOD_H - diff --git a/plugins/channelrx/demodrtty/rttydemodbaseband.cpp b/plugins/channelrx/demodrtty/rttydemodbaseband.cpp index e07245a51..81e928f83 100644 --- a/plugins/channelrx/demodrtty/rttydemodbaseband.cpp +++ b/plugins/channelrx/demodrtty/rttydemodbaseband.cpp @@ -134,7 +134,7 @@ bool RttyDemodBaseband::handleMessage(const Message& cmd) MsgConfigureRttyDemodBaseband& cfg = (MsgConfigureRttyDemodBaseband&) cmd; qDebug() << "RttyDemodBaseband::handleMessage: MsgConfigureRttyDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -155,17 +155,21 @@ bool RttyDemodBaseband::handleMessage(const Message& cmd) } } -void RttyDemodBaseband::applySettings(const RttyDemodSettings& settings, bool force) +void RttyDemodBaseband::applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(RttyDemodSettings::RTTYDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int RttyDemodBaseband::getChannelSampleRate() const @@ -178,4 +182,3 @@ void RttyDemodBaseband::setBasebandSampleRate(int sampleRate) m_channelizer->setBasebandSampleRate(sampleRate); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - diff --git a/plugins/channelrx/demodrtty/rttydemodbaseband.h b/plugins/channelrx/demodrtty/rttydemodbaseband.h index 35344b710..cf39ad006 100644 --- a/plugins/channelrx/demodrtty/rttydemodbaseband.h +++ b/plugins/channelrx/demodrtty/rttydemodbaseband.h @@ -44,20 +44,23 @@ public: public: const RttyDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRttyDemodBaseband* create(const RttyDemodSettings& settings, bool force) + static MsgConfigureRttyDemodBaseband* create(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force) { - return new MsgConfigureRttyDemodBaseband(settings, force); + return new MsgConfigureRttyDemodBaseband(settingsKeys, settings, force); } private: RttyDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRttyDemodBaseband(const RttyDemodSettings& settings, bool force) : + MsgConfigureRttyDemodBaseband(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -93,7 +96,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(RttyDemodSink *sink); - void applySettings(const RttyDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); @@ -101,4 +104,3 @@ private slots: }; #endif // INCLUDE_RTTYDEMODBASEBAND_H - diff --git a/plugins/channelrx/demodrtty/rttydemodgui.cpp b/plugins/channelrx/demodrtty/rttydemodgui.cpp index baad2448e..580f3e4d3 100644 --- a/plugins/channelrx/demodrtty/rttydemodgui.cpp +++ b/plugins/channelrx/demodrtty/rttydemodgui.cpp @@ -56,7 +56,7 @@ void RttyDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray RttyDemodGUI::serialize() const @@ -68,7 +68,7 @@ bool RttyDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -181,7 +181,7 @@ void RttyDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void RttyDemodGUI::channelMarkerHighlightedByCursor() @@ -194,7 +194,7 @@ void RttyDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void RttyDemodGUI::on_rfBW_valueChanged(int value) @@ -203,40 +203,40 @@ void RttyDemodGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(formatFrequency((int)bw)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void RttyDemodGUI::on_baudRate_currentIndexChanged(int index) { (void) index; m_settings.m_baudRate = ui->baudRate->currentText().toFloat(); - applySettings(); + applySettings(QStringList({"baudRate"})); } void RttyDemodGUI::on_frequencyShift_valueChanged(int value) { ui->frequencyShiftText->setText(formatFrequency(value)); m_settings.m_frequencyShift = value; - applySettings(); + applySettings(QStringList({"frequencyShift"})); } void RttyDemodGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1 dB").arg(value)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList({"squelch"})); } void RttyDemodGUI::on_characterSet_currentIndexChanged(int index) { m_settings.m_characterSet = (Baudot::CharacterSet) index; - applySettings(); + applySettings(QStringList({"characterSet"})); } void RttyDemodGUI::on_suppressCRLF_clicked(bool checked) { m_settings.m_suppressCRLF = checked; - applySettings(); + applySettings(QStringList({"suppressCRLF"})); } void RttyDemodGUI::on_mode_currentIndexChanged(int index) @@ -267,20 +267,20 @@ void RttyDemodGUI::on_mode_currentIndexChanged(int index) ui->rfBWText->setEnabled(custom); //m_settings.m_mode = index; - applySettings(); + //applySettings(QStringList({"mode"})); } void RttyDemodGUI::on_filter_currentIndexChanged(int index) { m_settings.m_filter = (RttyDemodSettings::FilterType)index; - applySettings(); + applySettings(QStringList({"filter"})); } void RttyDemodGUI::on_atc_clicked(bool checked) { m_settings.m_atc = checked; - applySettings(); + applySettings(QStringList({"atc"})); } void RttyDemodGUI::on_endian_clicked(bool checked) @@ -291,7 +291,7 @@ void RttyDemodGUI::on_endian_clicked(bool checked) } else { ui->endian->setText("LSB"); } - applySettings(); + applySettings(QStringList({"msbFirst"})); } void RttyDemodGUI::on_spaceHigh_clicked(bool checked) @@ -303,13 +303,13 @@ void RttyDemodGUI::on_spaceHigh_clicked(bool checked) else { ui->spaceHigh->setText("S-M"); } - applySettings(); + applySettings(QStringList({"spaceHigh"})); } void RttyDemodGUI::on_unshiftOnSpace_clicked(bool checked) { m_settings.m_unshiftOnSpace = checked; - applySettings(); + applySettings(QStringList({"unshiftOnSpace"})); } void RttyDemodGUI::on_clearTable_clicked() @@ -320,31 +320,31 @@ void RttyDemodGUI::on_clearTable_clicked() void RttyDemodGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList({"udpEnabled"})); } void RttyDemodGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList({"udpAddress"})); } void RttyDemodGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList({"udpPort"})); } void RttyDemodGUI::on_channel1_currentIndexChanged(int index) { m_settings.m_scopeCh1 = index; - applySettings(); + applySettings(QStringList({"scopeCh1"})); } void RttyDemodGUI::on_channel2_currentIndexChanged(int index) { m_settings.m_scopeCh2 = index; - applySettings(); + applySettings(QStringList({"scopeCh2"})); } void RttyDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -353,7 +353,7 @@ void RttyDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void RttyDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -398,7 +398,16 @@ void RttyDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -492,7 +501,7 @@ RttyDemodGUI::RttyDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -506,11 +515,11 @@ void RttyDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void RttyDemodGUI::applySettings(bool force) +void RttyDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - RttyDemod::MsgConfigureRttyDemod* message = RttyDemod::MsgConfigureRttyDemod::create( m_settings, force); + RttyDemod::MsgConfigureRttyDemod* message = RttyDemod::MsgConfigureRttyDemod::create(settingsKeys, m_settings, force); m_rttyDemod->getInputMessageQueue()->push(message); } } @@ -624,7 +633,7 @@ void RttyDemodGUI::tick() void RttyDemodGUI::on_logEnable_clicked(bool checked) { m_settings.m_logEnabled = checked; - applySettings(); + applySettings(QStringList({"logEnabled"})); } void RttyDemodGUI::on_logFilename_clicked() @@ -639,7 +648,7 @@ void RttyDemodGUI::on_logFilename_clicked() { m_settings.m_logFilename = fileNames[0]; ui->logFilename->setToolTip(QString(".txt log filename: %1").arg(m_settings.m_logFilename)); - applySettings(); + applySettings(QStringList({"logFilename"})); } } } @@ -673,4 +682,3 @@ void RttyDemodGUI::updateAbsoluteCenterFrequency() { setStatusFrequency(m_deviceCenterFrequency + m_settings.m_inputFrequencyOffset); } - diff --git a/plugins/channelrx/demodrtty/rttydemodgui.h b/plugins/channelrx/demodrtty/rttydemodgui.h index 736de1b4c..02b70bb35 100644 --- a/plugins/channelrx/demodrtty/rttydemodgui.h +++ b/plugins/channelrx/demodrtty/rttydemodgui.h @@ -86,7 +86,7 @@ private: virtual ~RttyDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); @@ -127,4 +127,3 @@ private slots: }; #endif // INCLUDE_RTTYDEMODGUI_H - diff --git a/plugins/channelrx/demodrtty/rttydemodsettings.cpp b/plugins/channelrx/demodrtty/rttydemodsettings.cpp index 5da7a8086..45009efe8 100644 --- a/plugins/channelrx/demodrtty/rttydemodsettings.cpp +++ b/plugins/channelrx/demodrtty/rttydemodsettings.cpp @@ -213,3 +213,191 @@ bool RttyDemodSettings::deserialize(const QByteArray& data) } } +void RttyDemodSettings::applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("baudRate")) { + m_baudRate = settings.m_baudRate; + } + if (settingsKeys.contains("frequencyShift")) { + m_frequencyShift = settings.m_frequencyShift; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("characterSet")) { + m_characterSet = settings.m_characterSet; + } + if (settingsKeys.contains("suppressCRLF")) { + m_suppressCRLF = settings.m_suppressCRLF; + } + if (settingsKeys.contains("unshiftOnSpace")) { + m_unshiftOnSpace = settings.m_unshiftOnSpace; + } + if (settingsKeys.contains("filter")) { + m_filter = settings.m_filter; + } + if (settingsKeys.contains("atc")) { + m_atc = settings.m_atc; + } + if (settingsKeys.contains("msbFirst")) { + m_msbFirst = settings.m_msbFirst; + } + if (settingsKeys.contains("spaceHigh")) { + m_spaceHigh = settings.m_spaceHigh; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("scopeCh1")) { + m_scopeCh1 = settings.m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2")) { + m_scopeCh2 = settings.m_scopeCh2; + } + if (settingsKeys.contains("logFilename")) { + m_logFilename = settings.m_logFilename; + } + if (settingsKeys.contains("logEnabled")) { + m_logEnabled = settings.m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString RttyDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("baudRate") || force) { + ostr << " m_baudRate: " << m_baudRate; + } + if (settingsKeys.contains("frequencyShift") || force) { + ostr << " m_frequencyShift: " << m_frequencyShift; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("characterSet") || force) { + ostr << " m_characterSet: " << m_characterSet; + } + if (settingsKeys.contains("suppressCRLF") || force) { + ostr << " m_suppressCRLF: " << m_suppressCRLF; + } + if (settingsKeys.contains("unshiftOnSpace") || force) { + ostr << " m_unshiftOnSpace: " << m_unshiftOnSpace; + } + if (settingsKeys.contains("filter") || force) { + ostr << " m_filter: " << m_filter; + } + if (settingsKeys.contains("atc") || force) { + ostr << " m_atc: " << m_atc; + } + if (settingsKeys.contains("msbFirst") || force) { + ostr << " m_msbFirst: " << m_msbFirst; + } + if (settingsKeys.contains("spaceHigh") || force) { + ostr << " m_spaceHigh: " << m_spaceHigh; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("scopeCh1") || force) { + ostr << " m_scopeCh1: " << m_scopeCh1; + } + if (settingsKeys.contains("scopeCh2") || force) { + ostr << " m_scopeCh2: " << m_scopeCh2; + } + if (settingsKeys.contains("logFilename") || force) { + ostr << " m_logFilename: " << m_logFilename.toStdString(); + } + if (settingsKeys.contains("logEnabled") || force) { + ostr << " m_logEnabled: " << m_logEnabled; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodrtty/rttydemodsettings.h b/plugins/channelrx/demodrtty/rttydemodsettings.h index 8864f6080..ca94cc2af 100644 --- a/plugins/channelrx/demodrtty/rttydemodsettings.h +++ b/plugins/channelrx/demodrtty/rttydemodsettings.h @@ -85,7 +85,8 @@ struct RttyDemodSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_RTTYDEMODSETTINGS_H */ - diff --git a/plugins/channelrx/demodrtty/rttydemodsink.cpp b/plugins/channelrx/demodrtty/rttydemodsink.cpp index 324d8c0e0..cca647bc8 100644 --- a/plugins/channelrx/demodrtty/rttydemodsink.cpp +++ b/plugins/channelrx/demodrtty/rttydemodsink.cpp @@ -51,7 +51,7 @@ RttyDemodSink::RttyDemodSink() : m_sampleBuffer.resize(m_sampleBufferSize); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); FFTFactory *fftFactory = DSPEngine::instance()->getFFTFactory(); @@ -581,24 +581,19 @@ void RttyDemodSink::init() m_rttyDecoder.init(); } -void RttyDemodSink::applySettings(const RttyDemodSettings& settings, bool force) +void RttyDemodSink::applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force) { - qDebug() << "RttyDemodSink::applySettings:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_baudRate: " << settings.m_baudRate - << " m_frequencyShift: " << settings.m_frequencyShift - << " m_characterSet: " << settings.m_characterSet - << " m_unshiftOnSpace: " << settings.m_unshiftOnSpace - << " force: " << force; + qDebug() << "RttyDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) RttyDemodSettings::RTTYDEMOD_CHANNEL_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_baudRate != m_settings.m_baudRate) || (settings.m_filter != m_settings.m_filter) || force) + if ((settingsKeys.contains("baudRate") && (settings.m_baudRate != m_settings.m_baudRate)) || + (settingsKeys.contains("filter") && (settings.m_filter != m_settings.m_filter)) || force) { m_envelope1.create(301, RttyDemodSettings::RTTYDEMOD_CHANNEL_SAMPLE_RATE, 2); m_envelope2.create(301, RttyDemodSettings::RTTYDEMOD_CHANNEL_SAMPLE_RATE, 2); @@ -628,14 +623,15 @@ void RttyDemodSink::applySettings(const RttyDemodSettings& settings, bool force) //m_raisedCosine1.printTaps("rcos"); } - if ((settings.m_characterSet != m_settings.m_characterSet) || force) { + if ((settingsKeys.contains("characterSet") && (settings.m_characterSet != m_settings.m_characterSet)) || force) { m_rttyDecoder.setCharacterSet(settings.m_characterSet); } - if ((settings.m_unshiftOnSpace != m_settings.m_unshiftOnSpace) || force) { + if ((settingsKeys.contains("unshiftOnSpace") && (settings.m_unshiftOnSpace != m_settings.m_unshiftOnSpace)) || force) { m_rttyDecoder.setUnshiftOnSpace(settings.m_unshiftOnSpace); } - if ((settings.m_baudRate != m_settings.m_baudRate) || (settings.m_frequencyShift != m_settings.m_frequencyShift) || force) + if ((settingsKeys.contains("baudRate") && (settings.m_baudRate != m_settings.m_baudRate)) || + (settingsKeys.contains("frequencyShift") && (settings.m_frequencyShift != m_settings.m_frequencyShift)) || force) { delete[] m_exp; delete[] m_prods1; @@ -665,6 +661,9 @@ void RttyDemodSink::applySettings(const RttyDemodSettings& settings, bool force) m_freq2Average.reset(); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } - diff --git a/plugins/channelrx/demodrtty/rttydemodsink.h b/plugins/channelrx/demodrtty/rttydemodsink.h index 96b91bbad..e35326d3b 100644 --- a/plugins/channelrx/demodrtty/rttydemodsink.h +++ b/plugins/channelrx/demodrtty/rttydemodsink.h @@ -46,7 +46,7 @@ public: void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const RttyDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RttyDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } @@ -165,4 +165,3 @@ private: }; #endif // INCLUDE_RTTYDEMODSINK_H - diff --git a/plugins/channelrx/demodssb/ssbdemod.cpp b/plugins/channelrx/demodssb/ssbdemod.cpp index c4a50220a..57d43d8ce 100644 --- a/plugins/channelrx/demodssb/ssbdemod.cpp +++ b/plugins/channelrx/demodssb/ssbdemod.cpp @@ -62,7 +62,7 @@ SSBDemod::SSBDemod(DeviceAPI *deviceAPI) : { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -172,7 +172,7 @@ void SSBDemod::start() m_thread->start(); - SSBDemodBaseband::MsgConfigureSSBDemodBaseband *msg = SSBDemodBaseband::MsgConfigureSSBDemodBaseband::create(m_settings, true); + SSBDemodBaseband::MsgConfigureSSBDemodBaseband *msg = SSBDemodBaseband::MsgConfigureSSBDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -199,7 +199,7 @@ bool SSBDemod::handleMessage(const Message& cmd) MsgConfigureSSBDemod& cfg = (MsgConfigureSSBDemod&) cmd; qDebug("SSBDemod::handleMessage: MsgConfigureSSBDemod"); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -236,122 +236,20 @@ void SSBDemod::setCenterFrequency(qint64 frequency) { SSBDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureSSBDemod *msgToGUI = MsgConfigureSSBDemod::create(settings, false); + MsgConfigureSSBDemod *msgToGUI = MsgConfigureSSBDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) +void SSBDemod::applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force) { - qDebug() << "SSBDemod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_filterIndex: " << settings.m_filterIndex - << " [m_spanLog2: " << settings.m_filterBank[settings.m_filterIndex].m_spanLog2 - << " m_rfBandwidth: " << settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth - << " m_lowCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_lowCutoff - << " m_fftWindow: " << settings.m_filterBank[settings.m_filterIndex].m_fftWindow << "]" - << " m_volume: " << settings.m_volume - << " m_audioBinaual: " << settings.m_audioBinaural - << " m_audioFlipChannels: " << settings.m_audioFlipChannels - << " m_dsb: " << settings.m_dsb - << " m_audioMute: " << settings.m_audioMute - << " m_agcActive: " << settings.m_agc - << " m_agcClamping: " << settings.m_agcClamping - << " m_agcTimeLog2: " << settings.m_agcTimeLog2 - << " agcPowerThreshold: " << settings.m_agcPowerThreshold - << " agcThresholdGate: " << settings.m_agcThresholdGate - << " m_dnr: " << settings.m_dnr - << " m_dnrScheme: " << settings.m_dnrScheme - << " m_dnrAboveAvgFactor: " << settings.m_dnrAboveAvgFactor - << " m_dnrSigmaFactor: " << settings.m_dnrSigmaFactor - << " m_dnrNbPeaks: " << settings.m_dnrNbPeaks - << " m_dnrAlpha: " << settings.m_dnrAlpha - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "SSBDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((m_settings.m_filterIndex != settings.m_filterIndex) || force) { - reverseAPIKeys.append("filterIndex"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2 != settings.m_filterBank[settings.m_filterIndex].m_spanLog2) || force) { - reverseAPIKeys.append("spanLog2"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth != settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff != settings.m_filterBank[settings.m_filterIndex].m_lowCutoff) || force) { - reverseAPIKeys.append("lowCutoff"); - } - if ((m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow != settings.m_filterBank[settings.m_filterIndex].m_fftWindow) || force) { - reverseAPIKeys.append("fftWindow"); - } - if ((m_settings.m_volume != settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((m_settings.m_agcTimeLog2 != settings.m_agcTimeLog2) || force) { - reverseAPIKeys.append("agcTimeLog2"); - } - if ((m_settings.m_agcPowerThreshold != settings.m_agcPowerThreshold) || force) { - reverseAPIKeys.append("agcPowerThreshold"); - } - if ((m_settings.m_agcThresholdGate != settings.m_agcThresholdGate) || force) { - reverseAPIKeys.append("agcThresholdGate"); - } - if ((m_settings.m_agcClamping != settings.m_agcClamping) || force) { - reverseAPIKeys.append("agcClamping"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((m_settings.m_audioBinaural != settings.m_audioBinaural) || force) { - reverseAPIKeys.append("audioBinaural"); - } - if ((m_settings.m_audioFlipChannels != settings.m_audioFlipChannels) || force) { - reverseAPIKeys.append("audioFlipChannels"); - } - if ((m_settings.m_dsb != settings.m_dsb) || force) { - reverseAPIKeys.append("dsb"); - } - if ((m_settings.m_audioMute != settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((m_settings.m_agc != settings.m_agc) || force) { - reverseAPIKeys.append("agc"); - } - if ((m_settings.m_dnr != settings.m_dnr) || force) { - reverseAPIKeys.append("dnr"); - } - if ((m_settings.m_dnrScheme != settings.m_dnrScheme) || force) { - reverseAPIKeys.append("dnrScheme"); - } - if ((m_settings.m_dnrAboveAvgFactor != settings.m_dnrAboveAvgFactor) || force) { - reverseAPIKeys.append("dnrAboveAvgFactor"); - } - if ((m_settings.m_dnrSigmaFactor != settings.m_dnrSigmaFactor) || force) { - reverseAPIKeys.append("dnrSigmaFactor"); - } - if ((m_settings.m_dnrNbPeaks != settings.m_dnrNbPeaks) || force) { - reverseAPIKeys.append("dnrNbPeaks"); - } - if ((m_settings.m_dnrAlpha != settings.m_dnrAlpha) || force) { - reverseAPIKeys.append("dnrAlpha"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex")) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -362,11 +260,9 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - if ((settings.m_dsb != m_settings.m_dsb) + if ((settingsKeys.contains("dsb") && (settings.m_dsb != m_settings.m_dsb)) || (settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth != m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth) || (settings.m_filterBank[settings.m_filterIndex].m_lowCutoff != m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff) || force) { @@ -379,28 +275,32 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) if (m_running) { - SSBDemodBaseband::MsgConfigureSSBDemodBaseband *msg = SSBDemodBaseband::MsgConfigureSSBDemodBaseband::create(settings, force); + SSBDemodBaseband::MsgConfigureSSBDemodBaseband *msg = SSBDemodBaseband::MsgConfigureSSBDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } if (settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = (settingsKeys.contains("useReverseAPI") || + (settingsKeys.contains("reverseAPIAddress")) || + (settingsKeys.contains("reverseAPIPort")) || + (settingsKeys.contains("reverseAPIDeviceIndex")) || + (settingsKeys.contains("reverseAPIChannelIndex"))); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force || !settingsKeys.isEmpty()) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray SSBDemod::serialize() const @@ -412,14 +312,14 @@ bool SSBDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(m_settings, true); + MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(m_settings, true); + MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -478,13 +378,13 @@ int SSBDemod::webapiSettingsPutPatch( SSBDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(settings, force); + MsgConfigureSSBDemod *msg = MsgConfigureSSBDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("SSBDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureSSBDemod *msgToGUI = MsgConfigureSSBDemod::create(settings, force); + MsgConfigureSSBDemod *msgToGUI = MsgConfigureSSBDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -721,7 +621,7 @@ void SSBDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response } } -void SSBDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force) +void SSBDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -748,7 +648,7 @@ void SSBDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co void SSBDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force) { @@ -774,7 +674,7 @@ void SSBDemod::sendChannelSettings( } void SSBDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const SSBDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodssb/ssbdemod.h b/plugins/channelrx/demodssb/ssbdemod.h index c2f7e94b7..89de0e303 100644 --- a/plugins/channelrx/demodssb/ssbdemod.h +++ b/plugins/channelrx/demodssb/ssbdemod.h @@ -49,20 +49,23 @@ public: public: const SSBDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureSSBDemod* create(const SSBDemodSettings& settings, bool force) + static MsgConfigureSSBDemod* create(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force) { - return new MsgConfigureSSBDemod(settings, force); + return new MsgConfigureSSBDemod(settingsKeys, settings, force); } private: SSBDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureSSBDemod(const SSBDemodSettings& settings, bool force) : + MsgConfigureSSBDemod(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -162,18 +165,18 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const SSBDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const SSBDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const SSBDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodssb/ssbdemodbaseband.cpp b/plugins/channelrx/demodssb/ssbdemodbaseband.cpp index a90e8017a..ca4b3ab59 100644 --- a/plugins/channelrx/demodssb/ssbdemodbaseband.cpp +++ b/plugins/channelrx/demodssb/ssbdemodbaseband.cpp @@ -120,7 +120,7 @@ bool SSBDemodBaseband::handleMessage(const Message& cmd) MsgConfigureSSBDemodBaseband& cfg = (MsgConfigureSSBDemodBaseband&) cmd; qDebug() << "SSBDemodBaseband::handleMessage: MsgConfigureSSBDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -176,9 +176,9 @@ bool SSBDemodBaseband::handleMessage(const Message& cmd) } } -void SSBDemodBaseband::applySettings(const SSBDemodSettings& settings, bool force) +void SSBDemodBaseband::applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset")) || force) { m_channelizer.setChannelization(m_audioSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset()); @@ -199,7 +199,7 @@ void SSBDemodBaseband::applySettings(const SSBDemodSettings& settings, bool forc } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName")) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -227,9 +227,13 @@ void SSBDemodBaseband::applySettings(const SSBDemodSettings& settings, bool forc } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int SSBDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodssb/ssbdemodbaseband.h b/plugins/channelrx/demodssb/ssbdemodbaseband.h index ed7ab5f81..91cc60754 100644 --- a/plugins/channelrx/demodssb/ssbdemodbaseband.h +++ b/plugins/channelrx/demodssb/ssbdemodbaseband.h @@ -41,20 +41,23 @@ public: public: const SSBDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureSSBDemodBaseband* create(const SSBDemodSettings& settings, bool force) + static MsgConfigureSSBDemodBaseband* create(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force) { - return new MsgConfigureSSBDemodBaseband(settings, force); + return new MsgConfigureSSBDemodBaseband(settingsKeys, settings, force); } private: SSBDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureSSBDemodBaseband(const SSBDemodSettings& settings, bool force) : + MsgConfigureSSBDemodBaseband(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const SSBDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force = false); MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; } private slots: diff --git a/plugins/channelrx/demodssb/ssbdemodgui.cpp b/plugins/channelrx/demodssb/ssbdemodgui.cpp index 879022832..f3e4e60d5 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.cpp +++ b/plugins/channelrx/demodssb/ssbdemodgui.cpp @@ -142,7 +142,7 @@ void SSBDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void SSBDemodGUI::channelMarkerHighlightedByCursor() @@ -154,14 +154,14 @@ void SSBDemodGUI::on_audioBinaural_toggled(bool binaural) { m_audioBinaural = binaural; m_settings.m_audioBinaural = binaural; - applySettings(); + applySettings(QStringList("audioBinaural")); } void SSBDemodGUI::on_audioFlipChannels_toggled(bool flip) { m_audioFlipChannels = flip; m_settings.m_audioFlipChannels = flip; - applySettings(); + applySettings(QStringList("audioFlipChannels")); } void SSBDemodGUI::on_dsb_toggled(bool dsb) @@ -175,7 +175,7 @@ void SSBDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void SSBDemodGUI::on_BW_valueChanged(int value) @@ -195,27 +195,27 @@ void SSBDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value)); m_settings.m_volume = CalcDb::powerFromdB(value); - applySettings(); + applySettings(QStringList("volume")); } void SSBDemodGUI::on_agc_toggled(bool checked) { m_settings.m_agc = checked; - applySettings(); + applySettings(QStringList("agc")); displayAGC(); } void SSBDemodGUI::on_agcClamping_toggled(bool checked) { m_settings.m_agcClamping = checked; - applySettings(); + applySettings(QStringList("agcClamping")); } void SSBDemodGUI::on_dnr_toggled(bool checked) { m_settings.m_dnr = checked; m_settings.m_filterBank[m_settings.m_filterIndex].m_dnr = m_settings.m_dnr; - applySettings(); + applySettings(QStringList({"dnr", "filterBank"})); } void SSBDemodGUI::on_agcTimeLog2_valueChanged(int value) @@ -223,14 +223,14 @@ void SSBDemodGUI::on_agcTimeLog2_valueChanged(int value) QString s = QString::number((1<agcTimeText->setText(s); m_settings.m_agcTimeLog2 = value; - applySettings(); + applySettings(QStringList("agcTimeLog2")); } void SSBDemodGUI::on_agcPowerThreshold_valueChanged(int value) { displayAGCPowerThreshold(value); m_settings.m_agcPowerThreshold = value; - applySettings(); + applySettings(QStringList("agcPowerThreshold")); } void SSBDemodGUI::on_agcThresholdGate_valueChanged(int value) @@ -239,14 +239,14 @@ void SSBDemodGUI::on_agcThresholdGate_valueChanged(int value) QString s = QString::number(agcThresholdGate, 'f', 0); ui->agcThresholdGateText->setText(s); m_settings.m_agcThresholdGate = agcThresholdGate; - applySettings(); + applySettings(QStringList("agcThresholdGate")); } void SSBDemodGUI::on_audioMute_toggled(bool checked) { m_audioMute = checked; m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void SSBDemodGUI::on_spanLog2_valueChanged(int value) @@ -258,6 +258,8 @@ void SSBDemodGUI::on_spanLog2_valueChanged(int value) } applyBandwidths(s2max - ui->spanLog2->value()); + m_settings.m_filterBank[m_settings.m_filterIndex].m_spanLog2 = s2max - ui->spanLog2->value(); + applySettings(QStringList({"spanLog2", "filterBank"})); } void SSBDemodGUI::on_flipSidebands_clicked(bool checked) @@ -272,7 +274,7 @@ void SSBDemodGUI::on_flipSidebands_clicked(bool checked) void SSBDemodGUI::on_fftWindow_currentIndexChanged(int index) { m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow = (FFTWindow::Function) index; - applySettings(); + applySettings(QStringList({"fftWindow", "filterBank"})); } void SSBDemodGUI::on_filterIndex_valueChanged(int value) @@ -339,7 +341,16 @@ void SSBDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -351,7 +362,7 @@ void SSBDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : @@ -458,11 +469,11 @@ bool SSBDemodGUI::blockApplySettings(bool block) return ret; } -void SSBDemodGUI::applySettings(bool force) +void SSBDemodGUI::applySettings(const QStringList& channelSettingsKeys, bool force) { if (m_doApplySettings) { - SSBDemod::MsgConfigureSSBDemod* message = SSBDemod::MsgConfigureSSBDemod::create( m_settings, force); + SSBDemod::MsgConfigureSSBDemod* message = SSBDemod::MsgConfigureSSBDemod::create(channelSettingsKeys, m_settings, force); m_ssbDemod->getInputMessageQueue()->push(message); } } @@ -597,7 +608,13 @@ void SSBDemodGUI::applyBandwidths(unsigned int spanLog2, bool force) m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth = bw * 100; m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff = lw * 100; - applySettings(force); + applySettings(QStringList({ + "dsb", + "spanLog2", + "rfBandwidth", + "lowCutoff", + "filterBank" + }), force); bool wasBlocked = blockApplySettings(true); m_channelMarker.setBandwidth(bw * 200); @@ -772,7 +789,7 @@ void SSBDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -805,27 +822,27 @@ void SSBDemodGUI::dnrSetup(int32_t iValueChanged) case FFTNRDialog::ValueChanged::ChangedScheme: m_settings.m_dnrScheme = m_fftNRDialog->getScheme(); m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrScheme = m_settings.m_dnrScheme; - applySettings(); + applySettings(QStringList({"dnrScheme", "filterBank"})); break; case FFTNRDialog::ValueChanged::ChangedAboveAvgFactor: m_settings.m_dnrAboveAvgFactor = m_fftNRDialog->getAboveAvgFactor(); m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrAboveAvgFactor = m_settings.m_dnrAboveAvgFactor; - applySettings(); + applySettings(QStringList({"dnrAboveAvgFactor", "filterBank"})); break; case FFTNRDialog::ValueChanged::ChangedSigmaFactor: m_settings.m_dnrSigmaFactor = m_fftNRDialog->getSigmaFactor(); m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrSigmaFactor = m_settings.m_dnrSigmaFactor; - applySettings(); + applySettings(QStringList({"dnrSigmaFactor", "filterBank"})); break; case FFTNRDialog::ValueChanged::ChangedNbPeaks: m_settings.m_dnrNbPeaks = m_fftNRDialog->getNbPeaks(); m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrNbPeaks = m_settings.m_dnrNbPeaks; - applySettings(); + applySettings(QStringList({"dnrNbPeaks", "filterBank"})); break; case FFTNRDialog::ValueChanged::ChangedAlpha: m_settings.m_dnrAlpha = m_fftNRDialog->getAlpha(); m_settings.m_filterBank[m_settings.m_filterIndex].m_dnrAlpha = m_settings.m_dnrAlpha; - applySettings(); + applySettings(QStringList({"dnrAlpha", "filterBank"})); break; default: break; diff --git a/plugins/channelrx/demodssb/ssbdemodgui.h b/plugins/channelrx/demodssb/ssbdemodgui.h index 9fa2a9ae7..df4f3f3db 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.h +++ b/plugins/channelrx/demodssb/ssbdemodgui.h @@ -98,7 +98,7 @@ private: virtual ~SSBDemodGUI(); bool blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& channelSettingsKeys, bool force = false); void applyBandwidths(unsigned int spanLog2, bool force = false); unsigned int spanLog2Max(); void displaySettings(); diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.cpp b/plugins/channelrx/demodssb/ssbdemodsettings.cpp index 4758be76a..83edb3e4b 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsettings.cpp @@ -235,3 +235,195 @@ bool SSBDemodSettings::deserialize(const QByteArray& data) return false; } } + +void SSBDemodSettings::applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("audioBinaural")) { + m_audioBinaural = settings.m_audioBinaural; + } + if (settingsKeys.contains("audioFlipChannels")) { + m_audioFlipChannels = settings.m_audioFlipChannels; + } + if (settingsKeys.contains("dsb")) { + m_dsb = settings.m_dsb; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("agc")) { + m_agc = settings.m_agc; + } + if (settingsKeys.contains("agcClamping")) { + m_agcClamping = settings.m_agcClamping; + } + if (settingsKeys.contains("agcTimeLog2")) { + m_agcTimeLog2 = settings.m_agcTimeLog2; + } + if (settingsKeys.contains("agcPowerThreshold")) { + m_agcPowerThreshold = settings.m_agcPowerThreshold; + } + if (settingsKeys.contains("agcThresholdGate")) { + m_agcThresholdGate = settings.m_agcThresholdGate; + } + if (settingsKeys.contains("dnr")) { + m_dnr = settings.m_dnr; + } + if (settingsKeys.contains("dnrScheme")) { + m_dnrScheme = settings.m_dnrScheme; + } + if (settingsKeys.contains("dnrAboveAvgFactor")) { + m_dnrAboveAvgFactor = settings.m_dnrAboveAvgFactor; + } + if (settingsKeys.contains("dnrSigmaFactor")) { + m_dnrSigmaFactor = settings.m_dnrSigmaFactor; + } + if (settingsKeys.contains("dnrNbPeaks")) { + m_dnrNbPeaks = settings.m_dnrNbPeaks; + } + if (settingsKeys.contains("dnrAlpha")) { + m_dnrAlpha = settings.m_dnrAlpha; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("filterBank")) { + m_filterBank = settings.m_filterBank; + } + if (settingsKeys.contains("filterIndex")) { + m_filterIndex = settings.m_filterIndex; + } +} + +QString SSBDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("audioBinaural") || force) { + ostr << " m_audioBinaural: " << m_audioBinaural; + } + if (settingsKeys.contains("audioFlipChannels") || force) { + ostr << " m_audioFlipChannels: " << m_audioFlipChannels; + } + if (settingsKeys.contains("dsb") || force) { + ostr << " m_dsb: " << m_dsb; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("agc") || force) { + ostr << " m_agc: " << m_agc; + } + if (settingsKeys.contains("agcClamping") || force) { + ostr << " m_agcClamping: " << m_agcClamping; + } + if (settingsKeys.contains("agcTimeLog2") || force) { + ostr << " m_agcTimeLog2: " << m_agcTimeLog2; + } + if (settingsKeys.contains("agcPowerThreshold") || force) { + ostr << " m_agcPowerThreshold: " << m_agcPowerThreshold; + } + if (settingsKeys.contains("agcThresholdGate") || force) { + ostr << " m_agcThresholdGate: " << m_agcThresholdGate; + } + if (settingsKeys.contains("dnr") || force) { + ostr << " m_dnr: " << m_dnr; + } + if (settingsKeys.contains("dnrScheme") || force) { + ostr << " m_dnrScheme: " << m_dnrScheme; + } + if (settingsKeys.contains("dnrAboveAvgFactor") || force) { + ostr << " m_dnrAboveAvgFactor: " << m_dnrAboveAvgFactor; + } + if (settingsKeys.contains("dnrSigmaFactor") || force) { + ostr << " m_dnrSigmaFactor: " << m_dnrSigmaFactor; + } + if (settingsKeys.contains("dnrNbPeaks") || force) { + ostr << " m_dnrNbPeaks: " << m_dnrNbPeaks; + } + if (settingsKeys.contains("dnrAlpha") || force) { + ostr << " m_dnrAlpha: " << m_dnrAlpha; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + if (settingsKeys.contains("filterIndex") || force) { + ostr << " m_filterIndex: " << m_filterIndex; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.h b/plugins/channelrx/demodssb/ssbdemodsettings.h index 47b33ed8e..bf3e19482 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.h +++ b/plugins/channelrx/demodssb/ssbdemodsettings.h @@ -98,6 +98,8 @@ struct SSBDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static const int m_minPowerThresholdDB; static const float m_mminPowerThresholdDBf; diff --git a/plugins/channelrx/demodssb/ssbdemodsink.cpp b/plugins/channelrx/demodssb/ssbdemodsink.cpp index 42c9e2ef2..3eda06678 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsink.cpp @@ -76,7 +76,7 @@ SSBDemodSink::SSBDemodSink() : m_lowpassQ.create(101, m_audioSampleRate, m_Bandwidth * 1.2); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } SSBDemodSink::~SSBDemodSink() @@ -342,39 +342,9 @@ void SSBDemodSink::applyAudioSampleRate(int sampleRate) } } -void SSBDemodSink::applySettings(const SSBDemodSettings& settings, bool force) +void SSBDemodSink::applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force) { - qDebug() << "SSBDemodSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_filterIndex: " << settings.m_filterIndex - << " [m_spanLog2: " << settings.m_filterBank[settings.m_filterIndex].m_spanLog2 - << " m_rfBandwidth: " << settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth - << " m_lowCutoff: " << settings.m_filterBank[settings.m_filterIndex].m_lowCutoff - << " m_fftWindow: " << settings.m_filterBank[settings.m_filterIndex].m_fftWindow << "]" - << " m_volume: " << settings.m_volume - << " m_audioBinaual: " << settings.m_audioBinaural - << " m_audioFlipChannels: " << settings.m_audioFlipChannels - << " m_dsb: " << settings.m_dsb - << " m_audioMute: " << settings.m_audioMute - << " m_agcActive: " << settings.m_agc - << " m_agcClamping: " << settings.m_agcClamping - << " m_agcTimeLog2: " << settings.m_agcTimeLog2 - << " agcPowerThreshold: " << settings.m_agcPowerThreshold - << " agcThresholdGate: " << settings.m_agcThresholdGate - << " m_dnr: " << settings.m_dnr - << " m_dnrScheme: " << settings.m_dnrScheme - << " m_dnrAboveAvgFactor: " << settings.m_dnrAboveAvgFactor - << " m_dnrSigmaFactor: " << settings.m_dnrSigmaFactor - << " m_dnrNbPeaks: " << settings.m_dnrNbPeaks - << " m_dnrAlpha: " << settings.m_dnrAlpha - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "SSBDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); if((m_settings.m_filterBank[m_settings.m_filterIndex].m_rfBandwidth != settings.m_filterBank[settings.m_filterIndex].m_rfBandwidth) || (m_settings.m_filterBank[m_settings.m_filterIndex].m_lowCutoff != settings.m_filterBank[settings.m_filterIndex].m_lowCutoff) || @@ -412,16 +382,16 @@ void SSBDemodSink::applySettings(const SSBDemodSettings& settings, bool force) m_lowpassQ.create(101, m_audioSampleRate, m_Bandwidth * 1.2); } - if ((m_settings.m_volume != settings.m_volume) || force) + if ((settingsKeys.contains("volume")) || force) { m_volume = settings.m_volume; m_volume /= 4.0; // for 3276.8 } - if ((m_settings.m_agcTimeLog2 != settings.m_agcTimeLog2) || - (m_settings.m_agcPowerThreshold != settings.m_agcPowerThreshold) || - (m_settings.m_agcThresholdGate != settings.m_agcThresholdGate) || - (m_settings.m_agcClamping != settings.m_agcClamping) || force) + if ((settingsKeys.contains("agcTimeLog2")) || + (settingsKeys.contains("agcPowerThreshold")) || + (settingsKeys.contains("agcThresholdGate")) || + (settingsKeys.contains("agcClamping")) || force) { int agcNbSamples = (m_audioSampleRate / 1000) * (1<setDNRScheme((FFTNoiseReduction::Scheme) settings.m_dnrScheme); } - if ((m_settings.m_dnrAboveAvgFactor != settings.m_dnrAboveAvgFactor) || force) { + if ((settingsKeys.contains("dnrAboveAvgFactor")) || force) { SSBFilter->setDNRAboveAvgFactor(settings.m_dnrAboveAvgFactor); } - if ((m_settings.m_dnrSigmaFactor != settings.m_dnrSigmaFactor) || force) { + if ((settingsKeys.contains("dnrSigmaFactor")) || force) { SSBFilter->setDNRSigmaFactor(settings.m_dnrSigmaFactor); } - if ((m_settings.m_dnrNbPeaks != settings.m_dnrNbPeaks) || force) { + if ((settingsKeys.contains("dnrNbPeaks")) || force) { SSBFilter->setDNRNbPeaks(settings.m_dnrNbPeaks); } - if ((m_settings.m_dnrAlpha != settings.m_dnrAlpha) || force) { + if ((settingsKeys.contains("dnrAlpha")) || force) { SSBFilter->setDNRAlpha(settings.m_dnrAlpha); } @@ -490,5 +460,10 @@ void SSBDemodSink::applySettings(const SSBDemodSettings& settings, bool force) m_dsb = settings.m_dsb; m_audioMute = settings.m_audioMute; m_agcActive = settings.m_agc; - m_settings = settings; + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodssb/ssbdemodsink.h b/plugins/channelrx/demodssb/ssbdemodsink.h index 918c00697..28ee4c37c 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.h +++ b/plugins/channelrx/demodssb/ssbdemodsink.h @@ -43,7 +43,7 @@ public: void setSpectrumSink(SpectrumVis* spectrumSink) { m_spectrumSink = spectrumSink; } void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false); - void applySettings(const SSBDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const SSBDemodSettings& settings, bool force = false); void applyAudioSampleRate(int sampleRate); AudioFifo *getAudioFifo() { return &m_audioFifo; } diff --git a/plugins/channelrx/demodvor/vordemod.cpp b/plugins/channelrx/demodvor/vordemod.cpp index fe6392ea6..f9a47fa5b 100644 --- a/plugins/channelrx/demodvor/vordemod.cpp +++ b/plugins/channelrx/demodvor/vordemod.cpp @@ -60,7 +60,7 @@ VORDemod::VORDemod(DeviceAPI *deviceAPI) : m_basebandSampleRate(0) { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -143,7 +143,7 @@ void VORDemod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - VORDemodBaseband::MsgConfigureVORDemodBaseband *msg = VORDemodBaseband::MsgConfigureVORDemodBaseband::create(m_settings, true); + VORDemodBaseband::MsgConfigureVORDemodBaseband *msg = VORDemodBaseband::MsgConfigureVORDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -168,7 +168,7 @@ bool VORDemod::handleMessage(const Message& cmd) { MsgConfigureVORDemod& cfg = (MsgConfigureVORDemod&) cmd; qDebug() << "VORDemod::handleMessage: MsgConfigureVORDemod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -247,65 +247,20 @@ void VORDemod::setCenterFrequency(qint64 frequency) { VORDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureVORDemod *msgToGUI = MsgConfigureVORDemod::create(settings, false); + MsgConfigureVORDemod *msgToGUI = MsgConfigureVORDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void VORDemod::applySettings(const VORDemodSettings& settings, bool force) +void VORDemod::applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force) { - qDebug() << "VORDemod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_navId: " << settings.m_navId - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_identBandpassEnable: " << settings.m_identBandpassEnable - << " m_audioMute: " << settings.m_audioMute - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "VORDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((m_settings.m_navId != settings.m_navId) || force) { - reverseAPIKeys.append("navId"); - - // Reset state so we don't report old data for new NavId - m_radial = 0.0f; - m_refMag = -200.0f; - m_varMag = -200.0f; - m_morseIdent = ""; - } - if ((m_settings.m_squelch != settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - - if ((m_settings.m_audioMute != settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((m_settings.m_identBandpassEnable != settings.m_identBandpassEnable) || force) { - reverseAPIKeys.append("identBandpassEnable"); - } - if ((m_settings.m_volume != settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -316,35 +271,29 @@ void VORDemod::applySettings(const VORDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); - } - - if ((m_settings.m_identThreshold != settings.m_identThreshold) || force) { - reverseAPIKeys.append("identThreshold"); } if (m_running) { - VORDemodBaseband::MsgConfigureVORDemodBaseband *msg = VORDemodBaseband::MsgConfigureVORDemodBaseband::create(settings, force); + VORDemodBaseband::MsgConfigureVORDemodBaseband *msg = VORDemodBaseband::MsgConfigureVORDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) || settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -359,14 +308,14 @@ bool VORDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureVORDemod *msg = MsgConfigureVORDemod::create(m_settings, true); + MsgConfigureVORDemod *msg = MsgConfigureVORDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureVORDemod *msg = MsgConfigureVORDemod::create(m_settings, true); + MsgConfigureVORDemod *msg = MsgConfigureVORDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -402,13 +351,13 @@ int VORDemod::webapiSettingsPutPatch( VORDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureVORDemod *msg = MsgConfigureVORDemod::create(settings, force); + MsgConfigureVORDemod *msg = MsgConfigureVORDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("VORDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureVORDemod *msgToGUI = MsgConfigureVORDemod::create(settings, force); + MsgConfigureVORDemod *msgToGUI = MsgConfigureVORDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -585,7 +534,7 @@ void VORDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response } } -void VORDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const VORDemodSettings& settings, bool force) +void VORDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const VORDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -612,7 +561,7 @@ void VORDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co void VORDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const VORDemodSettings& settings, bool force) { @@ -655,7 +604,7 @@ void VORDemod::sendChannelReport(QList& messagePipes) } void VORDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const VORDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodvor/vordemod.h b/plugins/channelrx/demodvor/vordemod.h index 61816fe60..d94774bfa 100644 --- a/plugins/channelrx/demodvor/vordemod.h +++ b/plugins/channelrx/demodvor/vordemod.h @@ -47,20 +47,23 @@ public: public: const VORDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureVORDemod* create(const VORDemodSettings& settings, bool force) + static MsgConfigureVORDemod* create(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force) { - return new MsgConfigureVORDemod(settings, force); + return new MsgConfigureVORDemod(settingsKeys, settings, force); } private: VORDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureVORDemod(const VORDemodSettings& settings, bool force) : + MsgConfigureVORDemod(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -162,18 +165,18 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const VORDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const VORDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const VORDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const VORDemodSettings& settings, bool force ); void sendChannelReport(QList& messagePipes); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const VORDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodvor/vordemodbaseband.cpp b/plugins/channelrx/demodvor/vordemodbaseband.cpp index 7d140b724..8bd61312a 100644 --- a/plugins/channelrx/demodvor/vordemodbaseband.cpp +++ b/plugins/channelrx/demodvor/vordemodbaseband.cpp @@ -133,7 +133,7 @@ bool VORDemodBaseband::handleMessage(const Message& cmd) MsgConfigureVORDemodBaseband& cfg = (MsgConfigureVORDemodBaseband&) cmd; qDebug() << "VORDemodBaseband::handleMessage: MsgConfigureVORDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -160,9 +160,9 @@ bool VORDemodBaseband::handleMessage(const Message& cmd) } } -void VORDemodBaseband::applySettings(const VORDemodSettings& settings, bool force) +void VORDemodBaseband::applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer.setChannelization(m_sink.getAudioSampleRate(), settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset()); @@ -174,7 +174,7 @@ void VORDemodBaseband::applySettings(const VORDemodSettings& settings, bool forc } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -191,7 +191,11 @@ void VORDemodBaseband::applySettings(const VORDemodSettings& settings, bool forc } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodvor/vordemodbaseband.h b/plugins/channelrx/demodvor/vordemodbaseband.h index 93ecf48fa..2eae96924 100644 --- a/plugins/channelrx/demodvor/vordemodbaseband.h +++ b/plugins/channelrx/demodvor/vordemodbaseband.h @@ -39,20 +39,23 @@ public: public: const VORDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureVORDemodBaseband* create(const VORDemodSettings& settings, bool force) + static MsgConfigureVORDemodBaseband* create(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force) { - return new MsgConfigureVORDemodBaseband(settings, force); + return new MsgConfigureVORDemodBaseband(settingsKeys, settings, force); } private: VORDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureVORDemodBaseband(const VORDemodSettings& settings, bool force) : + MsgConfigureVORDemodBaseband(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -85,7 +88,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const VORDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodvor/vordemodgui.cpp b/plugins/channelrx/demodvor/vordemodgui.cpp index 8ea23389c..f882b025d 100644 --- a/plugins/channelrx/demodvor/vordemodgui.cpp +++ b/plugins/channelrx/demodvor/vordemodgui.cpp @@ -54,7 +54,7 @@ void VORDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray VORDemodGUI::serialize() const @@ -66,7 +66,7 @@ bool VORDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -178,7 +178,7 @@ void VORDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void VORDemodGUI::channelMarkerHighlightedByCursor() @@ -191,40 +191,40 @@ void VORDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void VORDemodGUI::on_thresh_valueChanged(int value) { ui->threshText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_identThreshold = value / 10.0; - applySettings(); + applySettings(QStringList("identThreshold")); } void VORDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volume = value / 10.0; - applySettings(); + applySettings(QStringList("volume")); } void VORDemodGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1 dB").arg(value)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList("squelch")); } void VORDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void VORDemodGUI::on_identBandpassEnable_toggled(bool checked) { m_settings.m_identBandpassEnable = checked; - applySettings(); + applySettings(QStringList("identBandpassEnable")); } void VORDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -233,7 +233,7 @@ void VORDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void VORDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -278,7 +278,9 @@ void VORDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ "rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex" })); } resetContextMenuType(); @@ -337,7 +339,7 @@ VORDemodGUI::VORDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -352,11 +354,11 @@ void VORDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void VORDemodGUI::applySettings(bool force) +void VORDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - VORDemod::MsgConfigureVORDemod* message = VORDemod::MsgConfigureVORDemod::create( m_settings, force); + VORDemod::MsgConfigureVORDemod* message = VORDemod::MsgConfigureVORDemod::create(settingsKeys, m_settings, force); m_vorDemod->getInputMessageQueue()->push(message); } } @@ -420,7 +422,7 @@ void VORDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } diff --git a/plugins/channelrx/demodvor/vordemodgui.h b/plugins/channelrx/demodvor/vordemodgui.h index c8e9b9a41..9763259e0 100644 --- a/plugins/channelrx/demodvor/vordemodgui.h +++ b/plugins/channelrx/demodvor/vordemodgui.h @@ -83,7 +83,7 @@ private: virtual ~VORDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channelrx/demodvor/vordemodsettings.cpp b/plugins/channelrx/demodvor/vordemodsettings.cpp index f14cd1a96..32eee8a2c 100644 --- a/plugins/channelrx/demodvor/vordemodsettings.cpp +++ b/plugins/channelrx/demodvor/vordemodsettings.cpp @@ -166,4 +166,137 @@ bool VORDemodSettings::deserialize(const QByteArray& data) } } +void VORDemodSettings::applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("navId")) { + m_navId = settings.m_navId; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("identBandpassEnable")) { + m_identBandpassEnable = settings.m_identBandpassEnable; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("identThreshold")) { + m_identThreshold = settings.m_identThreshold; + } + if (settingsKeys.contains("refThresholdDB")) { + m_refThresholdDB = settings.m_refThresholdDB; + } + if (settingsKeys.contains("varThresholdDB")) { + m_varThresholdDB = settings.m_varThresholdDB; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString VORDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("navId") || force) { + ostr << " m_navId: " << m_navId; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("identBandpassEnable") || force) { + ostr << " m_identBandpassEnable: " << m_identBandpassEnable; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("identThreshold") || force) { + ostr << " m_identThreshold: " << m_identThreshold; + } + if (settingsKeys.contains("refThresholdDB") || force) { + ostr << " m_refThresholdDB: " << m_refThresholdDB; + } + if (settingsKeys.contains("varThresholdDB") || force) { + ostr << " m_varThresholdDB: " << m_varThresholdDB; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodvor/vordemodsettings.h b/plugins/channelrx/demodvor/vordemodsettings.h index 981b0de84..c3057117c 100644 --- a/plugins/channelrx/demodvor/vordemodsettings.h +++ b/plugins/channelrx/demodvor/vordemodsettings.h @@ -69,6 +69,8 @@ struct VORDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_VORDEMODSCSETTINGS_H */ diff --git a/plugins/channelrx/demodvor/vordemodsink.cpp b/plugins/channelrx/demodvor/vordemodsink.cpp index b60d43c4b..3f497436b 100644 --- a/plugins/channelrx/demodvor/vordemodsink.cpp +++ b/plugins/channelrx/demodvor/vordemodsink.cpp @@ -49,7 +49,7 @@ VORDemodSCSink::VORDemodSCSink() : m_magsq = 0.0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -281,21 +281,15 @@ void VORDemodSCSink::applyChannelSettings(int channelSampleRate, int channelFreq m_channelFrequencyOffset = channelFrequencyOffset; } -void VORDemodSCSink::applySettings(const VORDemodSettings& settings, bool force) +void VORDemodSCSink::applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force) { - qDebug() << "VORDemodSCSink::applySettings:" - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_identBandpassEnable: " << settings.m_identBandpassEnable - << " force: " << force; + qDebug() << "VORDemodSCSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((m_settings.m_squelch != settings.m_squelch) || force) { + if ((settingsKeys.contains("squelch") && (m_settings.m_squelch != settings.m_squelch)) || force) { m_squelchLevel = CalcDb::powerFromdB(settings.m_squelch); } - if (m_settings.m_navId != settings.m_navId) + if ((settingsKeys.contains("navId") && (m_settings.m_navId != settings.m_navId)) || force) { // Reset state when navId changes, so we don't report old ident for new navId m_morseDemod.reset(); @@ -303,7 +297,7 @@ void VORDemodSCSink::applySettings(const VORDemodSettings& settings, bool force) m_varGoertzel.reset(); } - if ((m_settings.m_identBandpassEnable != settings.m_identBandpassEnable) || force) + if ((settingsKeys.contains("identBandpassEnable") && (m_settings.m_identBandpassEnable != settings.m_identBandpassEnable)) || force) { if (settings.m_identBandpassEnable) { m_bandpass.create(1001, m_audioSampleRate, 970.0f, 1070.0f); @@ -313,8 +307,13 @@ void VORDemodSCSink::applySettings(const VORDemodSettings& settings, bool force) //m_bandpass.printTaps("audio_bpf"); } - m_settings = settings; - m_morseDemod.applySettings(m_settings.m_identThreshold); + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } + + m_morseDemod.applySettings(settings.m_identThreshold); } void VORDemodSCSink::applyAudioSampleRate(int sampleRate) diff --git a/plugins/channelrx/demodvor/vordemodsink.h b/plugins/channelrx/demodvor/vordemodsink.h index 6257bb848..c749fa31b 100644 --- a/plugins/channelrx/demodvor/vordemodsink.h +++ b/plugins/channelrx/demodvor/vordemodsink.h @@ -44,7 +44,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const VORDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const VORDemodSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue); void applyAudioSampleRate(int sampleRate); diff --git a/plugins/channelrx/demodwfm/wfmdemod.cpp b/plugins/channelrx/demodwfm/wfmdemod.cpp index 9415100a4..c11629fbc 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.cpp +++ b/plugins/channelrx/demodwfm/wfmdemod.cpp @@ -61,7 +61,7 @@ WFMDemod::WFMDemod(DeviceAPI* deviceAPI) : m_basebandSampleRate(0) { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -145,7 +145,7 @@ void WFMDemod::start() m_basebandSink->reset(); m_thread->start(); - WFMDemodBaseband::MsgConfigureWFMDemodBaseband *msg = WFMDemodBaseband::MsgConfigureWFMDemodBaseband::create(m_settings, true); + WFMDemodBaseband::MsgConfigureWFMDemodBaseband *msg = WFMDemodBaseband::MsgConfigureWFMDemodBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -170,7 +170,7 @@ bool WFMDemod::handleMessage(const Message& cmd) MsgConfigureWFMDemod& cfg = (MsgConfigureWFMDemod&) cmd; qDebug("WFMDemod::handleMessage: MsgConfigureWFMDemod"); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -211,64 +211,20 @@ void WFMDemod::setCenterFrequency(qint64 frequency) { WFMDemodSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureWFMDemod *msgToGUI = MsgConfigureWFMDemod::create(settings, false); + MsgConfigureWFMDemod *msgToGUI = MsgConfigureWFMDemod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void WFMDemod::applySettings(const WFMDemodSettings& settings, bool force) +void WFMDemod::applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force) { - qDebug() << "WFMDemod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_audioMute: " << settings.m_audioMute - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "WFMDemod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { - reverseAPIKeys.append("afBandwidth"); - } - if((settings.m_volume != m_settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if((settings.m_squelch != m_settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if((settings.m_audioMute != m_settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -279,34 +235,36 @@ void WFMDemod::applySettings(const WFMDemodSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - WFMDemodBaseband::MsgConfigureWFMDemodBaseband *msg = WFMDemodBaseband::MsgConfigureWFMDemodBaseband::create(settings, force); + WFMDemodBaseband::MsgConfigureWFMDemodBaseband *msg = WFMDemodBaseband::MsgConfigureWFMDemodBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray WFMDemod::serialize() const @@ -318,14 +276,14 @@ bool WFMDemod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(m_settings, true); + MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(m_settings, true); + MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -381,13 +339,13 @@ int WFMDemod::webapiSettingsPutPatch( WFMDemodSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(settings, force); + MsgConfigureWFMDemod *msg = MsgConfigureWFMDemod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("WFMDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureWFMDemod *msgToGUI = MsgConfigureWFMDemod::create(settings, force); + MsgConfigureWFMDemod *msgToGUI = MsgConfigureWFMDemod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -545,7 +503,7 @@ void WFMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response response.getWfmDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); } -void WFMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const WFMDemodSettings& settings, bool force) +void WFMDemod::webapiReverseSendSettings(const QList& channelSettingsKeys, const WFMDemodSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -572,7 +530,7 @@ void WFMDemod::webapiReverseSendSettings(QList& channelSettingsKeys, co void WFMDemod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const WFMDemodSettings& settings, bool force) { @@ -596,7 +554,7 @@ void WFMDemod::sendChannelSettings( } void WFMDemod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const WFMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodwfm/wfmdemod.h b/plugins/channelrx/demodwfm/wfmdemod.h index df9d15b96..94e822c26 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.h +++ b/plugins/channelrx/demodwfm/wfmdemod.h @@ -46,20 +46,23 @@ public: public: const WFMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureWFMDemod* create(const WFMDemodSettings& settings, bool force) + static MsgConfigureWFMDemod* create(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force) { - return new MsgConfigureWFMDemod(settings, force); + return new MsgConfigureWFMDemod(settingsKeys, settings, force); } private: WFMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureWFMDemod(const WFMDemodSettings& settings, bool force) : + MsgConfigureWFMDemod(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -157,18 +160,18 @@ private: static const int m_udpBlockSize; virtual bool handleMessage(const Message& cmd); - void applySettings(const WFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const WFMDemodSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const WFMDemodSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const WFMDemodSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const WFMDemodSettings& settings, bool force diff --git a/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp b/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp index 4e8d2cf41..e5bc8fb76 100644 --- a/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp @@ -120,7 +120,7 @@ bool WFMDemodBaseband::handleMessage(const Message& cmd) MsgConfigureWFMDemodBaseband& cfg = (MsgConfigureWFMDemodBaseband&) cmd; qDebug() << "WFMDemodBaseband::handleMessage: MsgConfigureWFMDemodBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -147,10 +147,10 @@ bool WFMDemodBaseband::handleMessage(const Message& cmd) } } -void WFMDemodBaseband::applySettings(const WFMDemodSettings& settings, bool force) +void WFMDemodBaseband::applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force) { - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("rfBandwidth") && settings.m_rfBandwidth != m_settings.m_rfBandwidth) + || (settingsKeys.contains("inputFrequencyOffset") && settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { m_channelizer->setChannelization(WFMDemodSettings::requiredBW(settings.m_rfBandwidth), settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); @@ -162,7 +162,7 @@ void WFMDemodBaseband::applySettings(const WFMDemodSettings& settings, bool forc } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -176,9 +176,13 @@ void WFMDemodBaseband::applySettings(const WFMDemodSettings& settings, bool forc } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int WFMDemodBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/demodwfm/wfmdemodbaseband.h b/plugins/channelrx/demodwfm/wfmdemodbaseband.h index b2d2e4484..aeb3a8c7e 100644 --- a/plugins/channelrx/demodwfm/wfmdemodbaseband.h +++ b/plugins/channelrx/demodwfm/wfmdemodbaseband.h @@ -42,20 +42,23 @@ public: public: const WFMDemodSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureWFMDemodBaseband* create(const WFMDemodSettings& settings, bool force) + static MsgConfigureWFMDemodBaseband* create(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force) { - return new MsgConfigureWFMDemodBaseband(settings, force); + return new MsgConfigureWFMDemodBaseband(settingsKeys, settings, force); } private: WFMDemodSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureWFMDemodBaseband(const WFMDemodSettings& settings, bool force) : + MsgConfigureWFMDemodBaseband(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: QDateTime m_audioFifoErrorDateTime; bool handleMessage(const Message& cmd); - void applySettings(const WFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.cpp b/plugins/channelrx/demodwfm/wfmdemodgui.cpp index bae2b95c4..d3a07875b 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodgui.cpp @@ -54,7 +54,7 @@ void WFMDemodGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(); + applySettings(QStringList(), true); } QByteArray WFMDemodGUI::serialize() const @@ -66,7 +66,7 @@ bool WFMDemodGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -119,7 +119,7 @@ void WFMDemodGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void WFMDemodGUI::channelMarkerHighlightedByCursor() @@ -132,41 +132,41 @@ void WFMDemodGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void WFMDemodGUI::on_rfBW_changed(quint64 value) { m_channelMarker.setBandwidth(value); m_settings.m_rfBandwidth = value; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void WFMDemodGUI::on_afBW_valueChanged(int value) { ui->afBWText->setText(QString("%1 kHz").arg(value)); m_settings.m_afBandwidth = value * 1000.0; - applySettings(); + applySettings(QStringList("afBandwidth")); } void WFMDemodGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volume = value / 10.0; - applySettings(); + applySettings(QStringList("volume")); } void WFMDemodGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1 dB").arg(value)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList("squelch")); } void WFMDemodGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void WFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -175,7 +175,7 @@ void WFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void WFMDemodGUI::onMenuDialogCalled(const QPoint &p) @@ -220,7 +220,7 @@ void WFMDemodGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"}), true); } resetContextMenuType(); @@ -284,7 +284,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -298,11 +298,11 @@ void WFMDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void WFMDemodGUI::applySettings(bool force) +void WFMDemodGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - WFMDemod::MsgConfigureWFMDemod* msgConfig = WFMDemod::MsgConfigureWFMDemod::create( m_settings, force); + WFMDemod::MsgConfigureWFMDemod* msgConfig = WFMDemod::MsgConfigureWFMDemod::create(settingsKeys, m_settings, force); m_wfmDemod->getInputMessageQueue()->push(msgConfig); } } @@ -362,7 +362,7 @@ void WFMDemodGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.h b/plugins/channelrx/demodwfm/wfmdemodgui.h index 271457403..80c19ae80 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.h +++ b/plugins/channelrx/demodwfm/wfmdemodgui.h @@ -87,7 +87,7 @@ private: virtual ~WFMDemodGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channelrx/demodwfm/wfmdemodsettings.cpp b/plugins/channelrx/demodwfm/wfmdemodsettings.cpp index fe2e2fe4f..661f792ee 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsettings.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodsettings.cpp @@ -163,3 +163,120 @@ bool WFMDemodSettings::deserialize(const QByteArray& data) return false; } } + +void WFMDemodSettings::applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth")) { + m_afBandwidth = settings.m_afBandwidth; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString WFMDemodSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth") || force) { + ostr << " m_afBandwidth: " << m_afBandwidth; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/demodwfm/wfmdemodsettings.h b/plugins/channelrx/demodwfm/wfmdemodsettings.h index c30dd7ed8..342cbd494 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsettings.h +++ b/plugins/channelrx/demodwfm/wfmdemodsettings.h @@ -61,6 +61,8 @@ struct WFMDemodSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static int requiredBW(int rfBW) { diff --git a/plugins/channelrx/demodwfm/wfmdemodsink.cpp b/plugins/channelrx/demodwfm/wfmdemodsink.cpp index 4c1d0aaf4..e2ab7cf23 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsink.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodsink.cpp @@ -50,7 +50,7 @@ WFMDemodSink::WFMDemodSink() : m_demodBuffer.resize(1<<12); m_demodBufferFill = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -219,26 +219,12 @@ void WFMDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque m_channelFrequencyOffset = channelFrequencyOffset; } -void WFMDemodSink::applySettings(const WFMDemodSettings& settings, bool force) +void WFMDemodSink::applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force) { - qDebug() << "WFMDemodSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_audioMute: " << settings.m_audioMute - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "WFMDemodSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if((settings.m_afBandwidth != m_settings.m_afBandwidth) || - (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if((settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || + (settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { qDebug() << "WFMDemodSink::applySettings: m_interpolator.create"; m_interpolator.create(16, m_channelSampleRate, settings.m_afBandwidth); @@ -255,11 +241,15 @@ void WFMDemodSink::applySettings(const WFMDemodSettings& settings, bool force) qDebug("WFMDemodSink::applySettings: m_fmExcursion: %f", m_fmExcursion); } - if ((settings.m_squelch != m_settings.m_squelch) || force) + if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || force) { qDebug() << "WFMDemodSink::applySettings: set m_squelchLevel"; m_squelchLevel = pow(10.0, settings.m_squelch / 10.0); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/demodwfm/wfmdemodsink.h b/plugins/channelrx/demodwfm/wfmdemodsink.h index 2ad0d16b5..48098408f 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsink.h +++ b/plugins/channelrx/demodwfm/wfmdemodsink.h @@ -62,7 +62,7 @@ public: } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const WFMDemodSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WFMDemodSettings& settings, bool force = false); AudioFifo *getAudioFifo() { return &m_audioFifo; } void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); } diff --git a/plugins/channelrx/filesink/filesink.cpp b/plugins/channelrx/filesink/filesink.cpp index 486e5cf78..8d4a4d06e 100644 --- a/plugins/channelrx/filesink/filesink.cpp +++ b/plugins/channelrx/filesink/filesink.cpp @@ -62,7 +62,7 @@ FileSink::FileSink(DeviceAPI *deviceAPI) : { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -181,7 +181,7 @@ void FileSink::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - FileSinkBaseband::MsgConfigureFileSinkBaseband *msg = FileSinkBaseband::MsgConfigureFileSinkBaseband::create(m_settings, true); + FileSinkBaseband::MsgConfigureFileSinkBaseband *msg = FileSinkBaseband::MsgConfigureFileSinkBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); if (getMessageQueueToGUI()) @@ -241,7 +241,7 @@ bool FileSink::handleMessage(const Message& cmd) { MsgConfigureFileSink& cfg = (MsgConfigureFileSink&) cmd; qDebug() << "FileSink::handleMessage: MsgConfigureFileSink"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -261,14 +261,14 @@ bool FileSink::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureFileSink *msg = MsgConfigureFileSink::create(m_settings, true); + MsgConfigureFileSink *msg = MsgConfigureFileSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureFileSink *msg = MsgConfigureFileSink::create(m_settings, true); + MsgConfigureFileSink *msg = MsgConfigureFileSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -322,48 +322,11 @@ DeviceSampleSource *FileSink::getLocalDevice(uint32_t index) return nullptr; } -void FileSink::applySettings(const FileSinkSettings& settings, bool force) +void FileSink::applySettings(const QStringList& settingsKeys, const FileSinkSettings& settings, bool force) { - qDebug() << "FileSink::applySettings:" - << "m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << "m_log2Decim: " << settings.m_log2Decim - << "m_fileRecordName: " << settings.m_fileRecordName - << "force: " << force; + qDebug() << "FileSink::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_fileRecordName != m_settings.m_fileRecordName) || force) { - reverseAPIKeys.append("fileRecordName"); - } - if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((settings.m_log2Decim != m_settings.m_log2Decim) || force) { - reverseAPIKeys.append("log2Decim"); - } - if ((settings.m_spectrumSquelchMode != m_settings.m_spectrumSquelchMode) || force) { - reverseAPIKeys.append("spectrumSquelchMode"); - } - if ((settings.m_spectrumSquelch != m_settings.m_spectrumSquelch) || force) { - reverseAPIKeys.append("spectrumSquelch"); - } - if ((settings.m_preRecordTime != m_settings.m_preRecordTime) || force) { - reverseAPIKeys.append("preRecordTime"); - } - if ((settings.m_squelchPostRecordTime != m_settings.m_squelchPostRecordTime) || force) { - reverseAPIKeys.append("squelchPostRecordTime"); - } - if ((settings.m_squelchRecordingEnable != m_settings.m_squelchRecordingEnable) || force) { - reverseAPIKeys.append("squelchRecordingEnable"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -374,34 +337,40 @@ void FileSink::applySettings(const FileSinkSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - FileSinkBaseband::MsgConfigureFileSinkBaseband *msg = FileSinkBaseband::MsgConfigureFileSinkBaseband::create(settings, force); + FileSinkBaseband::MsgConfigureFileSinkBaseband *msg = FileSinkBaseband::MsgConfigureFileSinkBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if ((settings.m_useReverseAPI) && (reverseAPIKeys.size() != 0)) + if ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI)) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex))) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void FileSink::record(bool record) @@ -470,13 +439,13 @@ int FileSink::webapiSettingsPutPatch( FileSinkSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureFileSink *msg = MsgConfigureFileSink::create(settings, force); + MsgConfigureFileSink *msg = MsgConfigureFileSink::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("FileSink::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFileSink *msgToGUI = MsgConfigureFileSink::create(settings, force); + MsgConfigureFileSink *msgToGUI = MsgConfigureFileSink::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -697,7 +666,7 @@ void FileSink::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response } } -void FileSink::webapiReverseSendSettings(QList& channelSettingsKeys, const FileSinkSettings& settings, bool force) +void FileSink::webapiReverseSendSettings(const QList& channelSettingsKeys, const FileSinkSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -724,7 +693,7 @@ void FileSink::webapiReverseSendSettings(QList& channelSettingsKeys, co void FileSink::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FileSinkSettings& settings, bool force) { @@ -748,7 +717,7 @@ void FileSink::sendChannelSettings( } void FileSink::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FileSinkSettings& settings, bool force diff --git a/plugins/channelrx/filesink/filesink.h b/plugins/channelrx/filesink/filesink.h index 16079ce5a..e1c4522cf 100644 --- a/plugins/channelrx/filesink/filesink.h +++ b/plugins/channelrx/filesink/filesink.h @@ -46,20 +46,23 @@ public: public: const FileSinkSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFileSink* create(const FileSinkSettings& settings, bool force) + static MsgConfigureFileSink* create(const QStringList& settingsKeys, const FileSinkSettings& settings, bool force) { - return new MsgConfigureFileSink(settings, force); + return new MsgConfigureFileSink(settingsKeys, settings, force); } private: FileSinkSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFileSink(const FileSinkSettings& settings, bool force) : + MsgConfigureFileSink(const QStringList& settingsKeys, const FileSinkSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -177,20 +180,20 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const FileSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FileSinkSettings& settings, bool force = false); void propagateSampleRateAndFrequency(uint32_t index, uint32_t log2Decim); DeviceSampleSource *getLocalDevice(uint32_t index); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const FileSinkSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const FileSinkSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FileSinkSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FileSinkSettings& settings, bool force diff --git a/plugins/channelrx/filesink/filesinkbaseband.cpp b/plugins/channelrx/filesink/filesinkbaseband.cpp index 2e2e1c689..e1f97d427 100644 --- a/plugins/channelrx/filesink/filesinkbaseband.cpp +++ b/plugins/channelrx/filesink/filesinkbaseband.cpp @@ -153,7 +153,7 @@ bool FileSinkBaseband::handleMessage(const Message& cmd) MsgConfigureFileSinkBaseband& cfg = (MsgConfigureFileSinkBaseband&) cmd; qDebug() << "FileSinkBaseband::handleMessage: MsgConfigureFileSinkBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -197,17 +197,12 @@ bool FileSinkBaseband::handleMessage(const Message& cmd) } } -void FileSinkBaseband::applySettings(const FileSinkSettings& settings, bool force) +void FileSinkBaseband::applySettings(const QStringList& settingsKeys, const FileSinkSettings& settings, bool force) { - qDebug() << "FileSinkBaseband::applySettings:" - << "m_log2Decim:" << settings.m_log2Decim - << "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset - << "m_fileRecordName: " << settings.m_fileRecordName - << "m_centerFrequency: " << m_centerFrequency - << "force: " << force; + qDebug() << "FileSinkBaseband::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_log2Decim != m_settings.m_log2Decim) - || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("log2Decim") && (settings.m_log2Decim != m_settings.m_log2Decim)) + || (settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { int desiredSampleRate = m_channelizer.getBasebandSampleRate() / (1<glSpectrumGUI->updateSettings(); m_channelMarker.updateSettings(static_cast(m_settings.m_channelMarker)); displaySettings(); + applySettings(QStringList(), true); blockApplySettings(false); return true; } @@ -230,7 +231,7 @@ FileSinkGUI::FileSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -246,13 +247,13 @@ void FileSinkGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void FileSinkGUI::applySettings(bool force) +void FileSinkGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - FileSink::MsgConfigureFileSink* message = FileSink::MsgConfigureFileSink::create(m_settings, force); + FileSink::MsgConfigureFileSink* message = FileSink::MsgConfigureFileSink::create(settingsKeys, m_settings, force); m_fileSink->getInputMessageQueue()->push(message); } } @@ -331,7 +332,7 @@ void FileSinkGUI::channelMarkerChangedByCursor() ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); setPosFromFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void FileSinkGUI::channelMarkerHighlightedByCursor() @@ -358,7 +359,7 @@ void FileSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void FileSinkGUI::onMenuDialogCalled(const QPoint &p) @@ -403,7 +404,14 @@ void FileSinkGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList() << "rgbColor" + << "title" + << "useReverseAPI" + << "reverseAPIAddress" + << "reverseAPIPort" + << "reverseAPIDeviceIndex" + << "reverseAPIChannelIndex" + << "streamIndex"); } resetContextMenuType(); @@ -417,7 +425,7 @@ void FileSinkGUI::on_deltaFrequency_changed(qint64 value) m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); setPosFromFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -427,7 +435,7 @@ void FileSinkGUI::on_decimationFactor_currentIndexChanged(int index) applyDecimation(); displayRate(); displayPos(); - applySettings(); + applySettings(QStringList("log2Decim")); if (m_fixedPosition) { setFrequencyFromPos(); @@ -446,7 +454,7 @@ void FileSinkGUI::on_fixedPosition_toggled(bool checked) if (m_fixedPosition) { setFrequencyFromPos(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -458,7 +466,7 @@ void FileSinkGUI::on_position_valueChanged(int value) if (m_fixedPosition) { setFrequencyFromPos(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -476,35 +484,35 @@ void FileSinkGUI::on_spectrumSquelch_toggled(bool checked) ui->squelchedRecording->blockSignals(false); } - applySettings(); + applySettings(QStringList("spectrumSquelchMode")); } void FileSinkGUI::on_squelchLevel_valueChanged(int value) { m_settings.m_spectrumSquelch = value; ui->squelchLevelText->setText(tr("%1").arg(m_settings.m_spectrumSquelch)); - applySettings(); + applySettings(QStringList("spectrumSquelch")); } void FileSinkGUI::on_preRecordTime_valueChanged(int value) { m_settings.m_preRecordTime = value; ui->preRecordTimeText->setText(tr("%1").arg(m_settings.m_preRecordTime)); - applySettings(); + applySettings(QStringList("preRecordTime")); } void FileSinkGUI::on_postSquelchTime_valueChanged(int value) { m_settings.m_squelchPostRecordTime = value; ui->postSquelchTimeText->setText(tr("%1").arg(m_settings.m_squelchPostRecordTime)); - applySettings(); + applySettings(QStringList("squelchPostRecordTime")); } void FileSinkGUI::on_squelchedRecording_toggled(bool checked) { ui->record->setEnabled(!checked); m_settings.m_squelchRecordingEnable = checked; - applySettings(); + applySettings(QStringList("squelchRecordingEnable")); } void FileSinkGUI::on_record_toggled(bool checked) @@ -534,7 +542,7 @@ void FileSinkGUI::on_showFileDialog_clicked(bool checked) { m_settings.m_fileRecordName = fileNames.at(0); ui->fileNameText->setText(m_settings.m_fileRecordName); - applySettings(); + applySettings(QStringList("fileRecordName")); } } } diff --git a/plugins/channelrx/filesink/filesinkgui.h b/plugins/channelrx/filesink/filesinkgui.h index 25c85541d..7fa8608da 100644 --- a/plugins/channelrx/filesink/filesinkgui.h +++ b/plugins/channelrx/filesink/filesinkgui.h @@ -94,7 +94,7 @@ private: virtual ~FileSinkGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applyDecimation(); void displaySettings(); void displayRate(); diff --git a/plugins/channelrx/filesink/filesinksettings.cpp b/plugins/channelrx/filesink/filesinksettings.cpp index b3d626ed1..e0c89c08e 100644 --- a/plugins/channelrx/filesink/filesinksettings.cpp +++ b/plugins/channelrx/filesink/filesinksettings.cpp @@ -173,6 +173,129 @@ bool FileSinkSettings::deserialize(const QByteArray& data) } } +void FileSinkSettings::applySettings(const QStringList& settingsKeys, const FileSinkSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("fileRecordName")) { + m_fileRecordName = settings.m_fileRecordName; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("log2Decim")) { + m_log2Decim = settings.m_log2Decim; + } + if (settingsKeys.contains("spectrumSquelchMode")) { + m_spectrumSquelchMode = settings.m_spectrumSquelchMode; + } + if (settingsKeys.contains("spectrumSquelch")) { + m_spectrumSquelch = settings.m_spectrumSquelch; + } + if (settingsKeys.contains("preRecordTime")) { + m_preRecordTime = settings.m_preRecordTime; + } + if (settingsKeys.contains("squelchPostRecordTime")) { + m_squelchPostRecordTime = settings.m_squelchPostRecordTime; + } + if (settingsKeys.contains("squelchRecordingEnable")) { + m_squelchRecordingEnable = settings.m_squelchRecordingEnable; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString FileSinkSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("fileRecordName") || force) { + ostr << " m_fileRecordName: " << m_fileRecordName.toStdString(); + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("log2Decim") || force) { + ostr << " m_log2Decim: " << m_log2Decim; + } + if (settingsKeys.contains("spectrumSquelchMode") || force) { + ostr << " m_spectrumSquelchMode: " << m_spectrumSquelchMode; + } + if (settingsKeys.contains("spectrumSquelch") || force) { + ostr << " m_spectrumSquelch: " << m_spectrumSquelch; + } + if (settingsKeys.contains("preRecordTime") || force) { + ostr << " m_preRecordTime: " << m_preRecordTime; + } + if (settingsKeys.contains("squelchPostRecordTime") || force) { + ostr << " m_squelchPostRecordTime: " << m_squelchPostRecordTime; + } + if (settingsKeys.contains("squelchRecordingEnable") || force) { + ostr << " m_squelchRecordingEnable: " << m_squelchRecordingEnable; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + unsigned int FileSinkSettings::getNbFixedShiftIndexes(int log2Decim) { int decim = (1<addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -144,7 +144,7 @@ void FreqTracker::start() m_basebandSink->reset(); m_thread->start(); - FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband *msg = FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband::create(m_settings, true); + FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband *msg = FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -187,7 +187,7 @@ bool FreqTracker::handleMessage(const Message& cmd) { MsgConfigureFreqTracker& cfg = (MsgConfigureFreqTracker&) cmd; qDebug() << "FreqTracker::handleMessage: MsgConfigureFreqTracker"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -196,7 +196,7 @@ bool FreqTracker::handleMessage(const Message& cmd) FreqTrackerReport::MsgSinkFrequencyOffsetNotification& cfg = (FreqTrackerReport::MsgSinkFrequencyOffsetNotification&) cmd; FreqTrackerSettings settings = m_settings; settings.m_inputFrequencyOffset = cfg.getFrequencyOffset(); - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (getMessageQueueToGUI()) { @@ -216,88 +216,22 @@ void FreqTracker::setCenterFrequency(qint64 frequency) { FreqTrackerSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFreqTracker *msgToGUI = MsgConfigureFreqTracker::create(settings, false); + MsgConfigureFreqTracker *msgToGUI = MsgConfigureFreqTracker::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) +void FreqTracker::applySettings(const QStringList& settingsKeys, const FreqTrackerSettings& settings, bool force) { - if (!settings.m_tracking) - { - qDebug() << "FreqTracker::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_log2Decim: " << settings.m_log2Decim - << " m_squelch: " << settings.m_squelch - << " m_rgbColor: " << settings.m_rgbColor - << " m_title: " << settings.m_title - << " m_alphaEMA: " << settings.m_alphaEMA - << " m_tracking: " << settings.m_tracking - << " m_trackerType: " << settings.m_trackerType - << " m_pllPskOrder: " << settings.m_pllPskOrder - << " m_rrc: " << settings.m_rrc - << " m_rrcRolloff: " << settings.m_rrcRolloff - << " m_streamIndex: " << settings.m_streamIndex - << " m_spanLog2: " << settings.m_spanLog2 - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + if (!settings.m_tracking) { + qDebug() << "FreqTracker::applySettings:" << settings.getDebugString(settingsKeys, force); } - QList reverseAPIKeys; - - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) { - reverseAPIKeys.append("log2Decim"); - } - if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((m_settings.m_squelch != settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((m_settings.m_rgbColor != settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((m_settings.m_title != settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((m_settings.m_alphaEMA != settings.m_alphaEMA) || force) { - reverseAPIKeys.append("alphaEMA"); - } - if ((m_settings.m_spanLog2 != settings.m_spanLog2) || force) { - reverseAPIKeys.append("spanLog2"); - } - if ((m_settings.m_tracking != settings.m_tracking) || force) { - reverseAPIKeys.append("tracking"); - } - if ((m_settings.m_trackerType != settings.m_trackerType) || force) { - reverseAPIKeys.append("trackerType"); - } - if ((m_settings.m_pllPskOrder != settings.m_pllPskOrder) || force) { - reverseAPIKeys.append("pllPskOrder"); - } - if ((m_settings.m_rrc != settings.m_rrc) || force) { - reverseAPIKeys.append("rrc"); - } - if ((m_settings.m_rrcRolloff != settings.m_rrcRolloff) || force) { - reverseAPIKeys.append("rrcRolloff"); - } - if ((m_settings.m_squelchGate != settings.m_squelchGate) || force) { - reverseAPIKeys.append("squelchGate"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -308,34 +242,36 @@ void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband *msg = FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband::create(settings, force); + FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband *msg = FreqTrackerBaseband::MsgConfigureFreqTrackerBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } @@ -348,14 +284,14 @@ bool FreqTracker::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(m_settings, true); + MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(m_settings, true); + MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -391,13 +327,13 @@ int FreqTracker::webapiSettingsPutPatch( FreqTrackerSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(settings, force); + MsgConfigureFreqTracker *msg = MsgConfigureFreqTracker::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("FreqTracker::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFreqTracker *msgToGUI = MsgConfigureFreqTracker::create(settings, force); + MsgConfigureFreqTracker *msgToGUI = MsgConfigureFreqTracker::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -593,7 +529,7 @@ void FreqTracker::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respo response.getFreqTrackerReport()->setTrackingDeltaFrequency(getAvgDeltaFreq()); } -void FreqTracker::webapiReverseSendSettings(QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force) +void FreqTracker::webapiReverseSendSettings(const QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -620,7 +556,7 @@ void FreqTracker::webapiReverseSendSettings(QList& channelSettingsKeys, void FreqTracker::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force) { @@ -644,7 +580,7 @@ void FreqTracker::sendChannelSettings( } void FreqTracker::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FreqTrackerSettings& settings, bool force) diff --git a/plugins/channelrx/freqtracker/freqtracker.h b/plugins/channelrx/freqtracker/freqtracker.h index 451ebf44f..d384a3a33 100644 --- a/plugins/channelrx/freqtracker/freqtracker.h +++ b/plugins/channelrx/freqtracker/freqtracker.h @@ -46,20 +46,23 @@ public: public: const FreqTrackerSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFreqTracker* create(const FreqTrackerSettings& settings, bool force) + static MsgConfigureFreqTracker* create(const QStringList& settingsKeys, const FreqTrackerSettings& settings, bool force) { - return new MsgConfigureFreqTracker(settings, force); + return new MsgConfigureFreqTracker(settingsKeys, settings, force); } private: FreqTrackerSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFreqTracker(const FreqTrackerSettings& settings, bool force) : + MsgConfigureFreqTracker(const QStringList& settingsKeys, const FreqTrackerSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -159,17 +162,17 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const FreqTrackerSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreqTrackerSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FreqTrackerSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FreqTrackerSettings& settings, bool force diff --git a/plugins/channelrx/freqtracker/freqtrackerbaseband.cpp b/plugins/channelrx/freqtracker/freqtrackerbaseband.cpp index 0f297759c..ec4d9a8a0 100644 --- a/plugins/channelrx/freqtracker/freqtrackerbaseband.cpp +++ b/plugins/channelrx/freqtracker/freqtrackerbaseband.cpp @@ -105,7 +105,7 @@ bool FreqTrackerBaseband::handleMessage(const Message& cmd) MsgConfigureFreqTrackerBaseband& cfg = (MsgConfigureFreqTrackerBaseband&) cmd; qDebug() << "FreqTrackerBaseband::handleMessage: MsgConfigureFreqTrackerBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -132,10 +132,10 @@ bool FreqTrackerBaseband::handleMessage(const Message& cmd) } } -void FreqTrackerBaseband::applySettings(const FreqTrackerSettings& settings, bool force) +void FreqTrackerBaseband::applySettings(const QStringList& settingsKeys, const FreqTrackerSettings& settings, bool force) { - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) - || (m_settings.m_log2Decim != settings.m_log2Decim)|| force) + if ((settingsKeys.contains("inputFrequencyOffset") && (m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset)) + || (settingsKeys.contains("log2Decim") && (m_settings.m_log2Decim != settings.m_log2Decim)) || force) { m_channelizer->setChannelization(m_basebandSampleRate/(1<deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void FreqTrackerGUI::channelMarkerHighlightedByCursor() @@ -154,7 +154,7 @@ void FreqTrackerGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void FreqTrackerGUI::on_log2Decim_currentIndexChanged(int index) @@ -169,7 +169,7 @@ void FreqTrackerGUI::on_log2Decim_currentIndexChanged(int index) ui->rfBW->setMaximum(sinkSampleRate/100); } - applySettings(); + applySettings(QStringList("log2Decim")); } void FreqTrackerGUI::on_rfBW_valueChanged(int value) @@ -177,7 +177,7 @@ void FreqTrackerGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(value * 100); m_settings.m_rfBandwidth = value * 100; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void FreqTrackerGUI::on_tracking_toggled(bool checked) @@ -189,7 +189,7 @@ void FreqTrackerGUI::on_tracking_toggled(bool checked) } m_settings.m_tracking = checked; - applySettings(); + applySettings(QStringList("tracking")); } void FreqTrackerGUI::on_alphaEMA_valueChanged(int value) @@ -197,13 +197,13 @@ void FreqTrackerGUI::on_alphaEMA_valueChanged(int value) m_settings.m_alphaEMA = value / 100.0; QString alphaEMAStr = QString::number(m_settings.m_alphaEMA, 'f', 2); ui->alphaEMAText->setText(alphaEMAStr); - applySettings(); + applySettings(QStringList("alphaEMA")); } void FreqTrackerGUI::on_trackerType_currentIndexChanged(int index) { m_settings.m_trackerType = (FreqTrackerSettings::TrackerType) index; - applySettings(); + applySettings(QStringList("trackerType")); } void FreqTrackerGUI::on_pllPskOrder_currentIndexChanged(int index) @@ -213,13 +213,13 @@ void FreqTrackerGUI::on_pllPskOrder_currentIndexChanged(int index) } m_settings.m_pllPskOrder = 1< 100 ? 100 : value; QString rolloffStr = QString::number(value/100.0, 'f', 2); ui->rrcRolloffText->setText(rolloffStr); - applySettings(); + applySettings(QStringList("rrcRolloff")); } void FreqTrackerGUI::on_squelch_valueChanged(int value) { ui->squelchText->setText(QString("%1 dB").arg(value)); m_settings.m_squelch = value; - applySettings(); + applySettings(QStringList("squelch")); } void FreqTrackerGUI::on_squelchGate_valueChanged(int value) { ui->squelchGateText->setText(QString("%1").arg(value * 10.0f, 0, 'f', 0)); m_settings.m_squelchGate = value; - applySettings(); + applySettings(QStringList("squelchGate")); } void FreqTrackerGUI::on_spanLog2_valueChanged(int value) @@ -259,7 +259,7 @@ void FreqTrackerGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void FreqTrackerGUI::onMenuDialogCalled(const QPoint &p) @@ -304,7 +304,8 @@ void FreqTrackerGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -375,7 +376,7 @@ FreqTrackerGUI::FreqTrackerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -390,11 +391,11 @@ void FreqTrackerGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void FreqTrackerGUI::applySettings(bool force) +void FreqTrackerGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - FreqTracker::MsgConfigureFreqTracker* message = FreqTracker::MsgConfigureFreqTracker::create( m_settings, force); + FreqTracker::MsgConfigureFreqTracker* message = FreqTracker::MsgConfigureFreqTracker::create(settingsKeys, m_settings, force); m_freqTracker->getInputMessageQueue()->push(message); } } @@ -403,7 +404,7 @@ void FreqTrackerGUI::applySpectrumBandwidth(int spanLog2, bool force) { displaySpectrumBandwidth(spanLog2); m_settings.m_spanLog2 = spanLog2; - applySettings(force); + applySettings(QStringList("spanLog2"), force); } void FreqTrackerGUI::displaySettings() diff --git a/plugins/channelrx/freqtracker/freqtrackergui.h b/plugins/channelrx/freqtracker/freqtrackergui.h index a2d15a571..828d15e45 100644 --- a/plugins/channelrx/freqtracker/freqtrackergui.h +++ b/plugins/channelrx/freqtracker/freqtrackergui.h @@ -89,7 +89,7 @@ private: virtual ~FreqTrackerGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applySpectrumBandwidth(int spanLog2, bool force = false); void displaySettings(); void displaySpectrumBandwidth(int spanLog2); diff --git a/plugins/channelrx/freqtracker/freqtrackersettings.cpp b/plugins/channelrx/freqtracker/freqtrackersettings.cpp index 62e15e527..94723b0cc 100644 --- a/plugins/channelrx/freqtracker/freqtrackersettings.cpp +++ b/plugins/channelrx/freqtracker/freqtrackersettings.cpp @@ -190,3 +190,150 @@ bool FreqTrackerSettings::deserialize(const QByteArray& data) return false; } } + +void FreqTrackerSettings::applySettings(const QStringList& settingsKeys, const FreqTrackerSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("log2Decim")) { + m_log2Decim = settings.m_log2Decim; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("spanLog2")) { + m_spanLog2 = settings.m_spanLog2; + } + if (settingsKeys.contains("alphaEMA")) { + m_alphaEMA = settings.m_alphaEMA; + } + if (settingsKeys.contains("tracking")) { + m_tracking = settings.m_tracking; + } + if (settingsKeys.contains("trackerType")) { + m_trackerType = settings.m_trackerType; + } + if (settingsKeys.contains("pllPskOrder")) { + m_pllPskOrder = settings.m_pllPskOrder; + } + if (settingsKeys.contains("rrc")) { + m_rrc = settings.m_rrc; + } + if (settingsKeys.contains("rrcRolloff")) { + m_rrcRolloff = settings.m_rrcRolloff; + } + if (settingsKeys.contains("squelchGate")) { + m_squelchGate = settings.m_squelchGate; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString FreqTrackerSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("log2Decim") || force) { + ostr << " m_log2Decim: " << m_log2Decim; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("spanLog2") || force) { + ostr << " m_spanLog2: " << m_spanLog2; + } + if (settingsKeys.contains("alphaEMA") || force) { + ostr << " m_alphaEMA: " << m_alphaEMA; + } + if (settingsKeys.contains("tracking") || force) { + ostr << " m_tracking: " << m_tracking; + } + if (settingsKeys.contains("trackerType") || force) { + ostr << " m_trackerType: " << m_trackerType; + } + if (settingsKeys.contains("pllPskOrder") || force) { + ostr << " m_pllPskOrder: " << m_pllPskOrder; + } + if (settingsKeys.contains("rrc") || force) { + ostr << " m_rrc: " << m_rrc; + } + if (settingsKeys.contains("rrcRolloff") || force) { + ostr << " m_rrcRolloff: " << m_rrcRolloff; + } + if (settingsKeys.contains("squelchGate") || force) { + ostr << " m_squelchGate: " << m_squelchGate; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/freqtracker/freqtrackersettings.h b/plugins/channelrx/freqtracker/freqtrackersettings.h index fcdb76ba9..a2cc936dc 100644 --- a/plugins/channelrx/freqtracker/freqtrackersettings.h +++ b/plugins/channelrx/freqtracker/freqtrackersettings.h @@ -71,6 +71,8 @@ struct FreqTrackerSettings void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const FreqTrackerSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channelrx/freqtracker/freqtrackersink.cpp b/plugins/channelrx/freqtracker/freqtrackersink.cpp index 7323eeb13..2940da900 100644 --- a/plugins/channelrx/freqtracker/freqtrackersink.cpp +++ b/plugins/channelrx/freqtracker/freqtrackersink.cpp @@ -247,38 +247,17 @@ void FreqTrackerSink::applyChannelSettings(int sinkSampleRate, int channelSample m_undersampleCount = 0; } -void FreqTrackerSink::applySettings(const FreqTrackerSettings& settings, bool force) +void FreqTrackerSink::applySettings(const QStringList& settingsKeys, const FreqTrackerSettings& settings, bool force) { - if (!settings.m_tracking) - { - qDebug() << "FreqTrackerSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_log2Decim: " << settings.m_log2Decim - << " m_squelch: " << settings.m_squelch - << " m_rgbColor: " << settings.m_rgbColor - << " m_title: " << settings.m_title - << " m_alphaEMA: " << settings.m_alphaEMA - << " m_tracking: " << settings.m_tracking - << " m_trackerType: " << settings.m_trackerType - << " m_pllPskOrder: " << settings.m_pllPskOrder - << " m_rrc: " << settings.m_rrc - << " m_rrcRolloff: " << settings.m_rrcRolloff - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + if (!settings.m_tracking) { + qDebug() << "FreqTrackerSink::applySettings:" << settings.getDebugString(settingsKeys, force); } - - if ((m_settings.m_squelch != settings.m_squelch) || force) { + if ((settingsKeys.contains("m_squelch") && (m_settings.m_squelch != settings.m_squelch)) || force) { m_squelchLevel = CalcDb::powerFromdB(settings.m_squelch); } - if ((m_settings.m_tracking != settings.m_tracking) || force) + if ((settingsKeys.contains("m_tracking") && (m_settings.m_tracking != settings.m_tracking)) || force) { m_avgDeltaFreq = 0.0; m_lastCorrAbs = 0; @@ -290,7 +269,7 @@ void FreqTrackerSink::applySettings(const FreqTrackerSettings& settings, bool fo } } - if ((m_settings.m_trackerType != settings.m_trackerType) || force) + if ((settingsKeys.contains("m_trackerType") && (m_settings.m_trackerType != settings.m_trackerType)) || force) { m_lastCorrAbs = 0; m_avgDeltaFreq = 0.0; @@ -308,7 +287,7 @@ void FreqTrackerSink::applySettings(const FreqTrackerSettings& settings, bool fo } } - if ((m_settings.m_pllPskOrder != settings.m_pllPskOrder) || force) + if ((settingsKeys.contains("m_pllPskOrder") && (m_settings.m_pllPskOrder != settings.m_pllPskOrder)) || force) { if (settings.m_pllPskOrder < 32) { m_pll.setPskOrder(settings.m_pllPskOrder); @@ -317,9 +296,9 @@ void FreqTrackerSink::applySettings(const FreqTrackerSettings& settings, bool fo bool useInterpolator = false; - if ((m_settings.m_rrcRolloff != settings.m_rrcRolloff) - || (m_settings.m_rfBandwidth != settings.m_rfBandwidth) - || (m_settings.m_squelchGate != settings.m_squelchGate) || force) { + if ((settingsKeys.contains("m_rrcRolloff") && (m_settings.m_rrcRolloff != settings.m_rrcRolloff)) + || (settingsKeys.contains("m_rfBandwidth") && (m_settings.m_rfBandwidth != settings.m_rfBandwidth)) + || (settingsKeys.contains("m_squelchGate") && (m_settings.m_squelchGate != settings.m_squelchGate)) || force) { useInterpolator = true; } @@ -331,7 +310,11 @@ void FreqTrackerSink::applySettings(const FreqTrackerSettings& settings, bool fo m_undersampleCount = 0; } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } if (useInterpolator) { setInterpolator(); diff --git a/plugins/channelrx/freqtracker/freqtrackersink.h b/plugins/channelrx/freqtracker/freqtrackersink.h index 5a686883f..d9b2f6edb 100644 --- a/plugins/channelrx/freqtracker/freqtrackersink.h +++ b/plugins/channelrx/freqtracker/freqtrackersink.h @@ -45,7 +45,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void setSpectrumSink(SpectrumVis* spectrumSink) { m_spectrumSink = spectrumSink; } - void applySettings(const FreqTrackerSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreqTrackerSettings& settings, bool force = false); void applyChannelSettings(int sinkSampleRate, int channelSampleRate, int channelFrequencyOffset, bool force = false); void setMessageQueueToInput(MessageQueue *messageQueue) { m_messageQueueToInput = messageQueue;} diff --git a/plugins/channelrx/heatmap/heatmap.cpp b/plugins/channelrx/heatmap/heatmap.cpp index 3e5c68334..12f2e40b6 100644 --- a/plugins/channelrx/heatmap/heatmap.cpp +++ b/plugins/channelrx/heatmap/heatmap.cpp @@ -51,7 +51,7 @@ HeatMap::HeatMap(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -125,7 +125,7 @@ void HeatMap::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - HeatMapBaseband::MsgConfigureHeatMapBaseband *msg = HeatMapBaseband::MsgConfigureHeatMapBaseband::create(m_settings, true); + HeatMapBaseband::MsgConfigureHeatMapBaseband *msg = HeatMapBaseband::MsgConfigureHeatMapBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -143,7 +143,7 @@ bool HeatMap::handleMessage(const Message& cmd) { MsgConfigureHeatMap& cfg = (MsgConfigureHeatMap&) cmd; qDebug() << "HeatMap::handleMessage: MsgConfigureHeatMap"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -178,35 +178,20 @@ void HeatMap::setCenterFrequency(qint64 frequency) { HeatMapSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureHeatMap *msgToGUI = MsgConfigureHeatMap::create(settings, false); + MsgConfigureHeatMap *msgToGUI = MsgConfigureHeatMap::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void HeatMap::applySettings(const HeatMapSettings& settings, bool force) +void HeatMap::applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force) { - qDebug() << "HeatMap::applySettings:" - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "HeatMap::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -217,24 +202,26 @@ void HeatMap::applySettings(const HeatMapSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - HeatMapBaseband::MsgConfigureHeatMapBaseband *msg = HeatMapBaseband::MsgConfigureHeatMapBaseband::create(settings, force); + HeatMapBaseband::MsgConfigureHeatMapBaseband *msg = HeatMapBaseband::MsgConfigureHeatMapBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray HeatMap::serialize() const @@ -246,14 +233,14 @@ bool HeatMap::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureHeatMap *msg = MsgConfigureHeatMap::create(m_settings, true); + MsgConfigureHeatMap *msg = MsgConfigureHeatMap::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureHeatMap *msg = MsgConfigureHeatMap::create(m_settings, true); + MsgConfigureHeatMap *msg = MsgConfigureHeatMap::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -289,13 +276,13 @@ int HeatMap::webapiSettingsPutPatch( HeatMapSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureHeatMap *msg = MsgConfigureHeatMap::create(settings, force); + MsgConfigureHeatMap *msg = MsgConfigureHeatMap::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("HeatMap::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureHeatMap *msgToGUI = MsgConfigureHeatMap::create(settings, force); + MsgConfigureHeatMap *msgToGUI = MsgConfigureHeatMap::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -446,7 +433,7 @@ void HeatMap::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respo } } -void HeatMap::webapiReverseSendSettings(QList& channelSettingsKeys, const HeatMapSettings& settings, bool force) +void HeatMap::webapiReverseSendSettings(const QList& channelSettingsKeys, const HeatMapSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -472,7 +459,7 @@ void HeatMap::webapiReverseSendSettings(QList& channelSettingsKeys, con } void HeatMap::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const HeatMapSettings& settings, bool force @@ -572,4 +559,3 @@ void HeatMap::handleIndexInDeviceSetChanged(int index) .arg(index); m_basebandSink->setFifoLabel(fifoLabel); } - diff --git a/plugins/channelrx/heatmap/heatmap.h b/plugins/channelrx/heatmap/heatmap.h index 34e074f28..fccea7329 100644 --- a/plugins/channelrx/heatmap/heatmap.h +++ b/plugins/channelrx/heatmap/heatmap.h @@ -52,20 +52,23 @@ public: public: const HeatMapSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureHeatMap* create(const HeatMapSettings& settings, bool force) + static MsgConfigureHeatMap* create(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force) { - return new MsgConfigureHeatMap(settings, force); + return new MsgConfigureHeatMap(settingsKeys, settings, force); } private: HeatMapSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureHeatMap(const HeatMapSettings& settings, bool force) : + MsgConfigureHeatMap(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -160,10 +163,10 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const HeatMapSettings& settings, bool force = false); - void webapiReverseSendSettings(QList& channelSettingsKeys, const HeatMapSettings& settings, bool force); + void applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force = false); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const HeatMapSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const HeatMapSettings& settings, bool force @@ -175,4 +178,3 @@ private slots: }; #endif // INCLUDE_HEATMAP_H - diff --git a/plugins/channelrx/heatmap/heatmapbaseband.cpp b/plugins/channelrx/heatmap/heatmapbaseband.cpp index db6add661..7bcfb177e 100644 --- a/plugins/channelrx/heatmap/heatmapbaseband.cpp +++ b/plugins/channelrx/heatmap/heatmapbaseband.cpp @@ -134,7 +134,7 @@ bool HeatMapBaseband::handleMessage(const Message& cmd) MsgConfigureHeatMapBaseband& cfg = (MsgConfigureHeatMapBaseband&) cmd; qDebug() << "HeatMapBaseband::handleMessage: MsgConfigureHeatMapBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -154,19 +154,24 @@ bool HeatMapBaseband::handleMessage(const Message& cmd) } } -void HeatMapBaseband::applySettings(const HeatMapSettings& settings, bool force) +void HeatMapBaseband::applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) - || (settings.m_sampleRate != m_settings.m_sampleRate) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) + || (settingsKeys.contains("sampleRate") && (settings.m_sampleRate != m_settings.m_sampleRate)) || force) { m_channelizer->setChannelization(settings.m_sampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) + { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void HeatMapBaseband::setBasebandSampleRate(int sampleRate) @@ -174,4 +179,3 @@ void HeatMapBaseband::setBasebandSampleRate(int sampleRate) m_channelizer->setBasebandSampleRate(sampleRate); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - diff --git a/plugins/channelrx/heatmap/heatmapbaseband.h b/plugins/channelrx/heatmap/heatmapbaseband.h index ef2bcb1e7..8ff45e425 100644 --- a/plugins/channelrx/heatmap/heatmapbaseband.h +++ b/plugins/channelrx/heatmap/heatmapbaseband.h @@ -44,20 +44,23 @@ public: public: const HeatMapSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureHeatMapBaseband* create(const HeatMapSettings& settings, bool force) + static MsgConfigureHeatMapBaseband* create(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force) { - return new MsgConfigureHeatMapBaseband(settings, force); + return new MsgConfigureHeatMapBaseband(settingsKeys, settings, force); } private: HeatMapSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureHeatMapBaseband(const HeatMapSettings& settings, bool force) : + MsgConfigureHeatMapBaseband(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -98,7 +101,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(HeatMapSink *sink); - void applySettings(const HeatMapSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force = false); private slots: void handleInputMessages(); @@ -106,4 +109,3 @@ private slots: }; #endif // INCLUDE_HEATMAPBASEBAND_H - diff --git a/plugins/channelrx/heatmap/heatmapgui.cpp b/plugins/channelrx/heatmap/heatmapgui.cpp index 68ec743dd..462f686d3 100644 --- a/plugins/channelrx/heatmap/heatmapgui.cpp +++ b/plugins/channelrx/heatmap/heatmapgui.cpp @@ -63,7 +63,7 @@ void HeatMapGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray HeatMapGUI::serialize() const @@ -75,7 +75,7 @@ bool HeatMapGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -128,7 +128,7 @@ void HeatMapGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void HeatMapGUI::channelMarkerHighlightedByCursor() @@ -141,7 +141,7 @@ void HeatMapGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void HeatMapGUI::on_rfBW_valueChanged(int value) @@ -150,7 +150,7 @@ void HeatMapGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void HeatMapGUI::on_minPower_valueChanged(double value) @@ -160,7 +160,7 @@ void HeatMapGUI::on_minPower_valueChanged(double value) if (m_powerYAxis) { m_powerYAxis->setMin(m_settings.m_minPower); } - applySettings(); + applySettings(QStringList("minPower")); } void HeatMapGUI::on_maxPower_valueChanged(double value) @@ -170,7 +170,7 @@ void HeatMapGUI::on_maxPower_valueChanged(double value) if (m_powerYAxis) { m_powerYAxis->setMax(m_settings.m_maxPower); } - applySettings(); + applySettings(QStringList("maxPower")); } void HeatMapGUI::on_colorMap_currentIndexChanged(int index) @@ -181,14 +181,14 @@ void HeatMapGUI::on_colorMap_currentIndexChanged(int index) m_colorMap = ColorMap::getColorMap(m_settings.m_colorMapName); } plotMap(); - applySettings(); + applySettings(QStringList("colorMapName")); } void HeatMapGUI::on_pulseTH_valueChanged(int value) { m_settings.m_pulseThreshold = (float)value; ui->pulseTHText->setText(QString::number(value)); - applySettings(); + applySettings(QStringList("pulseThreshold")); } const QStringList HeatMapGUI::m_averagePeriodTexts = { @@ -199,7 +199,7 @@ void HeatMapGUI::on_averagePeriod_valueChanged(int value) { m_settings.m_averagePeriodUS = (int)std::pow(10.0f, (float)value); ui->averagePeriodText->setText(m_averagePeriodTexts[value-1]); - applySettings(); + applySettings(QStringList("averagePeriodUS")); } const QStringList HeatMapGUI::m_sampleRateTexts = { @@ -213,7 +213,7 @@ void HeatMapGUI::on_sampleRate_valueChanged(int value) ui->averagePeriod->setMinimum(std::max(1, static_cast (m_averagePeriodTexts.size()) - value)); ui->rfBW->setMaximum(m_settings.m_sampleRate/100); m_scopeVis->setLiveRate(m_settings.m_sampleRate); - applySettings(); + applySettings(QStringList("sampleRate")); } void HeatMapGUI::on_mode_currentIndexChanged(int index) @@ -238,7 +238,7 @@ void HeatMapGUI::on_mode_currentIndexChanged(int index) } plotMap(); } - applySettings(); + applySettings(QStringList("mode")); } } @@ -265,7 +265,7 @@ void HeatMapGUI::on_displayChart_clicked(bool checked) { m_settings.m_displayChart = checked; displayPowerChart(); - applySettings(); + applySettings(QStringList("displayChart")); } void HeatMapGUI::on_clearHeatMap_clicked() @@ -434,7 +434,7 @@ void HeatMapGUI::on_txPosition_clicked(bool checked) { m_settings.m_txPosValid = checked; displayTXPosition(checked); - applySettings(); + applySettings(QStringList("txPosValid")); } void HeatMapGUI::on_txLatitude_editingFinished() @@ -442,7 +442,7 @@ void HeatMapGUI::on_txLatitude_editingFinished() m_settings.m_txLatitude = ui->txLatitude->text().toFloat(); updateRange(); sendTxToMap(); - applySettings(); + applySettings(QStringList("txLatitude")); } void HeatMapGUI::on_txLongitude_editingFinished() @@ -450,14 +450,14 @@ void HeatMapGUI::on_txLongitude_editingFinished() m_settings.m_txLongitude = ui->txLongitude->text().toFloat(); updateRange(); sendTxToMap(); - applySettings(); + applySettings(QStringList("txLongitude")); } void HeatMapGUI::on_txPower_valueChanged(double value) { m_settings.m_txPower = (float)value; sendTxToMap(); - applySettings(); + applySettings(QStringList("txPower")); } void HeatMapGUI::on_txPositionSet_clicked(bool checked) @@ -470,7 +470,7 @@ void HeatMapGUI::on_txPositionSet_clicked(bool checked) m_settings.m_txLongitude = m_longitude; updateRange(); sendTxToMap(); - applySettings(); + applySettings(QStringList({"txPositionSet", "txLatitude", "txLongitude"})); } void HeatMapGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -479,7 +479,7 @@ void HeatMapGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void HeatMapGUI::onMenuDialogCalled(const QPoint &p) @@ -524,7 +524,16 @@ void HeatMapGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -639,7 +648,7 @@ HeatMapGUI::HeatMapGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList({}), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); @@ -660,11 +669,11 @@ void HeatMapGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void HeatMapGUI::applySettings(bool force) +void HeatMapGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - HeatMap::MsgConfigureHeatMap* message = HeatMap::MsgConfigureHeatMap::create(m_settings, force); + HeatMap::MsgConfigureHeatMap* message = HeatMap::MsgConfigureHeatMap::create(settingsKeys, m_settings, force); m_heatMap->getInputMessageQueue()->push(message); } } @@ -1581,77 +1590,77 @@ void HeatMapGUI::on_displayAverage_clicked(bool checked) { m_settings.m_displayAverage = checked; m_powerAverageSeries->setVisible(checked); - applySettings(); + applySettings(QStringList("displayAverage")); } void HeatMapGUI::on_displayMax_clicked(bool checked) { m_settings.m_displayMax = checked; m_powerMaxPeakSeries->setVisible(checked); - applySettings(); + applySettings(QStringList("displayMax")); } void HeatMapGUI::on_displayMin_clicked(bool checked) { m_settings.m_displayMin = checked; m_powerMinPeakSeries->setVisible(checked); - applySettings(); + applySettings(QStringList("displayMin")); } void HeatMapGUI::on_displayPulseAverage_clicked(bool checked) { m_settings.m_displayPulseAverage = checked; m_powerPulseAverageSeries->setVisible(checked); - applySettings(); + applySettings(QStringList("displayPulseAverage")); } void HeatMapGUI::on_displayPathLoss_clicked(bool checked) { m_settings.m_displayPathLoss = checked; m_powerPathLossSeries->setVisible(checked); - applySettings(); + applySettings(QStringList("displayPathLoss")); } void HeatMapGUI::on_displayMins_valueChanged(int value) { m_settings.m_displayMins = value; updateAxis(); - applySettings(); + applySettings(QStringList("displayMins")); } void HeatMapGUI::on_recordAverage_clicked(bool checked) { m_settings.m_recordAverage = checked; resizeMap(0, 0); - applySettings(); + applySettings(QStringList("recordAverage")); } void HeatMapGUI::on_recordMax_clicked(bool checked) { m_settings.m_recordMax = checked; resizeMap(0, 0); - applySettings(); + applySettings(QStringList("recordMax")); } void HeatMapGUI::on_recordMin_clicked(bool checked) { m_settings.m_recordMin = checked; resizeMap(0, 0); - applySettings(); + applySettings(QStringList("recordMin")); } void HeatMapGUI::on_recordPulseAverage_clicked(bool checked) { m_settings.m_recordPulseAverage = checked; resizeMap(0, 0); - applySettings(); + applySettings(QStringList("recordPulseAverage")); } void HeatMapGUI::on_recordPathLoss_clicked(bool checked) { m_settings.m_recordPathLoss = checked; resizeMap(0, 0); - applySettings(); + applySettings(QStringList("recordPathLoss")); } QString HeatMapGUI::formatCoord(float coord) const diff --git a/plugins/channelrx/heatmap/heatmapgui.h b/plugins/channelrx/heatmap/heatmapgui.h index 70c508ad7..3e1fccf78 100644 --- a/plugins/channelrx/heatmap/heatmapgui.h +++ b/plugins/channelrx/heatmap/heatmapgui.h @@ -140,7 +140,7 @@ private: virtual ~HeatMapGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); @@ -222,4 +222,3 @@ private slots: }; #endif // INCLUDE_HEATMAPGUI_H - diff --git a/plugins/channelrx/heatmap/heatmapsettings.cpp b/plugins/channelrx/heatmap/heatmapsettings.cpp index 97e356315..b8e720a9d 100644 --- a/plugins/channelrx/heatmap/heatmapsettings.cpp +++ b/plugins/channelrx/heatmap/heatmapsettings.cpp @@ -208,3 +208,227 @@ bool HeatMapSettings::deserialize(const QByteArray& data) } } +void HeatMapSettings::applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("minPower")) { + m_minPower = settings.m_minPower; + } + if (settingsKeys.contains("maxPower")) { + m_maxPower = settings.m_maxPower; + } + if (settingsKeys.contains("colorMapName")) { + m_colorMapName = settings.m_colorMapName; + } + if (settingsKeys.contains("mode")) { + m_mode = settings.m_mode; + } + if (settingsKeys.contains("pulseThreshold")) { + m_pulseThreshold = settings.m_pulseThreshold; + } + if (settingsKeys.contains("averagePeriodUS")) { + m_averagePeriodUS = settings.m_averagePeriodUS; + } + if (settingsKeys.contains("sampleRate")) { + m_sampleRate = settings.m_sampleRate; + } + if (settingsKeys.contains("txPosValid")) { + m_txPosValid = settings.m_txPosValid; + } + if (settingsKeys.contains("txLatitude")) { + m_txLatitude = settings.m_txLatitude; + } + if (settingsKeys.contains("txLongitude")) { + m_txLongitude = settings.m_txLongitude; + } + if (settingsKeys.contains("txPower")) { + m_txPower = settings.m_txPower; + } + if (settingsKeys.contains("displayChart")) { + m_displayChart = settings.m_displayChart; + } + if (settingsKeys.contains("displayAverage")) { + m_displayAverage = settings.m_displayAverage; + } + if (settingsKeys.contains("displayMax")) { + m_displayMax = settings.m_displayMax; + } + if (settingsKeys.contains("displayMin")) { + m_displayMin = settings.m_displayMin; + } + if (settingsKeys.contains("displayPulseAverage")) { + m_displayPulseAverage = settings.m_displayPulseAverage; + } + if (settingsKeys.contains("displayPathLoss")) { + m_displayPathLoss = settings.m_displayPathLoss; + } + if (settingsKeys.contains("displayMins")) { + m_displayMins = settings.m_displayMins; + } + if (settingsKeys.contains("recordAverage")) { + m_recordAverage = settings.m_recordAverage; + } + if (settingsKeys.contains("recordMax")) { + m_recordMax = settings.m_recordMax; + } + if (settingsKeys.contains("recordMin")) { + m_recordMin = settings.m_recordMin; + } + if (settingsKeys.contains("recordPulseAverage")) { + m_recordPulseAverage = settings.m_recordPulseAverage; + } + if (settingsKeys.contains("recordPathLoss")) { + m_recordPathLoss = settings.m_recordPathLoss; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString HeatMapSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("minPower") || force) { + ostr << " m_minPower: " << m_minPower; + } + if (settingsKeys.contains("maxPower") || force) { + ostr << " m_maxPower: " << m_maxPower; + } + if (settingsKeys.contains("colorMapName") || force) { + ostr << " m_colorMapName: " << m_colorMapName.toStdString(); + } + if (settingsKeys.contains("mode") || force) { + ostr << " m_mode: " << m_mode; + } + if (settingsKeys.contains("pulseThreshold") || force) { + ostr << " m_pulseThreshold: " << m_pulseThreshold; + } + if (settingsKeys.contains("averagePeriodUS") || force) { + ostr << " m_averagePeriodUS: " << m_averagePeriodUS; + } + if (settingsKeys.contains("sampleRate") || force) { + ostr << " m_sampleRate: " << m_sampleRate; + } + if (settingsKeys.contains("txPosValid") || force) { + ostr << " m_txPosValid: " << m_txPosValid; + } + if (settingsKeys.contains("txLatitude") || force) { + ostr << " m_txLatitude: " << m_txLatitude; + } + if (settingsKeys.contains("txLongitude") || force) { + ostr << " m_txLongitude: " << m_txLongitude; + } + if (settingsKeys.contains("txPower") || force) { + ostr << " m_txPower: " << m_txPower; + } + if (settingsKeys.contains("displayChart") || force) { + ostr << " m_displayChart: " << m_displayChart; + } + if (settingsKeys.contains("displayAverage") || force) { + ostr << " m_displayAverage: " << m_displayAverage; + } + if (settingsKeys.contains("displayMax") || force) { + ostr << " m_displayMax: " << m_displayMax; + } + if (settingsKeys.contains("displayMin") || force) { + ostr << " m_displayMin: " << m_displayMin; + } + if (settingsKeys.contains("displayPulseAverage") || force) { + ostr << " m_displayPulseAverage: " << m_displayPulseAverage; + } + if (settingsKeys.contains("displayPathLoss") || force) { + ostr << " m_displayPathLoss: " << m_displayPathLoss; + } + if (settingsKeys.contains("displayMins") || force) { + ostr << " m_displayMins: " << m_displayMins; + } + if (settingsKeys.contains("recordAverage") || force) { + ostr << " m_recordAverage: " << m_recordAverage; + } + if (settingsKeys.contains("recordMax") || force) { + ostr << " m_recordMax: " << m_recordMax; + } + if (settingsKeys.contains("recordMin") || force) { + ostr << " m_recordMin: " << m_recordMin; + } + if (settingsKeys.contains("recordPulseAverage") || force) { + ostr << " m_recordPulseAverage: " << m_recordPulseAverage; + } + if (settingsKeys.contains("recordPathLoss") || force) { + ostr << " m_recordPathLoss: " << m_recordPathLoss; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/heatmap/heatmapsettings.h b/plugins/channelrx/heatmap/heatmapsettings.h index 5acb28008..339ad2e15 100644 --- a/plugins/channelrx/heatmap/heatmapsettings.h +++ b/plugins/channelrx/heatmap/heatmapsettings.h @@ -85,7 +85,8 @@ struct HeatMapSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_HEATMAPSETTINGS_H */ - diff --git a/plugins/channelrx/heatmap/heatmapsink.cpp b/plugins/channelrx/heatmap/heatmapsink.cpp index 202e9fb7f..d4166c323 100644 --- a/plugins/channelrx/heatmap/heatmapsink.cpp +++ b/plugins/channelrx/heatmap/heatmapsink.cpp @@ -39,7 +39,7 @@ HeatMapSink::HeatMapSink() : resetMagLevels(); m_sampleBuffer.resize(m_sampleBufferSize); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -170,17 +170,13 @@ void HeatMapSink::applyChannelSettings(int channelSampleRate, int channelFrequen m_channelFrequencyOffset = channelFrequencyOffset; } -void HeatMapSink::applySettings(const HeatMapSettings& settings, bool force) +void HeatMapSink::applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force) { - qDebug() << "HeatMapSink::applySettings:" - << " sampleRate: " << settings.m_sampleRate - << " averagePeriodUS: " << settings.m_averagePeriodUS - << " pulseThreshold: " << settings.m_pulseThreshold - << " force: " << force; + qDebug() << "HeatMapSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_averagePeriodUS != m_settings.m_averagePeriodUS) - || (settings.m_sampleRate != m_settings.m_sampleRate) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) + || (settingsKeys.contains("averagePeriodUS") && (settings.m_averagePeriodUS != m_settings.m_averagePeriodUS)) + || (settingsKeys.contains("sampleRate") && (settings.m_sampleRate != m_settings.m_sampleRate)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); @@ -188,8 +184,8 @@ void HeatMapSink::applySettings(const HeatMapSettings& settings, bool force) m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_averagePeriodUS != m_settings.m_averagePeriodUS) - || (settings.m_sampleRate != m_settings.m_sampleRate) + if ((settingsKeys.contains("averagePeriodUS") && (settings.m_averagePeriodUS != m_settings.m_averagePeriodUS)) + || (settingsKeys.contains("sampleRate") && (settings.m_sampleRate != m_settings.m_sampleRate)) || force) { m_averageCnt = (int)((settings.m_averagePeriodUS * (qint64)settings.m_sampleRate / 1e6)); @@ -211,12 +207,15 @@ void HeatMapSink::applySettings(const HeatMapSettings& settings, bool force) } } - if ((settings.m_pulseThreshold != m_settings.m_pulseThreshold) || force) + if ((settingsKeys.contains("pulseThreshold") && (settings.m_pulseThreshold != m_settings.m_pulseThreshold)) || force) { m_pulseThresholdLinear = std::pow(10.0, settings.m_pulseThreshold / 20.0); qDebug() << "m_pulseThresholdLinear" << m_pulseThresholdLinear; } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } - diff --git a/plugins/channelrx/heatmap/heatmapsink.h b/plugins/channelrx/heatmap/heatmapsink.h index 66f364315..8de1cf2cc 100644 --- a/plugins/channelrx/heatmap/heatmapsink.h +++ b/plugins/channelrx/heatmap/heatmapsink.h @@ -48,7 +48,7 @@ public: void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const HeatMapSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const HeatMapSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } @@ -150,4 +150,3 @@ private: }; #endif // INCLUDE_HEATMAPSINK_H - diff --git a/plugins/channelrx/noisefigure/noisefigure.cpp b/plugins/channelrx/noisefigure/noisefigure.cpp index 9f2774ce0..af767931a 100644 --- a/plugins/channelrx/noisefigure/noisefigure.cpp +++ b/plugins/channelrx/noisefigure/noisefigure.cpp @@ -67,7 +67,7 @@ NoiseFigure::NoiseFigure(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -128,11 +128,11 @@ void NoiseFigure::setCenterFrequency(qint64 frequency) { NoiseFigureSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNoiseFigure *msgToGUI = MsgConfigureNoiseFigure::create(settings, false); + MsgConfigureNoiseFigure *msgToGUI = MsgConfigureNoiseFigure::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -154,7 +154,7 @@ void NoiseFigure::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband *msg = NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband::create(m_settings, true); + NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband *msg = NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -448,7 +448,7 @@ bool NoiseFigure::handleMessage(const Message& cmd) { MsgConfigureNoiseFigure& cfg = (MsgConfigureNoiseFigure&) cmd; qDebug() << "NoiseFigure::handleMessage: MsgConfigureNoiseFigure"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -518,40 +518,16 @@ bool NoiseFigure::handleMessage(const Message& cmd) } } -void NoiseFigure::applySettings(const NoiseFigureSettings& settings, bool force) +void NoiseFigure::applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force) { - qDebug() << "NoiseFigure::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_fftSize: " << settings.m_fftSize - << " m_fftCount: " << settings.m_fftCount - << " m_sweepSpec: " << settings.m_sweepSpec - << " m_startValue: " << settings.m_startValue - << " m_stopValue: " << settings.m_stopValue - << " m_steps: " << settings.m_steps - << " m_step: " << settings.m_step - << " m_sweepList: " << settings.m_sweepList - << " m_setting: " << settings.m_setting - << " m_visaDevice: " << settings.m_visaDevice - << " m_powerOnSCPI: " << settings.m_powerOnSCPI - << " m_powerOffSCPI: " << settings.m_powerOffSCPI - << " m_powerOnCommand: " << settings.m_powerOnCommand - << " m_powerOffCommand: " << settings.m_powerOffCommand - << " m_powerDelay: " << settings.m_powerDelay - << " m_enr: " << settings.m_enr - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "NoiseFigure::applySettings:" << settings.getDebugString(settingsKeys, force); QList reverseAPIKeys; if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { reverseAPIKeys.append("inputFrequencyOffset"); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -566,16 +542,16 @@ void NoiseFigure::applySettings(const NoiseFigureSettings& settings, bool force) reverseAPIKeys.append("streamIndex"); } - NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband *msg = NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband::create(settings, force); + NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband *msg = NoiseFigureBaseband::MsgConfigureNoiseFigureBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } @@ -591,14 +567,14 @@ bool NoiseFigure::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureNoiseFigure *msg = MsgConfigureNoiseFigure::create(m_settings, true); + MsgConfigureNoiseFigure *msg = MsgConfigureNoiseFigure::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureNoiseFigure *msg = MsgConfigureNoiseFigure::create(m_settings, true); + MsgConfigureNoiseFigure *msg = MsgConfigureNoiseFigure::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -634,13 +610,13 @@ int NoiseFigure::webapiSettingsPutPatch( NoiseFigureSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureNoiseFigure *msg = MsgConfigureNoiseFigure::create(settings, force); + MsgConfigureNoiseFigure *msg = MsgConfigureNoiseFigure::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("NoiseFigure::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNoiseFigure *msgToGUI = MsgConfigureNoiseFigure::create(settings, force); + MsgConfigureNoiseFigure *msgToGUI = MsgConfigureNoiseFigure::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -784,7 +760,7 @@ void NoiseFigure::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& r } } -void NoiseFigure::webapiReverseSendSettings(QList& channelSettingsKeys, const NoiseFigureSettings& settings, bool force) +void NoiseFigure::webapiReverseSendSettings(const QList& channelSettingsKeys, const NoiseFigureSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -810,7 +786,7 @@ void NoiseFigure::webapiReverseSendSettings(QList& channelSettingsKeys, } void NoiseFigure::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const NoiseFigureSettings& settings, bool force diff --git a/plugins/channelrx/noisefigure/noisefigure.h b/plugins/channelrx/noisefigure/noisefigure.h index bc9335db7..80c5858ba 100644 --- a/plugins/channelrx/noisefigure/noisefigure.h +++ b/plugins/channelrx/noisefigure/noisefigure.h @@ -50,20 +50,23 @@ public: public: const NoiseFigureSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNoiseFigure* create(const NoiseFigureSettings& settings, bool force) + static MsgConfigureNoiseFigure* create(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force) { - return new MsgConfigureNoiseFigure(settings, force); + return new MsgConfigureNoiseFigure(settingsKeys, settings, force); } private: NoiseFigureSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNoiseFigure(const NoiseFigureSettings& settings, bool force) : + MsgConfigureNoiseFigure(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -260,10 +263,10 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const NoiseFigureSettings& settings, bool force = false); - void webapiReverseSendSettings(QList& channelSettingsKeys, const NoiseFigureSettings& settings, bool force); + void applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force = false); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const NoiseFigureSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const NoiseFigureSettings& settings, bool force diff --git a/plugins/channelrx/noisefigure/noisefigurebaseband.cpp b/plugins/channelrx/noisefigure/noisefigurebaseband.cpp index b0268d77a..e915adb48 100644 --- a/plugins/channelrx/noisefigure/noisefigurebaseband.cpp +++ b/plugins/channelrx/noisefigure/noisefigurebaseband.cpp @@ -133,7 +133,7 @@ bool NoiseFigureBaseband::handleMessage(const Message& cmd) MsgConfigureNoiseFigureBaseband& cfg = (MsgConfigureNoiseFigureBaseband&) cmd; qDebug() << "NoiseFigureBaseband::handleMessage: MsgConfigureNoiseFigureBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -154,11 +154,15 @@ bool NoiseFigureBaseband::handleMessage(const Message& cmd) } } -void NoiseFigureBaseband::applySettings(const NoiseFigureSettings& settings, bool force) +void NoiseFigureBaseband::applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force) { - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void NoiseFigureBaseband::setBasebandSampleRate(int sampleRate) diff --git a/plugins/channelrx/noisefigure/noisefigurebaseband.h b/plugins/channelrx/noisefigure/noisefigurebaseband.h index 816485b19..f820ffc6d 100644 --- a/plugins/channelrx/noisefigure/noisefigurebaseband.h +++ b/plugins/channelrx/noisefigure/noisefigurebaseband.h @@ -42,20 +42,23 @@ public: public: const NoiseFigureSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNoiseFigureBaseband* create(const NoiseFigureSettings& settings, bool force) + static MsgConfigureNoiseFigureBaseband* create(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force) { - return new MsgConfigureNoiseFigureBaseband(settings, force); + return new MsgConfigureNoiseFigureBaseband(settingsKeys, settings, force); } private: NoiseFigureSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNoiseFigureBaseband(const NoiseFigureSettings& settings, bool force) : + MsgConfigureNoiseFigureBaseband(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(NoiseFigureSink *sink); - void applySettings(const NoiseFigureSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/noisefigure/noisefiguregui.cpp b/plugins/channelrx/noisefigure/noisefiguregui.cpp index 98996df9c..6708ad91f 100644 --- a/plugins/channelrx/noisefigure/noisefiguregui.cpp +++ b/plugins/channelrx/noisefigure/noisefiguregui.cpp @@ -220,7 +220,7 @@ void NoiseFigureGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray NoiseFigureGUI::serialize() const @@ -232,7 +232,7 @@ bool NoiseFigureGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -312,7 +312,7 @@ void NoiseFigureGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NoiseFigureGUI::channelMarkerHighlightedByCursor() @@ -325,20 +325,20 @@ void NoiseFigureGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NoiseFigureGUI::on_fftCount_valueChanged(int value) { m_settings.m_fftCount = 10000 * value; ui->fftCountText->setText(QString("%1k").arg(m_settings.m_fftCount / 1000)); - applySettings(); + applySettings(QStringList("fftCount")); } void NoiseFigureGUI::on_setting_currentTextChanged(const QString& text) { m_settings.m_setting = text; - applySettings(); + applySettings(QStringList("setting")); } void NoiseFigureGUI::updateFreqWidgets() @@ -361,44 +361,44 @@ void NoiseFigureGUI::on_frequencySpec_currentIndexChanged(int index) { m_settings.m_sweepSpec = (NoiseFigureSettings::SweepSpec)index; updateFreqWidgets(); - applySettings(); + applySettings(QStringList("sweepSpec")); } void NoiseFigureGUI::on_start_valueChanged(double value) { m_settings.m_startValue = value; - applySettings(); + applySettings(QStringList("startValue")); } void NoiseFigureGUI::on_stop_valueChanged(double value) { m_settings.m_stopValue = value; - applySettings(); + applySettings(QStringList("stopValue")); } void NoiseFigureGUI::on_steps_valueChanged(int value) { m_settings.m_steps = value; - applySettings(); + applySettings(QStringList("steps")); } void NoiseFigureGUI::on_step_valueChanged(double value) { m_settings.m_step = value; - applySettings(); + applySettings(QStringList("step")); } void NoiseFigureGUI::on_list_editingFinished() { m_settings.m_sweepList = ui->list->text().trimmed(); - applySettings(); + applySettings(QStringList("sweepList")); } void NoiseFigureGUI::on_fftSize_currentIndexChanged(int index) { m_settings.m_fftSize = 1 << (index + 6); updateBW(); - applySettings(); + applySettings(QStringList("fftSize")); } void NoiseFigureGUI::on_startStop_clicked() @@ -517,7 +517,7 @@ void NoiseFigureGUI::on_enr_clicked() NoiseFigureENRDialog dialog(&m_settings); if (dialog.exec() == QDialog::Accepted) { - applySettings(); + applySettings(QStringList({"enrSettings", "interpolation"})); } } @@ -526,7 +526,7 @@ void NoiseFigureGUI::on_control_clicked() NoiseFigureControlDialog dialog(&m_settings); if (dialog.exec() == QDialog::Accepted) { - applySettings(); + applySettings(QStringList({"controlSettings", "powerDelay", "visaDevice", "powerOnCommand", "powerOffCommand", "powerOnSCPI", "powerOffSCPI"})); } } @@ -536,7 +536,7 @@ void NoiseFigureGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void NoiseFigureGUI::onMenuDialogCalled(const QPoint &p) @@ -581,7 +581,7 @@ void NoiseFigureGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"useReverseAPI", "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -668,7 +668,7 @@ NoiseFigureGUI::NoiseFigureGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -700,11 +700,11 @@ void NoiseFigureGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void NoiseFigureGUI::applySettings(bool force) +void NoiseFigureGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - NoiseFigure::MsgConfigureNoiseFigure* message = NoiseFigure::MsgConfigureNoiseFigure::create( m_settings, force); + NoiseFigure::MsgConfigureNoiseFigure* message = NoiseFigure::MsgConfigureNoiseFigure::create(settingsKeys, m_settings, force); m_noiseFigure->getInputMessageQueue()->push(message); } } diff --git a/plugins/channelrx/noisefigure/noisefiguregui.h b/plugins/channelrx/noisefigure/noisefiguregui.h index 8aa01ec22..d59b0efe2 100644 --- a/plugins/channelrx/noisefigure/noisefiguregui.h +++ b/plugins/channelrx/noisefigure/noisefiguregui.h @@ -102,7 +102,7 @@ private: virtual ~NoiseFigureGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channelrx/noisefigure/noisefiguresettings.cpp b/plugins/channelrx/noisefigure/noisefiguresettings.cpp index 9960098a3..715902204 100644 --- a/plugins/channelrx/noisefigure/noisefiguresettings.cpp +++ b/plugins/channelrx/noisefigure/noisefiguresettings.cpp @@ -253,3 +253,180 @@ void NoiseFigureSettings::deserializeENRs(const QByteArray& data, QList& (*stream) >> enrs; delete stream; } + +void NoiseFigureSettings::applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("fftSize")) { + m_fftSize = settings.m_fftSize; + } + if (settingsKeys.contains("fftCount")) { + m_fftCount = settings.m_fftCount; + } + if (settingsKeys.contains("sweepSpec")) { + m_sweepSpec = settings.m_sweepSpec; + } + if (settingsKeys.contains("startValue")) { + m_startValue = settings.m_startValue; + } + if (settingsKeys.contains("stopValue")) { + m_stopValue = settings.m_stopValue; + } + if (settingsKeys.contains("steps")) { + m_steps = settings.m_steps; + } + if (settingsKeys.contains("step")) { + m_step = settings.m_step; + } + if (settingsKeys.contains("sweepList")) { + m_sweepList = settings.m_sweepList; + } + if (settingsKeys.contains("visaDevice")) { + m_visaDevice = settings.m_visaDevice; + } + if (settingsKeys.contains("powerOnSCPI")) { + m_powerOnSCPI = settings.m_powerOnSCPI; + } + if (settingsKeys.contains("powerOffSCPI")) { + m_powerOffSCPI = settings.m_powerOffSCPI; + } + if (settingsKeys.contains("powerOnCommand")) { + m_powerOnCommand = settings.m_powerOnCommand; + } + if (settingsKeys.contains("powerOffCommand")) { + m_powerOffCommand = settings.m_powerOffCommand; + } + if (settingsKeys.contains("powerDelay")) { + m_powerDelay = settings.m_powerDelay; + } + if (settingsKeys.contains("interpolation")) { + m_interpolation = settings.m_interpolation; + } + if (settingsKeys.contains("setting")) { + m_setting = settings.m_setting; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString NoiseFigureSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("fftSize") || force) { + ostr << " m_fftSize: " << m_fftSize; + } + if (settingsKeys.contains("fftCount") || force) { + ostr << " m_fftCount: " << m_fftCount; + } + if (settingsKeys.contains("sweepSpec") || force) { + ostr << " m_sweepSpec: " << m_sweepSpec; + } + if (settingsKeys.contains("startValue") || force) { + ostr << " m_startValue: " << m_startValue; + } + if (settingsKeys.contains("stopValue") || force) { + ostr << " m_stopValue: " << m_stopValue; + } + if (settingsKeys.contains("steps") || force) { + ostr << " m_steps: " << m_steps; + } + if (settingsKeys.contains("step") || force) { + ostr << " m_step: " << m_step; + } + if (settingsKeys.contains("sweepList") || force) { + ostr << " m_sweepList: " << m_sweepList.toStdString(); + } + if (settingsKeys.contains("visaDevice") || force) { + ostr << " m_visaDevice: " << m_visaDevice.toStdString(); + } + if (settingsKeys.contains("powerOnSCPI") || force) { + ostr << " m_powerOnSCPI: " << m_powerOnSCPI.toStdString(); + } + if (settingsKeys.contains("powerOffSCPI") || force) { + ostr << " m_powerOffSCPI: " << m_powerOffSCPI.toStdString(); + } + if (settingsKeys.contains("powerOnCommand") || force) { + ostr << " m_powerOnCommand: " << m_powerOnCommand.toStdString(); + } + if (settingsKeys.contains("powerOffCommand") || force) { + ostr << " m_powerOffCommand: " << m_powerOffCommand.toStdString(); + } + if (settingsKeys.contains("powerDelay") || force) { + ostr << " m_powerDelay: " << m_powerDelay; + } + if (settingsKeys.contains("interpolation") || force) { + ostr << " m_interpolation: " << m_interpolation; + } + if (settingsKeys.contains("setting") || force) { + ostr << " m_setting: " << m_setting.toStdString(); + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/noisefigure/noisefiguresettings.h b/plugins/channelrx/noisefigure/noisefiguresettings.h index f5004caa4..9c0e47b13 100644 --- a/plugins/channelrx/noisefigure/noisefiguresettings.h +++ b/plugins/channelrx/noisefigure/noisefiguresettings.h @@ -103,6 +103,8 @@ struct NoiseFigureSettings bool deserialize(const QByteArray& data); QByteArray serializeENRs(QList enrs) const; void deserializeENRs(const QByteArray& data, QList& enrs); + void applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_NOISEFIGURESETTINGS_H */ diff --git a/plugins/channelrx/noisefigure/noisefiguresink.cpp b/plugins/channelrx/noisefigure/noisefiguresink.cpp index 76c0e4c2a..966a3004e 100644 --- a/plugins/channelrx/noisefigure/noisefiguresink.cpp +++ b/plugins/channelrx/noisefigure/noisefiguresink.cpp @@ -40,7 +40,7 @@ NoiseFigureSink::NoiseFigureSink() : { m_magsq = 0.0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, 0, true); } @@ -129,12 +129,11 @@ void NoiseFigureSink::applyChannelSettings(int channelSampleRate, int channelFre m_channelSampleRate = channelSampleRate; } -void NoiseFigureSink::applySettings(const NoiseFigureSettings& settings, bool force) +void NoiseFigureSink::applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force) { - qDebug() << "NoiseFigureSink::applySettings:" - << " force: " << force; + qDebug() << "NoiseFigureSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_fftSize != m_settings.m_fftSize) || force) + if ((settingsKeys.contains("fftSize") && (settings.m_fftSize != m_settings.m_fftSize)) || force) { FFTFactory *fftFactory = DSPEngine::instance()->getFFTFactory(); if (m_fftSequence >= 0) { @@ -144,11 +143,15 @@ void NoiseFigureSink::applySettings(const NoiseFigureSettings& settings, bool fo m_fftCounter = 0; } - if ((settings.m_fftCount != m_settings.m_fftCount) || force) + if ((settingsKeys.contains("fftCount") && (settings.m_fftCount != m_settings.m_fftCount)) || force) { m_powerSum = 0.0; m_count = 0; } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/noisefigure/noisefiguresink.h b/plugins/channelrx/noisefigure/noisefiguresink.h index 666215d36..8cbca8c70 100644 --- a/plugins/channelrx/noisefigure/noisefiguresink.h +++ b/plugins/channelrx/noisefigure/noisefiguresink.h @@ -44,7 +44,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const NoiseFigureSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NoiseFigureSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } void startMeasurement() { m_enabled = true; } diff --git a/plugins/channelrx/radioastronomy/radioastronomysettings.cpp b/plugins/channelrx/radioastronomy/radioastronomysettings.cpp index bc3f280d6..6982f239f 100644 --- a/plugins/channelrx/radioastronomy/radioastronomysettings.cpp +++ b/plugins/channelrx/radioastronomy/radioastronomysettings.cpp @@ -509,4 +509,665 @@ bool RadioAstronomySettings::deserialize(const QByteArray& data) } } +void RadioAstronomySettings::applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("sampleRate")) { + m_sampleRate = settings.m_sampleRate; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("integration")) { + m_integration = settings.m_integration; + } + if (settingsKeys.contains("fftSize")) { + m_fftSize = settings.m_fftSize; + } + if (settingsKeys.contains("fftWindow")) { + m_fftWindow = settings.m_fftWindow; + } + if (settingsKeys.contains("filterFreqs")) { + m_filterFreqs = settings.m_filterFreqs; + } + if (settingsKeys.contains("starTracker")) { + m_starTracker = settings.m_starTracker; + } + if (settingsKeys.contains("rotator")) { + m_rotator = settings.m_rotator; + } + if (settingsKeys.contains("tempRX")) { + m_tempRX = settings.m_tempRX; + } + if (settingsKeys.contains("tempCMB")) { + m_tempCMB = settings.m_tempCMB; + } + if (settingsKeys.contains("tempGal")) { + m_tempGal = settings.m_tempGal; + } + if (settingsKeys.contains("tempSP")) { + m_tempSP = settings.m_tempSP; + } + if (settingsKeys.contains("tempAtm")) { + m_tempAtm = settings.m_tempAtm; + } + if (settingsKeys.contains("tempAir")) { + m_tempAir = settings.m_tempAir; + } + if (settingsKeys.contains("zenithOpacity")) { + m_zenithOpacity = settings.m_zenithOpacity; + } + if (settingsKeys.contains("elevation")) { + m_elevation = settings.m_elevation; + } + if (settingsKeys.contains("tempGalLink")) { + m_tempGalLink = settings.m_tempGalLink; + } + if (settingsKeys.contains("tempAtmLink")) { + m_tempAtmLink = settings.m_tempAtmLink; + } + if (settingsKeys.contains("tempAirLink")) { + m_tempAirLink = settings.m_tempAirLink; + } + if (settingsKeys.contains("elevationLink")) { + m_elevationLink = settings.m_elevationLink; + } + if (settingsKeys.contains("gainVariation")) { + m_gainVariation = settings.m_gainVariation; + } + if (settingsKeys.contains("sourceType")) { + m_sourceType = settings.m_sourceType; + } + if (settingsKeys.contains("omegaS")) { + m_omegaS = settings.m_omegaS; + } + if (settingsKeys.contains("omegaSUnits")) { + m_omegaSUnits = settings.m_omegaSUnits; + } + if (settingsKeys.contains("omegaAUnits")) { + m_omegaAUnits = settings.m_omegaAUnits; + } + if (settingsKeys.contains("spectrumPeaks")) { + m_spectrumPeaks = settings.m_spectrumPeaks; + } + if (settingsKeys.contains("spectrumMarkers")) { + m_spectrumMarkers = settings.m_spectrumMarkers; + } + if (settingsKeys.contains("spectrumTemp")) { + m_spectrumTemp = settings.m_spectrumTemp; + } + if (settingsKeys.contains("spectrumReverseXAxis")) { + m_spectrumReverseXAxis = settings.m_spectrumReverseXAxis; + } + if (settingsKeys.contains("spectrumRefLine")) { + m_spectrumRefLine = settings.m_spectrumRefLine; + } + if (settingsKeys.contains("spectrumLAB")) { + m_spectrumLAB = settings.m_spectrumLAB; + } + if (settingsKeys.contains("spectrumDistance")) { + m_spectrumDistance = settings.m_spectrumDistance; + } + if (settingsKeys.contains("spectrumLegend")) { + m_spectrumLegend = settings.m_spectrumLegend; + } + if (settingsKeys.contains("spectrumReference")) { + m_spectrumReference = settings.m_spectrumReference; + } + if (settingsKeys.contains("spectrumRange")) { + m_spectrumRange = settings.m_spectrumRange; + } + if (settingsKeys.contains("spectrumSpan")) { + m_spectrumSpan = settings.m_spectrumSpan; + } + if (settingsKeys.contains("spectrumCenterFreqOffset")) { + m_spectrumCenterFreqOffset = settings.m_spectrumCenterFreqOffset; + } + if (settingsKeys.contains("spectrumAutoscale")) { + m_spectrumAutoscale = settings.m_spectrumAutoscale; + } + if (settingsKeys.contains("spectrumYScale")) { + m_spectrumYScale = settings.m_spectrumYScale; + } + if (settingsKeys.contains("spectrumBaseline")) { + m_spectrumBaseline = settings.m_spectrumBaseline; + } + if (settingsKeys.contains("recalibrate")) { + m_recalibrate = settings.m_recalibrate; + } + if (settingsKeys.contains("tCalHot")) { + m_tCalHot = settings.m_tCalHot; + } + if (settingsKeys.contains("tCalCold")) { + m_tCalCold = settings.m_tCalCold; + } + if (settingsKeys.contains("line")) { + m_line = settings.m_line; + } + if (settingsKeys.contains("lineCustomFrequency")) { + m_lineCustomFrequency = settings.m_lineCustomFrequency; + } + if (settingsKeys.contains("refFrame")) { + m_refFrame = settings.m_refFrame; + } + if (settingsKeys.contains("sunDistanceToGC")) { + m_sunDistanceToGC = settings.m_sunDistanceToGC; + } + if (settingsKeys.contains("sunOrbitalVelocity")) { + m_sunOrbitalVelocity = settings.m_sunOrbitalVelocity; + } + if (settingsKeys.contains("powerPeaks")) { + m_powerPeaks = settings.m_powerPeaks; + } + if (settingsKeys.contains("powerMarkers")) { + m_powerMarkers = settings.m_powerMarkers; + } + if (settingsKeys.contains("powerAvg")) { + m_powerAvg = settings.m_powerAvg; + } + if (settingsKeys.contains("powerLegend")) { + m_powerLegend = settings.m_powerLegend; + } + if (settingsKeys.contains("powerShowTsys0")) { + m_powerShowTsys0 = settings.m_powerShowTsys0; + } + if (settingsKeys.contains("powerShowAirTemp")) { + m_powerShowAirTemp = settings.m_powerShowAirTemp; + } + if (settingsKeys.contains("powerShowGaussian")) { + m_powerShowGaussian = settings.m_powerShowGaussian; + } + if (settingsKeys.contains("powerShowFiltered")) { + m_powerShowFiltered = settings.m_powerShowFiltered; + } + if (settingsKeys.contains("powerShowMeasurement")) { + m_powerShowMeasurement = settings.m_powerShowMeasurement; + } + if (settingsKeys.contains("powerReference")) { + m_powerReference = settings.m_powerReference; + } + if (settingsKeys.contains("powerRange")) { + m_powerRange = settings.m_powerRange; + } + if (settingsKeys.contains("powerAutoscale")) { + m_powerAutoscale = settings.m_powerAutoscale; + } + if (settingsKeys.contains("powerYData")) { + m_powerYData = settings.m_powerYData; + } + if (settingsKeys.contains("powerYUnits")) { + m_powerYUnits = settings.m_powerYUnits; + } + if (settingsKeys.contains("powerFilter")) { + m_powerFilter = settings.m_powerFilter; + } + if (settingsKeys.contains("powerFilterN")) { + m_powerFilterN = settings.m_powerFilterN; + } + if (settingsKeys.contains("power2DLinkSweep")) { + m_power2DLinkSweep = settings.m_power2DLinkSweep; + } + if (settingsKeys.contains("power2DSweepType")) { + m_power2DSweepType = settings.m_power2DSweepType; + } + if (settingsKeys.contains("power2DWidth")) { + m_power2DWidth = settings.m_power2DWidth; + } + if (settingsKeys.contains("power2DHeight")) { + m_power2DHeight = settings.m_power2DHeight; + } + if (settingsKeys.contains("power2DXMin")) { + m_power2DXMin = settings.m_power2DXMin; + } + if (settingsKeys.contains("power2DXMax")) { + m_power2DXMax = settings.m_power2DXMax; + } + if (settingsKeys.contains("power2DYMin")) { + m_power2DYMin = settings.m_power2DYMin; + } + if (settingsKeys.contains("power2DYMax")) { + m_power2DYMax = settings.m_power2DYMax; + } + if (settingsKeys.contains("powerColourAutoscale")) { + m_powerColourAutoscale = settings.m_powerColourAutoscale; + } + if (settingsKeys.contains("powerColourScaleMin")) { + m_powerColourScaleMin = settings.m_powerColourScaleMin; + } + if (settingsKeys.contains("powerColourScaleMax")) { + m_powerColourScaleMax = settings.m_powerColourScaleMax; + } + if (settingsKeys.contains("powerColourPalette")) { + m_powerColourPalette = settings.m_powerColourPalette; + } + if (settingsKeys.contains("runMode")) { + m_runMode = settings.m_runMode; + } + if (settingsKeys.contains("sweepStartAtTime")) { + m_sweepStartAtTime = settings.m_sweepStartAtTime; + } + if (settingsKeys.contains("sweepStartDateTime")) { + m_sweepStartDateTime = settings.m_sweepStartDateTime; + } + if (settingsKeys.contains("sweepType")) { + m_sweepType = settings.m_sweepType; + } + if (settingsKeys.contains("sweep1Start")) { + m_sweep1Start = settings.m_sweep1Start; + } + if (settingsKeys.contains("sweep1Stop")) { + m_sweep1Stop = settings.m_sweep1Stop; + } + if (settingsKeys.contains("sweep1Step")) { + m_sweep1Step = settings.m_sweep1Step; + } + if (settingsKeys.contains("sweep1Delay")) { + m_sweep1Delay = settings.m_sweep1Delay; + } + if (settingsKeys.contains("sweep2Start")) { + m_sweep2Start = settings.m_sweep2Start; + } + if (settingsKeys.contains("sweep2Stop")) { + m_sweep2Stop = settings.m_sweep2Stop; + } + if (settingsKeys.contains("sweep2Step")) { + m_sweep2Step = settings.m_sweep2Step; + } + if (settingsKeys.contains("sweep2Delay")) { + m_sweep2Delay = settings.m_sweep2Delay; + } + if (settingsKeys.contains("gpioEnabled")) { + m_gpioEnabled = settings.m_gpioEnabled; + } + if (settingsKeys.contains("gpioPin")) { + m_gpioPin = settings.m_gpioPin; + } + if (settingsKeys.contains("gpioSense")) { + m_gpioSense = settings.m_gpioSense; + } + if (settingsKeys.contains("startCalCommand")) { + m_startCalCommand = settings.m_startCalCommand; + } + if (settingsKeys.contains("stopCalCommand")) { + m_stopCalCommand = settings.m_stopCalCommand; + } + if (settingsKeys.contains("calCommandDelay")) { + m_calCommandDelay = settings.m_calCommandDelay; + } + if (settingsKeys.contains("sensorMeasurePeriod")) { + m_sensorMeasurePeriod = settings.m_sensorMeasurePeriod; + } + if (settingsKeys.contains("spectrumAutoSaveCSVFilename")) { + m_spectrumAutoSaveCSVFilename = settings.m_spectrumAutoSaveCSVFilename; + } + if (settingsKeys.contains("powerAutoSaveCSVFilename")) { + m_powerAutoSaveCSVFilename = settings.m_powerAutoSaveCSVFilename; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString RadioAstronomySettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("sampleRate") || force) { + ostr << " m_sampleRate: " << m_sampleRate; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("integration") || force) { + ostr << " m_integration: " << m_integration; + } + if (settingsKeys.contains("fftSize") || force) { + ostr << " m_fftSize: " << m_fftSize; + } + if (settingsKeys.contains("fftWindow") || force) { + ostr << " m_fftWindow: " << m_fftWindow; + } + if (settingsKeys.contains("filterFreqs") || force) { + ostr << " m_filterFreqs: " << m_filterFreqs.toStdString(); + } + if (settingsKeys.contains("starTracker") || force) { + ostr << " m_starTracker: " << m_starTracker.toStdString(); + } + if (settingsKeys.contains("rotator") || force) { + ostr << " m_rotator: " << m_rotator.toStdString(); + } + if (settingsKeys.contains("tempRX") || force) { + ostr << " m_tempRX: " << m_tempRX; + } + if (settingsKeys.contains("tempCMB") || force) { + ostr << " m_tempCMB: " << m_tempCMB; + } + if (settingsKeys.contains("tempGal") || force) { + ostr << " m_tempGal: " << m_tempGal; + } + if (settingsKeys.contains("tempSP") || force) { + ostr << " m_tempSP: " << m_tempSP; + } + if (settingsKeys.contains("tempAtm") || force) { + ostr << " m_tempAtm: " << m_tempAtm; + } + if (settingsKeys.contains("tempAir") || force) { + ostr << " m_tempAir: " << m_tempAir; + } + if (settingsKeys.contains("zenithOpacity") || force) { + ostr << " m_zenithOpacity: " << m_zenithOpacity; + } + if (settingsKeys.contains("elevation") || force) { + ostr << " m_elevation: " << m_elevation; + } + if (settingsKeys.contains("tempGalLink") || force) { + ostr << " m_tempGalLink: " << m_tempGalLink; + } + if (settingsKeys.contains("tempAtmLink") || force) { + ostr << " m_tempAtmLink: " << m_tempAtmLink; + } + if (settingsKeys.contains("tempAirLink") || force) { + ostr << " m_tempAirLink: " << m_tempAirLink; + } + if (settingsKeys.contains("elevationLink") || force) { + ostr << " m_elevationLink: " << m_elevationLink; + } + if (settingsKeys.contains("gainVariation") || force) { + ostr << " m_gainVariation: " << m_gainVariation; + } + if (settingsKeys.contains("sourceType") || force) { + ostr << " m_sourceType: " << m_sourceType; + } + if (settingsKeys.contains("omegaS") || force) { + ostr << " m_omegaS: " << m_omegaS; + } + if (settingsKeys.contains("omegaSUnits") || force) { + ostr << " m_omegaSUnits: " << m_omegaSUnits; + } + if (settingsKeys.contains("omegaAUnits") || force) { + ostr << " m_omegaAUnits: " << m_omegaAUnits; + } + if (settingsKeys.contains("spectrumPeaks") || force) { + ostr << " m_spectrumPeaks: " << m_spectrumPeaks; + } + if (settingsKeys.contains("spectrumMarkers") || force) { + ostr << " m_spectrumMarkers: " << m_spectrumMarkers; + } + if (settingsKeys.contains("spectrumTemp") || force) { + ostr << " m_spectrumTemp: " << m_spectrumTemp; + } + if (settingsKeys.contains("spectrumReverseXAxis") || force) { + ostr << " m_spectrumReverseXAxis: " << m_spectrumReverseXAxis; + } + if (settingsKeys.contains("spectrumRefLine") || force) { + ostr << " m_spectrumRefLine: " << m_spectrumRefLine; + } + if (settingsKeys.contains("spectrumLAB") || force) { + ostr << " m_spectrumLAB: " << m_spectrumLAB; + } + if (settingsKeys.contains("spectrumDistance") || force) { + ostr << " m_spectrumDistance: " << m_spectrumDistance; + } + if (settingsKeys.contains("spectrumLegend") || force) { + ostr << " m_spectrumLegend: " << m_spectrumLegend; + } + if (settingsKeys.contains("spectrumReference") || force) { + ostr << " m_spectrumReference: " << m_spectrumReference; + } + if (settingsKeys.contains("spectrumRange") || force) { + ostr << " m_spectrumRange: " << m_spectrumRange; + } + if (settingsKeys.contains("spectrumSpan") || force) { + ostr << " m_spectrumSpan: " << m_spectrumSpan; + } + if (settingsKeys.contains("spectrumCenterFreqOffset") || force) { + ostr << " m_spectrumCenterFreqOffset: " << m_spectrumCenterFreqOffset; + } + if (settingsKeys.contains("spectrumAutoscale") || force) { + ostr << " m_spectrumAutoscale: " << m_spectrumAutoscale; + } + if (settingsKeys.contains("spectrumYScale") || force) { + ostr << " m_spectrumYScale: " << m_spectrumYScale; + } + if (settingsKeys.contains("spectrumBaseline") || force) { + ostr << " m_spectrumBaseline: " << m_spectrumBaseline; + } + if (settingsKeys.contains("recalibrate") || force) { + ostr << " m_recalibrate: " << m_recalibrate; + } + if (settingsKeys.contains("tCalHot") || force) { + ostr << " m_tCalHot: " << m_tCalHot; + } + if (settingsKeys.contains("tCalCold") || force) { + ostr << " m_tCalCold: " << m_tCalCold; + } + if (settingsKeys.contains("line") || force) { + ostr << " m_line: " << m_line; + } + if (settingsKeys.contains("lineCustomFrequency") || force) { + ostr << " m_lineCustomFrequency: " << m_lineCustomFrequency; + } + if (settingsKeys.contains("refFrame") || force) { + ostr << " m_refFrame: " << m_refFrame; + } + if (settingsKeys.contains("sunDistanceToGC") || force) { + ostr << " m_sunDistanceToGC: " << m_sunDistanceToGC; + } + if (settingsKeys.contains("sunOrbitalVelocity") || force) { + ostr << " m_sunOrbitalVelocity: " << m_sunOrbitalVelocity; + } + if (settingsKeys.contains("powerPeaks") || force) { + ostr << " m_powerPeaks: " << m_powerPeaks; + } + if (settingsKeys.contains("powerMarkers") || force) { + ostr << " m_powerMarkers: " << m_powerMarkers; + } + if (settingsKeys.contains("powerAvg") || force) { + ostr << " m_powerAvg: " << m_powerAvg; + } + if (settingsKeys.contains("powerLegend") || force) { + ostr << " m_powerLegend: " << m_powerLegend; + } + if (settingsKeys.contains("powerShowTsys0") || force) { + ostr << " m_powerShowTsys0: " << m_powerShowTsys0; + } + if (settingsKeys.contains("powerShowAirTemp") || force) { + ostr << " m_powerShowAirTemp: " << m_powerShowAirTemp; + } + if (settingsKeys.contains("powerShowGaussian") || force) { + ostr << " m_powerShowGaussian: " << m_powerShowGaussian; + } + if (settingsKeys.contains("powerShowFiltered") || force) { + ostr << " m_powerShowFiltered: " << m_powerShowFiltered; + } + if (settingsKeys.contains("powerShowMeasurement") || force) { + ostr << " m_powerShowMeasurement: " << m_powerShowMeasurement; + } + if (settingsKeys.contains("powerReference") || force) { + ostr << " m_powerReference: " << m_powerReference; + } + if (settingsKeys.contains("powerRange") || force) { + ostr << " m_powerRange: " << m_powerRange; + } + if (settingsKeys.contains("powerAutoscale") || force) { + ostr << " m_powerAutoscale: " << m_powerAutoscale; + } + if (settingsKeys.contains("powerYData") || force) { + ostr << " m_powerYData: " << m_powerYData; + } + if (settingsKeys.contains("powerYUnits") || force) { + ostr << " m_powerYUnits: " << m_powerYUnits; + } + if (settingsKeys.contains("powerFilter") || force) { + ostr << " m_powerFilter: " << m_powerFilter; + } + if (settingsKeys.contains("powerFilterN") || force) { + ostr << " m_powerFilterN: " << m_powerFilterN; + } + if (settingsKeys.contains("power2DLinkSweep") || force) { + ostr << " m_power2DLinkSweep: " << m_power2DLinkSweep; + } + if (settingsKeys.contains("power2DSweepType") || force) { + ostr << " m_power2DSweepType: " << m_power2DSweepType; + } + if (settingsKeys.contains("power2DWidth") || force) { + ostr << " m_power2DWidth: " << m_power2DWidth; + } + if (settingsKeys.contains("power2DHeight") || force) { + ostr << " m_power2DHeight: " << m_power2DHeight; + } + if (settingsKeys.contains("power2DXMin") || force) { + ostr << " m_power2DXMin: " << m_power2DXMin; + } + if (settingsKeys.contains("power2DXMax") || force) { + ostr << " m_power2DXMax: " << m_power2DXMax; + } + if (settingsKeys.contains("power2DYMin") || force) { + ostr << " m_power2DYMin: " << m_power2DYMin; + } + if (settingsKeys.contains("power2DYMax") || force) { + ostr << " m_power2DYMax: " << m_power2DYMax; + } + if (settingsKeys.contains("powerColourAutoscale") || force) { + ostr << " m_powerColourAutoscale: " << m_powerColourAutoscale; + } + if (settingsKeys.contains("powerColourScaleMin") || force) { + ostr << " m_powerColourScaleMin: " << m_powerColourScaleMin; + } + if (settingsKeys.contains("powerColourScaleMax") || force) { + ostr << " m_powerColourScaleMax: " << m_powerColourScaleMax; + } + if (settingsKeys.contains("powerColourPalette") || force) { + ostr << " m_powerColourPalette: " << m_powerColourPalette.toStdString(); + } + if (settingsKeys.contains("runMode") || force) { + ostr << " m_runMode: " << m_runMode; + } + if (settingsKeys.contains("sweepStartAtTime") || force) { + ostr << " m_sweepStartAtTime: " << m_sweepStartAtTime; + } + if (settingsKeys.contains("sweepStartDateTime") || force) { + ostr << " m_sweepStartDateTime: " << m_sweepStartDateTime.toString().toStdString(); + } + if (settingsKeys.contains("sweepType") || force) { + ostr << " m_sweepType: " << m_sweepType; + } + if (settingsKeys.contains("sweep1Start") || force) { + ostr << " m_sweep1Start: " << m_sweep1Start; + } + if (settingsKeys.contains("sweep1Stop") || force) { + ostr << " m_sweep1Stop: " << m_sweep1Stop; + } + if (settingsKeys.contains("sweep1Step") || force) { + ostr << " m_sweep1Step: " << m_sweep1Step; + } + if (settingsKeys.contains("sweep1Delay") || force) { + ostr << " m_sweep1Delay: " << m_sweep1Delay; + } + if (settingsKeys.contains("sweep2Start") || force) { + ostr << " m_sweep2Start: " << m_sweep2Start; + } + if (settingsKeys.contains("sweep2Stop") || force) { + ostr << " m_sweep2Stop: " << m_sweep2Stop; + } + if (settingsKeys.contains("sweep2Step") || force) { + ostr << " m_sweep2Step: " << m_sweep2Step; + } + if (settingsKeys.contains("sweep2Delay") || force) { + ostr << " m_sweep2Delay: " << m_sweep2Delay; + } + if (settingsKeys.contains("gpioEnabled") || force) { + ostr << " m_gpioEnabled: " << m_gpioEnabled; + } + if (settingsKeys.contains("gpioPin") || force) { + ostr << " m_gpioPin: " << m_gpioPin; + } + if (settingsKeys.contains("gpioSense") || force) { + ostr << " m_gpioSense: " << m_gpioSense; + } + if (settingsKeys.contains("startCalCommand") || force) { + ostr << " m_startCalCommand: " << m_startCalCommand.toStdString(); + } + if (settingsKeys.contains("stopCalCommand") || force) { + ostr << " m_stopCalCommand: " << m_stopCalCommand.toStdString(); + } + if (settingsKeys.contains("calCommandDelay") || force) { + ostr << " m_calCommandDelay: " << m_calCommandDelay; + } + if (settingsKeys.contains("sensorMeasurePeriod") || force) { + ostr << " m_sensorMeasurePeriod: " << m_sensorMeasurePeriod; + } + if (settingsKeys.contains("spectrumAutoSaveCSVFilename") || force) { + ostr << " m_spectrumAutoSaveCSVFilename: " << m_spectrumAutoSaveCSVFilename.toStdString(); + } + if (settingsKeys.contains("powerAutoSaveCSVFilename") || force) { + ostr << " m_powerAutoSaveCSVFilename: " << m_powerAutoSaveCSVFilename.toStdString(); + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/radioastronomy/radioastronomysettings.h b/plugins/channelrx/radioastronomy/radioastronomysettings.h index a85587de0..eacd13cac 100644 --- a/plugins/channelrx/radioastronomy/radioastronomysettings.h +++ b/plugins/channelrx/radioastronomy/radioastronomysettings.h @@ -231,6 +231,8 @@ struct RadioAstronomySettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_RADIOASTRONOMYSETTINGS_H */ diff --git a/plugins/channelrx/radioclock/radioclocksettings.cpp b/plugins/channelrx/radioclock/radioclocksettings.cpp index 1b0a3485a..1c2cf0eef 100644 --- a/plugins/channelrx/radioclock/radioclocksettings.cpp +++ b/plugins/channelrx/radioclock/radioclocksettings.cpp @@ -166,4 +166,119 @@ bool RadioClockSettings::deserialize(const QByteArray& data) } } +void RadioClockSettings::applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings) +{ + if (settingsKeys.contains("frequencyMode")) { + m_frequencyMode = settings.m_frequencyMode; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("frequency")) { + m_frequency = settings.m_frequency; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("threshold")) { + m_threshold = settings.m_threshold; + } + if (settingsKeys.contains("modulation")) { + m_modulation = settings.m_modulation; + } + if (settingsKeys.contains("timezone")) { + m_timezone = settings.m_timezone; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString RadioClockSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("frequencyMode") || force) { + ostr << " m_frequencyMode: " << m_frequencyMode; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("frequency") || force) { + ostr << " m_frequency: " << m_frequency; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("threshold") || force) { + ostr << " m_threshold: " << m_threshold; + } + if (settingsKeys.contains("modulation") || force) { + ostr << " m_modulation: " << m_modulation; + } + if (settingsKeys.contains("timezone") || force) { + ostr << " m_timezone: " << m_timezone; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/radioclock/radioclocksettings.h b/plugins/channelrx/radioclock/radioclocksettings.h index aa944aa53..95b9c03f9 100644 --- a/plugins/channelrx/radioclock/radioclocksettings.h +++ b/plugins/channelrx/radioclock/radioclocksettings.h @@ -76,6 +76,8 @@ struct RadioClockSettings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; enum DST { UNKNOWN, diff --git a/plugins/channelrx/remotesink/remotesinksettings.cpp b/plugins/channelrx/remotesink/remotesinksettings.cpp index c874fa691..df79c103a 100644 --- a/plugins/channelrx/remotesink/remotesinksettings.cpp +++ b/plugins/channelrx/remotesink/remotesinksettings.cpp @@ -175,7 +175,119 @@ bool RemoteSinkSettings::deserialize(const QByteArray& data) } } +void RemoteSinkSettings::applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings) +{ + if (settingsKeys.contains("nbFECBlocks")) { + m_nbFECBlocks = settings.m_nbFECBlocks; + } + if (settingsKeys.contains("nbTxBytes")) { + m_nbTxBytes = settings.m_nbTxBytes; + } + if (settingsKeys.contains("deviceCenterFrequency")) { + m_deviceCenterFrequency = settings.m_deviceCenterFrequency; + } + if (settingsKeys.contains("dataAddress")) { + m_dataAddress = settings.m_dataAddress; + } + if (settingsKeys.contains("dataPort")) { + m_dataPort = settings.m_dataPort; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("log2Decim")) { + m_log2Decim = settings.m_log2Decim; + } + if (settingsKeys.contains("filterChainHash")) { + m_filterChainHash = settings.m_filterChainHash; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString RemoteSinkSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + if (settingsKeys.contains("nbFECBlocks") || force) { + ostr << " m_nbFECBlocks: " << m_nbFECBlocks; + } + if (settingsKeys.contains("nbTxBytes") || force) { + ostr << " m_nbTxBytes: " << m_nbTxBytes; + } + if (settingsKeys.contains("deviceCenterFrequency") || force) { + ostr << " m_deviceCenterFrequency: " << m_deviceCenterFrequency; + } + if (settingsKeys.contains("dataAddress") || force) { + ostr << " m_dataAddress: " << m_dataAddress.toStdString(); + } + if (settingsKeys.contains("dataPort") || force) { + ostr << " m_dataPort: " << m_dataPort; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("log2Decim") || force) { + ostr << " m_log2Decim: " << m_log2Decim; + } + if (settingsKeys.contains("filterChainHash") || force) { + ostr << " m_filterChainHash: " << m_filterChainHash; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } - + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/remotesink/remotesinksettings.h b/plugins/channelrx/remotesink/remotesinksettings.h index aaf694fbf..30b2ad72c 100644 --- a/plugins/channelrx/remotesink/remotesinksettings.h +++ b/plugins/channelrx/remotesink/remotesinksettings.h @@ -63,6 +63,8 @@ struct RemoteSinkSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_REMOTECHANNELSINKSETTINGS_H_ */ diff --git a/plugins/channelrx/sigmffilesink/sigmffilesinksettings.cpp b/plugins/channelrx/sigmffilesink/sigmffilesinksettings.cpp index 653c6c8bd..0b2cc9746 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesinksettings.cpp +++ b/plugins/channelrx/sigmffilesink/sigmffilesinksettings.cpp @@ -207,4 +207,137 @@ int SigMFFileSinkSettings::getOffsetFromFixedShiftIndex(int sampleRate, int log2 return ((shiftIndex - mid) * sampleRate) / (2*decim); } +void SigMFFileSinkSettings::applySettings(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings) +{ + if (settingsKeys.contains("ncoMode")) { + m_ncoMode = settings.m_ncoMode; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("fileRecordName")) { + m_fileRecordName = settings.m_fileRecordName; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("log2Decim")) { + m_log2Decim = settings.m_log2Decim; + } + if (settingsKeys.contains("spectrumSquelchMode")) { + m_spectrumSquelchMode = settings.m_spectrumSquelchMode; + } + if (settingsKeys.contains("spectrumSquelch")) { + m_spectrumSquelch = settings.m_spectrumSquelch; + } + if (settingsKeys.contains("preRecordTime")) { + m_preRecordTime = settings.m_preRecordTime; + } + if (settingsKeys.contains("squelchPostRecordTime")) { + m_squelchPostRecordTime = settings.m_squelchPostRecordTime; + } + if (settingsKeys.contains("squelchRecordingEnable")) { + m_squelchRecordingEnable = settings.m_squelchRecordingEnable; + } + if (settingsKeys.contains("log2RecordSampleSize")) { + m_log2RecordSampleSize = settings.m_log2RecordSampleSize; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString SigMFFileSinkSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("ncoMode") || force) { + ostr << " m_ncoMode: " << m_ncoMode; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("fileRecordName") || force) { + ostr << " m_fileRecordName: " << m_fileRecordName.toStdString(); + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("log2Decim") || force) { + ostr << " m_log2Decim: " << m_log2Decim; + } + if (settingsKeys.contains("spectrumSquelchMode") || force) { + ostr << " m_spectrumSquelchMode: " << m_spectrumSquelchMode; + } + if (settingsKeys.contains("spectrumSquelch") || force) { + ostr << " m_spectrumSquelch: " << m_spectrumSquelch; + } + if (settingsKeys.contains("preRecordTime") || force) { + ostr << " m_preRecordTime: " << m_preRecordTime; + } + if (settingsKeys.contains("squelchPostRecordTime") || force) { + ostr << " m_squelchPostRecordTime: " << m_squelchPostRecordTime; + } + if (settingsKeys.contains("squelchRecordingEnable") || force) { + ostr << " m_squelchRecordingEnable: " << m_squelchRecordingEnable; + } + if (settingsKeys.contains("log2RecordSampleSize") || force) { + ostr << " m_log2RecordSampleSize: " << m_log2RecordSampleSize; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/sigmffilesink/sigmffilesinksettings.h b/plugins/channelrx/sigmffilesink/sigmffilesinksettings.h index 3ce6fce24..c6100b472 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesinksettings.h +++ b/plugins/channelrx/sigmffilesink/sigmffilesinksettings.h @@ -61,6 +61,8 @@ struct SigMFFileSinkSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static unsigned int getNbFixedShiftIndexes(int log2Decim); static int getHalfBand(int sampleRate, int log2Decim); diff --git a/plugins/channelrx/udpsink/udpsinksettings.cpp b/plugins/channelrx/udpsink/udpsinksettings.cpp index 66dc833db..1adf2cae3 100644 --- a/plugins/channelrx/udpsink/udpsinksettings.cpp +++ b/plugins/channelrx/udpsink/udpsinksettings.cpp @@ -216,3 +216,179 @@ bool UDPSinkSettings::deserialize(const QByteArray& data) } } +void UDPSinkSettings::applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings) +{ + if (settingsKeys.contains("outputSampleRate")) { + m_outputSampleRate = settings.m_outputSampleRate; + } + if (settingsKeys.contains("sampleFormat")) { + m_sampleFormat = settings.m_sampleFormat; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("gain")) { + m_gain = settings.m_gain; + } + if (settingsKeys.contains("squelchdB")) { + m_squelchdB = settings.m_squelchdB; + } + if (settingsKeys.contains("squelchGate")) { + m_squelchGate = settings.m_squelchGate; + } + if (settingsKeys.contains("squelchEnabled")) { + m_squelchEnabled = settings.m_squelchEnabled; + } + if (settingsKeys.contains("agc")) { + m_agc = settings.m_agc; + } + if (settingsKeys.contains("audioActive")) { + m_audioActive = settings.m_audioActive; + } + if (settingsKeys.contains("audioStereo")) { + m_audioStereo = settings.m_audioStereo; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("audioPort")) { + m_audioPort = settings.m_audioPort; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString UDPSinkSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("outputSampleRate") || force) { + ostr << " m_outputSampleRate: " << m_outputSampleRate; + } + if (settingsKeys.contains("sampleFormat") || force) { + ostr << " m_sampleFormat: " << m_sampleFormat; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("gain") || force) { + ostr << " m_gain: " << m_gain; + } + if (settingsKeys.contains("squelchdB") || force) { + ostr << " m_squelchdB: " << m_squelchdB; + } + if (settingsKeys.contains("squelchGate") || force) { + ostr << " m_squelchGate: " << m_squelchGate; + } + if (settingsKeys.contains("squelchEnabled") || force) { + ostr << " m_squelchEnabled: " << m_squelchEnabled; + } + if (settingsKeys.contains("agc") || force) { + ostr << " m_agc: " << m_agc; + } + if (settingsKeys.contains("audioActive") || force) { + ostr << " m_audioActive: " << m_audioActive; + } + if (settingsKeys.contains("audioStereo") || force) { + ostr << " m_audioStereo: " << m_audioStereo; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("audioPort") || force) { + ostr << " m_audioPort: " << m_audioPort; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/udpsink/udpsinksettings.h b/plugins/channelrx/udpsink/udpsinksettings.h index 367576c5c..2e96b3db8 100644 --- a/plugins/channelrx/udpsink/udpsinksettings.h +++ b/plugins/channelrx/udpsink/udpsinksettings.h @@ -87,6 +87,8 @@ struct UDPSinkSettings void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channelrx/wdsprx/wdsprxsettings.cpp b/plugins/channelrx/wdsprx/wdsprxsettings.cpp index 32dbf3dcb..b69622198 100644 --- a/plugins/channelrx/wdsprx/wdsprxsettings.cpp +++ b/plugins/channelrx/wdsprx/wdsprxsettings.cpp @@ -562,3 +562,396 @@ bool WDSPRxSettings::deserialize(const QByteArray& data) return false; } } + +void WDSPRxSettings::applySettings(const QStringList& settingsKeys, const WDSPRxSettings& settings) +{ + if (settingsKeys.contains("demod")) { + m_demod = settings.m_demod; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume")) { + m_volume = settings.m_volume; + } + if (settingsKeys.contains("audioBinaural")) { + m_audioBinaural = settings.m_audioBinaural; + } + if (settingsKeys.contains("audioFlipChannels")) { + m_audioFlipChannels = settings.m_audioFlipChannels; + } + if (settingsKeys.contains("audioPan")) { + m_audioPan = settings.m_audioPan; + } + if (settingsKeys.contains("dsb")) { + m_dsb = settings.m_dsb; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("dbOrS")) { + m_dbOrS = settings.m_dbOrS; + } + if (settingsKeys.contains("agc")) { + m_agc = settings.m_agc; + } + if (settingsKeys.contains("agcMode")) { + m_agcMode = settings.m_agcMode; + } + if (settingsKeys.contains("agcGain")) { + m_agcGain = settings.m_agcGain; + } + if (settingsKeys.contains("agcSlope")) { + m_agcSlope = settings.m_agcSlope; + } + if (settingsKeys.contains("agcHangThreshold")) { + m_agcHangThreshold = settings.m_agcHangThreshold; + } + if (settingsKeys.contains("dnb")) { + m_dnb = settings.m_dnb; + } + if (settingsKeys.contains("nbScheme")) { + m_nbScheme = settings.m_nbScheme; + } + if (settingsKeys.contains("nb2Mode")) { + m_nb2Mode = settings.m_nb2Mode; + } + if (settingsKeys.contains("nbSlewTime")) { + m_nbSlewTime = settings.m_nbSlewTime; + } + if (settingsKeys.contains("nbLeadTime")) { + m_nbLeadTime = settings.m_nbLeadTime; + } + if (settingsKeys.contains("nbLagTime")) { + m_nbLagTime = settings.m_nbLagTime; + } + if (settingsKeys.contains("nbThreshold")) { + m_nbThreshold = settings.m_nbThreshold; + } + if (settingsKeys.contains("nbAvgTime")) { + m_nbAvgTime = settings.m_nbAvgTime; + } + if (settingsKeys.contains("dnr")) { + m_dnr = settings.m_dnr; + } + if (settingsKeys.contains("snb")) { + m_snb = settings.m_snb; + } + if (settingsKeys.contains("anf")) { + m_anf = settings.m_anf; + } + if (settingsKeys.contains("nrScheme")) { + m_nrScheme = settings.m_nrScheme; + } + if (settingsKeys.contains("nr2Gain")) { + m_nr2Gain = settings.m_nr2Gain; + } + if (settingsKeys.contains("nr2NPE")) { + m_nr2NPE = settings.m_nr2NPE; + } + if (settingsKeys.contains("nrPosition")) { + m_nrPosition = settings.m_nrPosition; + } + if (settingsKeys.contains("nr2ArtifactReduction")) { + m_nr2ArtifactReduction = settings.m_nr2ArtifactReduction; + } + if (settingsKeys.contains("amFadeLevel")) { + m_amFadeLevel = settings.m_amFadeLevel; + } + if (settingsKeys.contains("cwPeaking")) { + m_cwPeaking = settings.m_cwPeaking; + } + if (settingsKeys.contains("cwPeakFrequency")) { + m_cwPeakFrequency = settings.m_cwPeakFrequency; + } + if (settingsKeys.contains("cwBandwidth")) { + m_cwBandwidth = settings.m_cwBandwidth; + } + if (settingsKeys.contains("cwGain")) { + m_cwGain = settings.m_cwGain; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("fmAFLow")) { + m_fmAFLow = settings.m_fmAFLow; + } + if (settingsKeys.contains("fmAFHigh")) { + m_fmAFHigh = settings.m_fmAFHigh; + } + if (settingsKeys.contains("fmAFLimiter")) { + m_fmAFLimiter = settings.m_fmAFLimiter; + } + if (settingsKeys.contains("fmAFLimiterGain")) { + m_fmAFLimiterGain = settings.m_fmAFLimiterGain; + } + if (settingsKeys.contains("fmCTCSSNotch")) { + m_fmCTCSSNotch = settings.m_fmCTCSSNotch; + } + if (settingsKeys.contains("fmCTCSSNotchFrequency")) { + m_fmCTCSSNotchFrequency = settings.m_fmCTCSSNotchFrequency; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("squelchThreshold")) { + m_squelchThreshold = settings.m_squelchThreshold; + } + if (settingsKeys.contains("squelchMode")) { + m_squelchMode = settings.m_squelchMode; + } + if (settingsKeys.contains("ssqlTauMute")) { + m_ssqlTauMute = settings.m_ssqlTauMute; + } + if (settingsKeys.contains("ssqlTauUnmute")) { + m_ssqlTauUnmute = settings.m_ssqlTauUnmute; + } + if (settingsKeys.contains("amsqMaxTail")) { + m_amsqMaxTail = settings.m_amsqMaxTail; + } + if (settingsKeys.contains("equalizer")) { + m_equalizer = settings.m_equalizer; + } + if (settingsKeys.contains("rit")) { + m_rit = settings.m_rit; + } + if (settingsKeys.contains("ritFrequency")) { + m_ritFrequency = settings.m_ritFrequency; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("profileIndex")) { + m_profileIndex = settings.m_profileIndex; + } +} + +QString WDSPRxSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("demod") || force) { + ostr << " m_demod: " << m_demod; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("volume") || force) { + ostr << " m_volume: " << m_volume; + } + if (settingsKeys.contains("audioBinaural") || force) { + ostr << " m_audioBinaural: " << m_audioBinaural; + } + if (settingsKeys.contains("audioFlipChannels") || force) { + ostr << " m_audioFlipChannels: " << m_audioFlipChannels; + } + if (settingsKeys.contains("audioPan") || force) { + ostr << " m_audioPan: " << m_audioPan; + } + if (settingsKeys.contains("dsb") || force) { + ostr << " m_dsb: " << m_dsb; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("dbOrS") || force) { + ostr << " m_dbOrS: " << m_dbOrS; + } + if (settingsKeys.contains("agc") || force) { + ostr << " m_agc: " << m_agc; + } + if (settingsKeys.contains("agcMode") || force) { + ostr << " m_agcMode: " << m_agcMode; + } + if (settingsKeys.contains("agcGain") || force) { + ostr << " m_agcGain: " << m_agcGain; + } + if (settingsKeys.contains("agcSlope") || force) { + ostr << " m_agcSlope: " << m_agcSlope; + } + if (settingsKeys.contains("agcHangThreshold") || force) { + ostr << " m_agcHangThreshold: " << m_agcHangThreshold; + } + if (settingsKeys.contains("dnb") || force) { + ostr << " m_dnb: " << m_dnb; + } + if (settingsKeys.contains("nbScheme") || force) { + ostr << " m_nbScheme: " << m_nbScheme; + } + if (settingsKeys.contains("nb2Mode") || force) { + ostr << " m_nb2Mode: " << m_nb2Mode; + } + if (settingsKeys.contains("nbSlewTime") || force) { + ostr << " m_nbSlewTime: " << m_nbSlewTime; + } + if (settingsKeys.contains("nbLeadTime") || force) { + ostr << " m_nbLeadTime: " << m_nbLeadTime; + } + if (settingsKeys.contains("nbLagTime") || force) { + ostr << " m_nbLagTime: " << m_nbLagTime; + } + if (settingsKeys.contains("nbThreshold") || force) { + ostr << " m_nbThreshold: " << m_nbThreshold; + } + if (settingsKeys.contains("nbAvgTime") || force) { + ostr << " m_nbAvgTime: " << m_nbAvgTime; + } + if (settingsKeys.contains("dnr") || force) { + ostr << " m_dnr: " << m_dnr; + } + if (settingsKeys.contains("snb") || force) { + ostr << " m_snb: " << m_snb; + } + if (settingsKeys.contains("anf") || force) { + ostr << " m_anf: " << m_anf; + } + if (settingsKeys.contains("nrScheme") || force) { + ostr << " m_nrScheme: " << m_nrScheme; + } + if (settingsKeys.contains("nr2Gain") || force) { + ostr << " m_nr2Gain: " << m_nr2Gain; + } + if (settingsKeys.contains("nr2NPE") || force) { + ostr << " m_nr2NPE: " << m_nr2NPE; + } + if (settingsKeys.contains("nrPosition") || force) { + ostr << " m_nrPosition: " << m_nrPosition; + } + if (settingsKeys.contains("nr2ArtifactReduction") || force) { + ostr << " m_nr2ArtifactReduction: " << m_nr2ArtifactReduction; + } + if (settingsKeys.contains("amFadeLevel") || force) { + ostr << " m_amFadeLevel: " << m_amFadeLevel; + } + if (settingsKeys.contains("cwPeaking") || force) { + ostr << " m_cwPeaking: " << m_cwPeaking; + } + if (settingsKeys.contains("cwPeakFrequency") || force) { + ostr << " m_cwPeakFrequency: " << m_cwPeakFrequency; + } + if (settingsKeys.contains("cwBandwidth") || force) { + ostr << " m_cwBandwidth: " << m_cwBandwidth; + } + if (settingsKeys.contains("cwGain") || force) { + ostr << " m_cwGain: " << m_cwGain; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("fmAFLow") || force) { + ostr << " m_fmAFLow: " << m_fmAFLow; + } + if (settingsKeys.contains("fmAFHigh") || force) { + ostr << " m_fmAFHigh: " << m_fmAFHigh; + } + if (settingsKeys.contains("fmAFLimiter") || force) { + ostr << " m_fmAFLimiter: " << m_fmAFLimiter; + } + if (settingsKeys.contains("fmAFLimiterGain") || force) { + ostr << " m_fmAFLimiterGain: " << m_fmAFLimiterGain; + } + if (settingsKeys.contains("fmCTCSSNotch") || force) { + ostr << " m_fmCTCSSNotch: " << m_fmCTCSSNotch; + } + if (settingsKeys.contains("fmCTCSSNotchFrequency") || force) { + ostr << " m_fmCTCSSNotchFrequency: " << m_fmCTCSSNotchFrequency; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("squelchThreshold") || force) { + ostr << " m_squelchThreshold: " << m_squelchThreshold; + } + if (settingsKeys.contains("squelchMode") || force) { + ostr << " m_squelchMode: " << m_squelchMode; + } + if (settingsKeys.contains("ssqlTauMute") || force) { + ostr << " m_ssqlTauMute: " << m_ssqlTauMute; + } + if (settingsKeys.contains("ssqlTauUnmute") || force) { + ostr << " m_ssqlTauUnmute: " << m_ssqlTauUnmute; + } + if (settingsKeys.contains("amsqMaxTail") || force) { + ostr << " m_amsqMaxTail: " << m_amsqMaxTail; + } + if (settingsKeys.contains("equalizer") || force) { + ostr << " m_equalizer: " << m_equalizer; + } + if (settingsKeys.contains("rit") || force) { + ostr << " m_rit: " << m_rit; + } + if (settingsKeys.contains("ritFrequency") || force) { + ostr << " m_ritFrequency: " << m_ritFrequency; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + if (settingsKeys.contains("profileIndex") || force) { + ostr << " m_profileIndex: " << m_profileIndex; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelrx/wdsprx/wdsprxsettings.h b/plugins/channelrx/wdsprx/wdsprxsettings.h index 737adedbe..d65f39449 100644 --- a/plugins/channelrx/wdsprx/wdsprxsettings.h +++ b/plugins/channelrx/wdsprx/wdsprxsettings.h @@ -298,6 +298,8 @@ struct WDSPRxSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const WDSPRxSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static const int m_minPowerThresholdDB; static const float m_mminPowerThresholdDBf; diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt index 92e04f596..0aaafa68f 100644 --- a/sdrbase/CMakeLists.txt +++ b/sdrbase/CMakeLists.txt @@ -276,6 +276,7 @@ set(sdrbase_SOURCES #util/spinlock.cpp util/spyserverlist.cpp util/stix.cpp + util/stringlist.cpp util/rtty.cpp util/uid.cpp util/units.cpp @@ -540,6 +541,7 @@ set(sdrbase_HEADERS #util/spinlock.h util/spyserverlist.h util/stix.h + util/stringlist.h util/uid.h util/units.h util/timeutil.h diff --git a/sdrbase/util/stringlist.cpp b/sdrbase/util/stringlist.cpp new file mode 100644 index 000000000..41e79f30b --- /dev/null +++ b/sdrbase/util/stringlist.cpp @@ -0,0 +1,19 @@ +#include "stringlist.h" + +bool StringListUtil::containsAll(const QStringList &haystack, const QStringList &needles) +{ + for (const auto &s : needles) { + if (!haystack.contains(s)) // optionally add Qt::CaseSensitivity + return false; + } + return true; +} + +bool StringListUtil::containsAny(const QStringList &haystack, const QStringList &needles) +{ + for (const auto &s : needles) { + if (haystack.contains(s)) // optionally add Qt::CaseSensitivity + return true; + } + return false; +} diff --git a/sdrbase/util/stringlist.h b/sdrbase/util/stringlist.h new file mode 100644 index 000000000..99fcc46cb --- /dev/null +++ b/sdrbase/util/stringlist.h @@ -0,0 +1,13 @@ +#ifndef SDRBASE_UTIL_STRINGLIST_H_ +#define SDRBASE_UTIL_STRINGLIST_H_ + +#include + +namespace StringListUtil { + +static bool containsAll(const QStringList &haystack, const QStringList &needles); +static bool containsAny(const QStringList &haystack, const QStringList &needles); + +} // namespace StringListUtil + +#endif // SDRBASE_UTIL_STRINGLIST_H_ From 2a46208d37b061961604696d90e3fcb274b894c1 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 1 Feb 2026 00:49:36 +0100 Subject: [PATCH 2/5] Apply atomic settings to channel Rx plugins part 2. Part of #1329 --- .../radioastronomy/radioastronomy.cpp | 61 +++-- .../channelrx/radioastronomy/radioastronomy.h | 15 +- .../radioastronomy/radioastronomybaseband.cpp | 16 +- .../radioastronomy/radioastronomybaseband.h | 11 +- .../radioastronomy/radioastronomygui.cpp | 219 +++++++++--------- .../radioastronomy/radioastronomygui.h | 2 +- .../radioastronomy/radioastronomysink.cpp | 30 ++- .../radioastronomy/radioastronomysink.h | 2 +- .../radioastronomy/radioastronomyworker.h | 9 +- plugins/channelrx/radioclock/radioclock.cpp | 82 +++---- plugins/channelrx/radioclock/radioclock.h | 15 +- .../radioclock/radioclockbaseband.cpp | 14 +- .../channelrx/radioclock/radioclockbaseband.h | 11 +- .../channelrx/radioclock/radioclockgui.cpp | 31 +-- plugins/channelrx/radioclock/radioclockgui.h | 2 +- .../channelrx/radioclock/radioclocksink.cpp | 24 +- plugins/channelrx/radioclock/radioclocksink.h | 2 +- plugins/channelrx/remotesink/remotesink.cpp | 57 +++-- plugins/channelrx/remotesink/remotesink.h | 11 +- .../remotesink/remotesinkbaseband.cpp | 22 +- .../channelrx/remotesink/remotesinkbaseband.h | 11 +- .../channelrx/remotesink/remotesinkgui.cpp | 28 +-- plugins/channelrx/remotesink/remotesinkgui.h | 2 +- .../channelrx/remotesink/remotesinksink.cpp | 27 ++- plugins/channelrx/remotesink/remotesinksink.h | 2 +- .../channelrx/sigmffilesink/sigmffilesink.cpp | 91 +++----- .../channelrx/sigmffilesink/sigmffilesink.h | 17 +- .../sigmffilesink/sigmffilesinkbaseband.cpp | 28 +-- .../sigmffilesink/sigmffilesinkbaseband.h | 11 +- .../sigmffilesink/sigmffilesinkgui.cpp | 49 ++-- .../sigmffilesink/sigmffilesinkgui.h | 2 +- .../sigmffilesink/sigmffilesinksink.cpp | 20 +- .../sigmffilesink/sigmffilesinksink.h | 2 +- plugins/channelrx/udpsink/udpsink.cpp | 122 ++-------- plugins/channelrx/udpsink/udpsink.h | 17 +- plugins/channelrx/udpsink/udpsinkbaseband.cpp | 19 +- plugins/channelrx/udpsink/udpsinkbaseband.h | 11 +- plugins/channelrx/udpsink/udpsinkgui.cpp | 53 +++-- plugins/channelrx/udpsink/udpsinkgui.h | 4 +- plugins/channelrx/udpsink/udpsinksink.cpp | 55 ++--- plugins/channelrx/udpsink/udpsinksink.h | 2 +- plugins/channelrx/wdsprx/wdsprx.cpp | 74 +++--- plugins/channelrx/wdsprx/wdsprx.h | 11 +- plugins/channelrx/wdsprx/wdsprxbaseband.cpp | 18 +- plugins/channelrx/wdsprx/wdsprxbaseband.h | 11 +- plugins/channelrx/wdsprx/wdsprxgui.cpp | 123 +++++----- plugins/channelrx/wdsprx/wdsprxgui.h | 2 +- plugins/channelrx/wdsprx/wdsprxsink.cpp | 150 +++++------- plugins/channelrx/wdsprx/wdsprxsink.h | 2 +- sdrbase/util/stringlist.cpp | 4 +- 50 files changed, 738 insertions(+), 866 deletions(-) diff --git a/plugins/channelrx/radioastronomy/radioastronomy.cpp b/plugins/channelrx/radioastronomy/radioastronomy.cpp index b05d84270..3aeec05e5 100644 --- a/plugins/channelrx/radioastronomy/radioastronomy.cpp +++ b/plugins/channelrx/radioastronomy/radioastronomy.cpp @@ -82,7 +82,7 @@ RadioAstronomy::RadioAstronomy(DeviceAPI *deviceAPI) : m_worker->setMessageQueueToChannel(getInputMessageQueue()); m_worker->moveToThread(&m_workerThread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -200,8 +200,8 @@ void RadioAstronomy::start() m_workerThread.start(); m_basebandSink->getInputMessageQueue()->push(new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency)); - m_basebandSink->getInputMessageQueue()->push(RadioAstronomyBaseband::MsgConfigureRadioAstronomyBaseband::create(m_settings, true)); - m_worker->getInputMessageQueue()->push(RadioAstronomyWorker::MsgConfigureRadioAstronomyWorker::create(m_settings, true)); + m_basebandSink->getInputMessageQueue()->push(RadioAstronomyBaseband::MsgConfigureRadioAstronomyBaseband::create(QStringList(), m_settings, true)); + m_worker->getInputMessageQueue()->push(RadioAstronomyWorker::MsgConfigureRadioAstronomyWorker::create(QStringList(), m_settings, true)); } void RadioAstronomy::stop() @@ -219,11 +219,11 @@ void RadioAstronomy::setCenterFrequency(qint64 frequency) { RadioAstronomySettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRadioAstronomy *msgToGUI = MsgConfigureRadioAstronomy::create(settings, false); + MsgConfigureRadioAstronomy *msgToGUI = MsgConfigureRadioAstronomy::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -234,7 +234,7 @@ bool RadioAstronomy::handleMessage(const Message& cmd) { MsgConfigureRadioAstronomy& cfg = (MsgConfigureRadioAstronomy&) cmd; qDebug() << "RadioAstronomy::handleMessage: MsgConfigureRadioAstronomy"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -683,16 +683,9 @@ void RadioAstronomy::sweepComplete() } } -void RadioAstronomy::applySettings(const RadioAstronomySettings& settings, bool force) +void RadioAstronomy::applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) { - qDebug() << "RadioAstronomy::applySettings:" - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "RadioAstronomy::applySettings:" << settings.getDebugString(settingsKeys, force); QList reverseAPIKeys; @@ -762,7 +755,7 @@ void RadioAstronomy::applySettings(const RadioAstronomySettings& settings, bool reverseAPIKeys.append("sweep2Delay"); } - if ((m_settings.m_starTracker != settings.m_starTracker) + if ((settingsKeys.contains("starTracker") && (m_settings.m_starTracker != settings.m_starTracker)) || (!settings.m_starTracker.isEmpty() && (m_selectedPipe == nullptr)) // Change in available pipes || force) { @@ -783,7 +776,7 @@ void RadioAstronomy::applySettings(const RadioAstronomySettings& settings, bool reverseAPIKeys.append("starTracker"); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -798,21 +791,25 @@ void RadioAstronomy::applySettings(const RadioAstronomySettings& settings, bool reverseAPIKeys.append("streamIndex"); } - m_basebandSink->getInputMessageQueue()->push(RadioAstronomyBaseband::MsgConfigureRadioAstronomyBaseband::create(settings, force)); + m_basebandSink->getInputMessageQueue()->push(RadioAstronomyBaseband::MsgConfigureRadioAstronomyBaseband::create(settingsKeys, settings, force)); - m_worker->getInputMessageQueue()->push(RadioAstronomyWorker::MsgConfigureRadioAstronomyWorker::create(settings, force)); + m_worker->getInputMessageQueue()->push(RadioAstronomyWorker::MsgConfigureRadioAstronomyWorker::create(settingsKeys, settings, force)); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray RadioAstronomy::serialize() const @@ -824,14 +821,14 @@ bool RadioAstronomy::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(m_settings, true); + MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(m_settings, true); + MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -867,13 +864,13 @@ int RadioAstronomy::webapiSettingsPutPatch( RadioAstronomySettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(settings, force); + MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("RadioAstronomy::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRadioAstronomy *msgToGUI = MsgConfigureRadioAstronomy::create(settings, force); + MsgConfigureRadioAstronomy *msgToGUI = MsgConfigureRadioAstronomy::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -1087,7 +1084,7 @@ void RadioAstronomy::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings } } -void RadioAstronomy::webapiReverseSendSettings(QList& channelSettingsKeys, const RadioAstronomySettings& settings, bool force) +void RadioAstronomy::webapiReverseSendSettings(const QList& channelSettingsKeys, const RadioAstronomySettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -1113,7 +1110,7 @@ void RadioAstronomy::webapiReverseSendSettings(QList& channelSettingsKe } void RadioAstronomy::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RadioAstronomySettings& settings, bool force diff --git a/plugins/channelrx/radioastronomy/radioastronomy.h b/plugins/channelrx/radioastronomy/radioastronomy.h index db3948ba8..ea2af8dc5 100644 --- a/plugins/channelrx/radioastronomy/radioastronomy.h +++ b/plugins/channelrx/radioastronomy/radioastronomy.h @@ -50,20 +50,23 @@ public: public: const RadioAstronomySettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRadioAstronomy* create(const RadioAstronomySettings& settings, bool force) + static MsgConfigureRadioAstronomy* create(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) { - return new MsgConfigureRadioAstronomy(settings, force); + return new MsgConfigureRadioAstronomy(settingsKeys, settings, force); } private: RadioAstronomySettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRadioAstronomy(const RadioAstronomySettings& settings, bool force) : + MsgConfigureRadioAstronomy(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -482,10 +485,10 @@ private: QMetaObject::Connection m_sweepTimerConnection; virtual bool handleMessage(const Message& cmd); - void applySettings(const RadioAstronomySettings& settings, bool force = false); - void webapiReverseSendSettings(QList& channelSettingsKeys, const RadioAstronomySettings& settings, bool force); + void applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force = false); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const RadioAstronomySettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RadioAstronomySettings& settings, bool force diff --git a/plugins/channelrx/radioastronomy/radioastronomybaseband.cpp b/plugins/channelrx/radioastronomy/radioastronomybaseband.cpp index 286bdc0ed..9e1905a63 100644 --- a/plugins/channelrx/radioastronomy/radioastronomybaseband.cpp +++ b/plugins/channelrx/radioastronomy/radioastronomybaseband.cpp @@ -134,7 +134,7 @@ bool RadioAstronomyBaseband::handleMessage(const Message& cmd) MsgConfigureRadioAstronomyBaseband& cfg = (MsgConfigureRadioAstronomyBaseband&) cmd; qDebug() << "RadioAstronomyBaseband::handleMessage: MsgConfigureRadioAstronomyBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -173,19 +173,23 @@ bool RadioAstronomyBaseband::handleMessage(const Message& cmd) } } -void RadioAstronomyBaseband::applySettings(const RadioAstronomySettings& settings, bool force) +void RadioAstronomyBaseband::applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) - || (settings.m_sampleRate != m_settings.m_sampleRate) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) + || (settingsKeys.contains("sampleRate") && (settings.m_sampleRate != m_settings.m_sampleRate)) || force) { m_channelizer->setChannelization(settings.m_sampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void RadioAstronomyBaseband::setBasebandSampleRate(int sampleRate) diff --git a/plugins/channelrx/radioastronomy/radioastronomybaseband.h b/plugins/channelrx/radioastronomy/radioastronomybaseband.h index 50967cafa..22be38336 100644 --- a/plugins/channelrx/radioastronomy/radioastronomybaseband.h +++ b/plugins/channelrx/radioastronomy/radioastronomybaseband.h @@ -41,20 +41,23 @@ public: public: const RadioAstronomySettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRadioAstronomyBaseband* create(const RadioAstronomySettings& settings, bool force) + static MsgConfigureRadioAstronomyBaseband* create(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) { - return new MsgConfigureRadioAstronomyBaseband(settings, force); + return new MsgConfigureRadioAstronomyBaseband(settingsKeys, settings, force); } private: RadioAstronomySettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRadioAstronomyBaseband(const RadioAstronomySettings& settings, bool force) : + MsgConfigureRadioAstronomyBaseband(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -87,7 +90,7 @@ private: bool handleMessage(const Message& cmd); void calculateOffset(RadioAstronomySink *sink); - void applySettings(const RadioAstronomySettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/radioastronomy/radioastronomygui.cpp b/plugins/channelrx/radioastronomy/radioastronomygui.cpp index 28356cf8a..5c80f0d01 100644 --- a/plugins/channelrx/radioastronomy/radioastronomygui.cpp +++ b/plugins/channelrx/radioastronomy/radioastronomygui.cpp @@ -743,7 +743,7 @@ void RadioAstronomyGUI::on_powerAutoscale_toggled(bool checked) ui->powerStartTime->setEnabled(!m_settings.m_powerAutoscale); ui->powerEndTime->setEnabled(!m_settings.m_powerAutoscale); powerAutoscale(); - applySettings(); + applySettings(QStringList("powerAutoscale")); } void RadioAstronomyGUI::powerAutoscaleY(bool adjustAxis) @@ -800,7 +800,7 @@ void RadioAstronomyGUI::on_powerReference_valueChanged(double value) if (m_powerYAxis) { m_powerYAxis->setRange(m_settings.m_powerReference - m_settings.m_powerRange, m_settings.m_powerReference); } - applySettings(); + applySettings(QStringList("powerReference")); } void RadioAstronomyGUI::on_powerRange_valueChanged(double value) @@ -821,7 +821,7 @@ void RadioAstronomyGUI::on_powerRange_valueChanged(double value) if (m_powerYAxis) { m_powerYAxis->setRange(m_settings.m_powerReference - m_settings.m_powerRange, m_settings.m_powerReference); } - applySettings(); + applySettings(QStringList("powerRange")); } void RadioAstronomyGUI::on_powerStartTime_dateTimeChanged(QDateTime value) @@ -899,7 +899,7 @@ void RadioAstronomyGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray RadioAstronomyGUI::serialize() const @@ -911,7 +911,7 @@ bool RadioAstronomyGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -925,7 +925,7 @@ void RadioAstronomyGUI::updateAvailableFeatures(const AvailableChannelOrFeatureL if (renameFrom.contains(m_settings.m_starTracker)) { m_settings.m_starTracker = renameTo[renameFrom.indexOf(m_settings.m_starTracker)]; - applySettings(); + applySettings(QStringList("starTracker")); } ui->starTracker->blockSignals(true); @@ -948,7 +948,7 @@ void RadioAstronomyGUI::updateAvailableFeatures(const AvailableChannelOrFeatureL if (m_settings.m_starTracker != newText) { m_settings.m_starTracker = newText; - applySettings(); + applySettings(QStringList("starTracker")); } } @@ -1091,7 +1091,7 @@ void RadioAstronomyGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void RadioAstronomyGUI::channelMarkerHighlightedByCursor() @@ -1191,7 +1191,7 @@ void RadioAstronomyGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void RadioAstronomyGUI::on_sampleRate_changed(qint64 value) @@ -1200,7 +1200,7 @@ void RadioAstronomyGUI::on_sampleRate_changed(qint64 value) m_settings.m_sampleRate = sr; updateBWLimits(); updateIntegrationTime(); - applySettings(); + applySettings(QStringList("sampleRate")); } void RadioAstronomyGUI::on_rfBW_changed(qint64 value) @@ -1208,20 +1208,20 @@ void RadioAstronomyGUI::on_rfBW_changed(qint64 value) float bw = value; m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void RadioAstronomyGUI::on_integration_changed(qint64 value) { m_settings.m_integration = value; updateIntegrationTime(); - applySettings(); + applySettings(QStringList("integration")); } void RadioAstronomyGUI::on_recalibrate_toggled(bool checked) { m_settings.m_recalibrate = checked; - applySettings(); + applySettings(QStringList("recalibrate")); if (checked) { recalibrate(); } @@ -1231,7 +1231,7 @@ void RadioAstronomyGUI::on_showCalSettings_clicked() { RadioAstronomyCalibrationDialog dialog(&m_settings); if (dialog.exec() == QDialog::Accepted) { - applySettings(); + applySettings(QStringList({"gpioEnabled", "gpioPin", "gpioSense", "startCalCommand", "stopCalCommand", "calCommandDelay"})); } } @@ -1541,7 +1541,7 @@ void RadioAstronomyGUI::on_savePowerData_rightClicked(const QPoint& point) m_settings.m_powerAutoSaveCSVFilename = fileNames[0]; ui->savePowerData->setChecked(true); ui->savePowerData->setToolTip(QString("Left click to save data to a .csv file.\nRight click to disable auto save.\nAuto saving to %1").arg(m_settings.m_powerAutoSaveCSVFilename)); - applySettings(); + applySettings(QStringList("powerAutoSaveCSVFilename")); savePowerData(m_settings.m_powerAutoSaveCSVFilename); } } @@ -1551,7 +1551,7 @@ void RadioAstronomyGUI::on_savePowerData_rightClicked(const QPoint& point) ui->savePowerData->setChecked(false); ui->savePowerData->setToolTip("Left click to save data to a .csv file.\nRight click to auto-save data to a .csv file"); m_settings.m_powerAutoSaveCSVFilename = ""; - applySettings(); + applySettings(QStringList("powerAutoSaveCSVFilename")); } } @@ -1836,7 +1836,7 @@ void RadioAstronomyGUI::on_saveSpectrumData_rightClicked(const QPoint &point) m_settings.m_spectrumAutoSaveCSVFilename = fileNames[0]; ui->saveSpectrumData->setChecked(true); ui->saveSpectrumData->setToolTip(QString("Left click to save data to a .csv file.\nRight click to disable auto save.\nAuto saving to %1").arg(m_settings.m_spectrumAutoSaveCSVFilename)); - applySettings(); + applySettings(QStringList("spectrumAutoSaveCSVFilename")); saveSpectrumData(m_settings.m_spectrumAutoSaveCSVFilename); } } @@ -1846,7 +1846,7 @@ void RadioAstronomyGUI::on_saveSpectrumData_rightClicked(const QPoint &point) ui->saveSpectrumData->setChecked(false); ui->saveSpectrumData->setToolTip("Left click to save data to a .csv file.\nRight click to auto-save data to a .csv file"); m_settings.m_spectrumAutoSaveCSVFilename = ""; - applySettings(); + applySettings(QStringList("spectrumAutoSaveCSVFilename")); } } @@ -2019,7 +2019,7 @@ void RadioAstronomyGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void RadioAstronomyGUI::onMenuDialogCalled(const QPoint &p) @@ -2064,7 +2064,9 @@ void RadioAstronomyGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); @@ -2320,7 +2322,7 @@ RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); // Force apply all settings m_resizer.enableChildMouseTracking(); create2DImage(); @@ -2418,11 +2420,11 @@ void RadioAstronomyGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void RadioAstronomyGUI::applySettings(bool force) +void RadioAstronomyGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - RadioAstronomy::MsgConfigureRadioAstronomy* message = RadioAstronomy::MsgConfigureRadioAstronomy::create( m_settings, force); + RadioAstronomy::MsgConfigureRadioAstronomy* message = RadioAstronomy::MsgConfigureRadioAstronomy::create(settingsKeys, m_settings, force); m_radioAstronomy->getInputMessageQueue()->push(message); } } @@ -2712,7 +2714,7 @@ void RadioAstronomyGUI::updateRotatorList(const AvailableChannelOrFeatureList& r if (renameFrom.contains(m_settings.m_rotator)) { m_settings.m_rotator = renameTo[renameFrom.indexOf(m_settings.m_rotator)]; - applySettings(); + applySettings(QStringList("rotator")); } // Update list of rotators @@ -2744,26 +2746,26 @@ void RadioAstronomyGUI::updateRotatorList(const AvailableChannelOrFeatureList& r void RadioAstronomyGUI::on_fftSize_currentIndexChanged(int index) { m_settings.m_fftSize = 1 << (4+index); - applySettings(); + applySettings(QStringList("fftSize")); updateIntegrationTime(); } void RadioAstronomyGUI::on_fftWindow_currentIndexChanged(int index) { m_settings.m_fftWindow = (RadioAstronomySettings::FFTWindow)index; - applySettings(); + applySettings(QStringList("fftWindow")); } void RadioAstronomyGUI::on_filterFreqs_editingFinished() { m_settings.m_filterFreqs = ui->filterFreqs->text(); - applySettings(); + applySettings(QStringList("filterFreqs")); } void RadioAstronomyGUI::on_gainVariation_valueChanged(double value) { m_settings.m_gainVariation = value; - applySettings(); + applySettings(QStringList("gainVariation")); updateTSys0(); } @@ -2771,7 +2773,7 @@ void RadioAstronomyGUI::on_gainVariation_valueChanged(double value) void RadioAstronomyGUI::on_sourceType_currentIndexChanged(int index) { m_settings.m_sourceType = (RadioAstronomySettings::SourceType)index; - applySettings(); + applySettings(QStringList("sourceType")); if (m_settings.m_sourceType == RadioAstronomySettings::SUN) { // Mean diameter of Sun in degrees from Earth @@ -2797,7 +2799,7 @@ void RadioAstronomyGUI::on_omegaS_valueChanged(double value) } else if ((m_settings.m_sourceType == RadioAstronomySettings::CAS_A) && (value != 0.08333)) { ui->sourceType->setCurrentIndex((int)RadioAstronomySettings::COMPACT); } - applySettings(); + applySettings(QStringList("omegaS")); } void RadioAstronomyGUI::updateOmegaA() @@ -2818,7 +2820,7 @@ void RadioAstronomyGUI::on_omegaAUnits_currentIndexChanged(int index) } else { ui->omegaALabel->setText(QString("%1A").arg(QChar(937))); } - applySettings(); + applySettings(QStringList("omegaAUnits")); } void RadioAstronomyGUI::on_omegaSUnits_currentIndexChanged(int index) @@ -2832,19 +2834,19 @@ void RadioAstronomyGUI::on_omegaSUnits_currentIndexChanged(int index) { ui->sourceType->setCurrentIndex((int)RadioAstronomySettings::COMPACT); } - applySettings(); + applySettings(QStringList("omegaSUnits")); } void RadioAstronomyGUI::on_starTracker_currentTextChanged(const QString& text) { m_settings.m_starTracker = text; - applySettings(); + applySettings(QStringList("starTracker")); } void RadioAstronomyGUI::on_rotator_currentTextChanged(const QString& text) { m_settings.m_rotator = text; - applySettings(); + applySettings(QStringList("rotator")); setColumnPrecisionFromRotator(); } @@ -2890,7 +2892,7 @@ void RadioAstronomyGUI::on_showSensors_clicked() { m_sensors[0].setName(m_settings.m_sensorName[0]); m_sensors[1].setName(m_settings.m_sensorName[1]); - applySettings(); + applySettings(QStringList("sensorName")); } } @@ -2934,7 +2936,7 @@ void RadioAstronomyGUI::on_powerChartSelect_currentIndexChanged(int index) updatePowerMarkerTableVisibility(); updatePowerChartWidgetsVisibility(); plotPowerChart(); - applySettings(); + applySettings(QStringList("powerYData")); } void RadioAstronomyGUI::updatePowerChartWidgetsVisibility() @@ -3033,7 +3035,7 @@ void RadioAstronomyGUI::on_powerYUnits_currentIndexChanged(int index) ui->powerColourScaleMinUnits->setText(text); ui->powerColourScaleMaxUnits->setText(text); } - applySettings(); + applySettings(QStringList("powerYUnits")); plotPowerChart(); } @@ -3470,20 +3472,20 @@ void RadioAstronomyGUI::on_power2DAutoscale_clicked() void RadioAstronomyGUI::on_power2DLinkSweep_toggled(bool checked) { m_settings.m_power2DLinkSweep = checked; - applySettings(); + applySettings(QStringList("power2DLinkSweep")); } void RadioAstronomyGUI::on_power2DSweepType_currentIndexChanged(int index) { m_settings.m_power2DSweepType = (RadioAstronomySettings::SweepType)index; - applySettings(); + applySettings(QStringList("power2DSweepType")); plot2DChart(); } void RadioAstronomyGUI::on_power2DWidth_valueChanged(int value) { m_settings.m_power2DWidth = value; - applySettings(); + applySettings(QStringList("power2DWidth")); create2DImage(); plot2DChart(); } @@ -3491,7 +3493,7 @@ void RadioAstronomyGUI::on_power2DWidth_valueChanged(int value) void RadioAstronomyGUI::on_power2DHeight_valueChanged(int value) { m_settings.m_power2DHeight = value; - applySettings(); + applySettings(QStringList("power2DHeight")); create2DImage(); plot2DChart(); } @@ -3499,7 +3501,7 @@ void RadioAstronomyGUI::on_power2DHeight_valueChanged(int value) void RadioAstronomyGUI::on_power2DXMin_valueChanged(double value) { m_settings.m_power2DXMin = value; - applySettings(); + applySettings(QStringList("power2DXMin")); if (m_2DXAxis) { m_2DXAxis->setMin(m_settings.m_power2DXMin); @@ -3510,7 +3512,7 @@ void RadioAstronomyGUI::on_power2DXMin_valueChanged(double value) void RadioAstronomyGUI::on_power2DXMax_valueChanged(double value) { m_settings.m_power2DXMax = value; - applySettings(); + applySettings(QStringList("power2DXMax")); if (m_2DXAxis) { m_2DXAxis->setMax(m_settings.m_power2DXMax); @@ -3521,7 +3523,7 @@ void RadioAstronomyGUI::on_power2DXMax_valueChanged(double value) void RadioAstronomyGUI::on_power2DYMin_valueChanged(double value) { m_settings.m_power2DYMin = value; - applySettings(); + applySettings(QStringList("power2DYMin")); if (m_2DYAxis) { m_2DYAxis->setMin(m_settings.m_power2DYMin); @@ -3532,7 +3534,7 @@ void RadioAstronomyGUI::on_power2DYMin_valueChanged(double value) void RadioAstronomyGUI::on_power2DYMax_valueChanged(double value) { m_settings.m_power2DYMax = value; - applySettings(); + applySettings(QStringList("power2DYMax")); if (m_2DYAxis) { m_2DYAxis->setMax(m_settings.m_power2DYMax); @@ -3565,7 +3567,7 @@ void RadioAstronomyGUI::powerColourAutoscale() void RadioAstronomyGUI::on_powerColourAutoscale_toggled(bool checked) { m_settings.m_powerColourAutoscale = checked; - applySettings(); + applySettings(QStringList("powerColourAutoscale")); if (m_settings.m_powerColourAutoscale) { powerColourAutoscale(); } @@ -3585,7 +3587,7 @@ void RadioAstronomyGUI::on_powerColourScaleMin_valueChanged(double value) { m_settings.m_powerColourScaleMin = value; updatePowerColourScaleStep(); - applySettings(); + applySettings(QStringList("powerColourScaleMin")); recolour2DImage(); } @@ -3593,7 +3595,7 @@ void RadioAstronomyGUI::on_powerColourScaleMax_valueChanged(double value) { m_settings.m_powerColourScaleMax = value; updatePowerColourScaleStep(); - applySettings(); + applySettings(QStringList("powerColourScaleMax")); recolour2DImage(); } @@ -3601,7 +3603,7 @@ void RadioAstronomyGUI::on_powerColourPalette_currentIndexChanged(int index) { (void) index; m_settings.m_powerColourPalette = ui->powerColourPalette->currentText(); - applySettings(); + applySettings(QStringList("powerColourPalette")); recolour2DImage(); } @@ -3980,7 +3982,7 @@ void RadioAstronomyGUI::on_spectrumReference_valueChanged(double value) m_settings.m_spectrumReference = value; spectrumUpdateYRange(); if (!m_settings.m_spectrumAutoscale) { - applySettings(); + applySettings(QStringList("spectrumReference")); } } @@ -4001,7 +4003,7 @@ void RadioAstronomyGUI::on_spectrumRange_valueChanged(double value) } spectrumUpdateYRange(); if (!m_settings.m_spectrumAutoscale) { - applySettings(); + applySettings(QStringList("spectrumRange")); } } @@ -4009,7 +4011,7 @@ void RadioAstronomyGUI::on_spectrumSpan_valueChanged(double value) { m_settings.m_spectrumSpan = value; spectrumUpdateXRange(); - applySettings(); + applySettings(QStringList("spectrumSpan")); } void RadioAstronomyGUI::on_spectrumCenterFreq_valueChanged(double value) @@ -4023,7 +4025,7 @@ void RadioAstronomyGUI::on_spectrumCenterFreq_valueChanged(double value) } m_settings.m_spectrumCenterFreqOffset = offset; spectrumUpdateXRange(); - applySettings(); + applySettings(QStringList("spectrumCenterFreqOffset")); } void RadioAstronomyGUI::spectrumUpdateXRange(FFTMeasurement* fft) @@ -4075,7 +4077,7 @@ void RadioAstronomyGUI::on_spectrumAutoscale_toggled(bool checked) ui->spectrumCenterFreq->setEnabled(!m_settings.m_spectrumAutoscale); ui->spectrumSpan->setEnabled(!m_settings.m_spectrumAutoscale); spectrumAutoscale(); - applySettings(); + applySettings(QStringList("spectrumAutoscale")); } // Get minimum and maximum values in a series @@ -4170,7 +4172,7 @@ void RadioAstronomyGUI::on_spectrumYUnits_currentIndexChanged(int index) ui->spectrumMarkerTable->horizontalHeaderItem(SPECTRUM_MARKER_COL_VALUE)->setText("Tsource (K)"); } plotFFTMeasurement(); - applySettings(); + applySettings(QStringList("spectrumYScale")); } void RadioAstronomyGUI::on_spectrumBaseline_currentIndexChanged(int index) @@ -4180,7 +4182,7 @@ void RadioAstronomyGUI::on_spectrumBaseline_currentIndexChanged(int index) if ((m_settings.m_powerYData == RadioAstronomySettings::PY_TSOURCE) || (m_settings.m_powerYData == RadioAstronomySettings::PY_FLUX)) { plotPowerChart(); } - applySettings(); + applySettings(QStringList("spectrumBaseline")); } // Convert frequency shift to velocity in km/s (+ve approaching) @@ -5052,35 +5054,35 @@ void RadioAstronomyGUI::on_tempRX_valueChanged(double value) m_settings.m_tempRX = Units::noiseFigureToNoiseTemp(value); } updateTSys0(); - applySettings(); + applySettings(QStringList("tempRX")); } void RadioAstronomyGUI::on_tempCMB_valueChanged(double value) { m_settings.m_tempCMB = value; updateTSys0(); - applySettings(); + applySettings(QStringList("tempCMB")); } void RadioAstronomyGUI::on_tempGal_valueChanged(double value) { m_settings.m_tempGal = value; updateTSys0(); - applySettings(); + applySettings(QStringList("tempGal")); } void RadioAstronomyGUI::on_tempSP_valueChanged(double value) { m_settings.m_tempSP = value; updateTSys0(); - applySettings(); + applySettings(QStringList("tempSP")); } void RadioAstronomyGUI::on_tempAtm_valueChanged(double value) { m_settings.m_tempAtm = value; updateTSys0(); - applySettings(); + applySettings(QStringList("tempAtm")); } void RadioAstronomyGUI::on_tempAir_valueChanged(double value) @@ -5089,7 +5091,7 @@ void RadioAstronomyGUI::on_tempAir_valueChanged(double value) if (m_settings.m_tempAtmLink) { calcAtmosphericTemp(); } - applySettings(); + applySettings(QStringList("tempAir")); } void RadioAstronomyGUI::on_zenithOpacity_valueChanged(double value) @@ -5098,7 +5100,7 @@ void RadioAstronomyGUI::on_zenithOpacity_valueChanged(double value) if (m_settings.m_tempAtmLink) { calcAtmosphericTemp(); } - applySettings(); + applySettings(QStringList("zenithOpacity")); } void RadioAstronomyGUI::on_elevation_valueChanged(double value) @@ -5107,7 +5109,7 @@ void RadioAstronomyGUI::on_elevation_valueChanged(double value) if (m_settings.m_tempAtmLink) { calcAtmosphericTemp(); } - applySettings(); + applySettings(QStringList("elevation")); } void RadioAstronomyGUI::on_elevationLink_toggled(bool checked) @@ -5115,7 +5117,7 @@ void RadioAstronomyGUI::on_elevationLink_toggled(bool checked) m_settings.m_elevationLink = checked; ui->elevation->setValue(m_elevation); ui->elevation->setEnabled(!m_settings.m_elevationLink); - applySettings(); + applySettings(QStringList("elevationLink")); } void RadioAstronomyGUI::on_tempAtmLink_toggled(bool checked) @@ -5125,7 +5127,7 @@ void RadioAstronomyGUI::on_tempAtmLink_toggled(bool checked) if (checked) { calcAtmosphericTemp(); } - applySettings(); + applySettings(QStringList("tempAtmLink")); } void RadioAstronomyGUI::on_tempAirLink_toggled(bool checked) @@ -5137,7 +5139,7 @@ void RadioAstronomyGUI::on_tempAirLink_toggled(bool checked) ui->tempAir->setValue(m_airTemps.lastValue()); calcAtmosphericTemp(); } - applySettings(); + applySettings(QStringList("tempAirLink")); } void RadioAstronomyGUI::on_tempGalLink_toggled(bool checked) @@ -5147,7 +5149,7 @@ void RadioAstronomyGUI::on_tempGalLink_toggled(bool checked) calcGalacticBackgroundTemp(); } ui->tempGal->setEnabled(!m_settings.m_tempGalLink); - applySettings(); + applySettings(QStringList("tempGalLink")); } void RadioAstronomyGUI::on_tCalHotSelect_currentIndexChanged(int value) @@ -5177,7 +5179,7 @@ void RadioAstronomyGUI::on_tCalHot_valueChanged(double value) } m_settings.m_tCalHot = (float)temp; calibrate(); - applySettings(); + applySettings(QStringList("tCalHot")); } void RadioAstronomyGUI::on_tCalColdSelect_currentIndexChanged(int value) @@ -5207,7 +5209,7 @@ void RadioAstronomyGUI::on_tCalCold_valueChanged(double value) } m_settings.m_tCalCold = (float)temp; calibrate(); - applySettings(); + applySettings(QStringList("tCalCold")); } void RadioAstronomyGUI::on_spectrumLine_currentIndexChanged(int value) @@ -5215,7 +5217,7 @@ void RadioAstronomyGUI::on_spectrumLine_currentIndexChanged(int value) m_settings.m_line = (RadioAstronomySettings::Line)value; displaySpectrumLineFrequency(); plotFFTMeasurement(); - applySettings(); + applySettings(QStringList("line")); } void RadioAstronomyGUI::displaySpectrumLineFrequency() @@ -5245,27 +5247,27 @@ void RadioAstronomyGUI::on_spectrumLineFrequency_valueChanged(double value) { m_settings.m_lineCustomFrequency = value * 1e6; plotFFTMeasurement(); - applySettings(); + applySettings(QStringList("lineCustomFrequency")); } void RadioAstronomyGUI::on_refFrame_currentIndexChanged(int value) { m_settings.m_refFrame = (RadioAstronomySettings::RefFrame)value; plotFFTMeasurement(); - applySettings(); + applySettings(QStringList("refFrame")); } void RadioAstronomyGUI::on_sunDistanceToGC_valueChanged(double value) { m_settings.m_sunDistanceToGC = value; - applySettings(); + applySettings(QStringList("sunDistanceToGC")); calcDistances(); } void RadioAstronomyGUI::on_sunOrbitalVelocity_valueChanged(double value) { m_settings.m_sunOrbitalVelocity = value; - applySettings(); + applySettings(QStringList("sunOrbitalVelocity")); calcDistances(); } @@ -5346,7 +5348,7 @@ void RadioAstronomyGUI::on_saveSpectrumChartImages_clicked() void RadioAstronomyGUI::on_spectrumReverseXAxis_toggled(bool checked) { m_settings.m_spectrumReverseXAxis = checked; - applySettings(); + applySettings(QStringList("spectrumReverseXAxis")); if (ui->spectrumChartSelect->currentIndex() == 0) { plotFFTMeasurement(); } else { @@ -5358,7 +5360,7 @@ void RadioAstronomyGUI::on_powerShowPeak_toggled(bool checked) { m_settings.m_powerPeaks = checked; updatePowerMarkerTableVisibility(); - applySettings(); + applySettings(QStringList("powerPeaks")); if (m_powerPeakSeries) { m_powerPeakSeries->setVisible(checked); @@ -5374,7 +5376,7 @@ void RadioAstronomyGUI::on_spectrumPeak_toggled(bool checked) m_settings.m_spectrumPeaks = checked; updateSpectrumMarkerTableVisibility(); plotFFTMeasurement(); - applySettings(); + applySettings(QStringList("spectrumPeaks")); if (m_fftChart) { if (checked) { @@ -5391,7 +5393,7 @@ void RadioAstronomyGUI::on_powerShowMarker_toggled(bool checked) { m_settings.m_powerMarkers = checked; updatePowerMarkerTableVisibility(); - applySettings(); + applySettings(QStringList("powerMarkers")); if (m_powerMarkerSeries) { m_powerMarkerSeries->setVisible(checked); @@ -5406,7 +5408,7 @@ void RadioAstronomyGUI::on_powerShowMarker_toggled(bool checked) void RadioAstronomyGUI::on_powerShowAvg_toggled(bool checked) { m_settings.m_powerAvg = checked; - applySettings(); + applySettings(QStringList("powerAvg")); ui->powerChartAvgWidgets->setVisible(checked); getRollupContents()->arrangeRollups(); if (checked) { @@ -5417,7 +5419,7 @@ void RadioAstronomyGUI::on_powerShowAvg_toggled(bool checked) void RadioAstronomyGUI::on_powerShowLegend_toggled(bool checked) { m_settings.m_powerLegend = checked; - applySettings(); + applySettings(QStringList("powerLegend")); if (m_powerChart) { if (checked) { @@ -5431,7 +5433,7 @@ void RadioAstronomyGUI::on_powerShowLegend_toggled(bool checked) void RadioAstronomyGUI::on_powerShowTsys0_toggled(bool checked) { m_settings.m_powerShowTsys0 = checked; - applySettings(); + applySettings(QStringList("powerShowTsys0")); if (m_powerTsys0Series) { m_powerTsys0Series->setVisible(checked); } @@ -5440,21 +5442,21 @@ void RadioAstronomyGUI::on_powerShowTsys0_toggled(bool checked) void RadioAstronomyGUI::on_powerShowAirTemp_toggled(bool checked) { m_settings.m_powerShowAirTemp = checked; - applySettings(); + applySettings(QStringList("powerShowAirTemp")); m_airTemps.clicked(checked); } void RadioAstronomyGUI::on_powerShowSensor1_toggled(bool checked) { m_settings.m_sensorVisible[0] = checked; - applySettings(); + applySettings(QStringList("sensorVisible")); m_sensors[0].clicked(checked); } void RadioAstronomyGUI::on_powerShowSensor2_toggled(bool checked) { m_settings.m_sensorVisible[1] = checked; - applySettings(); + applySettings(QStringList("sensorVisible")); m_sensors[1].clicked(checked); } @@ -5512,7 +5514,7 @@ void RadioAstronomyGUI::updateSpectrumMarkerTableVisibility() void RadioAstronomyGUI::on_spectrumMarker_toggled(bool checked) { m_settings.m_spectrumMarkers = checked; - applySettings(); + applySettings(QStringList("spectrumMarkers")); updateSpectrumMarkerTableVisibility(); m_fftMarkerSeries->setVisible(checked); if (checked) @@ -5533,7 +5535,7 @@ void RadioAstronomyGUI::on_spectrumMarker_toggled(bool checked) void RadioAstronomyGUI::on_spectrumTemp_toggled(bool checked) { m_settings.m_spectrumTemp = checked; - applySettings(); + applySettings(QStringList("spectrumTemp")); ui->spectrumGaussianWidgets->setVisible(checked); m_fftGaussianSeries->setVisible(checked); updateSpectrumSelect(); @@ -5543,7 +5545,7 @@ void RadioAstronomyGUI::on_spectrumTemp_toggled(bool checked) void RadioAstronomyGUI::on_spectrumShowLegend_toggled(bool checked) { m_settings.m_spectrumLegend = checked; - applySettings(); + applySettings(QStringList("spectrumLegend")); if (m_fftChart) { m_fftChart->legend()->setVisible(checked); @@ -5554,7 +5556,7 @@ void RadioAstronomyGUI::on_spectrumShowLegend_toggled(bool checked) void RadioAstronomyGUI::on_spectrumShowRefLine_toggled(bool checked) { m_settings.m_spectrumRefLine = checked; - applySettings(); + applySettings(QStringList("spectrumRefLine")); ui->spectrumRefLineWidgets->setVisible(checked); if (m_fftHlineSeries) { @@ -5568,7 +5570,7 @@ void RadioAstronomyGUI::on_spectrumShowRefLine_toggled(bool checked) void RadioAstronomyGUI::on_spectrumShowLAB_toggled(bool checked) { m_settings.m_spectrumLAB = checked; - applySettings(); + applySettings(QStringList("spectrumLAB")); m_fftLABSeries->setVisible(m_settings.m_spectrumLAB); if (m_settings.m_spectrumLAB) { plotLAB(); // Replot in case data needs to be downloaded @@ -5621,7 +5623,7 @@ void RadioAstronomyGUI::updateDistanceColumns() void RadioAstronomyGUI::on_spectrumShowDistance_toggled(bool checked) { m_settings.m_spectrumDistance = checked; - applySettings(); + applySettings(QStringList("spectrumDistance")); if (m_settings.m_spectrumDistance && !m_settings.m_spectrumRefLine) { ui->spectrumShowRefLine->setChecked(true); } @@ -5888,7 +5890,7 @@ void RadioAstronomyGUI::calcColumnDensity() void RadioAstronomyGUI::on_powerShowGaussian_clicked(bool checked) { m_settings.m_powerShowGaussian = checked; - applySettings(); + applySettings(QStringList("powerShowGaussian")); ui->powerGaussianWidgets->setVisible(checked); m_powerGaussianSeries->setVisible(checked); updatePowerSelect(); @@ -6029,7 +6031,7 @@ void RadioAstronomyGUI::plotPowerFiltered() void RadioAstronomyGUI::on_powerShowFiltered_clicked(bool checked) { m_settings.m_powerShowFiltered = checked; - applySettings(); + applySettings(QStringList("powerShowFiltered")); ui->powerFilterWidgets->setVisible(checked); m_powerFilteredSeries->setVisible(checked); getRollupContents()->arrangeRollups(); @@ -6039,21 +6041,21 @@ void RadioAstronomyGUI::on_powerShowFiltered_clicked(bool checked) void RadioAstronomyGUI::on_powerFilter_currentIndexChanged(int index) { m_settings.m_powerFilter = (RadioAstronomySettings::PowerFilter)index; - applySettings(); + applySettings(QStringList("powerFilter")); plotPowerFiltered(); } void RadioAstronomyGUI::on_powerFilterN_valueChanged(int value) { m_settings.m_powerFilterN = value; - applySettings(); + applySettings(QStringList("powerFilterN")); plotPowerFiltered(); } void RadioAstronomyGUI::on_powerShowMeasurement_clicked(bool checked) { m_settings.m_powerShowMeasurement = checked; - applySettings(); + applySettings(QStringList("powerShowMeasurement")); m_powerSeries->setVisible(checked); } @@ -6241,7 +6243,7 @@ void RadioAstronomyGUI::displayRunModeSettings() void RadioAstronomyGUI::on_runMode_currentIndexChanged(int index) { m_settings.m_runMode = (RadioAstronomySettings::RunMode)index; - applySettings(); + applySettings(QStringList("runMode")); displayRunModeSettings(); } @@ -6263,49 +6265,49 @@ void RadioAstronomyGUI::on_sweepType_currentIndexChanged(int index) void RadioAstronomyGUI::on_sweep1Start_valueChanged(double value) { m_settings.m_sweep1Start = value; - applySettings(); + applySettings(QStringList("sweep1Start")); } void RadioAstronomyGUI::on_sweep1Stop_valueChanged(double value) { m_settings.m_sweep1Stop = value; - applySettings(); + applySettings(QStringList("sweep1Stop")); } void RadioAstronomyGUI::on_sweep1Step_valueChanged(double value) { m_settings.m_sweep1Step = value; - applySettings(); + applySettings(QStringList("sweep1Step")); } void RadioAstronomyGUI::on_sweep1Delay_valueChanged(double value) { m_settings.m_sweep1Delay = value; - applySettings(); + applySettings(QStringList("sweep1Delay")); } void RadioAstronomyGUI::on_sweep2Start_valueChanged(double value) { m_settings.m_sweep2Start = value; - applySettings(); + applySettings(QStringList("sweep2Start")); } void RadioAstronomyGUI::on_sweep2Stop_valueChanged(double value) { m_settings.m_sweep2Stop = value; - applySettings(); + applySettings(QStringList("sweep2Stop")); } void RadioAstronomyGUI::on_sweep2Step_valueChanged(double value) { m_settings.m_sweep2Step = value; - applySettings(); + applySettings(QStringList("sweep2Step")); } void RadioAstronomyGUI::on_sweep2Delay_valueChanged(double value) { m_settings.m_sweep2Delay = value; - applySettings(); + applySettings(QStringList("sweep2Delay")); } void RadioAstronomyGUI::on_sweepStartAtTime_currentIndexChanged(int index) @@ -6313,13 +6315,13 @@ void RadioAstronomyGUI::on_sweepStartAtTime_currentIndexChanged(int index) m_settings.m_sweepStartAtTime = ui->sweepStartAtTime->currentIndex() == 1; ui->sweepStartDateTime->setVisible(index == 1); getRollupContents()->arrangeRollups(); - applySettings(); + applySettings(QStringList("sweepStartAtTime")); } void RadioAstronomyGUI::on_sweepStartDateTime_dateTimeChanged(const QDateTime& dateTime) { m_settings.m_sweepStartDateTime = dateTime; - applySettings(); + applySettings(QStringList("sweepStartDateTime")); } void RadioAstronomyGUI::on_startStop_clicked(bool checked) @@ -6327,7 +6329,7 @@ void RadioAstronomyGUI::on_startStop_clicked(bool checked) if (checked) { ui->startStop->setStyleSheet("QToolButton { background-color : green; }"); - applySettings(); + applySettings(QStringList("startStop")); if (m_settings.m_power2DLinkSweep) { update2DSettingsFromSweep(); @@ -6341,6 +6343,7 @@ void RadioAstronomyGUI::on_startStop_clicked(bool checked) if (m_settings.m_runMode != RadioAstronomySettings::SWEEP) { ui->startStop->setStyleSheet("QToolButton { background-color : blue; }"); } + applySettings(QStringList("startStop")); } } diff --git a/plugins/channelrx/radioastronomy/radioastronomygui.h b/plugins/channelrx/radioastronomy/radioastronomygui.h index fb5c3f7e6..6953d4f77 100644 --- a/plugins/channelrx/radioastronomy/radioastronomygui.h +++ b/plugins/channelrx/radioastronomy/radioastronomygui.h @@ -348,7 +348,7 @@ private: virtual ~RadioAstronomyGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displaySpectrumLineFrequency(); void displayRunModeSettings(); diff --git a/plugins/channelrx/radioastronomy/radioastronomysink.cpp b/plugins/channelrx/radioastronomy/radioastronomysink.cpp index 3691afad7..b3fab45db 100644 --- a/plugins/channelrx/radioastronomy/radioastronomysink.cpp +++ b/plugins/channelrx/radioastronomy/radioastronomysink.cpp @@ -42,7 +42,7 @@ RadioAstronomySink::RadioAstronomySink(RadioAstronomy *aisDemod) : { m_magsq = 0.0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -241,18 +241,12 @@ void RadioAstronomySink::applyChannelSettings(int channelSampleRate, int channel m_channelFrequencyOffset = channelFrequencyOffset; } -void RadioAstronomySink::applySettings(const RadioAstronomySettings& settings, bool force) +void RadioAstronomySink::applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) { - qDebug() << "RadioAstronomySink::applySettings:" - << " m_sampleRate: " << settings.m_sampleRate - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fftSize: " << settings.m_fftSize - << " m_fftWindow: " << settings.m_fftWindow - << " m_filterFreqs: " << settings.m_filterFreqs - << " force: " << force; + qDebug() << "RadioAstronomySink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_sampleRate != m_settings.m_sampleRate) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) + || (settingsKeys.contains("sampleRate") && (settings.m_sampleRate != m_settings.m_sampleRate)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.0f); // 2.0 rather than 2.2 as in other plugins, to reduce rolloff at edge of band @@ -260,7 +254,7 @@ void RadioAstronomySink::applySettings(const RadioAstronomySettings& settings, b m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_fftSize != m_settings.m_fftSize) || force) + if ((settingsKeys.contains("fftSize") && (settings.m_fftSize != m_settings.m_fftSize)) || force) { FFTFactory *fftFactory = DSPEngine::instance()->getFFTFactory(); if (m_fftSequence >= 0) { @@ -275,8 +269,8 @@ void RadioAstronomySink::applySettings(const RadioAstronomySettings& settings, b m_fftSumCount = 0; } - if ((settings.m_fftSize != m_settings.m_fftSize) - || (settings.m_fftWindow != m_settings.m_fftWindow) + if ((settingsKeys.contains("fftSize") && (settings.m_fftSize != m_settings.m_fftSize)) + || (settingsKeys.contains("fftWindow") && (settings.m_fftWindow != m_settings.m_fftWindow)) || force) { if (settings.m_fftWindow == RadioAstronomySettings::HAN) { @@ -286,7 +280,7 @@ void RadioAstronomySink::applySettings(const RadioAstronomySettings& settings, b } } - if ((settings.m_filterFreqs != m_settings.m_filterFreqs) || force) + if ((settingsKeys.contains("filterFreqs") && (settings.m_filterFreqs != m_settings.m_filterFreqs)) || force) { m_filterBins.clear(); QStringList filterFreqs = settings.m_filterFreqs.split(" "); @@ -300,5 +294,9 @@ void RadioAstronomySink::applySettings(const RadioAstronomySettings& settings, b } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/radioastronomy/radioastronomysink.h b/plugins/channelrx/radioastronomy/radioastronomysink.h index 6386c42fd..75a2e75af 100644 --- a/plugins/channelrx/radioastronomy/radioastronomysink.h +++ b/plugins/channelrx/radioastronomy/radioastronomysink.h @@ -41,7 +41,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const RadioAstronomySettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } void startMeasurements(); diff --git a/plugins/channelrx/radioastronomy/radioastronomyworker.h b/plugins/channelrx/radioastronomy/radioastronomyworker.h index 5d79bd05f..ba17a0c5d 100644 --- a/plugins/channelrx/radioastronomy/radioastronomyworker.h +++ b/plugins/channelrx/radioastronomy/radioastronomyworker.h @@ -39,20 +39,23 @@ public: public: const RadioAstronomySettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRadioAstronomyWorker* create(const RadioAstronomySettings& settings, bool force) + static MsgConfigureRadioAstronomyWorker* create(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) { - return new MsgConfigureRadioAstronomyWorker(settings, force); + return new MsgConfigureRadioAstronomyWorker(settingsKeys, settings, force); } private: RadioAstronomySettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRadioAstronomyWorker(const RadioAstronomySettings& settings, bool force) : + MsgConfigureRadioAstronomyWorker(const QStringList& settingsKeys, const RadioAstronomySettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; diff --git a/plugins/channelrx/radioclock/radioclock.cpp b/plugins/channelrx/radioclock/radioclock.cpp index d9d4f6b9a..074a751a6 100644 --- a/plugins/channelrx/radioclock/radioclock.cpp +++ b/plugins/channelrx/radioclock/radioclock.cpp @@ -56,7 +56,7 @@ RadioClock::RadioClock(DeviceAPI *deviceAPI) : m_basebandSink->setChannel(this); m_basebandSink->moveToThread(&m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -130,7 +130,7 @@ void RadioClock::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - RadioClockBaseband::MsgConfigureRadioClockBaseband *msg = RadioClockBaseband::MsgConfigureRadioClockBaseband::create(m_settings, true); + RadioClockBaseband::MsgConfigureRadioClockBaseband *msg = RadioClockBaseband::MsgConfigureRadioClockBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); } @@ -146,11 +146,11 @@ void RadioClock::setCenterFrequency(qint64 frequency) { RadioClockSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRadioClock *msgToGUI = MsgConfigureRadioClock::create(settings, false); + MsgConfigureRadioClock *msgToGUI = MsgConfigureRadioClock::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -161,7 +161,7 @@ bool RadioClock::handleMessage(const Message& cmd) { MsgConfigureRadioClock& cfg = (MsgConfigureRadioClock&) cmd; qDebug() << "RadioClock::handleMessage: MsgConfigureRadioClock"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -216,41 +216,11 @@ ScopeVis *RadioClock::getScopeSink() return m_basebandSink->getScopeSink(); } -void RadioClock::applySettings(const RadioClockSettings& settings, bool force) +void RadioClock::applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force) { - qDebug() << "RadioClock::applySettings:" - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "RadioClock::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_frequencyMode != m_settings.m_frequencyMode) || force) { - reverseAPIKeys.append("frequencyMode"); - } - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_frequency != m_settings.m_frequency) || force) { - reverseAPIKeys.append("frequency"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_threshold != m_settings.m_threshold) || force) { - reverseAPIKeys.append("threshold"); - } - if ((settings.m_modulation != m_settings.m_modulation) || force) { - reverseAPIKeys.append("modulation"); - } - if ((settings.m_timezone != m_settings.m_timezone) || force) { - reverseAPIKeys.append("timezone"); - } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -261,24 +231,26 @@ void RadioClock::applySettings(const RadioClockSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - RadioClockBaseband::MsgConfigureRadioClockBaseband *msg = RadioClockBaseband::MsgConfigureRadioClockBaseband::create(settings, force); + RadioClockBaseband::MsgConfigureRadioClockBaseband *msg = RadioClockBaseband::MsgConfigureRadioClockBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray RadioClock::serialize() const @@ -290,14 +262,14 @@ bool RadioClock::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureRadioClock *msg = MsgConfigureRadioClock::create(m_settings, true); + MsgConfigureRadioClock *msg = MsgConfigureRadioClock::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureRadioClock *msg = MsgConfigureRadioClock::create(m_settings, true); + MsgConfigureRadioClock *msg = MsgConfigureRadioClock::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -340,13 +312,13 @@ int RadioClock::webapiSettingsPutPatch( settings.m_frequency = m_centerFrequency + settings.m_inputFrequencyOffset; } - MsgConfigureRadioClock *msg = MsgConfigureRadioClock::create(settings, force); + MsgConfigureRadioClock *msg = MsgConfigureRadioClock::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("RadioClock::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRadioClock *msgToGUI = MsgConfigureRadioClock::create(settings, force); + MsgConfigureRadioClock *msgToGUI = MsgConfigureRadioClock::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -501,7 +473,7 @@ void RadioClock::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respon response.getRadioClockReport()->setTime(new QString(m_dateTime.time().toString())); } -void RadioClock::webapiReverseSendSettings(QList& channelSettingsKeys, const RadioClockSettings& settings, bool force) +void RadioClock::webapiReverseSendSettings(const QList& channelSettingsKeys, const RadioClockSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -538,7 +510,7 @@ int RadioClock::webapiReportGet( } void RadioClock::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RadioClockSettings& settings, bool force diff --git a/plugins/channelrx/radioclock/radioclock.h b/plugins/channelrx/radioclock/radioclock.h index 4f367ff1a..5ac47d83e 100644 --- a/plugins/channelrx/radioclock/radioclock.h +++ b/plugins/channelrx/radioclock/radioclock.h @@ -49,20 +49,23 @@ public: public: const RadioClockSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRadioClock* create(const RadioClockSettings& settings, bool force) + static MsgConfigureRadioClock* create(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force) { - return new MsgConfigureRadioClock(settings, force); + return new MsgConfigureRadioClock(settingsKeys, settings, force); } private: RadioClockSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRadioClock(const RadioClockSettings& settings, bool force) : + MsgConfigureRadioClock(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -199,11 +202,11 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const RadioClockSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const RadioClockSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const RadioClockSettings& settings, bool force); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RadioClockSettings& settings, bool force diff --git a/plugins/channelrx/radioclock/radioclockbaseband.cpp b/plugins/channelrx/radioclock/radioclockbaseband.cpp index 03d3ceb2e..90540fdf4 100644 --- a/plugins/channelrx/radioclock/radioclockbaseband.cpp +++ b/plugins/channelrx/radioclock/radioclockbaseband.cpp @@ -136,7 +136,7 @@ bool RadioClockBaseband::handleMessage(const Message& cmd) MsgConfigureRadioClockBaseband& cfg = (MsgConfigureRadioClockBaseband&) cmd; qDebug() << "RadioClockBaseband::handleMessage: MsgConfigureRadioClockBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -156,17 +156,21 @@ bool RadioClockBaseband::handleMessage(const Message& cmd) } } -void RadioClockBaseband::applySettings(const RadioClockSettings& settings, bool force) +void RadioClockBaseband::applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { m_channelizer->setChannelization(RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void RadioClockBaseband::setBasebandSampleRate(int sampleRate) diff --git a/plugins/channelrx/radioclock/radioclockbaseband.h b/plugins/channelrx/radioclock/radioclockbaseband.h index 410362880..e200ef336 100644 --- a/plugins/channelrx/radioclock/radioclockbaseband.h +++ b/plugins/channelrx/radioclock/radioclockbaseband.h @@ -44,20 +44,23 @@ public: public: const RadioClockSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRadioClockBaseband* create(const RadioClockSettings& settings, bool force) + static MsgConfigureRadioClockBaseband* create(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force) { - return new MsgConfigureRadioClockBaseband(settings, force); + return new MsgConfigureRadioClockBaseband(settingsKeys, settings, force); } private: RadioClockSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRadioClockBaseband(const RadioClockSettings& settings, bool force) : + MsgConfigureRadioClockBaseband(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -91,7 +94,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const RadioClockSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/radioclock/radioclockgui.cpp b/plugins/channelrx/radioclock/radioclockgui.cpp index a21d19e96..b1dbe3a9b 100644 --- a/plugins/channelrx/radioclock/radioclockgui.cpp +++ b/plugins/channelrx/radioclock/radioclockgui.cpp @@ -52,7 +52,7 @@ void RadioClockGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray RadioClockGUI::serialize() const @@ -64,7 +64,7 @@ bool RadioClockGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -155,7 +155,7 @@ void RadioClockGUI::calcOffset() m_channelMarker.setCenterFrequency(offset); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -190,7 +190,7 @@ void RadioClockGUI::channelMarkerChangedByCursor() ui->deltaFrequency->blockSignals(false); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset", "frequency"})); } void RadioClockGUI::channelMarkerHighlightedByCursor() @@ -219,7 +219,7 @@ void RadioClockGUI::on_frequencyMode_currentIndexChanged(int index) ui->deltaFrequency->blockSignals(false); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"frequencyMode"})); } void RadioClockGUI::on_deltaFrequency_changed(qint64 value) @@ -240,7 +240,7 @@ void RadioClockGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(offset); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"inputFrequencyOffset"})); } void RadioClockGUI::on_rfBW_valueChanged(int value) @@ -248,27 +248,27 @@ void RadioClockGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1 Hz").arg(value)); m_channelMarker.setBandwidth(value); m_settings.m_rfBandwidth = value; - applySettings(); + applySettings(QStringList({"rfBandwidth"})); } void RadioClockGUI::on_threshold_valueChanged(int value) { ui->thresholdText->setText(QString("%1 dB").arg(value)); m_settings.m_threshold = value; - applySettings(); + applySettings(QStringList({"threshold"})); } void RadioClockGUI::on_modulation_currentIndexChanged(int index) { m_settings.m_modulation = (RadioClockSettings::Modulation)index; - applySettings(); + applySettings(QStringList({"modulation"})); } void RadioClockGUI::on_timezone_currentIndexChanged(int index) { m_settings.m_timezone = (RadioClockSettings::DisplayTZ)index; displayDateTime(); - applySettings(); + applySettings(QStringList({"timezone"})); } void RadioClockGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -277,7 +277,7 @@ void RadioClockGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void RadioClockGUI::onMenuDialogCalled(const QPoint &p) @@ -322,7 +322,8 @@ void RadioClockGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -390,7 +391,7 @@ RadioClockGUI::RadioClockGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -405,11 +406,11 @@ void RadioClockGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void RadioClockGUI::applySettings(bool force) +void RadioClockGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - RadioClock::MsgConfigureRadioClock* message = RadioClock::MsgConfigureRadioClock::create( m_settings, force); + RadioClock::MsgConfigureRadioClock* message = RadioClock::MsgConfigureRadioClock::create(settingsKeys, m_settings, force); m_radioClock->getInputMessageQueue()->push(message); } } diff --git a/plugins/channelrx/radioclock/radioclockgui.h b/plugins/channelrx/radioclock/radioclockgui.h index a17d01ff7..122335e58 100644 --- a/plugins/channelrx/radioclock/radioclockgui.h +++ b/plugins/channelrx/radioclock/radioclockgui.h @@ -88,7 +88,7 @@ private: virtual ~RadioClockGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channelrx/radioclock/radioclocksink.cpp b/plugins/channelrx/radioclock/radioclocksink.cpp index b23b3e05c..77fa9cbce 100644 --- a/plugins/channelrx/radioclock/radioclocksink.cpp +++ b/plugins/channelrx/radioclock/radioclocksink.cpp @@ -47,9 +47,9 @@ RadioClockSink::RadioClockSink() : m_zeroCount(0), m_sampleBufferIndex(0), m_gotMarker(false) -{ +{ m_phaseDiscri.setFMScaling(RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE / (2.0f * 20.0/M_PI)); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); for (int i = 0; i < RadioClockSettings::m_scopeStreams; i++) { @@ -999,27 +999,23 @@ void RadioClockSink::applyChannelSettings(int channelSampleRate, int channelFreq m_channelFrequencyOffset = channelFrequencyOffset; } -void RadioClockSink::applySettings(const RadioClockSettings& settings, bool force) +void RadioClockSink::applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force) { - qDebug() << "RadioClockSink::applySettings:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_threshold: " << settings.m_threshold - << " m_modulation: " << settings.m_modulation - << " force: " << force; + qDebug() << "RadioClockSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2); m_interpolatorDistance = (Real) m_channelSampleRate / (Real) RadioClockSettings::RADIOCLOCK_CHANNEL_SAMPLE_RATE; m_interpolatorDistanceRemain = m_interpolatorDistance; } - if ((settings.m_threshold != m_settings.m_threshold) || force) + if ((settingsKeys.contains("threshold") && (settings.m_threshold != m_settings.m_threshold)) || force) { m_linearThreshold = CalcDb::powerFromdB(-settings.m_threshold); } - if ((settings.m_modulation != m_settings.m_modulation) || force) + if ((settingsKeys.contains("modulation") && (settings.m_modulation != m_settings.m_modulation)) || force) { m_gotMinuteMarker = false; m_lowCount = 0; @@ -1032,5 +1028,9 @@ void RadioClockSink::applySettings(const RadioClockSettings& settings, bool forc } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/radioclock/radioclocksink.h b/plugins/channelrx/radioclock/radioclocksink.h index 316cb9ecd..8088411c6 100644 --- a/plugins/channelrx/radioclock/radioclocksink.h +++ b/plugins/channelrx/radioclock/radioclocksink.h @@ -49,7 +49,7 @@ public: void setScopeSink(ScopeVis* scopeSink); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const RadioClockSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RadioClockSettings& settings, bool force = false); void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } void setChannel(ChannelAPI *channel) { m_channel = channel; } diff --git a/plugins/channelrx/remotesink/remotesink.cpp b/plugins/channelrx/remotesink/remotesink.cpp index 7131d3bb1..82a83477e 100644 --- a/plugins/channelrx/remotesink/remotesink.cpp +++ b/plugins/channelrx/remotesink/remotesink.cpp @@ -60,7 +60,7 @@ RemoteSink::RemoteSink(DeviceAPI *deviceAPI) : { setObjectName(m_channelId); updateWithDeviceData(); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -145,7 +145,7 @@ void RemoteSink::start() m_basebandSink->setBasebandSampleRate(m_basebandSampleRate); } - RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband *msg = RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband::create(m_settings, true); + RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband *msg = RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -170,7 +170,7 @@ bool RemoteSink::handleMessage(const Message& cmd) { MsgConfigureRemoteSink& cfg = (MsgConfigureRemoteSink&) cmd; qDebug() << "RemoteSink::handleMessage: MsgConfigureRemoteSink"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -212,48 +212,43 @@ bool RemoteSink::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(m_settings, true); + MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(m_settings, true); + MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } } -void RemoteSink::applySettings(const RemoteSinkSettings& settings, bool force) +void RemoteSink::applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force) { - qDebug() << "RemoteSink::applySettings:" - << " m_nbFECBlocks: " << settings.m_nbFECBlocks - << " m_dataAddress: " << settings.m_dataAddress - << " m_dataPort: " << settings.m_dataPort - << " m_streamIndex: " << settings.m_streamIndex - << " force: " << force; + qDebug() << "RemoteSink::applySettings:" << settings.getDebugString(settingsKeys, force); QList reverseAPIKeys; bool frequencyOffsetChange = false; - if ((m_settings.m_nbFECBlocks != settings.m_nbFECBlocks) || force) { + if ((settingsKeys.contains("nbFECBlocks") && (m_settings.m_nbFECBlocks != settings.m_nbFECBlocks)) || force) { reverseAPIKeys.append("nbFECBlocks"); } - if ((m_settings.m_dataAddress != settings.m_dataAddress) || force) { + if ((settingsKeys.contains("dataAddress") && (m_settings.m_dataAddress != settings.m_dataAddress)) || force) { reverseAPIKeys.append("dataAddress"); } - if ((m_settings.m_dataPort != settings.m_dataPort) || force) { + if ((settingsKeys.contains("dataPort") && (m_settings.m_dataPort != settings.m_dataPort)) || force) { reverseAPIKeys.append("dataPort"); } - if ((m_settings.m_rgbColor != settings.m_rgbColor) || force) { + if ((settingsKeys.contains("rgbColor") && (m_settings.m_rgbColor != settings.m_rgbColor)) || force) { reverseAPIKeys.append("rgbColor"); } - if ((m_settings.m_title != settings.m_title) || force) { + if ((settingsKeys.contains("title") && (m_settings.m_title != settings.m_title)) || force) { reverseAPIKeys.append("title"); } - if ((m_settings.m_deviceCenterFrequency != settings.m_deviceCenterFrequency) || force) + if ((settingsKeys.contains("deviceCenterFrequency") && (m_settings.m_deviceCenterFrequency != settings.m_deviceCenterFrequency)) || force) { reverseAPIKeys.append("deviceCenterFrequency"); @@ -264,19 +259,19 @@ void RemoteSink::applySettings(const RemoteSinkSettings& settings, bool force) } } - if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) + if ((settingsKeys.contains("log2Decim") && (m_settings.m_log2Decim != settings.m_log2Decim)) || force) { reverseAPIKeys.append("log2Decim"); frequencyOffsetChange = true; } - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) + if ((settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) || force) { reverseAPIKeys.append("filterChainHash"); frequencyOffsetChange = true; } - if ((m_settings.m_nbTxBytes != settings.m_nbTxBytes) || force) + if ((settingsKeys.contains("nbTxBytes") && (m_settings.m_nbTxBytes != settings.m_nbTxBytes)) || force) { reverseAPIKeys.append("nbTxBytes"); stop(); @@ -284,7 +279,7 @@ void RemoteSink::applySettings(const RemoteSinkSettings& settings, bool force) m_basebandSink->setNbTxBytes(settings.m_nbTxBytes); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if ((settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) || force) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -301,17 +296,17 @@ void RemoteSink::applySettings(const RemoteSinkSettings& settings, bool force) if (m_running) { - RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband *msg = RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband::create(settings, force); + RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband *msg = RemoteSinkBaseband::MsgConfigureRemoteSinkBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if ((settings.m_useReverseAPI) && (reverseAPIKeys.size() != 0)) + if (( settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI && (reverseAPIKeys.size() != 0)) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } @@ -385,14 +380,14 @@ int RemoteSink::webapiSettingsPutPatch( RemoteSinkSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(settings, force); + MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("RemoteSink::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRemoteSink *msgToGUI = MsgConfigureRemoteSink::create(settings, force); + MsgConfigureRemoteSink *msgToGUI = MsgConfigureRemoteSink::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } diff --git a/plugins/channelrx/remotesink/remotesink.h b/plugins/channelrx/remotesink/remotesink.h index 5c4d2cdf1..9a6a73a9c 100644 --- a/plugins/channelrx/remotesink/remotesink.h +++ b/plugins/channelrx/remotesink/remotesink.h @@ -45,20 +45,23 @@ public: public: const RemoteSinkSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRemoteSink* create(const RemoteSinkSettings& settings, bool force) + static MsgConfigureRemoteSink* create(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force) { - return new MsgConfigureRemoteSink(settings, force); + return new MsgConfigureRemoteSink(settingsKeys, settings, force); } private: RemoteSinkSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRemoteSink(const RemoteSinkSettings& settings, bool force) : + MsgConfigureRemoteSink(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -139,7 +142,7 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const RemoteSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force = false); static void validateFilterChainHash(RemoteSinkSettings& settings); void calculateFrequencyOffset(); void updateWithDeviceData(); diff --git a/plugins/channelrx/remotesink/remotesinkbaseband.cpp b/plugins/channelrx/remotesink/remotesinkbaseband.cpp index f68d84fb5..9eb750499 100644 --- a/plugins/channelrx/remotesink/remotesinkbaseband.cpp +++ b/plugins/channelrx/remotesink/remotesinkbaseband.cpp @@ -127,7 +127,7 @@ bool RemoteSinkBaseband::handleMessage(const Message& cmd) MsgConfigureRemoteSinkBaseband& cfg = (MsgConfigureRemoteSinkBaseband&) cmd; qDebug() << "RemoteSinkBaseband::handleMessage: MsgConfigureRemoteSinkBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -149,21 +149,23 @@ bool RemoteSinkBaseband::handleMessage(const Message& cmd) } } -void RemoteSinkBaseband::applySettings(const RemoteSinkSettings& settings, bool force) +void RemoteSinkBaseband::applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force) { - qDebug() << "RemoteSinkBaseband::applySettings:" - << "m_log2Decim:" << settings.m_log2Decim - << "m_filterChainHash:" << settings.m_filterChainHash - << " force: " << force; + qDebug() << "RemoteSinkBaseband::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_log2Decim != m_settings.m_log2Decim) - || (settings.m_filterChainHash != m_settings.m_filterChainHash) || force) + if ((settingsKeys.contains("log2Decim") && (settings.m_log2Decim != m_settings.m_log2Decim)) + || (settingsKeys.contains("filterChainHash") && (settings.m_filterChainHash != m_settings.m_filterChainHash)) || force) { m_channelizer->setDecimation(settings.m_log2Decim, settings.m_filterChainHash); } - m_sink.applySettings(settings, force); - m_settings = settings; + m_sink.applySettings(settingsKeys, settings, force); + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int RemoteSinkBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/remotesink/remotesinkbaseband.h b/plugins/channelrx/remotesink/remotesinkbaseband.h index 6b081a6f0..22b2a513d 100644 --- a/plugins/channelrx/remotesink/remotesinkbaseband.h +++ b/plugins/channelrx/remotesink/remotesinkbaseband.h @@ -40,20 +40,23 @@ public: public: const RemoteSinkSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRemoteSinkBaseband* create(const RemoteSinkSettings& settings, bool force) + static MsgConfigureRemoteSinkBaseband* create(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force) { - return new MsgConfigureRemoteSinkBaseband(settings, force); + return new MsgConfigureRemoteSinkBaseband(settingsKeys, settings, force); } private: RemoteSinkSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRemoteSinkBaseband(const RemoteSinkSettings& settings, bool force) : + MsgConfigureRemoteSinkBaseband(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -86,7 +89,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const RemoteSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/remotesink/remotesinkgui.cpp b/plugins/channelrx/remotesink/remotesinkgui.cpp index 94247a47d..c7675710c 100644 --- a/plugins/channelrx/remotesink/remotesinkgui.cpp +++ b/plugins/channelrx/remotesink/remotesinkgui.cpp @@ -44,7 +44,7 @@ void RemoteSinkGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray RemoteSinkGUI::serialize() const @@ -56,7 +56,7 @@ bool RemoteSinkGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -131,7 +131,7 @@ RemoteSinkGUI::RemoteSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -146,13 +146,13 @@ void RemoteSinkGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void RemoteSinkGUI::applySettings(bool force) +void RemoteSinkGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - RemoteSink::MsgConfigureRemoteSink* message = RemoteSink::MsgConfigureRemoteSink::create(m_settings, force); + RemoteSink::MsgConfigureRemoteSink* message = RemoteSink::MsgConfigureRemoteSink::create(settingsKeys, m_settings, force); m_remoteSink->getInputMessageQueue()->push(message); } } @@ -228,7 +228,7 @@ void RemoteSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void RemoteSinkGUI::onMenuDialogCalled(const QPoint &p) @@ -273,7 +273,9 @@ void RemoteSinkGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"color", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); @@ -294,7 +296,7 @@ void RemoteSinkGUI::on_position_valueChanged(int value) void RemoteSinkGUI::on_dataAddress_returnPressed() { m_settings.m_dataAddress = ui->dataAddress->text(); - applySettings(); + applySettings(QStringList({"dataAddress"})); } void RemoteSinkGUI::on_dataPort_returnPressed() @@ -311,7 +313,7 @@ void RemoteSinkGUI::on_dataPort_returnPressed() m_settings.m_dataPort = dataPort; } - applySettings(); + applySettings(QStringList({"dataPort"})); } void RemoteSinkGUI::on_dataApplyButton_clicked(bool checked) @@ -327,7 +329,7 @@ void RemoteSinkGUI::on_dataApplyButton_clicked(bool checked) m_settings.m_dataPort = udpDataPort; } - applySettings(); + applySettings(QStringList({"dataAddress", "dataPort"})); } void RemoteSinkGUI::on_nbFECBlocks_valueChanged(int value) @@ -338,13 +340,13 @@ void RemoteSinkGUI::on_nbFECBlocks_valueChanged(int value) QString s = QString::number(nbOriginalBlocks + nbFECBlocks, 'f', 0); QString s1 = QString::number(nbFECBlocks, 'f', 0); ui->nominalNbBlocksText->setText(tr("%1/%2").arg(s).arg(s1)); - applySettings(); + applySettings(QStringList({"nbFECBlocks"})); } void RemoteSinkGUI::on_nbTxBytes_currentIndexChanged(int index) { m_settings.m_nbTxBytes = 1 << index; - applySettings(); + applySettings(QStringList({"nbTxBytes"})); } void RemoteSinkGUI::applyDecimation() @@ -370,7 +372,7 @@ void RemoteSinkGUI::applyPosition() updateAbsoluteCenterFrequency(); displayRateAndShift(); - applySettings(); + applySettings(QStringList()); } void RemoteSinkGUI::tick() diff --git a/plugins/channelrx/remotesink/remotesinkgui.h b/plugins/channelrx/remotesink/remotesinkgui.h index cf6b447d5..bcccea91b 100644 --- a/plugins/channelrx/remotesink/remotesinkgui.h +++ b/plugins/channelrx/remotesink/remotesinkgui.h @@ -85,7 +85,7 @@ private: virtual ~RemoteSinkGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displayRateAndShift(); bool handleMessage(const Message& message); diff --git a/plugins/channelrx/remotesink/remotesinksink.cpp b/plugins/channelrx/remotesink/remotesinksink.cpp index 6c9a4d4e9..fbe19e9f3 100644 --- a/plugins/channelrx/remotesink/remotesinksink.cpp +++ b/plugins/channelrx/remotesink/remotesinksink.cpp @@ -44,7 +44,7 @@ RemoteSinkSink::RemoteSinkSink() : m_dataPort(9090) { qDebug("RemoteSinkSink::RemoteSinkSink"); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } RemoteSinkSink::~RemoteSinkSink() @@ -222,33 +222,32 @@ void RemoteSinkSink::feed(const SampleVector::const_iterator& begin, const Sampl } } -void RemoteSinkSink::applySettings(const RemoteSinkSettings& settings, bool force) +void RemoteSinkSink::applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force) { - qDebug() << "RemoteSinkSink::applySettings:" - << " m_nbFECBlocks: " << settings.m_nbFECBlocks - << " m_dataAddress: " << settings.m_dataAddress - << " m_dataPort: " << settings.m_dataPort - << " m_streamIndex: " << settings.m_streamIndex - << " force: " << force; + qDebug() << "RemoteSinkSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((m_settings.m_dataAddress != settings.m_dataAddress) || force) { + if ((settingsKeys.contains("dataAddress") && (m_settings.m_dataAddress != settings.m_dataAddress)) || force) { m_dataAddress = settings.m_dataAddress; } - if ((m_settings.m_dataPort != settings.m_dataPort) || force) { + if ((settingsKeys.contains("dataPort") && (m_settings.m_dataPort != settings.m_dataPort)) || force) { m_dataPort = settings.m_dataPort; } - if ((m_settings.m_log2Decim != settings.m_log2Decim) - || (m_settings.m_filterChainHash != settings.m_filterChainHash) - || (m_settings.m_nbFECBlocks != settings.m_nbFECBlocks) || force) + if ((settingsKeys.contains("log2Decim") && (m_settings.m_log2Decim != settings.m_log2Decim)) + || (settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) + || (settingsKeys.contains("nbFECBlocks") && (m_settings.m_nbFECBlocks != settings.m_nbFECBlocks)) || force) { double shiftFactor = HBFilterChainConverter::getShiftFactor(settings.m_log2Decim, settings.m_filterChainHash); m_frequencyOffset = round(shiftFactor*m_basebandSampleRate); setNbBlocksFEC(settings.m_nbFECBlocks); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void RemoteSinkSink::applyBasebandSampleRate(uint32_t sampleRate) diff --git a/plugins/channelrx/remotesink/remotesinksink.h b/plugins/channelrx/remotesink/remotesinksink.h index 2347eab19..ec7894972 100644 --- a/plugins/channelrx/remotesink/remotesinksink.h +++ b/plugins/channelrx/remotesink/remotesinksink.h @@ -45,7 +45,7 @@ public: void init(); void setNbTxBytes(uint32_t nbTxBytes) { m_nbTxBytes = nbTxBytes; } - void applySettings(const RemoteSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RemoteSinkSettings& settings, bool force = false); void applyBasebandSampleRate(uint32_t sampleRate); void setDeviceCenterFrequency(uint64_t frequency) { m_deviceCenterFrequency = frequency; } void setDeviceIndex(uint32_t deviceIndex) { m_deviceIndex = deviceIndex; } diff --git a/plugins/channelrx/sigmffilesink/sigmffilesink.cpp b/plugins/channelrx/sigmffilesink/sigmffilesink.cpp index c9636fb26..08bf4e126 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesink.cpp +++ b/plugins/channelrx/sigmffilesink/sigmffilesink.cpp @@ -62,7 +62,7 @@ SigMFFileSink::SigMFFileSink(DeviceAPI *deviceAPI) : { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -180,7 +180,7 @@ void SigMFFileSink::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSink->getInputMessageQueue()->push(dspMsg); - SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband *msg = SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband::create(m_settings, true); + SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband *msg = SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); if (getMessageQueueToGUI()) @@ -239,7 +239,7 @@ bool SigMFFileSink::handleMessage(const Message& cmd) { MsgConfigureSigMFFileSink& cfg = (MsgConfigureSigMFFileSink&) cmd; qDebug() << "SigMFFileSink::handleMessage: MsgConfigureSigMFFileSink"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -259,14 +259,14 @@ bool SigMFFileSink::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureSigMFFileSink *msg = MsgConfigureSigMFFileSink::create(m_settings, true); + MsgConfigureSigMFFileSink *msg = MsgConfigureSigMFFileSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureSigMFFileSink *msg = MsgConfigureSigMFFileSink::create(m_settings, true); + MsgConfigureSigMFFileSink *msg = MsgConfigureSigMFFileSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -320,52 +320,11 @@ DeviceSampleSource *SigMFFileSink::getLocalDevice(uint32_t index) return nullptr; } -void SigMFFileSink::applySettings(const SigMFFileSinkSettings& settings, bool force) +void SigMFFileSink::applySettings(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings, bool force) { - qDebug() << "SigMFFileSink::applySettings:" - << "m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << "m_log2Decim: " << settings.m_log2Decim - << "m_fileRecordName: " << settings.m_fileRecordName - << "m_log2RecordSampleSize: " << settings.m_log2RecordSampleSize - << "force: " << force; + qDebug() << "SigMFFileSink::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_fileRecordName != m_settings.m_fileRecordName) || force) { - reverseAPIKeys.append("fileRecordName"); - } - if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((settings.m_log2Decim != m_settings.m_log2Decim) || force) { - reverseAPIKeys.append("log2Decim"); - } - if ((settings.m_spectrumSquelchMode != m_settings.m_spectrumSquelchMode) || force) { - reverseAPIKeys.append("spectrumSquelchMode"); - } - if ((settings.m_spectrumSquelch != m_settings.m_spectrumSquelch) || force) { - reverseAPIKeys.append("spectrumSquelch"); - } - if ((settings.m_preRecordTime != m_settings.m_preRecordTime) || force) { - reverseAPIKeys.append("preRecordTime"); - } - if ((settings.m_squelchPostRecordTime != m_settings.m_squelchPostRecordTime) || force) { - reverseAPIKeys.append("squelchPostRecordTime"); - } - if ((settings.m_squelchRecordingEnable != m_settings.m_squelchRecordingEnable) || force) { - reverseAPIKeys.append("squelchRecordingEnable"); - } - if ((settings.m_log2RecordSampleSize != m_settings.m_log2RecordSampleSize) || force) { - reverseAPIKeys.append("log2RecordSampleSize"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -376,31 +335,33 @@ void SigMFFileSink::applySettings(const SigMFFileSinkSettings& settings, bool fo m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband *msg = SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband::create(settings, force); + SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband *msg = SigMFFileSinkBaseband::MsgConfigureSigMFFileSinkBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if ((settings.m_useReverseAPI) && (reverseAPIKeys.size() != 0)) + if ((settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex))) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -472,13 +433,13 @@ int SigMFFileSink::webapiSettingsPutPatch( SigMFFileSinkSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureSigMFFileSink *msg = MsgConfigureSigMFFileSink::create(settings, force); + MsgConfigureSigMFFileSink *msg = MsgConfigureSigMFFileSink::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("SigMFFileSink::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureSigMFFileSink *msgToGUI = MsgConfigureSigMFFileSink::create(settings, force); + MsgConfigureSigMFFileSink *msgToGUI = MsgConfigureSigMFFileSink::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -703,7 +664,7 @@ void SigMFFileSink::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& res response.getSigMfFileSinkReport()->setRecordSize(getByteCount()); } -void SigMFFileSink::webapiReverseSendSettings(QList& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force) +void SigMFFileSink::webapiReverseSendSettings(const QList& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -730,7 +691,7 @@ void SigMFFileSink::webapiReverseSendSettings(QList& channelSettingsKey void SigMFFileSink::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force) { @@ -754,7 +715,7 @@ void SigMFFileSink::sendChannelSettings( } void SigMFFileSink::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const SigMFFileSinkSettings& settings, bool force diff --git a/plugins/channelrx/sigmffilesink/sigmffilesink.h b/plugins/channelrx/sigmffilesink/sigmffilesink.h index 9a7f5d678..a72111c30 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesink.h +++ b/plugins/channelrx/sigmffilesink/sigmffilesink.h @@ -46,20 +46,23 @@ public: public: const SigMFFileSinkSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureSigMFFileSink* create(const SigMFFileSinkSettings& settings, bool force) + static MsgConfigureSigMFFileSink* create(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings, bool force) { - return new MsgConfigureSigMFFileSink(settings, force); + return new MsgConfigureSigMFFileSink(settingsKeys, settings, force); } private: SigMFFileSinkSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureSigMFFileSink(const SigMFFileSinkSettings& settings, bool force) : + MsgConfigureSigMFFileSink(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -177,20 +180,20 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const SigMFFileSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings, bool force = false); void propagateSampleRateAndFrequency(uint32_t index, uint32_t log2Decim); DeviceSampleSource *getLocalDevice(uint32_t index); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const SigMFFileSinkSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const SigMFFileSinkSettings& settings, bool force diff --git a/plugins/channelrx/sigmffilesink/sigmffilesinkbaseband.cpp b/plugins/channelrx/sigmffilesink/sigmffilesinkbaseband.cpp index fa4546594..111f93d88 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesinkbaseband.cpp +++ b/plugins/channelrx/sigmffilesink/sigmffilesinkbaseband.cpp @@ -156,7 +156,7 @@ bool SigMFFileSinkBaseband::handleMessage(const Message& cmd) MsgConfigureSigMFFileSinkBaseband& cfg = (MsgConfigureSigMFFileSinkBaseband&) cmd; qDebug() << "SigMFFileSinkBaseband::handleMessage: MsgConfigureSigMFFileSinkBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -200,17 +200,12 @@ bool SigMFFileSinkBaseband::handleMessage(const Message& cmd) } } -void SigMFFileSinkBaseband::applySettings(const SigMFFileSinkSettings& settings, bool force) +void SigMFFileSinkBaseband::applySettings(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings, bool force) { - qDebug() << "SigMFFileSinkBaseband::applySettings:" - << "m_log2Decim:" << settings.m_log2Decim - << "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset - << "m_fileRecordName: " << settings.m_fileRecordName - << "m_centerFrequency: " << m_centerFrequency - << "force: " << force; + qDebug() << "SigMFFileSinkBaseband::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_log2Decim != m_settings.m_log2Decim) - || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("log2Decim") && settings.m_log2Decim != m_settings.m_log2Decim) + || (settingsKeys.contains("inputFrequencyOffset") && settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { int desiredSampleRate = m_channelizer.getBasebandSampleRate() / (1<getInputMessageQueue()->push(message); } } @@ -325,7 +325,7 @@ void SigMFFileSinkGUI::channelMarkerChangedByCursor() ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); setPosFromFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void SigMFFileSinkGUI::channelMarkerHighlightedByCursor() @@ -352,7 +352,7 @@ void SigMFFileSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void SigMFFileSinkGUI::onMenuDialogCalled(const QPoint &p) @@ -397,7 +397,16 @@ void SigMFFileSinkGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -411,7 +420,7 @@ void SigMFFileSinkGUI::on_deltaFrequency_changed(qint64 value) m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); setPosFromFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -421,7 +430,7 @@ void SigMFFileSinkGUI::on_decimationFactor_currentIndexChanged(int index) applyDecimation(); displayRate(); displayPos(); - applySettings(); + applySettings(QStringList("log2Decim")); if (m_fixedPosition) { setFrequencyFromPos(); @@ -433,7 +442,7 @@ void SigMFFileSinkGUI::on_decimationFactor_currentIndexChanged(int index) void SigMFFileSinkGUI::on_recordSampleSize_currentIndexChanged(int index) { m_settings.m_log2RecordSampleSize = index + 3; - applySettings(); + applySettings(QStringList("log2RecordSampleSize")); } void SigMFFileSinkGUI::on_fixedPosition_toggled(bool checked) @@ -446,7 +455,7 @@ void SigMFFileSinkGUI::on_fixedPosition_toggled(bool checked) if (m_fixedPosition) { setFrequencyFromPos(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -458,7 +467,7 @@ void SigMFFileSinkGUI::on_position_valueChanged(int value) if (m_fixedPosition) { setFrequencyFromPos(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } } @@ -478,35 +487,35 @@ void SigMFFileSinkGUI::on_spectrumSquelch_toggled(bool checked) ui->squelchedRecording->setEnabled(checked); - applySettings(); + applySettings(QStringList("spectrumSquelchMode")); } void SigMFFileSinkGUI::on_squelchLevel_valueChanged(int value) { m_settings.m_spectrumSquelch = value; ui->squelchLevelText->setText(tr("%1").arg(m_settings.m_spectrumSquelch)); - applySettings(); + applySettings(QStringList("spectrumSquelch")); } void SigMFFileSinkGUI::on_preRecordTime_valueChanged(int value) { m_settings.m_preRecordTime = value; ui->preRecordTimeText->setText(tr("%1").arg(m_settings.m_preRecordTime)); - applySettings(); + applySettings(QStringList("preRecordTime")); } void SigMFFileSinkGUI::on_postSquelchTime_valueChanged(int value) { m_settings.m_squelchPostRecordTime = value; ui->postSquelchTimeText->setText(tr("%1").arg(m_settings.m_squelchPostRecordTime)); - applySettings(); + applySettings(QStringList("squelchPostRecordTime")); } void SigMFFileSinkGUI::on_squelchedRecording_toggled(bool checked) { ui->record->setEnabled(!checked); m_settings.m_squelchRecordingEnable = checked; - applySettings(); + applySettings(QStringList("squelchRecordingEnable")); } void SigMFFileSinkGUI::on_record_toggled(bool checked) @@ -537,7 +546,7 @@ void SigMFFileSinkGUI::on_showFileDialog_clicked(bool checked) { m_settings.m_fileRecordName = fileNames.at(0); ui->fileNameText->setText(m_settings.m_fileRecordName); - applySettings(); + applySettings(QStringList("fileRecordName")); } } } diff --git a/plugins/channelrx/sigmffilesink/sigmffilesinkgui.h b/plugins/channelrx/sigmffilesink/sigmffilesinkgui.h index 17ce8c6b9..34a1391b2 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesinkgui.h +++ b/plugins/channelrx/sigmffilesink/sigmffilesinkgui.h @@ -94,7 +94,7 @@ private: virtual ~SigMFFileSinkGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applyDecimation(); void displaySettings(); void displayRate(); diff --git a/plugins/channelrx/sigmffilesink/sigmffilesinksink.cpp b/plugins/channelrx/sigmffilesink/sigmffilesinksink.cpp index 31502079f..a27bb1de9 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesinksink.cpp +++ b/plugins/channelrx/sigmffilesink/sigmffilesinksink.cpp @@ -23,6 +23,7 @@ #include "dsp/dspcommands.h" #include "dsp/sigmffilerecord.h" #include "dsp/spectrumvis.h" +#include "util/stringlist.h" #include "sigmffilesinkmessages.h" #include "sigmffilesinksink.h" @@ -241,15 +242,13 @@ void SigMFFileSinkSink::applyChannelSettings( m_preRecordBuffer.reset(); } -void SigMFFileSinkSink::applySettings(const SigMFFileSinkSettings& settings, bool force) +void SigMFFileSinkSink::applySettings(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings, bool force) { - qDebug() << "SigMFFileSinkSink::applySettings:" - << "m_fileRecordName: " << settings.m_fileRecordName - << "force: " << force; + qDebug() << "SigMFFileSinkSink::applySettings:" << settings.getDebugString(settingsKeys, force); QString fileRecordName = settings.m_fileRecordName; - if ((settings.m_fileRecordName != m_settings.m_fileRecordName) || force) + if ((settingsKeys.contains("fileRecordName") && (settings.m_fileRecordName != m_settings.m_fileRecordName)) || force) { QStringList dotBreakout = settings.m_fileRecordName.split(QLatin1Char('.')); @@ -284,7 +283,7 @@ void SigMFFileSinkSink::applySettings(const SigMFFileSinkSettings& settings, boo } } - if ((settings.m_preRecordTime != m_settings.m_squelchPostRecordTime) || force) + if ((StringListUtil::containsAny(settingsKeys, {"preRecordTime", "squelchPostRecordTime"}) && (settings.m_preRecordTime != m_settings.m_squelchPostRecordTime)) || force) { m_preRecordBuffer.setSize(settings.m_preRecordTime * m_sinkSampleRate); @@ -293,11 +292,16 @@ void SigMFFileSinkSink::applySettings(const SigMFFileSinkSettings& settings, boo } } - if ((settings.m_log2RecordSampleSize != m_settings.m_log2RecordSampleSize) || force) { + if ((settingsKeys.contains("log2RecordSampleSize") && (settings.m_log2RecordSampleSize != m_settings.m_log2RecordSampleSize)) || force) { m_fileSink.setLog2RecordSampleSize(settings.m_log2RecordSampleSize); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } + m_settings.m_fileRecordName = fileRecordName; } diff --git a/plugins/channelrx/sigmffilesink/sigmffilesinksink.h b/plugins/channelrx/sigmffilesink/sigmffilesinksink.h index 5293fe345..52f491bc7 100644 --- a/plugins/channelrx/sigmffilesink/sigmffilesinksink.h +++ b/plugins/channelrx/sigmffilesink/sigmffilesinksink.h @@ -50,7 +50,7 @@ public: int channelFrequencyOffset, int64_t centerFrequency, bool force = false); - void applySettings(const SigMFFileSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const SigMFFileSinkSettings& settings, bool force = false); uint64_t getMsCount() const { return m_msCount; } uint64_t getByteCount() const { return m_byteCount; } unsigned int getNbTracks() const { return m_fileSink.getNbCaptures(); } diff --git a/plugins/channelrx/udpsink/udpsink.cpp b/plugins/channelrx/udpsink/udpsink.cpp index 5ae73638e..e8a446b05 100644 --- a/plugins/channelrx/udpsink/udpsink.cpp +++ b/plugins/channelrx/udpsink/udpsink.cpp @@ -59,7 +59,7 @@ UDPSink::UDPSink(DeviceAPI *deviceAPI) : m_basebandSink->setSpectrum(&m_spectrumVis); m_basebandSink->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -144,7 +144,7 @@ bool UDPSink::handleMessage(const Message& cmd) MsgConfigureUDPSink& cfg = (MsgConfigureUDPSink&) cmd; qDebug("UDPSink::handleMessage: MsgConfigureUDPSink"); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -173,94 +173,20 @@ void UDPSink::setCenterFrequency(qint64 frequency) { UDPSinkSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureUDPSink *msgToGUI = MsgConfigureUDPSink::create(settings, false); + MsgConfigureUDPSink *msgToGUI = MsgConfigureUDPSink::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void UDPSink::applySettings(const UDPSinkSettings& settings, bool force) +void UDPSink::applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force) { - qDebug() << "UDPSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_audioActive: " << settings.m_audioActive - << " m_audioStereo: " << settings.m_audioStereo - << " m_gain: " << settings.m_gain - << " m_volume: " << settings.m_volume - << " m_squelchEnabled: " << settings.m_squelchEnabled - << " m_squelchdB: " << settings.m_squelchdB - << " m_squelchGate" << settings.m_squelchGate - << " m_agc" << settings.m_agc - << " m_sampleFormat: " << settings.m_sampleFormat - << " m_outputSampleRate: " << settings.m_outputSampleRate - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_udpAddressStr: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " m_audioPort: " << settings.m_audioPort - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "UDPSink::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_audioActive != m_settings.m_audioActive) || force) { - reverseAPIKeys.append("audioActive"); - } - if ((settings.m_audioStereo != m_settings.m_audioStereo) || force) { - reverseAPIKeys.append("audioStereo"); - } - if ((settings.m_gain != m_settings.m_gain) || force) { - reverseAPIKeys.append("gain"); - } - if ((settings.m_volume != m_settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((settings.m_squelchEnabled != m_settings.m_squelchEnabled) || force) { - reverseAPIKeys.append("squelchEnabled"); - } - if ((settings.m_squelchdB != m_settings.m_squelchdB) || force) { - reverseAPIKeys.append("squelchDB"); - } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) { - reverseAPIKeys.append("squelchGate"); - } - if ((settings.m_agc != m_settings.m_agc) || force) { - reverseAPIKeys.append("agc"); - } - if ((settings.m_sampleFormat != m_settings.m_sampleFormat) || force) { - reverseAPIKeys.append("sampleFormat"); - } - if ((settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) { - reverseAPIKeys.append("outputSampleRate"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_audioPort != m_settings.m_audioPort) || force) { - reverseAPIKeys.append("audioPort"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -271,28 +197,26 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - UDPSinkBaseband::MsgConfigureUDPSinkBaseband *msg = UDPSinkBaseband::MsgConfigureUDPSinkBaseband::create(settings, force); + UDPSinkBaseband::MsgConfigureUDPSinkBaseband *msg = UDPSinkBaseband::MsgConfigureUDPSinkBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -307,14 +231,14 @@ bool UDPSink::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(m_settings, true); + MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(m_settings, true); + MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -350,13 +274,13 @@ int UDPSink::webapiSettingsPutPatch( UDPSinkSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(settings, force); + MsgConfigureUDPSink *msg = MsgConfigureUDPSink::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("getUdpSinkSettings::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureUDPSink *msgToGUI = MsgConfigureUDPSink::create(settings, force); + MsgConfigureUDPSink *msgToGUI = MsgConfigureUDPSink::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -564,7 +488,7 @@ void UDPSink::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getUdpSinkReport()->setInputSampleRate(m_channelSampleRate); } -void UDPSink::webapiReverseSendSettings(QList& channelSettingsKeys, const UDPSinkSettings& settings, bool force) +void UDPSink::webapiReverseSendSettings(const QList& channelSettingsKeys, const UDPSinkSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -591,7 +515,7 @@ void UDPSink::webapiReverseSendSettings(QList& channelSettingsKeys, con void UDPSink::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const UDPSinkSettings& settings, bool force) { @@ -615,7 +539,7 @@ void UDPSink::sendChannelSettings( } void UDPSink::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const UDPSinkSettings& settings, bool force diff --git a/plugins/channelrx/udpsink/udpsink.h b/plugins/channelrx/udpsink/udpsink.h index c08d4d256..d976e56b6 100644 --- a/plugins/channelrx/udpsink/udpsink.h +++ b/plugins/channelrx/udpsink/udpsink.h @@ -44,20 +44,23 @@ public: public: const UDPSinkSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureUDPSink* create(const UDPSinkSettings& settings, bool force) + static MsgConfigureUDPSink* create(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force) { - return new MsgConfigureUDPSink(settings, force); + return new MsgConfigureUDPSink(settingsKeys, settings, force); } private: UDPSinkSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureUDPSink(const UDPSinkSettings& settings, bool force) : + MsgConfigureUDPSink(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } @@ -156,17 +159,17 @@ protected: virtual bool handleMessage(const Message& cmd); - void applySettings(const UDPSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const UDPSinkSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const UDPSinkSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const UDPSinkSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const UDPSinkSettings& settings, bool force diff --git a/plugins/channelrx/udpsink/udpsinkbaseband.cpp b/plugins/channelrx/udpsink/udpsinkbaseband.cpp index 02d64fb36..0c355bc5e 100644 --- a/plugins/channelrx/udpsink/udpsinkbaseband.cpp +++ b/plugins/channelrx/udpsink/udpsinkbaseband.cpp @@ -109,7 +109,7 @@ bool UDPSinkBaseband::handleMessage(const Message& cmd) MsgConfigureUDPSinkBaseband& cfg = (MsgConfigureUDPSinkBaseband&) cmd; qDebug() << "UDPSinkBaseband::handleMessage: MsgConfigureUDPSinkBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -139,9 +139,9 @@ bool UDPSinkBaseband::handleMessage(const Message& cmd) } } -void UDPSinkBaseband::applySettings(const UDPSinkSettings& settings, bool force) +void UDPSinkBaseband::applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force) { - if ((settings.m_audioActive != m_settings.m_audioActive) || force) + if ((settingsKeys.contains("audioActive") && (settings.m_audioActive != m_settings.m_audioActive)) || force) { if (settings.m_audioActive) { DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue()); @@ -150,15 +150,20 @@ void UDPSinkBaseband::applySettings(const UDPSinkSettings& settings, bool force) } } - if ((settings.m_outputSampleRate != m_settings.m_outputSampleRate) - || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("outputSampleRate") && (settings.m_outputSampleRate != m_settings.m_outputSampleRate)) + || (settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(settings.m_outputSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_sink.applySettings(settings, force); - m_settings = settings; + m_sink.applySettings(settingsKeys, settings, force); + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int UDPSinkBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/udpsink/udpsinkbaseband.h b/plugins/channelrx/udpsink/udpsinkbaseband.h index 2d3a688a3..f26db8ef6 100644 --- a/plugins/channelrx/udpsink/udpsinkbaseband.h +++ b/plugins/channelrx/udpsink/udpsinkbaseband.h @@ -38,20 +38,23 @@ public: MESSAGE_CLASS_DECLARATION public: const UDPSinkSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureUDPSinkBaseband* create(const UDPSinkSettings& settings, bool force) + static MsgConfigureUDPSinkBaseband* create(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force) { - return new MsgConfigureUDPSinkBaseband(settings, force); + return new MsgConfigureUDPSinkBaseband(settingsKeys, settings, force); } private: UDPSinkSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureUDPSinkBaseband(const UDPSinkSettings& settings, bool force) : + MsgConfigureUDPSinkBaseband(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } @@ -101,7 +104,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const UDPSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channelrx/udpsink/udpsinkgui.cpp b/plugins/channelrx/udpsink/udpsinkgui.cpp index 5cf7d806c..38ca53e99 100644 --- a/plugins/channelrx/udpsink/udpsinkgui.cpp +++ b/plugins/channelrx/udpsink/udpsinkgui.cpp @@ -49,8 +49,8 @@ void UDPSinkGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettingsImmediate(true); - applySettings(true); + applySettingsImmediate(QStringList(), true); + applySettings(QStringList(), true); } QByteArray UDPSinkGUI::serialize() const @@ -63,8 +63,8 @@ bool UDPSinkGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettingsImmediate(true); - applySettings(true); + applySettingsImmediate(QStringList(), true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -118,7 +118,7 @@ void UDPSinkGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettingsImmediate(); + applySettingsImmediate(QStringList("inputFrequencyOffset")); } void UDPSinkGUI::channelMarkerHighlightedByCursor() @@ -219,8 +219,8 @@ UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS displaySettings(); makeUIConnections(); - applySettingsImmediate(true); - applySettings(true); + applySettingsImmediate(QStringList(), true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -389,20 +389,20 @@ void UDPSinkGUI::setSampleFormat(int index) } } -void UDPSinkGUI::applySettingsImmediate(bool force) +void UDPSinkGUI::applySettingsImmediate(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - UDPSink::MsgConfigureUDPSink* message = UDPSink::MsgConfigureUDPSink::create( m_settings, force); + UDPSink::MsgConfigureUDPSink* message = UDPSink::MsgConfigureUDPSink::create(settingsKeys, m_settings, force); m_udpSink->getInputMessageQueue()->push(message); } } -void UDPSinkGUI::applySettings(bool force) +void UDPSinkGUI::applySettings( const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - UDPSink::MsgConfigureUDPSink* message = UDPSink::MsgConfigureUDPSink::create( m_settings, force); + UDPSink::MsgConfigureUDPSink* message = UDPSink::MsgConfigureUDPSink::create(settingsKeys, m_settings, force); m_udpSink->getInputMessageQueue()->push(message); ui->applyBtn->setEnabled(false); @@ -415,7 +415,7 @@ void UDPSinkGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void UDPSinkGUI::on_sampleFormat_currentIndexChanged(int index) @@ -543,39 +543,39 @@ void UDPSinkGUI::on_applyBtn_clicked() ui->glSpectrum->setSampleRate(m_settings.m_outputSampleRate); - applySettings(); + applySettings(QStringList({"rfBandwidth", "outputSampleRate"})); } void UDPSinkGUI::on_audioActive_toggled(bool active) { m_settings.m_audioActive = active; - applySettingsImmediate(); + applySettingsImmediate(QStringList("audioActive")); } void UDPSinkGUI::on_audioStereo_toggled(bool stereo) { m_settings.m_audioStereo = stereo; - applySettingsImmediate(); + applySettingsImmediate(QStringList("audioStereo")); } void UDPSinkGUI::on_agc_toggled(bool agc) { m_settings.m_agc = agc; - applySettingsImmediate(); + applySettingsImmediate(QStringList("agc")); } void UDPSinkGUI::on_gain_valueChanged(int value) { m_settings.m_gain = value / 10.0; ui->gainText->setText(tr("%1").arg(value/10.0, 0, 'f', 1)); - applySettingsImmediate(); + applySettingsImmediate(QStringList("gain")); } void UDPSinkGUI::on_volume_valueChanged(int value) { m_settings.m_volume = value; ui->volumeText->setText(QString("%1").arg(value)); - applySettingsImmediate(); + applySettingsImmediate(QStringList("volume")); } void UDPSinkGUI::on_squelch_valueChanged(int value) @@ -593,14 +593,14 @@ void UDPSinkGUI::on_squelch_valueChanged(int value) m_settings.m_squelchEnabled = true; } - applySettingsImmediate(); + applySettingsImmediate(QStringList("squelchdB")); } void UDPSinkGUI::on_squelchGate_valueChanged(int value) { m_settings.m_squelchGate = value; ui->squelchGateText->setText(tr("%1").arg(value*10.0, 0, 'f', 0)); - applySettingsImmediate(); + applySettingsImmediate(QStringList("squelchGate")); } void UDPSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -610,7 +610,7 @@ void UDPSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown) } getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void UDPSinkGUI::onMenuDialogCalled(const QPoint &p) @@ -655,7 +655,16 @@ void UDPSinkGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettingsImmediate(); + applySettingsImmediate(QStringList({ + "title", + "rgbColor", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); diff --git a/plugins/channelrx/udpsink/udpsinkgui.h b/plugins/channelrx/udpsink/udpsinkgui.h index 352b98631..847ce1a21 100644 --- a/plugins/channelrx/udpsink/udpsinkgui.h +++ b/plugins/channelrx/udpsink/udpsinkgui.h @@ -94,8 +94,8 @@ private: virtual ~UDPSinkGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); - void applySettingsImmediate(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); + void applySettingsImmediate(const QStringList& settingsKeys, bool force = false); void displaySettings(); void setSampleFormat(int index); void setSampleFormatIndex(const UDPSinkSettings::SampleFormat& sampleFormat); diff --git a/plugins/channelrx/udpsink/udpsinksink.cpp b/plugins/channelrx/udpsink/udpsinksink.cpp index 3b69797ff..de34a3fa1 100644 --- a/plugins/channelrx/udpsink/udpsinksink.cpp +++ b/plugins/channelrx/udpsink/udpsinksink.cpp @@ -85,7 +85,7 @@ UDPSinkSink::UDPSinkSink() : //DSPEngine::instance()->addAudioSink(&m_audioFifo); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } UDPSinkSink::~UDPSinkSink() @@ -365,43 +365,20 @@ void UDPSinkSink::applyChannelSettings(int channelSampleRate, int channelFrequen m_channelFrequencyOffset = channelFrequencyOffset; } -void UDPSinkSink::applySettings(const UDPSinkSettings& settings, bool force) +void UDPSinkSink::applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force) { - qDebug() << "UDPSinkSink::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_audioActive: " << settings.m_audioActive - << " m_audioStereo: " << settings.m_audioStereo - << " m_gain: " << settings.m_gain - << " m_volume: " << settings.m_volume - << " m_squelchEnabled: " << settings.m_squelchEnabled - << " m_squelchdB: " << settings.m_squelchdB - << " m_squelchGate" << settings.m_squelchGate - << " m_agc" << settings.m_agc - << " m_sampleFormat: " << settings.m_sampleFormat - << " m_outputSampleRate: " << settings.m_outputSampleRate - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_udpAddressStr: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " m_audioPort: " << settings.m_audioPort - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "UDPSinkSink::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_audioActive != m_settings.m_audioActive) || force) + if ((settingsKeys.contains("audioActive") && (settings.m_audioActive != m_settings.m_audioActive)) || force) { if (settings.m_audioActive) { m_audioBufferFill = 0; } } - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || - (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || - (settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || + (settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || + (settingsKeys.contains("outputSampleRate") && (settings.m_outputSampleRate != m_settings.m_outputSampleRate)) || force) { m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.0); m_sampleDistanceRemain = m_channelSampleRate / settings.m_outputSampleRate; @@ -432,7 +409,7 @@ void UDPSinkSink::applySettings(const UDPSinkSettings& settings, bool force) m_outMovingAverage.resize(settings.m_outputSampleRate * 0.01, 1e-10); // 10 ms } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) + if ((settingsKeys.contains("squelchGate") && (settings.m_squelchGate != m_settings.m_squelchGate)) || force) { if ((settings.m_sampleFormat == UDPSinkSettings::FormatLSB) || (settings.m_sampleFormat == UDPSinkSettings::FormatLSBMono) || @@ -452,27 +429,27 @@ void UDPSinkSink::applySettings(const UDPSinkSettings& settings, bool force) m_agc.setStepDownDelay(stepDownDelay); // same delay for up and down } - if ((settings.m_squelchdB != m_settings.m_squelchdB) || force) + if ((settingsKeys.contains("squelchdB") && (settings.m_squelchdB != m_settings.m_squelchdB)) || force) { m_squelch = CalcDb::powerFromdB(settings.m_squelchdB); m_agc.setThreshold(m_squelch*(1<<23)); } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) + if ((settingsKeys.contains("udpAddress") && (settings.m_udpAddress != m_settings.m_udpAddress)) || force) { m_udpBuffer16->setAddress(const_cast(settings.m_udpAddress)); m_udpBufferMono16->setAddress(const_cast(settings.m_udpAddress)); m_udpBuffer24->setAddress(const_cast(settings.m_udpAddress)); } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) + if ((settingsKeys.contains("udpPort") && (settings.m_udpPort != m_settings.m_udpPort)) || force) { m_udpBuffer16->setPort(settings.m_udpPort); m_udpBufferMono16->setPort(settings.m_udpPort); m_udpBuffer24->setPort(settings.m_udpPort); } - if ((settings.m_audioPort != m_settings.m_audioPort) || force) + if ((settingsKeys.contains("audioPort") && (settings.m_audioPort != m_settings.m_audioPort)) || force) { disconnect(m_audioSocket, SIGNAL(readyRead()), this, SLOT(audioReadyRead())); delete m_audioSocket; @@ -489,9 +466,13 @@ void UDPSinkSink::applySettings(const UDPSinkSettings& settings, bool force) } } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { + if ((settingsKeys.contains("fmDeviation") && (settings.m_fmDeviation != m_settings.m_fmDeviation)) || force) { m_phaseDiscri.setFMScaling((float) settings.m_outputSampleRate / (2.0f * settings.m_fmDeviation)); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/udpsink/udpsinksink.h b/plugins/channelrx/udpsink/udpsinksink.h index 0b6eeede9..d5f01299f 100644 --- a/plugins/channelrx/udpsink/udpsinksink.h +++ b/plugins/channelrx/udpsink/udpsinksink.h @@ -48,7 +48,7 @@ public: virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = true); - void applySettings(const UDPSinkSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const UDPSinkSettings& settings, bool force = false); AudioFifo *getAudioFifo() { return &m_audioFifo; } void setAudioFifoLabel(const QString& label) { m_audioFifo.setLabel(label); } diff --git a/plugins/channelrx/wdsprx/wdsprx.cpp b/plugins/channelrx/wdsprx/wdsprx.cpp index 079be782e..e6cc15655 100644 --- a/plugins/channelrx/wdsprx/wdsprx.cpp +++ b/plugins/channelrx/wdsprx/wdsprx.cpp @@ -62,7 +62,7 @@ WDSPRx::WDSPRx(DeviceAPI *deviceAPI) : { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSink(this); m_deviceAPI->addChannelSinkAPI(this); @@ -174,7 +174,7 @@ void WDSPRx::start() m_thread->start(); - WDSPRxBaseband::MsgConfigureWDSPRxBaseband *msg = WDSPRxBaseband::MsgConfigureWDSPRxBaseband::create(m_settings, true); + WDSPRxBaseband::MsgConfigureWDSPRxBaseband *msg = WDSPRxBaseband::MsgConfigureWDSPRxBaseband::create(QStringList(), m_settings, true); m_basebandSink->getInputMessageQueue()->push(msg); m_running = true; @@ -201,7 +201,7 @@ bool WDSPRx::handleMessage(const Message& cmd) auto& cfg = (const MsgConfigureWDSPRx&) cmd; qDebug("WDSPRx::handleMessage: MsgConfigureWDSPRx"); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -238,42 +238,18 @@ void WDSPRx::setCenterFrequency(qint64 frequency) { WDSPRxSettings settings = m_settings; settings.m_inputFrequencyOffset = (qint32) frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureWDSPRx *msgToGUI = MsgConfigureWDSPRx::create(settings, false); + MsgConfigureWDSPRx *msgToGUI = MsgConfigureWDSPRx::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force) +void WDSPRx::applySettings(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force) { - qDebug() << "WDSPRx::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_profileIndex: " << settings.m_profileIndex - << " [m_spanLog2: " << settings.m_profiles[settings.m_profileIndex].m_spanLog2 - << " m_highCutoff: " << settings.m_profiles[settings.m_profileIndex].m_highCutoff - << " m_lowCutoff: " << settings.m_profiles[settings.m_profileIndex].m_lowCutoff - << " m_fftWindow: " << settings.m_profiles[settings.m_profileIndex].m_fftWindow << "]" - << " m_volume: " << settings.m_volume - << " m_audioBinaual: " << settings.m_audioBinaural - << " m_audioFlipChannels: " << settings.m_audioFlipChannels - << " m_dsb: " << settings.m_dsb - << " m_audioMute: " << settings.m_audioMute - << " m_agcActive: " << settings.m_agc - << " m_agcMode: " << settings.m_agcMode - << " m_agcGain: " << settings.m_agcGain - << " m_agcSlope: " << settings.m_agcSlope - << " m_agcHangThreshold: " << settings.m_agcHangThreshold - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "WDSPRx::applySettings:" << settings.getDebugString(settingsKeys, force); QList reverseAPIKeys; @@ -317,7 +293,7 @@ void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force) reverseAPIKeys.append("agc"); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -332,9 +308,9 @@ void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force) reverseAPIKeys.append("streamIndex"); } - if ((settings.m_dsb != m_settings.m_dsb) - || (settings.m_profiles[settings.m_profileIndex].m_highCutoff != m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff) - || (settings.m_profiles[settings.m_profileIndex].m_lowCutoff != m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff) || force) + if ((settingsKeys.contains("dsb") && (settings.m_dsb != m_settings.m_dsb)) + || (settingsKeys.contains("highCutoff") && (settings.m_profiles[settings.m_profileIndex].m_highCutoff != m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff)) + || (settingsKeys.contains("lowCutoff") && (settings.m_profiles[settings.m_profileIndex].m_lowCutoff != m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff)) || force) { SpectrumSettings spectrumSettings = m_spectrumVis.getSettings(); spectrumSettings.m_ssb = !settings.m_dsb; @@ -345,17 +321,17 @@ void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force) if (m_running) { - WDSPRxBaseband::MsgConfigureWDSPRxBaseband *msg = WDSPRxBaseband::MsgConfigureWDSPRxBaseband::create(settings, force); + WDSPRxBaseband::MsgConfigureWDSPRxBaseband *msg = WDSPRxBaseband::MsgConfigureWDSPRxBaseband::create(settingsKeys, settings, force); m_basebandSink->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } @@ -366,7 +342,11 @@ void WDSPRx::applySettings(const WDSPRxSettings& settings, bool force) sendChannelSettings(pipes, reverseAPIKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray WDSPRx::serialize() const @@ -378,14 +358,14 @@ bool WDSPRx::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureWDSPRx *msg = MsgConfigureWDSPRx::create(m_settings, true); + MsgConfigureWDSPRx *msg = MsgConfigureWDSPRx::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureWDSPRx *msg = MsgConfigureWDSPRx::create(m_settings, true); + MsgConfigureWDSPRx *msg = MsgConfigureWDSPRx::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -444,13 +424,13 @@ int WDSPRx::webapiSettingsPutPatch( WDSPRxSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureWDSPRx *msg = MsgConfigureWDSPRx::create(settings, force); + MsgConfigureWDSPRx *msg = MsgConfigureWDSPRx::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("WDSPRx::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureWDSPRx *msgToGUI = MsgConfigureWDSPRx::create(settings, force); + MsgConfigureWDSPRx *msgToGUI = MsgConfigureWDSPRx::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } diff --git a/plugins/channelrx/wdsprx/wdsprx.h b/plugins/channelrx/wdsprx/wdsprx.h index b7b7b95c6..f47a4d0cd 100644 --- a/plugins/channelrx/wdsprx/wdsprx.h +++ b/plugins/channelrx/wdsprx/wdsprx.h @@ -49,20 +49,23 @@ public: public: const WDSPRxSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureWDSPRx* create(const WDSPRxSettings& settings, bool force) + static MsgConfigureWDSPRx* create(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force) { - return new MsgConfigureWDSPRx(settings, force); + return new MsgConfigureWDSPRx(settingsKeys, settings, force); } private: WDSPRxSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureWDSPRx(const WDSPRxSettings& settings, bool force) : + MsgConfigureWDSPRx( const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -162,7 +165,7 @@ private: QNetworkRequest m_networkRequest; bool handleMessage(const Message& cmd) final; - void applySettings(const WDSPRxSettings& settings, bool force = false); + void applySettings( const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer() const; void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); void webapiReverseSendSettings(const QList& channelSettingsKeys, const WDSPRxSettings& settings, bool force); diff --git a/plugins/channelrx/wdsprx/wdsprxbaseband.cpp b/plugins/channelrx/wdsprx/wdsprxbaseband.cpp index f0a1e176d..97826c8e3 100644 --- a/plugins/channelrx/wdsprx/wdsprxbaseband.cpp +++ b/plugins/channelrx/wdsprx/wdsprxbaseband.cpp @@ -121,7 +121,7 @@ bool WDSPRxBaseband::handleMessage(const Message& cmd) MsgConfigureWDSPRxBaseband& cfg = (MsgConfigureWDSPRxBaseband&) cmd; qDebug() << "WDSPRxBaseband::handleMessage: MsgConfigureWDSPRxBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -177,9 +177,9 @@ bool WDSPRxBaseband::handleMessage(const Message& cmd) } } -void WDSPRxBaseband::applySettings(const WDSPRxSettings& settings, bool force) +void WDSPRxBaseband::applySettings(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { m_channelizer.setChannelization(m_audioSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer.getChannelSampleRate(), m_channelizer.getChannelFrequencyOffset()); @@ -191,7 +191,7 @@ void WDSPRxBaseband::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((settings.m_profiles[settings.m_profileIndex].m_spanLog2 != m_settings.m_profiles[settings.m_profileIndex].m_spanLog2) || force) + if ((settingsKeys.contains("spanLog2") && settings.m_profiles[settings.m_profileIndex].m_spanLog2 != m_settings.m_profiles[settings.m_profileIndex].m_spanLog2) || force) { if (m_spectrumVis) { @@ -200,7 +200,7 @@ void WDSPRxBaseband::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); @@ -228,9 +228,13 @@ void WDSPRxBaseband::applySettings(const WDSPRxSettings& settings, bool force) } } - m_sink.applySettings(settings, force); + m_sink.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int WDSPRxBaseband::getChannelSampleRate() const diff --git a/plugins/channelrx/wdsprx/wdsprxbaseband.h b/plugins/channelrx/wdsprx/wdsprxbaseband.h index 6042b51b2..860a163c9 100644 --- a/plugins/channelrx/wdsprx/wdsprxbaseband.h +++ b/plugins/channelrx/wdsprx/wdsprxbaseband.h @@ -41,20 +41,23 @@ public: public: const WDSPRxSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureWDSPRxBaseband* create(const WDSPRxSettings& settings, bool force) + static MsgConfigureWDSPRxBaseband* create(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force) { - return new MsgConfigureWDSPRxBaseband(settings, force); + return new MsgConfigureWDSPRxBaseband(settingsKeys, settings, force); } private: WDSPRxSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureWDSPRxBaseband(const WDSPRxSettings& settings, bool force) : + MsgConfigureWDSPRxBaseband(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: QRecursiveMutex m_mutex; bool handleMessage(const Message& cmd); - void applySettings(const WDSPRxSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force = false); MessageQueue *getMessageQueueToGUI() { return m_messageQueueToGUI; } private slots: diff --git a/plugins/channelrx/wdsprx/wdsprxgui.cpp b/plugins/channelrx/wdsprx/wdsprxgui.cpp index 319790569..07343ee2c 100644 --- a/plugins/channelrx/wdsprx/wdsprxgui.cpp +++ b/plugins/channelrx/wdsprx/wdsprxgui.cpp @@ -146,7 +146,7 @@ void WDSPRxGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void WDSPRxGUI::channelMarkerHighlightedByCursor() @@ -159,7 +159,7 @@ void WDSPRxGUI::on_audioBinaural_toggled(bool binaural) m_audioBinaural = binaural; m_settings.m_audioBinaural = binaural; m_settings.m_profiles[m_settings.m_profileIndex].m_audioBinaural = m_settings.m_audioBinaural; - applySettings(); + applySettings(QStringList("audioBinaural")); } void WDSPRxGUI::on_audioFlipChannels_toggled(bool flip) @@ -167,7 +167,7 @@ void WDSPRxGUI::on_audioFlipChannels_toggled(bool flip) m_audioFlipChannels = flip; m_settings.m_audioFlipChannels = flip; m_settings.m_profiles[m_settings.m_profileIndex].m_audioFlipChannels = m_settings.m_audioFlipChannels; - applySettings(); + applySettings(QStringList("audioFlipChannels")); } void WDSPRxGUI::on_dsb_toggled(bool dsb) @@ -181,7 +181,7 @@ void WDSPRxGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency((int) value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void WDSPRxGUI::on_BW_valueChanged(int value) @@ -201,14 +201,14 @@ void WDSPRxGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value)); m_settings.m_volume = (Real) CalcDb::powerFromdB(value); - applySettings(); + applySettings(QStringList("volume")); } void WDSPRxGUI::on_agc_toggled(bool checked) { m_settings.m_agc = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_agc = m_settings.m_agc; - applySettings(); + applySettings(QStringList("agc")); } void WDSPRxGUI::on_agcGain_valueChanged(int value) @@ -217,42 +217,42 @@ void WDSPRxGUI::on_agcGain_valueChanged(int value) ui->agcGainText->setText(s); m_settings.m_agcGain = value; m_settings.m_profiles[m_settings.m_profileIndex].m_agcGain = m_settings.m_agcGain; - applySettings(); + applySettings(QStringList("agcGain")); } void WDSPRxGUI::on_dnr_toggled(bool checked) { m_settings.m_dnr = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_dnr = m_settings.m_dnr; - applySettings(); + applySettings(QStringList("dnr")); } void WDSPRxGUI::on_dnb_toggled(bool checked) { m_settings.m_dnb = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_dnb = m_settings.m_dnb; - applySettings(); + applySettings(QStringList("dnb")); } void WDSPRxGUI::on_anf_toggled(bool checked) { m_settings.m_anf = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_anf = m_settings.m_anf; - applySettings(); + applySettings(QStringList("anf")); } void WDSPRxGUI::on_cwPeaking_toggled(bool checked) { m_settings.m_cwPeaking = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_cwPeaking = m_settings.m_cwPeaking; - applySettings(); + applySettings(QStringList("cwPeaking")); } void WDSPRxGUI::on_squelch_toggled(bool checked) { m_settings.m_squelch = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_squelch = m_settings.m_squelch; - applySettings(); + applySettings(QStringList("squelch")); } void WDSPRxGUI::on_squelchThreshold_valueChanged(int value) @@ -260,14 +260,14 @@ void WDSPRxGUI::on_squelchThreshold_valueChanged(int value) m_settings.m_squelchThreshold = value; m_settings.m_profiles[m_settings.m_profileIndex].m_squelchThreshold = m_settings.m_squelchThreshold; ui->squelchThresholdText->setText(tr("%1").arg(m_settings.m_squelchThreshold)); - applySettings(); + applySettings(QStringList("squelchThreshold")); } void WDSPRxGUI::on_equalizer_toggled(bool checked) { m_settings.m_equalizer = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_equalizer = m_settings.m_equalizer; - applySettings(); + applySettings(QStringList("equalizer")); } void WDSPRxGUI::on_rit_toggled(bool checked) @@ -275,7 +275,7 @@ void WDSPRxGUI::on_rit_toggled(bool checked) m_settings.m_rit = checked; m_settings.m_profiles[m_settings.m_profileIndex].m_rit = m_settings.m_rit; m_channelMarker.setShift(checked ? (int) m_settings.m_ritFrequency: 0); - applySettings(); + applySettings(QStringList("rit")); } void WDSPRxGUI::on_ritFrequency_valueChanged(int value) @@ -284,7 +284,7 @@ void WDSPRxGUI::on_ritFrequency_valueChanged(int value) m_settings.m_profiles[m_settings.m_profileIndex].m_ritFrequency = m_settings.m_ritFrequency; ui->ritFrequencyText->setText(tr("%1").arg(value)); m_channelMarker.setShift(m_settings.m_rit ? value: 0); - applySettings(); + applySettings(QStringList("ritFrequency")); } void WDSPRxGUI::on_dbOrS_toggled(bool checked) @@ -299,7 +299,7 @@ void WDSPRxGUI::on_audioMute_toggled(bool checked) { m_audioMute = checked; m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void WDSPRxGUI::on_spanLog2_valueChanged(int value) @@ -325,7 +325,7 @@ void WDSPRxGUI::on_flipSidebands_clicked(bool checked) void WDSPRxGUI::on_fftWindow_currentIndexChanged(int index) { m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow = index; - applySettings(); + applySettings(QStringList("fftWindow")); } void WDSPRxGUI::on_profileIndex_valueChanged(int value) @@ -469,7 +469,14 @@ void WDSPRxGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList() << "rgbColor" + << "title" + << "useReverseAPI" + << "reverseAPIAddress" + << "reverseAPIPort" + << "reverseAPIDeviceIndex" + << "reverseAPIChannelIndex" + << "streamIndex"); } resetContextMenuType(); @@ -481,7 +488,7 @@ void WDSPRxGUI::onWidgetRolled(const QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } WDSPRxGUI::WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : @@ -626,11 +633,11 @@ bool WDSPRxGUI::blockApplySettings(bool block) return ret; } -void WDSPRxGUI::applySettings(bool force) +void WDSPRxGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - WDSPRx::MsgConfigureWDSPRx* message = WDSPRx::MsgConfigureWDSPRx::create( m_settings, force); + WDSPRx::MsgConfigureWDSPRx* message = WDSPRx::MsgConfigureWDSPRx::create(settingsKeys, m_settings, force); m_wdspRx->getInputMessageQueue()->push(message); } } @@ -763,7 +770,7 @@ void WDSPRxGUI::applyBandwidths(unsigned int spanLog2, bool force) m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff = (Real) (bw * 100); m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff = (Real) (lw * 100); - applySettings(force); + applySettings(QStringList({"dsb", "spanLog2", "highCutoff", "lowCutoff"}), force); bool wasBlocked = blockApplySettings(true); m_channelMarker.setBandwidth(bw * 200); @@ -932,7 +939,7 @@ void WDSPRxGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -963,17 +970,17 @@ void WDSPRxGUI::agcSetup(int iValueChanged) case WDSPRxAGCDialog::ValueChanged::ChangedMode: m_settings.m_agcMode = m_agcDialog->getAGCMode(); m_settings.m_profiles[m_settings.m_profileIndex].m_agcMode = m_settings.m_agcMode; - applySettings(); + applySettings(QStringList("agcMode")); break; case WDSPRxAGCDialog::ValueChanged::ChangedSlope: m_settings.m_agcSlope = m_agcDialog->getAGCSlope(); m_settings.m_profiles[m_settings.m_profileIndex].m_agcSlope = m_settings.m_agcSlope; - applySettings(); + applySettings(QStringList("agcSlope")); break; case WDSPRxAGCDialog::ValueChanged::ChangedHangThreshold: m_settings.m_agcHangThreshold = m_agcDialog->getAGCHangThreshold(); m_settings.m_profiles[m_settings.m_profileIndex].m_agcHangThreshold = m_settings.m_agcHangThreshold; - applySettings(); + applySettings(QStringList("agcHangThreshold")); break; default: break; @@ -1011,37 +1018,37 @@ void WDSPRxGUI::dnbSetup(int32_t iValueChanged) case WDSPRxDNBDialog::ValueChanged::ChangedNB: m_settings.m_nbScheme = m_dnbDialog->getNBScheme(); m_settings.m_profiles[m_settings.m_profileIndex].m_nbScheme = m_settings.m_nbScheme; - applySettings(); + applySettings(QStringList("nbScheme")); break; case WDSPRxDNBDialog::ValueChanged::ChangedNB2Mode: m_settings.m_nb2Mode = m_dnbDialog->getNB2Mode(); m_settings.m_profiles[m_settings.m_profileIndex].m_nb2Mode = m_settings.m_nb2Mode; - applySettings(); + applySettings(QStringList("nb2Mode")); break; case WDSPRxDNBDialog::ValueChanged::ChangedNBSlewTime: m_settings.m_nbSlewTime = m_dnbDialog->getNBSlewTime(); m_settings.m_profiles[m_settings.m_profileIndex].m_nbSlewTime = m_settings.m_nbSlewTime; - applySettings(); + applySettings(QStringList("nbSlewTime")); break; case WDSPRxDNBDialog::ValueChanged::ChangedNBLeadTime: m_settings.m_nbLeadTime = m_dnbDialog->getNBLeadTime(); m_settings.m_profiles[m_settings.m_profileIndex].m_nbLeadTime = m_settings.m_nbLeadTime; - applySettings(); + applySettings(QStringList("nbLeadTime")); break; case WDSPRxDNBDialog::ValueChanged::ChangedNBLagTime: m_settings.m_nbLagTime = m_dnbDialog->getNBLagTime(); m_settings.m_profiles[m_settings.m_profileIndex].m_nbLagTime = m_settings.m_nbLagTime; - applySettings(); + applySettings(QStringList("nbLagTime")); break; case WDSPRxDNBDialog::ValueChanged::ChangedNBThreshold: m_settings.m_nbThreshold = m_dnbDialog->getNBThreshold(); m_settings.m_profiles[m_settings.m_profileIndex].m_nbThreshold = m_settings.m_nbThreshold; - applySettings(); + applySettings(QStringList("nbThreshold")); break; case WDSPRxDNBDialog::ValueChanged::ChangedNBAvgTime: m_settings.m_nbAvgTime = m_dnbDialog->getNBAvgTime(); m_settings.m_profiles[m_settings.m_profileIndex].m_nbAvgTime = m_settings.m_nbAvgTime; - applySettings(); + applySettings(QStringList("nbAvgTime")); break; default: break; @@ -1078,32 +1085,32 @@ void WDSPRxGUI::dnrSetup(int32_t iValueChanged) case WDSPRxDNRDialog::ValueChanged::ChangedSNB: m_settings.m_snb = m_dnrDialog->getSNB(); m_settings.m_profiles[m_settings.m_profileIndex].m_snb = m_settings.m_snb; - applySettings(); + applySettings(QStringList("snb")); break; case WDSPRxDNRDialog::ValueChanged::ChangedNR: m_settings.m_nrScheme = m_dnrDialog->getNRScheme(); m_settings.m_profiles[m_settings.m_profileIndex].m_nrScheme = m_settings.m_nrScheme; - applySettings(); + applySettings(QStringList("nrScheme")); break; case WDSPRxDNRDialog::ValueChanged::ChangedNR2Gain: m_settings.m_nr2Gain = m_dnrDialog->getNR2Gain(); m_settings.m_profiles[m_settings.m_profileIndex].m_nr2Gain = m_settings.m_nr2Gain; - applySettings(); + applySettings(QStringList("nr2Gain")); break; case WDSPRxDNRDialog::ValueChanged::ChangedNR2NPE: m_settings.m_nr2NPE = m_dnrDialog->getNR2NPE(); m_settings.m_profiles[m_settings.m_profileIndex].m_nr2NPE = m_settings.m_nr2NPE; - applySettings(); + applySettings(QStringList("nr2NPE")); break; case WDSPRxDNRDialog::ValueChanged::ChangedNRPosition: m_settings.m_nrPosition = m_dnrDialog->getNRPosition(); m_settings.m_profiles[m_settings.m_profileIndex].m_nrPosition = m_settings.m_nrPosition; - applySettings(); + applySettings(QStringList("nrPosition")); break; case WDSPRxDNRDialog::ValueChanged::ChangedNR2Artifacts: m_settings.m_nr2ArtifactReduction = m_dnrDialog->getNR2ArtifactReduction(); m_settings.m_profiles[m_settings.m_profileIndex].m_nr2ArtifactReduction = m_settings.m_nr2ArtifactReduction; - applySettings(); + applySettings(QStringList("nr2ArtifactReduction")); break; default: break; @@ -1137,17 +1144,17 @@ void WDSPRxGUI::cwPeakSetup(int iValueChanged) case WDSPRxCWPeakDialog::ChangedCWPeakFrequency: m_settings.m_cwPeakFrequency = m_cwPeakDialog->getCWPeakFrequency(); m_settings.m_profiles[m_settings.m_profileIndex].m_cwPeakFrequency = m_settings.m_cwPeakFrequency; - applySettings(); + applySettings(QStringList("cwPeakFrequency")); break; case WDSPRxCWPeakDialog::ChangedCWBandwidth: m_settings.m_cwBandwidth = m_cwPeakDialog->getCWBandwidth(); m_settings.m_profiles[m_settings.m_profileIndex].m_cwBandwidth = m_settings.m_cwBandwidth; - applySettings(); + applySettings(QStringList("cwBandwidth")); break; case WDSPRxCWPeakDialog::ChangedCWGain: m_settings.m_cwGain = m_cwPeakDialog->getCWGain(); m_settings.m_profiles[m_settings.m_profileIndex].m_cwGain = m_settings.m_cwGain; - applySettings(); + applySettings(QStringList("cwGain")); break; default: break; @@ -1199,7 +1206,7 @@ void WDSPRxGUI::amSetup(int iValueChanged) { m_settings.m_amFadeLevel = m_amDialog->getFadeLevel(); m_settings.m_profiles[m_settings.m_profileIndex].m_amFadeLevel = m_settings.m_amFadeLevel; - applySettings(); + applySettings(QStringList("amFadeLevel")); } } @@ -1216,37 +1223,37 @@ void WDSPRxGUI::fmSetup(int iValueChanged) case WDSPRxFMDialog::ChangedDeviation: m_settings.m_fmDeviation = m_fmDialog->getDeviation(); m_settings.m_profiles[m_settings.m_profileIndex].m_fmDeviation = m_settings.m_fmDeviation; - applySettings(); + applySettings(QStringList("fmDeviation")); break; case WDSPRxFMDialog::ChangedAFLow: m_settings.m_fmAFLow = m_fmDialog->getAFLow(); m_settings.m_profiles[m_settings.m_profileIndex].m_fmAFLow = m_settings.m_fmAFLow; - applySettings(); + applySettings(QStringList("fmAFLow")); break; case WDSPRxFMDialog::ChangedAFHigh: m_settings.m_fmAFHigh = m_fmDialog->getAFHigh(); m_settings.m_profiles[m_settings.m_profileIndex].m_fmAFHigh = m_settings.m_fmAFHigh; - applySettings(); + applySettings(QStringList("fmAFHigh")); break; case WDSPRxFMDialog::ChangedAFLimiter: m_settings.m_fmAFLimiter = m_fmDialog->getAFLimiter(); m_settings.m_profiles[m_settings.m_profileIndex].m_fmAFLimiter = m_settings.m_fmAFLimiter; - applySettings(); + applySettings(QStringList("fmAFLimiter")); break; case WDSPRxFMDialog::ChangedAFLimiterGain: m_settings.m_fmAFLimiterGain = m_fmDialog->getAFLimiterGain(); m_settings.m_profiles[m_settings.m_profileIndex].m_fmAFLimiterGain = m_settings.m_fmAFLimiterGain; - applySettings(); + applySettings(QStringList("fmAFLimiterGain")); break; case WDSPRxFMDialog::ChangedCTCSSNotch: m_settings.m_fmCTCSSNotch = m_fmDialog->getCTCSSNotch(); m_settings.m_profiles[m_settings.m_profileIndex].m_fmCTCSSNotch = m_settings.m_fmCTCSSNotch; - applySettings(); + applySettings(QStringList("fmCTCSSNotch")); break; case WDSPRxFMDialog::ChangedCTCSSNotchFrequency: m_settings.m_fmCTCSSNotchFrequency = m_fmDialog->getCTCSSNotchFrequency(); m_settings.m_profiles[m_settings.m_profileIndex].m_fmCTCSSNotchFrequency = m_settings.m_fmCTCSSNotchFrequency; - applySettings(); + applySettings(QStringList("fmCTCSSNotchFrequency")); break; default: break; @@ -1281,22 +1288,22 @@ void WDSPRxGUI::squelchSetup(int iValueChanged) case WDSPRxSquelchDialog::ChangedMode: m_settings.m_squelchMode = m_squelchDialog->getMode(); m_settings.m_profiles[m_settings.m_profileIndex].m_squelchMode = m_settings.m_squelchMode; - applySettings(); + applySettings(QStringList("squelchMode")); break; case WDSPRxSquelchDialog::ChangedSSQLTauMute: m_settings.m_ssqlTauMute = m_squelchDialog->getSSQLTauMute(); m_settings.m_profiles[m_settings.m_profileIndex].m_ssqlTauMute = m_settings.m_ssqlTauMute; - applySettings(); + applySettings(QStringList("ssqlTauMute")); break; case WDSPRxSquelchDialog::ChangedSSQLTauUnmute: m_settings.m_ssqlTauUnmute = m_squelchDialog->getSSQLTauUnmute(); m_settings.m_profiles[m_settings.m_profileIndex].m_ssqlTauUnmute = m_settings.m_ssqlTauUnmute; - applySettings(); + applySettings(QStringList("ssqlTauUnmute")); break; case WDSPRxSquelchDialog::ChangedAMSQMaxTail: m_settings.m_amsqMaxTail = m_squelchDialog->getAMSQMaxTail(); m_settings.m_profiles[m_settings.m_profileIndex].m_amsqMaxTail = m_settings.m_amsqMaxTail; - applySettings(); + applySettings(QStringList("amsqMaxTail")); break; default: break; @@ -1329,12 +1336,12 @@ void WDSPRxGUI::equalizerSetup(int iValueChanged) case WDSPRxEqDialog::ChangedFrequency: m_settings.m_eqF = m_equalizerDialog->getEqF(); m_settings.m_profiles[m_settings.m_profileIndex].m_eqF = m_settings.m_eqF; - applySettings(); + applySettings(QStringList("eqF")); break; case WDSPRxEqDialog::ChangedGain: m_settings.m_eqG = m_equalizerDialog->getEqG(); m_settings.m_profiles[m_settings.m_profileIndex].m_eqG = m_settings.m_eqG; - applySettings(); + applySettings(QStringList("eqG")); break; default: break; @@ -1365,7 +1372,7 @@ void WDSPRxGUI::panSetup(int iValueChanged) { m_settings.m_audioPan = m_panDialog->getPan(); m_settings.m_profiles[m_settings.m_profileIndex].m_audioPan = m_settings.m_audioPan; - applySettings(); + applySettings(QStringList("audioPan")); } } diff --git a/plugins/channelrx/wdsprx/wdsprxgui.h b/plugins/channelrx/wdsprx/wdsprxgui.h index fb354eda7..da3e6a652 100644 --- a/plugins/channelrx/wdsprx/wdsprxgui.h +++ b/plugins/channelrx/wdsprx/wdsprxgui.h @@ -125,7 +125,7 @@ private: ~WDSPRxGUI() final; bool blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applyBandwidths(unsigned int spanLog2, bool force = false); unsigned int spanLog2Max() const; void displaySettings(); diff --git a/plugins/channelrx/wdsprx/wdsprxsink.cpp b/plugins/channelrx/wdsprx/wdsprxsink.cpp index 7a266714e..8840d9f52 100644 --- a/plugins/channelrx/wdsprx/wdsprxsink.cpp +++ b/plugins/channelrx/wdsprx/wdsprxsink.cpp @@ -134,7 +134,7 @@ WDSPRxSink::WDSPRxSink() : m_rxa->setPassband(0, m_Bandwidth); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } WDSPRxSink::~WDSPRxSink() @@ -329,47 +329,15 @@ void WDSPRxSink::applyAudioSampleRate(int sampleRate) } } -void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) +void WDSPRxSink::applySettings(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force) { - qDebug() << "WDSPRxSink::applySettings:" - << " m_demod: " << settings.m_demod - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_profileIndex: " << settings.m_profileIndex - << " m_spanLog2: " << settings.m_profiles[settings.m_profileIndex].m_spanLog2 - << " m_highCutoff: " << settings.m_profiles[settings.m_profileIndex].m_highCutoff - << " m_lowCutoff: " << settings.m_profiles[settings.m_profileIndex].m_lowCutoff - << " m_fftWindow: " << settings.m_profiles[settings.m_profileIndex].m_fftWindow << "]" - << " m_volume: " << settings.m_volume - << " m_audioBinaural: " << settings.m_audioBinaural - << " m_audioFlipChannels: " << settings.m_audioFlipChannels - << " m_dsb: " << settings.m_dsb - << " m_audioMute: " << settings.m_audioMute - << " m_agc: " << settings.m_agc - << " m_agcMode: " << settings.m_agcMode - << " m_agcGain: " << settings.m_agcGain - << " m_agcSlope: " << settings.m_agcSlope - << " m_agcHangThreshold: " << settings.m_agcHangThreshold - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_dnr: " << settings.m_dnr - << " m_nrScheme: " << settings.m_nrScheme - << " m_nrPosition: "<< settings.m_nrPosition - << " m_nr2Gain: " << settings.m_nr2Gain - << " m_nr2NPE: " << settings.m_nr2NPE - << " m_nr2ArtifactReduction: " << settings.m_nr2ArtifactReduction - << " m_rit: " << settings.m_rit - << " m_ritFrequency: " << settings.m_ritFrequency - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "WDSPRxSink::applySettings:" << settings.getDebugString(settingsKeys, force); // RIT - if ((m_settings.m_rit != settings.m_rit) || (m_settings.m_ritFrequency != settings.m_ritFrequency) || force) + if ((settingsKeys.contains("rit") && (m_settings.m_rit != settings.m_rit)) || + (settingsKeys.contains("ritFrequency") && (m_settings.m_ritFrequency != settings.m_ritFrequency)) || force) { m_rxa->shift->SetFreq(settings.m_ritFrequency); m_rxa->shift->SetRun(settings.m_rit ? 1 : 0); @@ -377,11 +345,11 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) // Filter and mode - if((m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff != settings.m_profiles[settings.m_profileIndex].m_highCutoff) || - (m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff != settings.m_profiles[settings.m_profileIndex].m_lowCutoff) || - (m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow != settings.m_profiles[settings.m_profileIndex].m_fftWindow) || - (m_settings.m_demod != settings.m_demod) || - (m_settings.m_dsb != settings.m_dsb) || force) + if((settingsKeys.contains("highCutoff") && (m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff != settings.m_profiles[settings.m_profileIndex].m_highCutoff)) || + (settingsKeys.contains("lowCutoff") && (m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff != settings.m_profiles[settings.m_profileIndex].m_lowCutoff)) || + (settingsKeys.contains("fftWindow") && (m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow != settings.m_profiles[settings.m_profileIndex].m_fftWindow)) || + (settingsKeys.contains("demod") && (m_settings.m_demod != settings.m_demod)) || + (settingsKeys.contains("dsb") && (m_settings.m_dsb != settings.m_dsb)) || force) { float band; float low; @@ -480,14 +448,14 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((m_settings.m_profiles[settings.m_profileIndex].m_spanLog2 != settings.m_profiles[settings.m_profileIndex].m_spanLog2) || force) { + if ((settingsKeys.contains("spanLog2") && (m_settings.m_profiles[settings.m_profileIndex].m_spanLog2 != settings.m_profiles[settings.m_profileIndex].m_spanLog2)) || force) { m_spectrumProbe.setSpanLog2(settings.m_profiles[settings.m_profileIndex].m_spanLog2); } // Noise Reduction - if ((m_settings.m_dnr != settings.m_dnr) - || (m_settings.m_nrScheme != settings.m_nrScheme) || force) + if ((settingsKeys.contains("dnr") && (m_settings.m_dnr != settings.m_dnr)) + || (settingsKeys.contains("nrScheme") && (m_settings.m_nrScheme != settings.m_nrScheme)) || force) { m_rxa->setANRRun(0); m_rxa->setEMNRRun(0); @@ -508,7 +476,7 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((m_settings.m_nrPosition != settings.m_nrPosition) || force) + if ((settingsKeys.contains("nrPosition") && (m_settings.m_nrPosition != settings.m_nrPosition)) || force) { switch (settings.m_nrPosition) { @@ -525,7 +493,7 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((m_settings.m_nr2Gain != settings.m_nr2Gain) || force) + if ((settingsKeys.contains("nr2Gain") && (m_settings.m_nr2Gain != settings.m_nr2Gain)) || force) { switch (settings.m_nr2Gain) { @@ -543,7 +511,7 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((m_settings.m_nr2NPE != settings.m_nr2NPE) || force) + if ((settingsKeys.contains("nr2NPE") && (m_settings.m_nr2NPE != settings.m_nr2NPE)) || force) { switch (settings.m_nr2NPE) { @@ -558,41 +526,41 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((m_settings.m_nr2ArtifactReduction != settings.m_nr2ArtifactReduction) || force) { + if ((settingsKeys.contains("nr2ArtifactReduction") && (m_settings.m_nr2ArtifactReduction != settings.m_nr2ArtifactReduction)) || force) { m_rxa->emnr->setAeRun(settings.m_nr2ArtifactReduction ? 1 : 0); } - if ((m_settings.m_anf != settings.m_anf) || force) { + if ((settingsKeys.contains("anf") && (m_settings.m_anf != settings.m_anf)) || force) { m_rxa->setANFRun(settings.m_anf ? 1 : 0); } // Caution: Causes corruption - if ((m_settings.m_snb != settings.m_snb) || force) { + if ((settingsKeys.contains("snb") && (m_settings.m_snb != settings.m_snb)) || force) { m_rxa->setSNBARun(settings.m_snb ? 1 : 0); } // CW Peaking - if ((m_settings.m_cwPeaking != settings.m_cwPeaking) || force) { + if ((settingsKeys.contains("cwPeaking") && (m_settings.m_cwPeaking != settings.m_cwPeaking)) || force) { m_rxa->speak->setRun(settings.m_cwPeaking ? 1 : 0); } - if ((m_settings.m_cwPeakFrequency != settings.m_cwPeakFrequency) || force) { + if ((settingsKeys.contains("cwPeakFrequency") && (m_settings.m_cwPeakFrequency != settings.m_cwPeakFrequency)) || force) { m_rxa->speak->setFreq(settings.m_cwPeakFrequency); } - if ((m_settings.m_cwBandwidth != settings.m_cwBandwidth) || force) { + if ((settingsKeys.contains("cwBandwidth") && (m_settings.m_cwBandwidth != settings.m_cwBandwidth)) || force) { m_rxa->speak->setBandwidth(settings.m_cwBandwidth); } - if ((m_settings.m_cwGain != settings.m_cwGain) || force) { + if ((settingsKeys.contains("cwGain") && (m_settings.m_cwGain != settings.m_cwGain)) || force) { m_rxa->speak->setGain(settings.m_cwGain); } // Noise Blanker - if ((m_settings.m_dnb != settings.m_dnb) - || (m_settings.m_nbScheme != settings.m_nbScheme) || force) + if ((settingsKeys.contains("dnb") && (m_settings.m_dnb != settings.m_dnb)) + || (settingsKeys.contains("nbScheme") && (m_settings.m_nbScheme != settings.m_nbScheme)) || force) { m_rxa->anb->setRun(0); m_rxa->nob->setRun(0); @@ -613,31 +581,31 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((m_settings.m_nbSlewTime != settings.m_nbSlewTime) || force) + if ((settingsKeys.contains("nbSlewTime") && (m_settings.m_nbSlewTime != settings.m_nbSlewTime)) || force) { m_rxa->anb->setTau(settings.m_nbSlewTime * 0.001); m_rxa->nob->setTau(settings.m_nbSlewTime * 0.001); } - if ((m_settings.m_nbLeadTime != settings.m_nbLeadTime) || force) + if ((settingsKeys.contains("nbLeadTime") && (m_settings.m_nbLeadTime != settings.m_nbLeadTime)) || force) { m_rxa->anb->setAdvtime(settings.m_nbLeadTime * 0.001); m_rxa->nob->setAdvtime(settings.m_nbLeadTime * 0.001); } - if ((m_settings.m_nbLagTime != settings.m_nbLagTime) || force) + if ((settingsKeys.contains("nbLagTime") && (m_settings.m_nbLagTime != settings.m_nbLagTime)) || force) { m_rxa->anb->setHangtime(settings.m_nbLagTime * 0.001); m_rxa->nob->setHangtime(settings.m_nbLagTime * 0.001); } - if ((m_settings.m_nbThreshold != settings.m_nbThreshold) || force) + if ((settingsKeys.contains("nbThreshold") && (m_settings.m_nbThreshold != settings.m_nbThreshold)) || force) { m_rxa->anb->setThreshold(settings.m_nbThreshold); m_rxa->nob->setThreshold(settings.m_nbThreshold); } - if ((m_settings.m_nbAvgTime != settings.m_nbAvgTime) || force) + if ((settingsKeys.contains("nbAvgTime") && (m_settings.m_nbAvgTime != settings.m_nbAvgTime)) || force) { m_rxa->anb->setBacktau(settings.m_nbAvgTime * 0.001); m_rxa->nob->setBacktau(settings.m_nbAvgTime * 0.001); @@ -645,43 +613,43 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) // AM option - if ((m_settings.m_amFadeLevel != settings.m_amFadeLevel) || force) { + if ((settingsKeys.contains("amFadeLevel") && (m_settings.m_amFadeLevel != settings.m_amFadeLevel)) || force) { m_rxa->amd->setFadeLevel(settings.m_amFadeLevel); } // FM options - if ((m_settings.m_fmDeviation != settings.m_fmDeviation) || force) { + if ((settingsKeys.contains("fmDeviation") && (m_settings.m_fmDeviation != settings.m_fmDeviation)) || force) { m_rxa->fmd->setDeviation(settings.m_fmDeviation); } - if ((m_settings.m_fmAFLow != settings.m_fmAFLow) - || (m_settings.m_fmAFHigh != settings.m_fmAFHigh) || force) + if ((settingsKeys.contains("fmAFLow") && (m_settings.m_fmAFLow != settings.m_fmAFLow)) + || (settingsKeys.contains("fmAFHigh") && (m_settings.m_fmAFHigh != settings.m_fmAFHigh)) || force) { m_rxa->fmd->setAFFilter(settings.m_fmAFLow, settings.m_fmAFHigh); } - if ((m_settings.m_fmAFLimiter != settings.m_fmAFLimiter) || force) { + if ((settingsKeys.contains("fmAFLimiter") && (m_settings.m_fmAFLimiter != settings.m_fmAFLimiter)) || force) { m_rxa->fmd->setLimRun(settings.m_fmAFLimiter ? 1 : 0); } - if ((m_settings.m_fmAFLimiterGain != settings.m_fmAFLimiterGain) || force) { + if ((settingsKeys.contains("fmAFLimiterGain") && (m_settings.m_fmAFLimiterGain != settings.m_fmAFLimiterGain)) || force) { m_rxa->fmd->setLimGain(settings.m_fmAFLimiterGain); } - if ((m_settings.m_fmCTCSSNotch != settings.m_fmCTCSSNotch) || force) { + if ((settingsKeys.contains("fmCTCSSNotch") && (m_settings.m_fmCTCSSNotch != settings.m_fmCTCSSNotch)) || force) { m_rxa->fmd->setCTCSSRun(settings.m_fmCTCSSNotch ? 1 : 0); } - if ((m_settings.m_fmCTCSSNotchFrequency != settings.m_fmCTCSSNotchFrequency) || force) { + if ((settingsKeys.contains("fmCTCSSNotchFrequency") && (m_settings.m_fmCTCSSNotchFrequency != settings.m_fmCTCSSNotchFrequency)) || force) { m_rxa->fmd->setCTCSSFreq(settings.m_fmCTCSSNotchFrequency); } // Squelch - if ((m_settings.m_squelch != settings.m_squelch) - || (m_settings.m_squelchThreshold != settings.m_squelchThreshold) - || (m_settings.m_squelchMode != settings.m_squelchMode) || force) + if ((settingsKeys.contains("squelch") && (m_settings.m_squelch != settings.m_squelch)) + || (settingsKeys.contains("squelchThreshold") && (m_settings.m_squelchThreshold != settings.m_squelchThreshold)) + || (settingsKeys.contains("squelchMode") && (m_settings.m_squelchMode != settings.m_squelchMode)) || force) { m_rxa->ssql->setRun(0); m_rxa->amsq->setRun(0); @@ -719,39 +687,39 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - if ((m_settings.m_ssqlTauMute != settings.m_ssqlTauMute) || force) { + if ((settingsKeys.contains("ssqlTauMute") && (m_settings.m_ssqlTauMute != settings.m_ssqlTauMute)) || force) { m_rxa->ssql->setTauMute(settings.m_ssqlTauMute); } - if ((m_settings.m_ssqlTauUnmute != settings.m_ssqlTauUnmute) || force) { + if ((settingsKeys.contains("ssqlTauUnmute") && (m_settings.m_ssqlTauUnmute != settings.m_ssqlTauUnmute)) || force) { m_rxa->ssql->setTauUnMute(settings.m_ssqlTauUnmute); } - if ((m_settings.m_amsqMaxTail != settings.m_amsqMaxTail) || force) { + if ((settingsKeys.contains("amsqMaxTail") && (m_settings.m_amsqMaxTail != settings.m_amsqMaxTail)) || force) { m_rxa->amsq->setMaxTail(settings.m_amsqMaxTail); } // Equalizer - if ((m_settings.m_equalizer != settings.m_equalizer) || force) { + if ((settingsKeys.contains("equalizer") && (m_settings.m_equalizer != settings.m_equalizer)) || force) { m_rxa->eqp->setRun(settings.m_equalizer ? 1 : 0); } - if ((m_settings.m_eqF != settings.m_eqF) - || (m_settings.m_eqG != settings.m_eqG) || force) + if ((settingsKeys.contains("eqF") && (m_settings.m_eqF != settings.m_eqF)) + || (settingsKeys.contains("eqG") && (m_settings.m_eqG != settings.m_eqG)) || force) { m_rxa->eqp->setProfile(10, settings.m_eqF.data(), settings.m_eqG.data()); } // Audio panel - if ((m_settings.m_volume != settings.m_volume) || force) { + if ((settingsKeys.contains("volume") && (m_settings.m_volume != settings.m_volume)) || force) { m_rxa->panel->setGain1(settings.m_volume); } - if ((m_settings.m_audioBinaural != settings.m_audioBinaural) - || (m_settings.m_audioPan != settings.m_audioPan) - || (m_settings.m_audioFlipChannels != settings.m_audioFlipChannels) || force) + if ((settingsKeys.contains("audioBinaural") && (m_settings.m_audioBinaural != settings.m_audioBinaural)) + || (settingsKeys.contains("audioPan") && (m_settings.m_audioPan != settings.m_audioPan)) + || (settingsKeys.contains("audioFlipChannels") && (m_settings.m_audioFlipChannels != settings.m_audioFlipChannels)) || force) { if (settings.m_audioBinaural) { @@ -767,11 +735,11 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) // AGC - if ((m_settings.m_agc != settings.m_agc) - || (m_settings.m_agcMode != settings.m_agcMode) - || (m_settings.m_agcSlope != settings.m_agcSlope) - || (m_settings.m_agcHangThreshold != settings.m_agcHangThreshold) - || (m_settings.m_agcGain != settings.m_agcGain) || force) + if ((settingsKeys.contains("agc") && (m_settings.m_agc != settings.m_agc)) + || (settingsKeys.contains("agcMode") && (m_settings.m_agcMode != settings.m_agcMode)) + || (settingsKeys.contains("agcSlope") && (m_settings.m_agcSlope != settings.m_agcSlope)) + || (settingsKeys.contains("agcHangThreshold") && (m_settings.m_agcHangThreshold != settings.m_agcHangThreshold)) + || (settingsKeys.contains("agcGain") && (m_settings.m_agcGain != settings.m_agcGain)) || force) { m_rxa->agc->setSlope(settings.m_agcSlope); m_rxa->agc->setTop((float) settings.m_agcGain); @@ -816,5 +784,9 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelrx/wdsprx/wdsprxsink.h b/plugins/channelrx/wdsprx/wdsprxsink.h index 12408921e..b7f447d00 100644 --- a/plugins/channelrx/wdsprx/wdsprxsink.h +++ b/plugins/channelrx/wdsprx/wdsprxsink.h @@ -48,7 +48,7 @@ public: void setSpectrumSink(SpectrumVis* spectrumSink) { m_spectrumSink = spectrumSink; } void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false); - void applySettings(const WDSPRxSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WDSPRxSettings& settings, bool force = false); void applyAudioSampleRate(int sampleRate); AudioFifo *getAudioFifo() { return &m_audioFifo; } diff --git a/sdrbase/util/stringlist.cpp b/sdrbase/util/stringlist.cpp index 41e79f30b..97f865244 100644 --- a/sdrbase/util/stringlist.cpp +++ b/sdrbase/util/stringlist.cpp @@ -1,6 +1,6 @@ #include "stringlist.h" -bool StringListUtil::containsAll(const QStringList &haystack, const QStringList &needles) +static bool StringListUtil::containsAll(const QStringList &haystack, const QStringList &needles) { for (const auto &s : needles) { if (!haystack.contains(s)) // optionally add Qt::CaseSensitivity @@ -9,7 +9,7 @@ bool StringListUtil::containsAll(const QStringList &haystack, const QStringList return true; } -bool StringListUtil::containsAny(const QStringList &haystack, const QStringList &needles) +static bool StringListUtil::containsAny(const QStringList &haystack, const QStringList &needles) { for (const auto &s : needles) { if (haystack.contains(s)) // optionally add Qt::CaseSensitivity From 47fba8c980910d5346ee61ecfc191f6ad9205259 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 1 Feb 2026 11:18:18 +0100 Subject: [PATCH 3/5] Apply atomic settings to channel Tx plugins. Fixes #1329 --- plugins/channelrx/wdsprx/wdsprx.cpp | 48 +-- plugins/channeltx/filesource/filesource.cpp | 81 ++--- plugins/channeltx/filesource/filesource.h | 17 +- .../filesource/filesourcebaseband.cpp | 18 +- .../channeltx/filesource/filesourcebaseband.h | 11 +- .../channeltx/filesource/filesourcegui.cpp | 24 +- plugins/channeltx/filesource/filesourcegui.h | 2 +- .../filesource/filesourcesettings.cpp | 105 ++++++ .../channeltx/filesource/filesourcesettings.h | 2 + .../channeltx/filesource/filesourcesource.cpp | 18 +- .../channeltx/filesource/filesourcesource.h | 2 +- plugins/channeltx/localsource/localsource.cpp | 74 ++-- plugins/channeltx/localsource/localsource.h | 17 +- .../localsource/localsourcebaseband.cpp | 21 +- .../localsource/localsourcebaseband.h | 11 +- .../channeltx/localsource/localsourcegui.cpp | 20 +- .../channeltx/localsource/localsourcegui.h | 2 +- .../localsource/localsourcesettings.cpp | 96 ++++- .../localsource/localsourcesettings.h | 2 + .../mod802.15.4/ieee_802_15_4_mod.cpp | 229 ++---------- .../channeltx/mod802.15.4/ieee_802_15_4_mod.h | 17 +- .../mod802.15.4/ieee_802_15_4_modbaseband.cpp | 20 +- .../mod802.15.4/ieee_802_15_4_modbaseband.h | 11 +- .../mod802.15.4/ieee_802_15_4_modgui.cpp | 66 ++-- .../mod802.15.4/ieee_802_15_4_modgui.h | 2 +- .../mod802.15.4/ieee_802_15_4_modsettings.cpp | 243 +++++++++++++ .../mod802.15.4/ieee_802_15_4_modsettings.h | 2 + .../mod802.15.4/ieee_802_15_4_modsource.cpp | 29 +- .../mod802.15.4/ieee_802_15_4_modsource.h | 2 +- plugins/channeltx/modais/aismod.cpp | 180 ++-------- plugins/channeltx/modais/aismod.h | 17 +- plugins/channeltx/modais/aismodbaseband.cpp | 6 +- plugins/channeltx/modais/aismodbaseband.h | 11 +- plugins/channeltx/modais/aismodgui.cpp | 62 ++-- plugins/channeltx/modais/aismodgui.h | 2 +- plugins/channeltx/modais/aismodsettings.cpp | 243 +++++++++++++ plugins/channeltx/modais/aismodsettings.h | 2 + plugins/channeltx/modais/aismodsource.cpp | 12 +- plugins/channeltx/modais/aismodsource.h | 2 +- plugins/channeltx/modam/ammod.cpp | 100 ++---- plugins/channeltx/modam/ammod.h | 11 +- plugins/channeltx/modam/ammodbaseband.cpp | 20 +- plugins/channeltx/modam/ammodbaseband.h | 11 +- plugins/channeltx/modam/ammodgui.cpp | 47 +-- plugins/channeltx/modam/ammodgui.h | 2 +- plugins/channeltx/modam/ammodsettings.cpp | 150 ++++++++ plugins/channeltx/modam/ammodsettings.h | 2 + plugins/channeltx/modam/ammodsource.cpp | 16 +- plugins/channeltx/modam/ammodsource.h | 2 +- plugins/channeltx/modatv/atvmod.cpp | 131 ++----- plugins/channeltx/modatv/atvmod.h | 17 +- plugins/channeltx/modatv/atvmodbaseband.cpp | 35 +- plugins/channeltx/modatv/atvmodbaseband.h | 11 +- plugins/channeltx/modatv/atvmodgui.cpp | 56 +-- plugins/channeltx/modatv/atvmodgui.h | 2 +- plugins/channeltx/modatv/atvmodsettings.cpp | 201 +++++++++++ plugins/channeltx/modatv/atvmodsettings.h | 2 + plugins/channeltx/modatv/atvmodsource.cpp | 52 +-- plugins/channeltx/modatv/atvmodsource.h | 2 +- plugins/channeltx/moddatv/datvmod.cpp | 132 ++----- plugins/channeltx/moddatv/datvmod.h | 17 +- plugins/channeltx/moddatv/datvmodbaseband.cpp | 6 +- plugins/channeltx/moddatv/datvmodbaseband.h | 2 +- plugins/channeltx/moddatv/datvmodgui.cpp | 55 +-- plugins/channeltx/moddatv/datvmodgui.h | 2 +- plugins/channeltx/moddatv/datvmodsettings.cpp | 189 ++++++++++ plugins/channeltx/moddatv/datvmodsettings.h | 2 + plugins/channeltx/moddatv/datvmodsource.cpp | 55 +-- plugins/channeltx/moddatv/datvmodsource.h | 2 +- plugins/channeltx/modfreedv/freedvmod.cpp | 98 ++--- plugins/channeltx/modfreedv/freedvmod.h | 17 +- .../channeltx/modfreedv/freedvmodbaseband.cpp | 20 +- .../channeltx/modfreedv/freedvmodbaseband.h | 11 +- plugins/channeltx/modfreedv/freedvmodgui.cpp | 47 ++- plugins/channeltx/modfreedv/freedvmodgui.h | 2 +- .../channeltx/modfreedv/freedvmodsettings.cpp | 138 +++++++ .../channeltx/modfreedv/freedvmodsettings.h | 2 + .../channeltx/modfreedv/freedvmodsource.cpp | 14 +- plugins/channeltx/modfreedv/freedvmodsource.h | 2 +- plugins/channeltx/modm17/m17mod.cpp | 20 +- plugins/channeltx/modm17/m17modbaseband.cpp | 2 +- plugins/channeltx/modm17/m17modsettings.cpp | 116 ++++++ plugins/channeltx/modm17/m17modsettings.h | 1 + plugins/channeltx/modm17/m17modsource.cpp | 4 +- plugins/channeltx/modm17/m17modsource.h | 2 +- plugins/channeltx/modnfm/nfmmod.cpp | 116 ++---- plugins/channeltx/modnfm/nfmmod.h | 11 +- plugins/channeltx/modnfm/nfmmodbaseband.cpp | 20 +- plugins/channeltx/modnfm/nfmmodbaseband.h | 11 +- plugins/channeltx/modnfm/nfmmodgui.cpp | 67 ++-- plugins/channeltx/modnfm/nfmmodgui.h | 2 +- plugins/channeltx/modnfm/nfmmodsettings.cpp | 203 +++++++++++ plugins/channeltx/modnfm/nfmmodsettings.h | 2 + plugins/channeltx/modnfm/nfmmodsource.cpp | 24 +- plugins/channeltx/modnfm/nfmmodsource.h | 2 +- plugins/channeltx/modpacket/packetmod.cpp | 249 ++----------- plugins/channeltx/modpacket/packetmod.h | 17 +- .../channeltx/modpacket/packetmodbaseband.cpp | 12 +- .../channeltx/modpacket/packetmodbaseband.h | 11 +- plugins/channeltx/modpacket/packetmodgui.cpp | 56 +-- plugins/channeltx/modpacket/packetmodgui.h | 2 +- .../channeltx/modpacket/packetmodsettings.cpp | 339 ++++++++++++++++++ .../channeltx/modpacket/packetmodsettings.h | 2 + .../channeltx/modpacket/packetmodsource.cpp | 24 +- plugins/channeltx/modpacket/packetmodsource.h | 2 +- plugins/channeltx/modpsk31/psk31mod.cpp | 144 ++------ plugins/channeltx/modpsk31/psk31mod.h | 17 +- .../channeltx/modpsk31/psk31modbaseband.cpp | 14 +- plugins/channeltx/modpsk31/psk31modbaseband.h | 11 +- plugins/channeltx/modpsk31/psk31modgui.cpp | 38 +- plugins/channeltx/modpsk31/psk31modgui.h | 2 +- .../channeltx/modpsk31/psk31modsettings.cpp | 186 ++++++++++ plugins/channeltx/modpsk31/psk31modsettings.h | 2 + plugins/channeltx/modpsk31/psk31modsource.cpp | 16 +- plugins/channeltx/modpsk31/psk31modsource.h | 2 +- plugins/channeltx/modrtty/rttymod.cpp | 169 ++------- plugins/channeltx/modrtty/rttymod.h | 17 +- plugins/channeltx/modrtty/rttymodbaseband.cpp | 14 +- plugins/channeltx/modrtty/rttymodbaseband.h | 11 +- plugins/channeltx/modrtty/rttymodgui.cpp | 53 +-- plugins/channeltx/modrtty/rttymodgui.h | 2 +- plugins/channeltx/modrtty/rttymodsettings.cpp | 222 ++++++++++++ plugins/channeltx/modrtty/rttymodsettings.h | 2 + plugins/channeltx/modrtty/rttymodsource.cpp | 22 +- plugins/channeltx/modrtty/rttymodsource.h | 2 +- plugins/channeltx/modssb/ssbmod.cpp | 111 ++---- plugins/channeltx/modssb/ssbmod.h | 11 +- plugins/channeltx/modssb/ssbmodbaseband.cpp | 23 +- plugins/channeltx/modssb/ssbmodbaseband.h | 11 +- plugins/channeltx/modssb/ssbmodgui.cpp | 51 +-- plugins/channeltx/modssb/ssbmodgui.h | 2 +- plugins/channeltx/modssb/ssbmodsettings.cpp | 198 ++++++++++ plugins/channeltx/modssb/ssbmodsettings.h | 2 + plugins/channeltx/modssb/ssbmodsource.cpp | 25 +- plugins/channeltx/modssb/ssbmodsource.h | 2 +- plugins/channeltx/modwfm/wfmmod.cpp | 97 ++--- plugins/channeltx/modwfm/wfmmod.h | 17 +- plugins/channeltx/modwfm/wfmmodbaseband.cpp | 20 +- plugins/channeltx/modwfm/wfmmodbaseband.h | 11 +- plugins/channeltx/modwfm/wfmmodgui.cpp | 50 +-- plugins/channeltx/modwfm/wfmmodgui.h | 2 +- plugins/channeltx/modwfm/wfmmodsettings.cpp | 156 ++++++++ plugins/channeltx/modwfm/wfmmodsettings.h | 2 + plugins/channeltx/modwfm/wfmmodsource.cpp | 18 +- plugins/channeltx/modwfm/wfmmodsource.h | 2 +- .../channeltx/remotesource/remotesource.cpp | 63 +--- plugins/channeltx/remotesource/remotesource.h | 17 +- .../remotesource/remotesourcebaseband.cpp | 25 +- .../remotesource/remotesourcebaseband.h | 11 +- .../remotesource/remotesourcegui.cpp | 23 +- .../channeltx/remotesource/remotesourcegui.h | 2 +- .../remotesource/remotesourcesettings.cpp | 99 +++++ .../remotesource/remotesourcesettings.h | 2 + plugins/channeltx/udpsource/udpsource.cpp | 129 ++----- plugins/channeltx/udpsource/udpsource.h | 17 +- .../channeltx/udpsource/udpsourcebaseband.cpp | 6 +- .../channeltx/udpsource/udpsourcebaseband.h | 11 +- plugins/channeltx/udpsource/udpsourcegui.cpp | 36 +- plugins/channeltx/udpsource/udpsourcegui.h | 2 +- .../channeltx/udpsource/udpsourcesettings.cpp | 186 +++++++++- .../channeltx/udpsource/udpsourcesettings.h | 2 + .../channeltx/udpsource/udpsourcesource.cpp | 54 +-- plugins/channeltx/udpsource/udpsourcesource.h | 2 +- 163 files changed, 4500 insertions(+), 2673 deletions(-) diff --git a/plugins/channelrx/wdsprx/wdsprx.cpp b/plugins/channelrx/wdsprx/wdsprx.cpp index e6cc15655..9ac16c69a 100644 --- a/plugins/channelrx/wdsprx/wdsprx.cpp +++ b/plugins/channelrx/wdsprx/wdsprx.cpp @@ -251,48 +251,6 @@ void WDSPRx::applySettings(const QStringList& settingsKeys, const WDSPRxSettings { qDebug() << "WDSPRx::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((m_settings.m_profileIndex != settings.m_profileIndex) || force) { - reverseAPIKeys.append("filterIndex"); - } - if ((m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2 != settings.m_profiles[settings.m_profileIndex].m_spanLog2) || force) { - reverseAPIKeys.append("spanLog2"); - } - if ((m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff != settings.m_profiles[settings.m_profileIndex].m_highCutoff) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff != settings.m_profiles[settings.m_profileIndex].m_lowCutoff) || force) { - reverseAPIKeys.append("lowCutoff"); - } - if ((m_settings.m_profiles[m_settings.m_profileIndex].m_fftWindow != settings.m_profiles[settings.m_profileIndex].m_fftWindow) || force) { - reverseAPIKeys.append("fftWindow"); - } - if ((m_settings.m_volume != settings.m_volume) || force) { - reverseAPIKeys.append("volume"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((m_settings.m_audioBinaural != settings.m_audioBinaural) || force) { - reverseAPIKeys.append("audioBinaural"); - } - if ((m_settings.m_audioFlipChannels != settings.m_audioFlipChannels) || force) { - reverseAPIKeys.append("audioFlipChannels"); - } - if ((m_settings.m_dsb != settings.m_dsb) || force) { - reverseAPIKeys.append("dsb"); - } - if ((m_settings.m_audioMute != settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((m_settings.m_agc != settings.m_agc) || force) { - reverseAPIKeys.append("agc"); - } - if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only @@ -304,8 +262,6 @@ void WDSPRx::applySettings(const QStringList& settingsKeys, const WDSPRxSettings m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if ((settingsKeys.contains("dsb") && (settings.m_dsb != m_settings.m_dsb)) @@ -332,14 +288,14 @@ void WDSPRx::applySettings(const QStringList& settingsKeys, const WDSPRxSettings (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (!pipes.empty()) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } if (force) { diff --git a/plugins/channeltx/filesource/filesource.cpp b/plugins/channeltx/filesource/filesource.cpp index db828839f..73f2596a9 100644 --- a/plugins/channeltx/filesource/filesource.cpp +++ b/plugins/channeltx/filesource/filesource.cpp @@ -62,7 +62,7 @@ FileSource::FileSource(DeviceAPI *deviceAPI) : m_basebandSource = new FileSourceBaseband(); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -154,7 +154,7 @@ bool FileSource::handleMessage(const Message& cmd) { MsgConfigureFileSource& cfg = (MsgConfigureFileSource&) cmd; qDebug() << "FileSource::handleMessage: MsgConfigureFileSource"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } else if (MsgConfigureFileSourceWork::match(cmd)) @@ -200,65 +200,30 @@ bool FileSource::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureFileSource *msg = MsgConfigureFileSource::create(m_settings, true); + MsgConfigureFileSource *msg = MsgConfigureFileSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureFileSource *msg = MsgConfigureFileSource::create(m_settings, true); + MsgConfigureFileSource *msg = MsgConfigureFileSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } } -void FileSource::applySettings(const FileSourceSettings& settings, bool force) +void FileSource::applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force) { - qDebug() << "FileSource::applySettings:" - << "m_fileName:" << settings.m_fileName - << "m_loop:" << settings.m_loop - << "m_gainDB:" << settings.m_gainDB - << "m_log2Interp:" << settings.m_log2Interp - << "m_filterChainHash:" << settings.m_filterChainHash - << "m_useReverseAPI:" << settings.m_useReverseAPI - << "m_reverseAPIAddress:" << settings.m_reverseAPIAddress - << "m_reverseAPIChannelIndex:" << settings.m_reverseAPIChannelIndex - << "m_reverseAPIDeviceIndex:" << settings.m_reverseAPIDeviceIndex - << "m_reverseAPIPort:" << settings.m_reverseAPIPort - << "m_rgbColor:" << settings.m_rgbColor - << "m_title:" << settings.m_title - << " force: " << force; + qDebug() << "FileSource::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((m_settings.m_fileName != settings.m_fileName) || force) + if ((settingsKeys.contains("fileName") && (m_settings.m_fileName != settings.m_fileName)) || force) { - reverseAPIKeys.append("fileName"); FileSourceBaseband::MsgConfigureFileSourceName *msg = FileSourceBaseband::MsgConfigureFileSourceName::create(settings.m_fileName); m_basebandSource->getInputMessageQueue()->push(msg); } - if ((m_settings.m_loop != settings.m_loop) || force) { - reverseAPIKeys.append("loop"); - } - if ((m_settings.m_log2Interp != settings.m_log2Interp) || force) { - reverseAPIKeys.append("log2Interp"); - } - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) { - reverseAPIKeys.append("filterChainHash"); - } - if ((m_settings.m_gainDB != settings.m_gainDB) || force) { - reverseAPIKeys.append("gainDB"); - } - if ((m_settings.m_rgbColor != settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((m_settings.m_title != settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -269,28 +234,26 @@ void FileSource::applySettings(const FileSourceSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - FileSourceBaseband::MsgConfigureFileSourceBaseband *msg = FileSourceBaseband::MsgConfigureFileSourceBaseband::create(settings, force); + FileSourceBaseband::MsgConfigureFileSourceBaseband *msg = FileSourceBaseband::MsgConfigureFileSourceBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -343,13 +306,13 @@ int FileSource::webapiSettingsPutPatch( FileSourceSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureFileSource *msg = MsgConfigureFileSource::create(settings, force); + MsgConfigureFileSource *msg = MsgConfigureFileSource::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("FileSource::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFileSource *msgToGUI = MsgConfigureFileSource::create(settings, force); + MsgConfigureFileSource *msgToGUI = MsgConfigureFileSource::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -570,7 +533,7 @@ void FileSource::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respon response.getFileSourceReport()->setChannelPowerDb(CalcDb::dbPower(getMagSq())); } -void FileSource::webapiReverseSendSettings(QList& channelSettingsKeys, const FileSourceSettings& settings, bool force) +void FileSource::webapiReverseSendSettings(const QList& channelSettingsKeys, const FileSourceSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -597,7 +560,7 @@ void FileSource::webapiReverseSendSettings(QList& channelSettingsKeys, void FileSource::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FileSourceSettings& settings, bool force) { @@ -621,7 +584,7 @@ void FileSource::sendChannelSettings( } void FileSource::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FileSourceSettings& settings, bool force diff --git a/plugins/channeltx/filesource/filesource.h b/plugins/channeltx/filesource/filesource.h index c2d580f08..2d5186b2f 100644 --- a/plugins/channeltx/filesource/filesource.h +++ b/plugins/channeltx/filesource/filesource.h @@ -52,20 +52,23 @@ public: public: const FileSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFileSource* create(const FileSourceSettings& settings, bool force) + static MsgConfigureFileSource* create(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force) { - return new MsgConfigureFileSource(settings, force); + return new MsgConfigureFileSource(settingsKeys, settings, force); } private: FileSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFileSource(const FileSourceSettings& settings, bool force) : + MsgConfigureFileSource(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -240,19 +243,19 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const FileSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force = false); static void validateFilterChainHash(FileSourceSettings& settings); void calculateFrequencyOffset(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const FileSourceSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const FileSourceSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FileSourceSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FileSourceSettings& settings, bool force diff --git a/plugins/channeltx/filesource/filesourcebaseband.cpp b/plugins/channeltx/filesource/filesourcebaseband.cpp index 6d1874c71..cdfd01427 100644 --- a/plugins/channeltx/filesource/filesourcebaseband.cpp +++ b/plugins/channeltx/filesource/filesourcebaseband.cpp @@ -141,7 +141,7 @@ bool FileSourceBaseband::handleMessage(const Message& cmd) MsgConfigureFileSourceBaseband& cfg = (MsgConfigureFileSourceBaseband&) cmd; qDebug() << "FileSourceBaseband::handleMessage: MsgConfigureFileSourceBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -187,23 +187,17 @@ bool FileSourceBaseband::handleMessage(const Message& cmd) } } -void FileSourceBaseband::applySettings(const FileSourceSettings& settings, bool force) +void FileSourceBaseband::applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force) { - qDebug() << "FileSourceBaseband::applySettings:" - << "m_fileName:" << settings.m_fileName - << "m_loop:" << settings.m_loop - << "m_gainDB:" << settings.m_gainDB - << "m_log2Interp:" << settings.m_log2Interp - << "m_filterChainHash:" << settings.m_filterChainHash - << " force: " << force; + qDebug() << "FileSourceBaseband::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) - || (m_settings.m_log2Interp != settings.m_log2Interp) || force) + if ((settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) + || (settingsKeys.contains("log2Interp") && (m_settings.m_log2Interp != settings.m_log2Interp)) || force) { m_channelizer->setInterpolation(settings.m_log2Interp, settings.m_filterChainHash); } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); m_settings = settings; } diff --git a/plugins/channeltx/filesource/filesourcebaseband.h b/plugins/channeltx/filesource/filesourcebaseband.h index 976cd6006..29eb32b8f 100644 --- a/plugins/channeltx/filesource/filesourcebaseband.h +++ b/plugins/channeltx/filesource/filesourcebaseband.h @@ -39,20 +39,23 @@ public: public: const FileSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFileSourceBaseband* create(const FileSourceSettings& settings, bool force) + static MsgConfigureFileSourceBaseband* create(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force) { - return new MsgConfigureFileSourceBaseband(settings, force); + return new MsgConfigureFileSourceBaseband(settingsKeys, settings, force); } private: FileSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFileSourceBaseband(const FileSourceSettings& settings, bool force) : + MsgConfigureFileSourceBaseband(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -152,7 +155,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const FileSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/filesource/filesourcegui.cpp b/plugins/channeltx/filesource/filesourcegui.cpp index 617ca34f6..754cd39d6 100644 --- a/plugins/channeltx/filesource/filesourcegui.cpp +++ b/plugins/channeltx/filesource/filesourcegui.cpp @@ -48,7 +48,7 @@ void FileSourceGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray FileSourceGUI::serialize() const @@ -60,7 +60,7 @@ bool FileSourceGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -215,7 +215,7 @@ FileSourceGUI::FileSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -229,13 +229,13 @@ void FileSourceGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void FileSourceGUI::applySettings(bool force) +void FileSourceGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - FileSource::MsgConfigureFileSource* message = FileSource::MsgConfigureFileSource::create(m_settings, force); + FileSource::MsgConfigureFileSource* message = FileSource::MsgConfigureFileSource::create(settingsKeys, m_settings, force); m_fileSource->getInputMessageQueue()->push(message); } } @@ -243,7 +243,7 @@ void FileSourceGUI::applySettings(bool force) void FileSourceGUI::configureFileName() { qDebug() << "FileSourceGui::configureFileName: " << m_settings.m_fileName.toStdString().c_str(); - applySettings(); + applySettings(QStringList("fileName")); } void FileSourceGUI::updateWithAcquisition() @@ -364,7 +364,7 @@ void FileSourceGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void FileSourceGUI::onMenuDialogCalled(const QPoint &p) @@ -408,7 +408,9 @@ void FileSourceGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); @@ -430,7 +432,7 @@ void FileSourceGUI::on_gain_valueChanged(int value) { ui->gainText->setText(tr("%1 dB").arg(value)); m_settings.m_gainDB = value; - applySettings(); + applySettings(QStringList({"gainDB"})); } void FileSourceGUI::on_showFileDialog_clicked(bool checked) @@ -453,7 +455,7 @@ void FileSourceGUI::on_playLoop_toggled(bool checked) if (m_doApplySettings) { m_settings.m_loop = checked; - FileSource::MsgConfigureFileSource *message = FileSource::MsgConfigureFileSource::create(m_settings, false); + FileSource::MsgConfigureFileSource *message = FileSource::MsgConfigureFileSource::create(QStringList({"loop"}), m_settings, false); m_fileSource->getInputMessageQueue()->push(message); } } @@ -498,7 +500,7 @@ void FileSourceGUI::applyPosition() updateAbsoluteCenterFrequency(); displayRateAndShift(); - applySettings(); + applySettings(QStringList({"log2Interp", "filterChainHash"})); } void FileSourceGUI::tick() diff --git a/plugins/channeltx/filesource/filesourcegui.h b/plugins/channeltx/filesource/filesourcegui.h index 29bd4370d..04b6917e3 100644 --- a/plugins/channeltx/filesource/filesourcegui.h +++ b/plugins/channeltx/filesource/filesourcegui.h @@ -92,7 +92,7 @@ private: virtual ~FileSourceGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void configureFileName(); void updateWithAcquisition(); void updateWithStreamData(); diff --git a/plugins/channeltx/filesource/filesourcesettings.cpp b/plugins/channeltx/filesource/filesourcesettings.cpp index bfc2b7a94..f1992a564 100644 --- a/plugins/channeltx/filesource/filesourcesettings.cpp +++ b/plugins/channeltx/filesource/filesourcesettings.cpp @@ -148,3 +148,108 @@ bool FileSourceSettings::deserialize(const QByteArray& data) return false; } } + +void FileSourceSettings::applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings) +{ + if (settingsKeys.contains("fileName")) { + m_fileName = settings.m_fileName; + } + if (settingsKeys.contains("loop")) { + m_loop = settings.m_loop; + } + if (settingsKeys.contains("log2Interp")) { + m_log2Interp = settings.m_log2Interp; + } + if (settingsKeys.contains("filterChainHash")) { + m_filterChainHash = settings.m_filterChainHash; + } + if (settingsKeys.contains("gainDB")) { + m_gainDB = settings.m_gainDB; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString FileSourceSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("fileName") || force) { + ostr << " m_fileName: " << m_fileName.toStdString(); + } + if (settingsKeys.contains("loop") || force) { + ostr << " m_loop: " << m_loop; + } + if (settingsKeys.contains("log2Interp") || force) { + ostr << " m_log2Interp: " << m_log2Interp; + } + if (settingsKeys.contains("filterChainHash") || force) { + ostr << " m_filterChainHash: " << m_filterChainHash; + } + if (settingsKeys.contains("gainDB") || force) { + ostr << " m_gainDB: " << m_gainDB; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/filesource/filesourcesettings.h b/plugins/channeltx/filesource/filesourcesettings.h index 74a2c0586..e174a5432 100644 --- a/plugins/channeltx/filesource/filesourcesettings.h +++ b/plugins/channeltx/filesource/filesourcesettings.h @@ -54,6 +54,8 @@ struct FileSourceSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* PLUGINS_CHANNELTX_FILESOURCE_FILESOURCESETTINGS_H_ */ diff --git a/plugins/channeltx/filesource/filesourcesource.cpp b/plugins/channeltx/filesource/filesourcesource.cpp index 11d85ca18..9ccdcab41 100644 --- a/plugins/channeltx/filesource/filesourcesource.cpp +++ b/plugins/channeltx/filesource/filesourcesource.cpp @@ -306,20 +306,18 @@ void FileSourceSource::handleEOF() } } -void FileSourceSource::applySettings(const FileSourceSettings& settings, bool force) +void FileSourceSource::applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force) { - qDebug() << "FileSourceSource::applySettings:" - << "m_fileName:" << settings.m_fileName - << "m_loop:" << settings.m_loop - << "m_gainDB:" << settings.m_gainDB - << "m_log2Interp:" << settings.m_log2Interp - << "m_filterChainHash:" << settings.m_filterChainHash - << " force: " << force; + qDebug() << "FileSourceSource::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((m_settings.m_gainDB != settings.m_gainDB) || force) { + if ((settingsKeys.contains("gainDB") && (m_settings.m_gainDB != settings.m_gainDB)) || force) { m_linearGain = CalcDb::powerFromdB(settings.m_gainDB/2.0); // Divide by two for power gain to voltage gain conversion } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channeltx/filesource/filesourcesource.h b/plugins/channeltx/filesource/filesourcesource.h index c6ba48392..264746f86 100644 --- a/plugins/channeltx/filesource/filesourcesource.h +++ b/plugins/channeltx/filesource/filesourcesource.h @@ -69,7 +69,7 @@ public: m_magsqCount = 0; } - void applySettings(const FileSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FileSourceSettings& settings, bool force = false); void setMessageQueueToGUI(MessageQueue *messageQueue) { m_guiMessageQueue = messageQueue; } void openFileStream(const QString& fileName); diff --git a/plugins/channeltx/localsource/localsource.cpp b/plugins/channeltx/localsource/localsource.cpp index 13d9156ad..8180fec56 100644 --- a/plugins/channeltx/localsource/localsource.cpp +++ b/plugins/channeltx/localsource/localsource.cpp @@ -56,7 +56,7 @@ LocalSource::LocalSource(DeviceAPI *deviceAPI) : m_basebandSource = new LocalSourceBaseband(); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -145,7 +145,7 @@ bool LocalSource::handleMessage(const Message& cmd) { MsgConfigureLocalSource& cfg = (MsgConfigureLocalSource&) cmd; qDebug() << "LocalSource::handleMessage: MsgConfigureLocalSink"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -165,14 +165,14 @@ bool LocalSource::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureLocalSource *msg = MsgConfigureLocalSource::create(m_settings, true); + MsgConfigureLocalSource *msg = MsgConfigureLocalSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureLocalSource *msg = MsgConfigureLocalSource::create(m_settings, true); + MsgConfigureLocalSource *msg = MsgConfigureLocalSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -253,33 +253,12 @@ void LocalSource::propagateSampleRateAndFrequency(uint32_t index, uint32_t log2I } } -void LocalSource::applySettings(const LocalSourceSettings& settings, bool force) +void LocalSource::applySettings(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force) { - qDebug() << "LocalSource::applySettings:" - << "m_localDeviceIndex:" << settings.m_localDeviceIndex - << "m_log2Interp:" << settings.m_log2Interp - << "m_filterChainHash:" << settings.m_filterChainHash - << "m_play:" << settings.m_play - << "m_rgbColor:" << settings.m_rgbColor - << "m_title:" << settings.m_title - << "m_useReverseAPI:" << settings.m_useReverseAPI - << "m_reverseAPIAddress:" << settings.m_reverseAPIAddress - << "m_reverseAPIChannelIndex:" << settings.m_reverseAPIChannelIndex - << "m_reverseAPIDeviceIndex:" << settings.m_reverseAPIDeviceIndex - << "m_reverseAPIPort:" << settings.m_reverseAPIPort - << " force: " << force; + qDebug() << "LocalSource::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_log2Interp != m_settings.m_log2Interp) || force) { - reverseAPIKeys.append("log2Interp"); - } - if ((settings.m_filterChainHash != m_settings.m_filterChainHash) || force) { - reverseAPIKeys.append("filterChainHash"); - } - if ((settings.m_localDeviceIndex != m_settings.m_localDeviceIndex) || force) + if ((settingsKeys.contains("localDeviceIndex") && (settings.m_localDeviceIndex != m_settings.m_localDeviceIndex)) || force) { - reverseAPIKeys.append("localDeviceIndex"); propagateSampleRateAndFrequency(settings.m_localDeviceIndex, settings.m_log2Interp); DeviceSampleSink *deviceSampleSink = getLocalDevice(settings.m_localDeviceIndex); LocalSourceBaseband::MsgConfigureLocalDeviceSampleSink *msg = @@ -287,23 +266,22 @@ void LocalSource::applySettings(const LocalSourceSettings& settings, bool force) m_basebandSource->getInputMessageQueue()->push(msg); } - if ((settings.m_log2Interp != m_settings.m_log2Interp) - || (settings.m_filterChainHash != m_settings.m_filterChainHash) || force) + if ((settingsKeys.contains("log2Interp") && (settings.m_log2Interp != m_settings.m_log2Interp)) + || (settingsKeys.contains("filterChainHash") && (settings.m_filterChainHash != m_settings.m_filterChainHash)) || force) { calculateFrequencyOffset(settings.m_log2Interp, settings.m_filterChainHash); propagateSampleRateAndFrequency(m_settings.m_localDeviceIndex, settings.m_log2Interp); } - if ((settings.m_play != m_settings.m_play) || force) + if ((settingsKeys.contains("play") && (settings.m_play != m_settings.m_play)) || force) { - reverseAPIKeys.append("play"); LocalSourceBaseband::MsgConfigureLocalSourceWork *msg = LocalSourceBaseband::MsgConfigureLocalSourceWork::create( settings.m_play ); m_basebandSource->getInputMessageQueue()->push(msg); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if ((settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex))) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -314,28 +292,26 @@ void LocalSource::applySettings(const LocalSourceSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - LocalSourceBaseband::MsgConfigureLocalSourceBaseband *msg = LocalSourceBaseband::MsgConfigureLocalSourceBaseband::create(settings, force); + LocalSourceBaseband::MsgConfigureLocalSourceBaseband *msg = LocalSourceBaseband::MsgConfigureLocalSourceBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if ((settings.m_useReverseAPI) && (reverseAPIKeys.size() != 0)) + if ((settingsKeys.contains("useReverseAPI") && (settings.m_useReverseAPI))) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -388,13 +364,13 @@ int LocalSource::webapiSettingsPutPatch( LocalSourceSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureLocalSource *msg = MsgConfigureLocalSource::create(settings, force); + MsgConfigureLocalSource *msg = MsgConfigureLocalSource::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("LocalSource::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureLocalSource *msgToGUI = MsgConfigureLocalSource::create(settings, force); + MsgConfigureLocalSource *msgToGUI = MsgConfigureLocalSource::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -511,7 +487,7 @@ void LocalSource::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& r } } -void LocalSource::webapiReverseSendSettings(QList& channelSettingsKeys, const LocalSourceSettings& settings, bool force) +void LocalSource::webapiReverseSendSettings(const QList& channelSettingsKeys, const LocalSourceSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -538,7 +514,7 @@ void LocalSource::webapiReverseSendSettings(QList& channelSettingsKeys, void LocalSource::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const LocalSourceSettings& settings, bool force) { @@ -562,7 +538,7 @@ void LocalSource::sendChannelSettings( } void LocalSource::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const LocalSourceSettings& settings, bool force diff --git a/plugins/channeltx/localsource/localsource.h b/plugins/channeltx/localsource/localsource.h index 4ce4e9eee..c77b05315 100644 --- a/plugins/channeltx/localsource/localsource.h +++ b/plugins/channeltx/localsource/localsource.h @@ -43,20 +43,23 @@ public: public: const LocalSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureLocalSource* create(const LocalSourceSettings& settings, bool force) + static MsgConfigureLocalSource* create(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force) { - return new MsgConfigureLocalSource(settings, force); + return new MsgConfigureLocalSource(settingsKeys, settings, force); } private: LocalSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureLocalSource(const LocalSourceSettings& settings, bool force) : + MsgConfigureLocalSource(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -136,21 +139,21 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const LocalSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force = false); void propagateSampleRateAndFrequency(uint32_t index, uint32_t log2Interp); static void validateFilterChainHash(LocalSourceSettings& settings); void calculateFrequencyOffset(uint32_t log2Interp, uint32_t filterChainHash); DeviceSampleSink *getLocalDevice(uint32_t index); - void webapiReverseSendSettings(QList& channelSettingsKeys, const LocalSourceSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const LocalSourceSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const LocalSourceSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const LocalSourceSettings& settings, bool force diff --git a/plugins/channeltx/localsource/localsourcebaseband.cpp b/plugins/channeltx/localsource/localsourcebaseband.cpp index 1becad049..08db0c8c5 100644 --- a/plugins/channeltx/localsource/localsourcebaseband.cpp +++ b/plugins/channeltx/localsource/localsourcebaseband.cpp @@ -137,7 +137,7 @@ bool LocalSourceBaseband::handleMessage(const Message& cmd) MsgConfigureLocalSourceBaseband& cfg = (MsgConfigureLocalSourceBaseband&) cmd; qDebug() << "LocalSourceBaseband::handleMessage: MsgConfigureLocalSourceBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -184,23 +184,22 @@ bool LocalSourceBaseband::handleMessage(const Message& cmd) } } -void LocalSourceBaseband::applySettings(const LocalSourceSettings& settings, bool force) +void LocalSourceBaseband::applySettings(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force) { - qDebug() << "LocalSourceBaseband::applySettings:" - << "m_localDeviceIndex:" << settings.m_localDeviceIndex - << "m_log2Interp:" << settings.m_log2Interp - << "m_filterChainHash:" << settings.m_filterChainHash - << "m_play:" << settings.m_play - << " force: " << force; + qDebug() << "LocalSourceBaseband::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_log2Interp != m_settings.m_log2Interp) - || (settings.m_filterChainHash != m_settings.m_filterChainHash) || force) + if ((settingsKeys.contains("log2Interp") && (settings.m_log2Interp != m_settings.m_log2Interp)) + || (settingsKeys.contains("filterChainHash") && (settings.m_filterChainHash != m_settings.m_filterChainHash)) || force) { m_channelizer->setInterpolation(m_settings.m_log2Interp, m_settings.m_filterChainHash); } //m_source.applySettings(settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int LocalSourceBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/localsource/localsourcebaseband.h b/plugins/channeltx/localsource/localsourcebaseband.h index 3eee5678b..96e0d6165 100644 --- a/plugins/channeltx/localsource/localsourcebaseband.h +++ b/plugins/channeltx/localsource/localsourcebaseband.h @@ -40,20 +40,23 @@ public: public: const LocalSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureLocalSourceBaseband* create(const LocalSourceSettings& settings, bool force) + static MsgConfigureLocalSourceBaseband* create(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force) { - return new MsgConfigureLocalSourceBaseband(settings, force); + return new MsgConfigureLocalSourceBaseband(settingsKeys, settings, force); } private: LocalSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureLocalSourceBaseband(const LocalSourceSettings& settings, bool force) : + MsgConfigureLocalSourceBaseband(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -118,7 +121,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const LocalSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const LocalSourceSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/localsource/localsourcegui.cpp b/plugins/channeltx/localsource/localsourcegui.cpp index 191e3ebec..62ee36c54 100644 --- a/plugins/channeltx/localsource/localsourcegui.cpp +++ b/plugins/channeltx/localsource/localsourcegui.cpp @@ -43,7 +43,7 @@ void LocalSourceGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray LocalSourceGUI::serialize() const @@ -55,7 +55,7 @@ bool LocalSourceGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -129,7 +129,7 @@ LocalSourceGUI::LocalSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B updateLocalDevices(); displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -143,13 +143,13 @@ void LocalSourceGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void LocalSourceGUI::applySettings(bool force) +void LocalSourceGUI::applySettings(const QStringList& keys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - LocalSource::MsgConfigureLocalSource* message = LocalSource::MsgConfigureLocalSource::create(m_settings, force); + LocalSource::MsgConfigureLocalSource* message = LocalSource::MsgConfigureLocalSource::create(keys, m_settings, force); m_localSource->getInputMessageQueue()->push(message); } } @@ -232,7 +232,7 @@ void LocalSourceGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void LocalSourceGUI::onMenuDialogCalled(const QPoint &p) @@ -277,7 +277,7 @@ void LocalSourceGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"color", "title", "useReverseAPI", "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"}), true); } resetContextMenuType(); @@ -298,7 +298,7 @@ void LocalSourceGUI::on_position_valueChanged(int value) void LocalSourceGUI::on_localDevice_currentIndexChanged(int index) { m_settings.m_localDeviceIndex = ui->localDevice->itemData(index).toInt(); - applySettings(); + applySettings(QStringList("localDeviceIndex")); } void LocalSourceGUI::on_localDevicesRefresh_clicked(bool checked) @@ -310,7 +310,7 @@ void LocalSourceGUI::on_localDevicesRefresh_clicked(bool checked) void LocalSourceGUI::on_localDevicePlay_toggled(bool checked) { m_settings.m_play = checked; - applySettings(); + applySettings(QStringList("play")); } void LocalSourceGUI::applyInterpolation() @@ -336,7 +336,7 @@ void LocalSourceGUI::applyPosition() updateAbsoluteCenterFrequency(); displayRateAndShift(); - applySettings(); + applySettings(QStringList({"filterChainHash", "log2Interp"})); } void LocalSourceGUI::tick() diff --git a/plugins/channeltx/localsource/localsourcegui.h b/plugins/channeltx/localsource/localsourcegui.h index b48de3b24..584eb5d38 100644 --- a/plugins/channeltx/localsource/localsourcegui.h +++ b/plugins/channeltx/localsource/localsourcegui.h @@ -85,7 +85,7 @@ private: virtual ~LocalSourceGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& keys, bool force = false); void displaySettings(); void displayRateAndShift(); void updateLocalDevices(); diff --git a/plugins/channeltx/localsource/localsourcesettings.cpp b/plugins/channeltx/localsource/localsourcesettings.cpp index 2111ae701..87bad4c6b 100644 --- a/plugins/channeltx/localsource/localsourcesettings.cpp +++ b/plugins/channeltx/localsource/localsourcesettings.cpp @@ -142,7 +142,101 @@ bool LocalSourceSettings::deserialize(const QByteArray& data) } } +void LocalSourceSettings::applySettings(const QStringList& settingsKeys, const LocalSourceSettings& settings) +{ + if (settingsKeys.contains("localDeviceIndex")) { + m_localDeviceIndex = settings.m_localDeviceIndex; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("log2Interp")) { + m_log2Interp = settings.m_log2Interp; + } + if (settingsKeys.contains("filterChainHash")) { + m_filterChainHash = settings.m_filterChainHash; + } + if (settingsKeys.contains("play")) { + m_play = settings.m_play; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString LocalSourceSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + if (settingsKeys.contains("localDeviceIndex") || force) { + ostr << " m_localDeviceIndex: " << m_localDeviceIndex; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("log2Interp") || force) { + ostr << " m_log2Interp: " << m_log2Interp; + } + if (settingsKeys.contains("filterChainHash") || force) { + ostr << " m_filterChainHash: " << m_filterChainHash; + } + if (settingsKeys.contains("play") || force) { + ostr << " m_play: " << m_play; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } - + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/localsource/localsourcesettings.h b/plugins/channeltx/localsource/localsourcesettings.h index a2cdb3872..512746341 100644 --- a/plugins/channeltx/localsource/localsourcesettings.h +++ b/plugins/channeltx/localsource/localsourcesettings.h @@ -53,6 +53,8 @@ struct LocalSourceSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const LocalSourceSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_LOCALSOURCESETTINGS_H_ */ diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.cpp b/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.cpp index 58c261252..a16dac6c8 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.cpp +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.cpp @@ -64,7 +64,7 @@ IEEE_802_15_4_Mod::IEEE_802_15_4_Mod(DeviceAPI *deviceAPI) : m_basebandSource->setSpectrumSampleSink(&m_spectrumVis); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -133,7 +133,7 @@ bool IEEE_802_15_4_Mod::handleMessage(const Message& cmd) MsgConfigureIEEE_802_15_4_Mod& cfg = (MsgConfigureIEEE_802_15_4_Mod&) cmd; qDebug() << "IEEE_802_15_4_Mod::handleMessage: MsgConfigureIEEE_802_15_4_Mod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -171,203 +171,20 @@ void IEEE_802_15_4_Mod::setCenterFrequency(qint64 frequency) { IEEE_802_15_4_ModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureIEEE_802_15_4_Mod *msgToGUI = MsgConfigureIEEE_802_15_4_Mod::create(settings, false); + MsgConfigureIEEE_802_15_4_Mod *msgToGUI = MsgConfigureIEEE_802_15_4_Mod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void IEEE_802_15_4_Mod::applySettings(const IEEE_802_15_4_ModSettings& settings, bool force) +void IEEE_802_15_4_Mod::applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) { - qDebug() << "IEEE_802_15_4_Mod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_modulation: " << settings.m_modulation - << " m_bitRate: " << settings.m_bitRate - << " m_subGHzBand: " << settings.m_subGHzBand - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_gain: " << settings.m_gain - << " m_channelMute: " << settings.m_channelMute - << " m_repeat: " << settings.m_repeat - << " m_repeatDelay: " << settings.m_repeatDelay - << " m_repeatCount: " << settings.m_repeatCount - << " m_rampUpBits: " << settings.m_rampUpBits - << " m_rampDownBits: " << settings.m_rampDownBits - << " m_rampRange: " << settings.m_rampRange - << " m_modulateWhileRamping: "<< settings.m_modulateWhileRamping - << " m_lpfTaps: " << settings.m_lpfTaps - << " m_bbNoise: " << settings.m_bbNoise - << " m_writeToFile: " << settings.m_writeToFile - << " m_spectrumRate: " << settings.m_spectrumRate - << " m_data: " << settings.m_data - << " m_rgbColor: " << settings.m_rgbColor - << " m_title: " << settings.m_title - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " m_scramble: " << settings.m_scramble - << " m_polynomial: " << settings.m_polynomial - << " m_pulseShaping: " << settings.m_pulseShaping - << " m_beta: " << settings.m_beta - << " m_symbolSpan: " << settings.m_symbolSpan - << " m_udpEnabled: " << settings.m_udpEnabled - << " m_udpBytesFormat: " << settings.m_udpBytesFormat - << " m_udpAddress: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " force: " << force; + qDebug() << "IEEE_802_15_4_Mod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - - if ((settings.m_modulation != m_settings.m_modulation) || force) { - reverseAPIKeys.append("modulation"); - } - - if ((settings.m_bitRate != m_settings.m_bitRate) || force) { - reverseAPIKeys.append("bitRate"); - } - - if ((settings.m_subGHzBand != m_settings.m_subGHzBand) || force) { - reverseAPIKeys.append("subGHzBand"); - } - - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - - if ((settings.m_gain != m_settings.m_gain) || force) { - reverseAPIKeys.append("gain"); - } - - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - - if ((settings.m_repeat != m_settings.m_repeat) || force) { - reverseAPIKeys.append("repeat"); - } - - if ((settings.m_repeatDelay != m_settings.m_repeatDelay) || force) { - reverseAPIKeys.append("repeatDelay"); - } - - if ((settings.m_repeatCount != m_settings.m_repeatCount) || force) { - reverseAPIKeys.append("repeatCount"); - } - - if ((settings.m_rampUpBits != m_settings.m_rampUpBits) || force) { - reverseAPIKeys.append("rampUpBits"); - } - - if ((settings.m_rampDownBits != m_settings.m_rampDownBits) || force) { - reverseAPIKeys.append("rampDownBits"); - } - - if ((settings.m_rampRange != m_settings.m_rampRange) || force) { - reverseAPIKeys.append("rampRange"); - } - - if ((settings.m_modulateWhileRamping != m_settings.m_modulateWhileRamping) || force) { - reverseAPIKeys.append("modulateWhileRamping"); - } - - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || force) { - reverseAPIKeys.append("lpfTaps"); - } - - if ((settings.m_bbNoise != m_settings.m_bbNoise) || force) { - reverseAPIKeys.append("bbNoise"); - } - - if ((settings.m_writeToFile != m_settings.m_writeToFile) || force) { - reverseAPIKeys.append("writeToFile"); - } - - if ((settings.m_spectrumRate != m_settings.m_spectrumRate) || force) { - reverseAPIKeys.append("spectrumRate"); - } - - if ((settings.m_data != m_settings.m_data) || force) { - reverseAPIKeys.append("data"); - } - - if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - - if ((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - - if ((settings.m_streamIndex != m_settings.m_streamIndex) || force) { - reverseAPIKeys.append("streamIndex"); - } - - if ((settings.m_useReverseAPI != m_settings.m_useReverseAPI) || force) { - reverseAPIKeys.append("useReverseAPI"); - } - - if ((settings.m_reverseAPIAddress != m_settings.m_reverseAPIAddress) || force) { - reverseAPIKeys.append("reverseAPIAddress"); - } - - if ((settings.m_reverseAPIPort != m_settings.m_reverseAPIPort) || force) { - reverseAPIKeys.append("reverseAPIPort"); - } - - if ((settings.m_reverseAPIDeviceIndex != m_settings.m_reverseAPIDeviceIndex) || force) { - reverseAPIKeys.append("reverseAPIDeviceIndex"); - } - - if ((settings.m_reverseAPIChannelIndex != m_settings.m_reverseAPIChannelIndex) || force) { - reverseAPIKeys.append("reverseAPIChannelIndex"); - } - - if ((settings.m_scramble != m_settings.m_scramble) || force) { - reverseAPIKeys.append("scramble"); - } - - if ((settings.m_polynomial != m_settings.m_polynomial) || force) { - reverseAPIKeys.append("polynomial"); - } - - if ((settings.m_pulseShaping != m_settings.m_pulseShaping) || force) { - reverseAPIKeys.append("pulseShaping"); - } - - if ((settings.m_beta != m_settings.m_beta) || force) { - reverseAPIKeys.append("beta"); - } - - if ((settings.m_symbolSpan != m_settings.m_symbolSpan) || force) { - reverseAPIKeys.append("symbolSpan"); - } - - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - - if ((settings.m_udpBytesFormat != m_settings.m_udpBytesFormat) || force) { - reverseAPIKeys.append("udpBytesFormat"); - } - - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -378,28 +195,26 @@ void IEEE_802_15_4_Mod::applySettings(const IEEE_802_15_4_ModSettings& settings, m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - IEEE_802_15_4_ModBaseband::MsgConfigureIEEE_802_15_4_ModBaseband *msg = IEEE_802_15_4_ModBaseband::MsgConfigureIEEE_802_15_4_ModBaseband::create(settings, force); + IEEE_802_15_4_ModBaseband::MsgConfigureIEEE_802_15_4_ModBaseband *msg = IEEE_802_15_4_ModBaseband::MsgConfigureIEEE_802_15_4_ModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -420,7 +235,7 @@ bool IEEE_802_15_4_Mod::deserialize(const QByteArray& data) success = false; } - MsgConfigureIEEE_802_15_4_Mod *msg = MsgConfigureIEEE_802_15_4_Mod::create(m_settings, true); + MsgConfigureIEEE_802_15_4_Mod *msg = MsgConfigureIEEE_802_15_4_Mod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return success; @@ -457,12 +272,12 @@ int IEEE_802_15_4_Mod::webapiSettingsPutPatch( IEEE_802_15_4_ModSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureIEEE_802_15_4_Mod *msg = MsgConfigureIEEE_802_15_4_Mod::create(settings, force); + MsgConfigureIEEE_802_15_4_Mod *msg = MsgConfigureIEEE_802_15_4_Mod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureIEEE_802_15_4_Mod *msgToGUI = MsgConfigureIEEE_802_15_4_Mod::create(settings, force); + MsgConfigureIEEE_802_15_4_Mod *msgToGUI = MsgConfigureIEEE_802_15_4_Mod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -740,7 +555,7 @@ void IEEE_802_15_4_Mod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response.getIeee802154ModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void IEEE_802_15_4_Mod::webapiReverseSendSettings(QList& channelSettingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) +void IEEE_802_15_4_Mod::webapiReverseSendSettings(const QList& channelSettingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -767,7 +582,7 @@ void IEEE_802_15_4_Mod::webapiReverseSendSettings(QList& channelSetting void IEEE_802_15_4_Mod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) { @@ -791,7 +606,7 @@ void IEEE_802_15_4_Mod::sendChannelSettings( } void IEEE_802_15_4_Mod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const IEEE_802_15_4_ModSettings& settings, bool force diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h b/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h index 956f48209..1ceb0c261 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_mod.h @@ -51,20 +51,23 @@ public: public: const IEEE_802_15_4_ModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureIEEE_802_15_4_Mod* create(const IEEE_802_15_4_ModSettings& settings, bool force) + static MsgConfigureIEEE_802_15_4_Mod* create(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) { - return new MsgConfigureIEEE_802_15_4_Mod(settings, force); + return new MsgConfigureIEEE_802_15_4_Mod(settingsKeys, settings, force); } private: IEEE_802_15_4_ModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureIEEE_802_15_4_Mod(const IEEE_802_15_4_ModSettings& settings, bool force) : + MsgConfigureIEEE_802_15_4_Mod(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -179,17 +182,17 @@ private: // QUdpSocket *m_udpSocket; virtual bool handleMessage(const Message& cmd); - void applySettings(const IEEE_802_15_4_ModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const IEEE_802_15_4_ModSettings& settings, bool force diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.cpp b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.cpp index 5cefb4036..30453f2da 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.cpp +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.cpp @@ -141,7 +141,7 @@ bool IEEE_802_15_4_ModBaseband::handleMessage(const Message& cmd) MsgConfigureIEEE_802_15_4_ModBaseband& cfg = (MsgConfigureIEEE_802_15_4_ModBaseband&) cmd; qDebug() << "IEEE_802_15_4_ModBaseband::handleMessage: MsgConfigureIEEE_802_15_4_ModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -170,19 +170,19 @@ bool IEEE_802_15_4_ModBaseband::handleMessage(const Message& cmd) } } -void IEEE_802_15_4_ModBaseband::applySettings(const IEEE_802_15_4_ModSettings& settings, bool force) +void IEEE_802_15_4_ModBaseband::applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(m_channelizer->getChannelSampleRate(), settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) - || (settings.m_udpAddress != m_settings.m_udpAddress) - || (settings.m_udpPort != m_settings.m_udpPort) + if ((settingsKeys.contains("udpEnabled") && (settings.m_udpEnabled != m_settings.m_udpEnabled)) + || (settingsKeys.contains("udpAddress") && (settings.m_udpAddress != m_settings.m_udpAddress)) + || (settingsKeys.contains("udpPort") && (settings.m_udpPort != m_settings.m_udpPort)) || force) { qDebug() << "IEEE_802_15_4_ModBaseband::applySettings:" @@ -200,7 +200,11 @@ void IEEE_802_15_4_ModBaseband::applySettings(const IEEE_802_15_4_ModSettings& s } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int IEEE_802_15_4_ModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.h b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.h index 3c8b13634..9b5229ce6 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.h +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modbaseband.h @@ -42,20 +42,23 @@ public: public: const IEEE_802_15_4_ModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureIEEE_802_15_4_ModBaseband* create(const IEEE_802_15_4_ModSettings& settings, bool force) + static MsgConfigureIEEE_802_15_4_ModBaseband* create(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) { - return new MsgConfigureIEEE_802_15_4_ModBaseband(settings, force); + return new MsgConfigureIEEE_802_15_4_ModBaseband(settingsKeys, settings, force); } private: IEEE_802_15_4_ModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureIEEE_802_15_4_ModBaseband(const IEEE_802_15_4_ModSettings& settings, bool force) : + MsgConfigureIEEE_802_15_4_ModBaseband(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -91,7 +94,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const IEEE_802_15_4_ModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.cpp b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.cpp index 7a10b9932..83261e71e 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.cpp +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.cpp @@ -72,14 +72,14 @@ qint64 IEEE_802_15_4_ModGUI::getCenterFrequency() const { void IEEE_802_15_4_ModGUI::setCenterFrequency(qint64 centerFrequency) { m_channelMarker.setCenterFrequency(centerFrequency); - applySettings(); + applySettings(QStringList(), true); } void IEEE_802_15_4_ModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray IEEE_802_15_4_ModGUI::serialize() const @@ -91,7 +91,7 @@ bool IEEE_802_15_4_ModGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -134,7 +134,7 @@ void IEEE_802_15_4_ModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList(), true); } void IEEE_802_15_4_ModGUI::handleSourceMessages() @@ -177,7 +177,7 @@ void IEEE_802_15_4_ModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void IEEE_802_15_4_ModGUI::on_phy_currentIndexChanged(int value) @@ -196,7 +196,7 @@ void IEEE_802_15_4_ModGUI::on_phy_currentIndexChanged(int value) ui->glSpectrum->setSampleRate(m_settings.m_spectrumRate); displayChipRate(m_settings); checkSampleRate(); - applySettings(); + applySettings(QStringList("phy")); // Remove custom PHY when deselected, as we no longer know how to set it if (value < 6) @@ -209,20 +209,20 @@ void IEEE_802_15_4_ModGUI::on_rfBW_valueChanged(int value) displayRFBandwidth(bw); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void IEEE_802_15_4_ModGUI::on_gain_valueChanged(int value) { ui->gainText->setText(QString("%1dB").arg(value)); m_settings.m_gain = value; - applySettings(); + applySettings(QStringList("gain")); } void IEEE_802_15_4_ModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void IEEE_802_15_4_ModGUI::on_txButton_clicked() @@ -238,13 +238,13 @@ void IEEE_802_15_4_ModGUI::on_frame_returnPressed() void IEEE_802_15_4_ModGUI::on_frame_editingFinished() { m_settings.m_data = ui->frame->text(); - applySettings(); + applySettings(QStringList("data")); } void IEEE_802_15_4_ModGUI::on_repeat_toggled(bool checked) { m_settings.m_repeat = checked; - applySettings(); + applySettings(QStringList("repeat")); } void IEEE_802_15_4_ModGUI::repeatSelect(const QPoint& p) @@ -256,7 +256,7 @@ void IEEE_802_15_4_ModGUI::repeatSelect(const QPoint& p) { m_settings.m_repeatDelay = dialog.m_repeatDelay; m_settings.m_repeatCount = dialog.m_repeatCount; - applySettings(); + applySettings(QStringList({"repeatDDelay", "repeatCount"})); } } @@ -298,26 +298,41 @@ void IEEE_802_15_4_ModGUI::txSettingsSelect(const QPoint& p) m_settings.m_bbNoise = dialog.m_bbNoise; m_settings.m_writeToFile = dialog.m_writeToFile; displaySettings(); - applySettings(); + applySettings(QStringList({ + "rampUpBits", + "rampDownBits", + "rampRange", + "modulateWhileRamping", + "modulation", + "bitRate", + "pulseShaping", + "beta", + "symbolSpan", + "scramble", + "polynomial", + "lpfTaps", + "bbNoise", + "writeToFile" + })); } } void IEEE_802_15_4_ModGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void IEEE_802_15_4_ModGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void IEEE_802_15_4_ModGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void IEEE_802_15_4_ModGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -326,7 +341,7 @@ void IEEE_802_15_4_ModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void IEEE_802_15_4_ModGUI::onMenuDialogCalled(const QPoint &p) @@ -371,7 +386,16 @@ void IEEE_802_15_4_ModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -480,7 +504,7 @@ IEEE_802_15_4_ModGUI::IEEE_802_15_4_ModGUI(PluginAPI* pluginAPI, DeviceUISet *de displaySettings(); makeUIConnections(); - applySettings(); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -503,11 +527,11 @@ void IEEE_802_15_4_ModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void IEEE_802_15_4_ModGUI::applySettings(bool force) +void IEEE_802_15_4_ModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - IEEE_802_15_4_Mod::MsgConfigureIEEE_802_15_4_Mod *msg = IEEE_802_15_4_Mod::MsgConfigureIEEE_802_15_4_Mod::create(m_settings, force); + IEEE_802_15_4_Mod::MsgConfigureIEEE_802_15_4_Mod *msg = IEEE_802_15_4_Mod::MsgConfigureIEEE_802_15_4_Mod::create(settingsKeys, m_settings, force); m_IEEE_802_15_4_Mod->getInputMessageQueue()->push(msg); } } diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.h b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.h index 60b7d5355..3cb62f003 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.h +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modgui.h @@ -93,7 +93,7 @@ private: void checkSampleRate(); void transmit(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displayRFBandwidth(int bandwidth); void displayChipRate(const IEEE_802_15_4_ModSettings& settings); diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.cpp b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.cpp index 07d0e7b06..09938d427 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.cpp +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.cpp @@ -306,3 +306,246 @@ bool IEEE_802_15_4_ModSettings::deserialize(const QByteArray& data) return false; } } + +void IEEE_802_15_4_ModSettings::applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("modulation")) { + m_modulation = settings.m_modulation; + } + if (settingsKeys.contains("bitRate")) { + m_bitRate = settings.m_bitRate; + } + if (settingsKeys.contains("subGHzBand")) { + m_subGHzBand = settings.m_subGHzBand; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("gain")) { + m_gain = settings.m_gain; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("repeat")) { + m_repeat = settings.m_repeat; + } + if (settingsKeys.contains("repeatDelay")) { + m_repeatDelay = settings.m_repeatDelay; + } + if (settingsKeys.contains("repeatCount")) { + m_repeatCount = settings.m_repeatCount; + } + if (settingsKeys.contains("rampUpBits")) { + m_rampUpBits = settings.m_rampUpBits; + } + if (settingsKeys.contains("rampDownBits")) { + m_rampDownBits = settings.m_rampDownBits; + } + if (settingsKeys.contains("rampRange")) { + m_rampRange = settings.m_rampRange; + } + if (settingsKeys.contains("modulateWhileRamping")) { + m_modulateWhileRamping = settings.m_modulateWhileRamping; + } + if (settingsKeys.contains("lpfTaps")) { + m_lpfTaps = settings.m_lpfTaps; + } + if (settingsKeys.contains("bbNoise")) { + m_bbNoise = settings.m_bbNoise; + } + if (settingsKeys.contains("writeToFile")) { + m_writeToFile = settings.m_writeToFile; + } + if (settingsKeys.contains("spectrumRate")) { + m_spectrumRate = settings.m_spectrumRate; + } + if (settingsKeys.contains("data")) { + m_data = settings.m_data; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("scramble")) { + m_scramble = settings.m_scramble; + } + if (settingsKeys.contains("polynomial")) { + m_polynomial = settings.m_polynomial; + } + if (settingsKeys.contains("pulseShaping")) { + m_pulseShaping = settings.m_pulseShaping; + } + if (settingsKeys.contains("beta")) { + m_beta = settings.m_beta; + } + if (settingsKeys.contains("symbolSpan")) { + m_symbolSpan = settings.m_symbolSpan; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpBytesFormat")) { + m_udpBytesFormat = settings.m_udpBytesFormat; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString IEEE_802_15_4_ModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("modulation") || force) { + ostr << " m_modulation: " << m_modulation; + } + if (settingsKeys.contains("bitRate") || force) { + ostr << " m_bitRate: " << m_bitRate; + } + if (settingsKeys.contains("subGHzBand") || force) { + ostr << " m_subGHzBand: " << m_subGHzBand; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("gain") || force) { + ostr << " m_gain: " << m_gain; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("repeat") || force) { + ostr << " m_repeat: " << m_repeat; + } + if (settingsKeys.contains("repeatDelay") || force) { + ostr << " m_repeatDelay: " << m_repeatDelay; + } + if (settingsKeys.contains("repeatCount") || force) { + ostr << " m_repeatCount: " << m_repeatCount; + } + if (settingsKeys.contains("rampUpBits") || force) { + ostr << " m_rampUpBits: " << m_rampUpBits; + } + if (settingsKeys.contains("rampDownBits") || force) { + ostr << " m_rampDownBits: " << m_rampDownBits; + } + if (settingsKeys.contains("rampRange") || force) { + ostr << " m_rampRange: " << m_rampRange; + } + if (settingsKeys.contains("modulateWhileRamping") || force) { + ostr << " m_modulateWhileRamping: " << m_modulateWhileRamping; + } + if (settingsKeys.contains("lpfTaps") || force) { + ostr << " m_lpfTaps: " << m_lpfTaps; + } + if (settingsKeys.contains("bbNoise") || force) { + ostr << " m_bbNoise: " << m_bbNoise; + } + if (settingsKeys.contains("writeToFile") || force) { + ostr << " m_writeToFile: " << m_writeToFile; + } + if (settingsKeys.contains("spectrumRate") || force) { + ostr << " m_spectrumRate: " << m_spectrumRate; + } + if (settingsKeys.contains("data") || force) { + ostr << " m_data: " << m_data.toStdString(); + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("scramble") || force) { + ostr << " m_scramble: " << m_scramble; + } + if (settingsKeys.contains("polynomial") || force) { + ostr << " m_polynomial: " << m_polynomial; + } + if (settingsKeys.contains("pulseShaping") || force) { + ostr << " m_pulseShaping: " << m_pulseShaping; + } + if (settingsKeys.contains("beta") || force) { + ostr << " m_beta: " << m_beta; + } + if (settingsKeys.contains("symbolSpan") || force) { + ostr << " m_symbolSpan: " << m_symbolSpan; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpBytesFormat") || force) { + ostr << " m_udpBytesFormat: " << m_udpBytesFormat; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.h b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.h index b7972bc09..d799a8af0 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.h +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsettings.h @@ -93,6 +93,8 @@ struct IEEE_802_15_4_ModSettings bool setPHY(QString phy); QString getPHY() const; int getChipRate() const; + void applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_IEEE_802_15_4_MODSETTINGS_H */ diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.cpp b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.cpp index 501ff8388..ce7fc115a 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.cpp +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.cpp @@ -59,7 +59,7 @@ IEEE_802_15_4_ModSource::IEEE_802_15_4_ModSource() : m_pulseShapeQ.create(1, 6, m_channelSampleRate/300000, true); m_specSampleBuffer.resize(m_specSampleBufferSize); m_scopeSampleBuffer.resize(m_scopeSampleBufferSize); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); } @@ -311,15 +311,16 @@ void IEEE_802_15_4_ModSource::calculateLevel(Real& sample) } } -void IEEE_802_15_4_ModSource::applySettings(const IEEE_802_15_4_ModSettings& settings, bool force) +void IEEE_802_15_4_ModSource::applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force) { // Only recreate filters if settings have changed - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("lpfTaps") && (settings.m_lpfTaps != m_settings.m_lpfTaps)) || + (settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { qDebug() << "IEEE_802_15_4_ModSource::applySettings: Creating new lpf with taps " << settings.m_lpfTaps << " rfBW " << settings.m_rfBandwidth; m_lowpass.create(settings.m_lpfTaps, m_channelSampleRate, settings.m_rfBandwidth / 2.0); } - if ((settings.m_spectrumRate != m_settings.m_spectrumRate) || force) + if ((settingsKeys.contains("spectrumRate") && (settings.m_spectrumRate != m_settings.m_spectrumRate)) || force) { m_interpolatorDistanceRemain = 0; m_interpolatorConsumed = false; @@ -350,12 +351,12 @@ void IEEE_802_15_4_ModSource::applySettings(const IEEE_802_15_4_ModSettings& set qCritical("Sample rate is not a high enough multiple of the chip rate"); } - if ((settings.m_pulseShaping != m_settings.m_pulseShaping) - || (settings.m_beta != m_settings.m_beta) - || (settings.m_symbolSpan != m_settings.m_symbolSpan) - || (settings.m_bitRate != m_settings.m_bitRate) - || (settings.m_modulation != m_settings.m_modulation) - || (settings.m_subGHzBand != m_settings.m_subGHzBand) + if ((settingsKeys.contains("pulseShaping") && (settings.m_pulseShaping != m_settings.m_pulseShaping)) + || (settingsKeys.contains("beta") && (settings.m_beta != m_settings.m_beta)) + || (settingsKeys.contains("symbolSpan") && (settings.m_symbolSpan != m_settings.m_symbolSpan)) + || (settingsKeys.contains("bitRate") && (settings.m_bitRate != m_settings.m_bitRate)) + || (settingsKeys.contains("modulation") && (settings.m_modulation != m_settings.m_modulation)) + || (settingsKeys.contains("subGHzBand") && (settings.m_subGHzBand != m_settings.m_subGHzBand)) || force) { qDebug() << "IEEE_802_15_4_ModSource::applySettings: Recreating pulse shaping filter: " @@ -378,11 +379,15 @@ void IEEE_802_15_4_ModSource::applySettings(const IEEE_802_15_4_ModSettings& set } } - if ((settings.m_polynomial != m_settings.m_polynomial) || force) { + if ((settingsKeys.contains("polynomial") && (settings.m_polynomial != m_settings.m_polynomial)) || force) { m_scrambler.setPolynomial(settings.m_polynomial); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } // Precalculate linear gain to save doing it in the loop m_linearGain = powf(10.0f, m_settings.m_gain/20.0f); diff --git a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.h b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.h index c7c18d885..351c315c0 100644 --- a/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.h +++ b/plugins/channeltx/mod802.15.4/ieee_802_15_4_modsource.h @@ -98,7 +98,7 @@ public: MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication void setSpectrumSink(BasebandSampleSink *sampleSink) { m_spectrumSink = sampleSink; } void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } - void applySettings(const IEEE_802_15_4_ModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const IEEE_802_15_4_ModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); bool handleMessage(const Message& cmd); diff --git a/plugins/channeltx/modais/aismod.cpp b/plugins/channeltx/modais/aismod.cpp index 189ee60cf..68f6e447d 100644 --- a/plugins/channeltx/modais/aismod.cpp +++ b/plugins/channeltx/modais/aismod.cpp @@ -67,7 +67,7 @@ AISMod::AISMod(DeviceAPI *deviceAPI) : m_basebandSource->setChannel(this); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -133,11 +133,11 @@ void AISMod::setCenterFrequency(qint64 frequency) { AISModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAISMod *msgToGUI = MsgConfigureAISMod::create(settings, false); + MsgConfigureAISMod *msgToGUI = MsgConfigureAISMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -149,7 +149,7 @@ bool AISMod::handleMessage(const Message& cmd) MsgConfigureAISMod& cfg = (MsgConfigureAISMod&) cmd; qDebug() << "AISMod::handleMessage: MsgConfigureAISMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -311,141 +311,13 @@ void AISMod::encode() } } -void AISMod::applySettings(const AISModSettings& settings, bool force) +void AISMod::applySettings(const QStringList& settingsKeys, const AISModSettings& settings, bool force) { - qDebug() << "AISMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_gain: " << settings.m_gain - << " m_channelMute: " << settings.m_channelMute - << " m_repeat: " << settings.m_repeat - << " m_repeatDelay: " << settings.m_repeatDelay - << " m_repeatCount: " << settings.m_repeatCount - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "AISMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - - if ((settings.m_gain != m_settings.m_gain) || force) { - reverseAPIKeys.append("gain"); - } - - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - - if ((settings.m_repeat != m_settings.m_repeat) || force) { - reverseAPIKeys.append("repeat"); - } - - if ((settings.m_baud != m_settings.m_baud) || force) { - reverseAPIKeys.append("baud"); - } - - if ((settings.m_repeatDelay != m_settings.m_repeatDelay) || force) { - reverseAPIKeys.append("repeatDelay"); - } - - if ((settings.m_repeatCount != m_settings.m_repeatCount) || force) { - reverseAPIKeys.append("repeatCount"); - } - - if ((settings.m_rampUpBits != m_settings.m_rampUpBits) || force) { - reverseAPIKeys.append("rampUpBits"); - } - - if ((settings.m_rampDownBits != m_settings.m_rampDownBits) || force) { - reverseAPIKeys.append("rampDownBits"); - } - - if ((settings.m_rampRange != m_settings.m_rampRange) || force) { - reverseAPIKeys.append("rampRange"); - } - - if ((settings.m_rfNoise != m_settings.m_rfNoise) || force) { - reverseAPIKeys.append("rfNoise"); - } - - if ((settings.m_writeToFile != m_settings.m_writeToFile) || force) { - reverseAPIKeys.append("writeToFile"); - } - - if ((settings.m_msgType != m_settings.m_msgType) || force) { - reverseAPIKeys.append("msgType"); - } - - if ((settings.m_mmsi != m_settings.m_mmsi) || force) { - reverseAPIKeys.append("mmsi"); - } - - if ((settings.m_status != m_settings.m_status) || force) { - reverseAPIKeys.append("status"); - } - - if ((settings.m_latitude != m_settings.m_latitude) || force) { - reverseAPIKeys.append("latitude"); - } - - if ((settings.m_longitude != m_settings.m_longitude) || force) { - reverseAPIKeys.append("longitude"); - } - - if ((settings.m_course != m_settings.m_course) || force) { - reverseAPIKeys.append("course"); - } - - if ((settings.m_speed != m_settings.m_speed) || force) { - reverseAPIKeys.append("speed"); - } - - if ((settings.m_heading != m_settings.m_heading) || force) { - reverseAPIKeys.append("heading"); - } - - if ((settings.m_data != m_settings.m_data) || force) { - reverseAPIKeys.append("data"); - } - - if ((settings.m_bt != m_settings.m_bt) || force) { - reverseAPIKeys.append("bt"); - } - - if ((settings.m_symbolSpan != m_settings.m_symbolSpan) || force) { - reverseAPIKeys.append("symbolSpan"); - } - - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - - if ( (settings.m_udpEnabled != m_settings.m_udpEnabled) - || (settings.m_udpAddress != m_settings.m_udpAddress) - || (settings.m_udpPort != m_settings.m_udpPort) + if ((settingsKeys.contains("udpEnabled") && (settings.m_udpEnabled != m_settings.m_udpEnabled)) + || (settingsKeys.contains("udpAddress") && (settings.m_udpAddress != m_settings.m_udpAddress)) + || (settingsKeys.contains("udpPort") && (settings.m_udpPort != m_settings.m_udpPort)) || force) { if (settings.m_udpEnabled) @@ -454,7 +326,7 @@ void AISMod::applySettings(const AISModSettings& settings, bool force) closeUDP(); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -465,28 +337,26 @@ void AISMod::applySettings(const AISModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - AISModBaseband::MsgConfigureAISModBaseband *msg = AISModBaseband::MsgConfigureAISModBaseband::create(settings, force); + AISModBaseband::MsgConfigureAISModBaseband *msg = AISModBaseband::MsgConfigureAISModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -507,7 +377,7 @@ bool AISMod::deserialize(const QByteArray& data) success = false; } - MsgConfigureAISMod *msg = MsgConfigureAISMod::create(m_settings, true); + MsgConfigureAISMod *msg = MsgConfigureAISMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return success; @@ -563,12 +433,12 @@ int AISMod::webapiSettingsPutPatch( AISModSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureAISMod *msg = MsgConfigureAISMod::create(settings, force); + MsgConfigureAISMod *msg = MsgConfigureAISMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAISMod *msgToGUI = MsgConfigureAISMod::create(settings, force); + MsgConfigureAISMod *msgToGUI = MsgConfigureAISMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -857,7 +727,7 @@ void AISMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getAisModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void AISMod::webapiReverseSendSettings(QList& channelSettingsKeys, const AISModSettings& settings, bool force) +void AISMod::webapiReverseSendSettings(const QList& channelSettingsKeys, const AISModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -884,7 +754,7 @@ void AISMod::webapiReverseSendSettings(QList& channelSettingsKeys, cons void AISMod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const AISModSettings& settings, bool force) { @@ -908,7 +778,7 @@ void AISMod::sendChannelSettings( } void AISMod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const AISModSettings& settings, bool force diff --git a/plugins/channeltx/modais/aismod.h b/plugins/channeltx/modais/aismod.h index d93a350eb..21e799035 100644 --- a/plugins/channeltx/modais/aismod.h +++ b/plugins/channeltx/modais/aismod.h @@ -49,20 +49,23 @@ public: public: const AISModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAISMod* create(const AISModSettings& settings, bool force) + static MsgConfigureAISMod* create(const QStringList& settingsKeys, const AISModSettings& settings, bool force) { - return new MsgConfigureAISMod(settings, force); + return new MsgConfigureAISMod(settingsKeys, settings, force); } private: AISModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAISMod(const AISModSettings& settings, bool force) : + MsgConfigureAISMod(const QStringList& settingsKeys, const AISModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -240,18 +243,18 @@ private: QUdpSocket *m_udpSocket; virtual bool handleMessage(const Message& cmd); - void applySettings(const AISModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AISModSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const AISModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const AISModSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const AISModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const AISModSettings& settings, bool force diff --git a/plugins/channeltx/modais/aismodbaseband.cpp b/plugins/channeltx/modais/aismodbaseband.cpp index 9be7ee1a7..38959ebaf 100644 --- a/plugins/channeltx/modais/aismodbaseband.cpp +++ b/plugins/channeltx/modais/aismodbaseband.cpp @@ -146,7 +146,7 @@ bool AISModBaseband::handleMessage(const Message& cmd) MsgConfigureAISModBaseband& cfg = (MsgConfigureAISModBaseband&) cmd; qDebug() << "AISModBaseband::handleMessage: MsgConfigureAISModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -189,7 +189,7 @@ bool AISModBaseband::handleMessage(const Message& cmd) } } -void AISModBaseband::applySettings(const AISModSettings& settings, bool force) +void AISModBaseband::applySettings(const QStringList& settingsKeys, const AISModSettings& settings, bool force) { if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { @@ -197,7 +197,7 @@ void AISModBaseband::applySettings(const AISModSettings& settings, bool force) m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); m_settings = settings; } diff --git a/plugins/channeltx/modais/aismodbaseband.h b/plugins/channeltx/modais/aismodbaseband.h index 82d06000a..23e127ebf 100644 --- a/plugins/channeltx/modais/aismodbaseband.h +++ b/plugins/channeltx/modais/aismodbaseband.h @@ -43,20 +43,23 @@ public: public: const AISModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAISModBaseband* create(const AISModSettings& settings, bool force) + static MsgConfigureAISModBaseband* create(const QStringList& settingsKeys, const AISModSettings& settings, bool force) { - return new MsgConfigureAISModBaseband(settings, force); + return new MsgConfigureAISModBaseband(settingsKeys, settings, force); } private: AISModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAISModBaseband(const AISModSettings& settings, bool force) : + MsgConfigureAISModBaseband(const QStringList& settingsKeys, const AISModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -92,7 +95,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const AISModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AISModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modais/aismodgui.cpp b/plugins/channeltx/modais/aismodgui.cpp index 8e2a56dfa..7926c9147 100644 --- a/plugins/channeltx/modais/aismodgui.cpp +++ b/plugins/channeltx/modais/aismodgui.cpp @@ -57,7 +57,7 @@ void AISModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray AISModGUI::serialize() const @@ -69,7 +69,7 @@ bool AISModGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -116,7 +116,7 @@ void AISModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void AISModGUI::handleSourceMessages() @@ -138,7 +138,7 @@ void AISModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void AISModGUI::on_mode_currentIndexChanged(int value) @@ -160,7 +160,7 @@ void AISModGUI::on_mode_currentIndexChanged(int value) ui->fmDev->setValue(m_settings.m_fmDeviation / 100.0); ui->btText->setText(QString("%1").arg(m_settings.m_bt, 0, 'f', 1)); ui->bt->setValue(m_settings.m_bt * 10); - applySettings(); + applySettings(QStringList({"rfBandwidth", "fmDeviation", "bt"})); } void AISModGUI::on_rfBW_valueChanged(int value) @@ -169,34 +169,34 @@ void AISModGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void AISModGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 100.0; - applySettings(); + applySettings(QStringList("fmDeviation")); } void AISModGUI::on_bt_valueChanged(int value) { ui->btText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_bt = value / 10.0; - applySettings(); + applySettings(QStringList("bt")); } void AISModGUI::on_gain_valueChanged(int value) { ui->gainText->setText(QString("%1dB").arg(value)); m_settings.m_gain = value; - applySettings(); + applySettings(QStringList("gain")); } void AISModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void AISModGUI::on_insertPosition_clicked() @@ -216,61 +216,61 @@ void AISModGUI::on_txButton_clicked() void AISModGUI::on_message_returnPressed() { m_settings.m_data = ui->message->text(); - applySettings(); + applySettings(QStringList("data")); } void AISModGUI::on_msgId_currentIndexChanged(int index) { m_settings.m_msgType = (AISModSettings::MsgType) index; - applySettings(); + applySettings(QStringList("msgType")); } void AISModGUI::on_mmsi_editingFinished() { m_settings.m_mmsi = ui->mmsi->text(); - applySettings(); + applySettings(QStringList("mmsi")); } void AISModGUI::on_status_currentIndexChanged(int index) { m_settings.m_status = (AISModSettings::Status) index; - applySettings(); + applySettings(QStringList("status")); } void AISModGUI::on_latitude_valueChanged(double value) { m_settings.m_latitude = (float)value; - applySettings(); + applySettings(QStringList("latitude")); } void AISModGUI::on_longitude_valueChanged(double value) { m_settings.m_longitude = (float)value; - applySettings(); + applySettings(QStringList("longitude")); } void AISModGUI::on_course_valueChanged(double value) { m_settings.m_course = (float)value; - applySettings(); + applySettings(QStringList("course")); } void AISModGUI::on_speed_valueChanged(double value) { m_settings.m_speed = (float)value; - applySettings(); + applySettings(QStringList("speed")); } void AISModGUI::on_heading_valueChanged(int value) { m_settings.m_heading = value; - applySettings(); + applySettings(QStringList("heading")); } void AISModGUI::on_message_editingFinished() { m_settings.m_data = ui->message->text(); - applySettings(); + applySettings(QStringList("data")); } // Encode the message specified in individual settings in to a hex string (data settings) and put in message field @@ -283,7 +283,7 @@ void AISModGUI::on_encode_clicked() void AISModGUI::on_repeat_toggled(bool checked) { m_settings.m_repeat = checked; - applySettings(); + applySettings(QStringList("repeat")); } void AISModGUI::repeatSelect(const QPoint& p) @@ -295,7 +295,7 @@ void AISModGUI::repeatSelect(const QPoint& p) { m_settings.m_repeatDelay = dialog.m_repeatDelay; m_settings.m_repeatCount = dialog.m_repeatCount; - applySettings(); + applySettings(QStringList({"repeatDelay", "repeatCount"})); } } @@ -320,26 +320,26 @@ void AISModGUI::txSettingsSelect(const QPoint& p) m_settings.m_rfNoise = dialog.m_rfNoise; m_settings.m_writeToFile = dialog.m_writeToFile; displaySettings(); - applySettings(); + applySettings(QStringList({"rampUpBits", "rampDownBits", "rampRange", "baud", "symbolSpan", "rfNoise", "writeToFile"})); } } void AISModGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void AISModGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void AISModGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void AISModGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -348,7 +348,7 @@ void AISModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void AISModGUI::onMenuDialogCalled(const QPoint &p) @@ -393,7 +393,7 @@ void AISModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -505,7 +505,7 @@ AISModGUI::AISModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam displaySettings(); makeUIConnections(); - applySettings(); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -527,11 +527,11 @@ void AISModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void AISModGUI::applySettings(bool force) +void AISModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - AISMod::MsgConfigureAISMod *msg = AISMod::MsgConfigureAISMod::create(m_settings, force); + AISMod::MsgConfigureAISMod *msg = AISMod::MsgConfigureAISMod::create(settingsKeys, m_settings, force); m_aisMod->getInputMessageQueue()->push(msg); } } diff --git a/plugins/channeltx/modais/aismodgui.h b/plugins/channeltx/modais/aismodgui.h index 7788670d0..d0720b5d0 100644 --- a/plugins/channeltx/modais/aismodgui.h +++ b/plugins/channeltx/modais/aismodgui.h @@ -87,7 +87,7 @@ private: void transmit(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channeltx/modais/aismodsettings.cpp b/plugins/channeltx/modais/aismodsettings.cpp index 98dd39da0..736602594 100644 --- a/plugins/channeltx/modais/aismodsettings.cpp +++ b/plugins/channeltx/modais/aismodsettings.cpp @@ -285,3 +285,246 @@ bool AISModSettings::deserialize(const QByteArray& data) return false; } } + +void AISModSettings::applySettings(const QStringList& settingsKeys, const AISModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("baud")) { + m_baud = settings.m_baud; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("gain")) { + m_gain = settings.m_gain; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("repeat")) { + m_repeat = settings.m_repeat; + } + if (settingsKeys.contains("repeatDelay")) { + m_repeatDelay = settings.m_repeatDelay; + } + if (settingsKeys.contains("repeatCount")) { + m_repeatCount = settings.m_repeatCount; + } + if (settingsKeys.contains("rampUpBits")) { + m_rampUpBits = settings.m_rampUpBits; + } + if (settingsKeys.contains("rampDownBits")) { + m_rampDownBits = settings.m_rampDownBits; + } + if (settingsKeys.contains("rampRange")) { + m_rampRange = settings.m_rampRange; + } + if (settingsKeys.contains("rfNoise")) { + m_rfNoise = settings.m_rfNoise; + } + if (settingsKeys.contains("writeToFile")) { + m_writeToFile = settings.m_writeToFile; + } + if (settingsKeys.contains("msgType")) { + m_msgType = settings.m_msgType; + } + if (settingsKeys.contains("mmsi")) { + m_mmsi = settings.m_mmsi; + } + if (settingsKeys.contains("status")) { + m_status = settings.m_status; + } + if (settingsKeys.contains("latitude")) { + m_latitude = settings.m_latitude; + } + if (settingsKeys.contains("longitude")) { + m_longitude = settings.m_longitude; + } + if (settingsKeys.contains("course")) { + m_course = settings.m_course; + } + if (settingsKeys.contains("speed")) { + m_speed = settings.m_speed; + } + if (settingsKeys.contains("heading")) { + m_heading = settings.m_heading; + } + if (settingsKeys.contains("data")) { + m_data = settings.m_data; + } + if (settingsKeys.contains("bt")) { + m_bt = settings.m_bt; + } + if (settingsKeys.contains("symbolSpan")) { + m_symbolSpan = settings.m_symbolSpan; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString AISModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("baud") || force) { + ostr << " m_baud: " << m_baud; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("gain") || force) { + ostr << " m_gain: " << m_gain; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("repeat") || force) { + ostr << " m_repeat: " << m_repeat; + } + if (settingsKeys.contains("repeatDelay") || force) { + ostr << " m_repeatDelay: " << m_repeatDelay; + } + if (settingsKeys.contains("repeatCount") || force) { + ostr << " m_repeatCount: " << m_repeatCount; + } + if (settingsKeys.contains("rampUpBits") || force) { + ostr << " m_rampUpBits: " << m_rampUpBits; + } + if (settingsKeys.contains("rampDownBits") || force) { + ostr << " m_rampDownBits: " << m_rampDownBits; + } + if (settingsKeys.contains("rampRange") || force) { + ostr << " m_rampRange: " << m_rampRange; + } + if (settingsKeys.contains("rfNoise") || force) { + ostr << " m_rfNoise: " << m_rfNoise; + } + if (settingsKeys.contains("writeToFile") || force) { + ostr << " m_writeToFile: " << m_writeToFile; + } + if (settingsKeys.contains("msgType") || force) { + ostr << " m_msgType: " << m_msgType; + } + if (settingsKeys.contains("mmsi") || force) { + ostr << " m_mmsi: " << m_mmsi.toStdString(); + } + if (settingsKeys.contains("status") || force) { + ostr << " m_status: " << m_status; + } + if (settingsKeys.contains("latitude") || force) { + ostr << " m_latitude: " << m_latitude; + } + if (settingsKeys.contains("longitude") || force) { + ostr << " m_longitude: " << m_longitude; + } + if (settingsKeys.contains("course") || force) { + ostr << " m_course: " << m_course; + } + if (settingsKeys.contains("speed") || force) { + ostr << " m_speed: " << m_speed; + } + if (settingsKeys.contains("heading") || force) { + ostr << " m_heading: " << m_heading; + } + if (settingsKeys.contains("data") || force) { + ostr << " m_data: " << m_data.toStdString(); + } + if (settingsKeys.contains("bt") || force) { + ostr << " m_bt: " << m_bt; + } + if (settingsKeys.contains("symbolSpan") || force) { + ostr << " m_symbolSpan: " << m_symbolSpan; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modais/aismodsettings.h b/plugins/channeltx/modais/aismodsettings.h index e8cc2f35c..e4f035546 100644 --- a/plugins/channeltx/modais/aismodsettings.h +++ b/plugins/channeltx/modais/aismodsettings.h @@ -109,6 +109,8 @@ struct AISModSettings Real getRfBandwidth(int modeIndex); Real getFMDeviation(int modeIndex); float getBT(int modeIndex); + void applySettings(const QStringList& settingsKeys, const AISModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* PLUGINS_CHANNELTX_MODAIS_AISMODSETTINGS_H */ diff --git a/plugins/channeltx/modais/aismodsource.cpp b/plugins/channeltx/modais/aismodsource.cpp index 972dcafdf..6dce17ffd 100644 --- a/plugins/channeltx/modais/aismodsource.cpp +++ b/plugins/channeltx/modais/aismodsource.cpp @@ -50,7 +50,7 @@ AISModSource::AISModSource() : m_scopeSampleBuffer.resize(m_scopeSampleBufferSize); m_specSampleBuffer.resize(m_specSampleBufferSize); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -311,11 +311,11 @@ void AISModSource::calculateLevel(Real& sample) } } -void AISModSource::applySettings(const AISModSettings& settings, bool force) +void AISModSource::applySettings(const QStringList& settingsKeys, const AISModSettings& settings, bool force) { - if ((settings.m_bt != m_settings.m_bt) - || (settings.m_symbolSpan != m_settings.m_symbolSpan) - || (settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("bt") && (settings.m_bt != m_settings.m_bt)) + || (settingsKeys.contains("symbolSpan") && (settings.m_symbolSpan != m_settings.m_symbolSpan)) + || (settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { qDebug() << "AISModSource::applySettings: Recreating pulse shaping filter: " << " SampleRate:" << AISModSettings::AISMOD_SAMPLE_RATE @@ -326,7 +326,7 @@ void AISModSource::applySettings(const AISModSettings& settings, bool force) m_pulseShape.create(settings.m_bt, settings.m_symbolSpan, AISModSettings::AISMOD_SAMPLE_RATE/settings.m_baud); } - if ((settings.m_data != m_settings.m_data) || force) + if ((settingsKeys.contains("data") && (settings.m_data != m_settings.m_data)) || force) { qDebug() << "AISModSource::applySettings: new data: " << settings.m_data; addTXPacket(settings.m_data); diff --git a/plugins/channeltx/modais/aismodsource.h b/plugins/channeltx/modais/aismodsource.h index 6bc964399..f6d09d9e4 100644 --- a/plugins/channeltx/modais/aismodsource.h +++ b/plugins/channeltx/modais/aismodsource.h @@ -64,7 +64,7 @@ public: } void setSpectrumSink(BasebandSampleSink *sampleSink) { m_spectrumSink = sampleSink; } void setScopeSink(ScopeVis* scopeSink) { m_scopeSink = scopeSink; } - void applySettings(const AISModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AISModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void addTXPacket(const QString& data); void addTXPacket(QByteArray data); diff --git a/plugins/channeltx/modam/ammod.cpp b/plugins/channeltx/modam/ammod.cpp index ba6eed13d..b73cb89c4 100644 --- a/plugins/channeltx/modam/ammod.cpp +++ b/plugins/channeltx/modam/ammod.cpp @@ -60,7 +60,7 @@ AMMod::AMMod(DeviceAPI *deviceAPI) : m_centerFrequency(0) { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -138,7 +138,7 @@ void AMMod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSource->getInputMessageQueue()->push(dspMsg); - AMModBaseband::MsgConfigureAMModBaseband *msg = AMModBaseband::MsgConfigureAMModBaseband::create(m_settings, true); + AMModBaseband::MsgConfigureAMModBaseband *msg = AMModBaseband::MsgConfigureAMModBaseband::create(QStringList(), m_settings, true); m_basebandSource->getInputMessageQueue()->push(msg); if (m_levelMeter) { @@ -171,11 +171,11 @@ void AMMod::setCenterFrequency(qint64 frequency) { AMModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAMMod *msgToGUI = MsgConfigureAMMod::create(settings, false); + MsgConfigureAMMod *msgToGUI = MsgConfigureAMMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -187,7 +187,7 @@ bool AMMod::handleMessage(const Message& cmd) auto& cfg = (const MsgConfigureAMMod&) cmd; qDebug() << "AMMod::handleMessage: MsgConfigureAMMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -302,67 +302,11 @@ void AMMod::seekFileStream(int seekPercentage) } } -void AMMod::applySettings(const AMModSettings& settings, bool force) +void AMMod::applySettings(const QStringList& settingsKeys, const AMModSettings& settings, bool force) { - qDebug() << "AMMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_modFactor: " << settings.m_modFactor - << " m_toneFrequency: " << settings.m_toneFrequency - << " m_volumeFactor: " << settings.m_volumeFactor - << " m_channelMute: " << settings.m_channelMute - << " m_playLoop: " << settings.m_playLoop - << " m_modAFInput " << settings.m_modAFInput - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_streamIndex: " << settings.m_streamIndex - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "AMMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - - if ((settings.m_modFactor != m_settings.m_modFactor) || force) { - reverseAPIKeys.append("modFactor"); - } - - if ((settings.m_volumeFactor != m_settings.m_volumeFactor) || force) { - reverseAPIKeys.append("volumeFactor"); - } - - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - - if ((settings.m_playLoop != m_settings.m_playLoop) || force) { - reverseAPIKeys.append("playLoop"); - } - - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) { - reverseAPIKeys.append("modAFInput"); - } - - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { - reverseAPIKeys.append("toneFrequency"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) { - reverseAPIKeys.append("feedbackAudioDeviceName"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -373,31 +317,29 @@ void AMMod::applySettings(const AMModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - AMModBaseband::MsgConfigureAMModBaseband *msg = AMModBaseband::MsgConfigureAMModBaseband::create(settings, force); + AMModBaseband::MsgConfigureAMModBaseband *msg = AMModBaseband::MsgConfigureAMModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (!pipes.empty()) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -412,14 +354,14 @@ bool AMMod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureAMMod *msg = MsgConfigureAMMod::create(m_settings, true); + MsgConfigureAMMod *msg = MsgConfigureAMMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureAMMod *msg = MsgConfigureAMMod::create(m_settings, true); + MsgConfigureAMMod *msg = MsgConfigureAMMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -495,12 +437,12 @@ int AMMod::webapiSettingsPutPatch( } } - MsgConfigureAMMod *msg = MsgConfigureAMMod::create(settings, force); + MsgConfigureAMMod *msg = MsgConfigureAMMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureAMMod *msgToGUI = MsgConfigureAMMod::create(settings, force); + MsgConfigureAMMod *msgToGUI = MsgConfigureAMMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } diff --git a/plugins/channeltx/modam/ammod.h b/plugins/channeltx/modam/ammod.h index 7fd8008a7..e980914d9 100644 --- a/plugins/channeltx/modam/ammod.h +++ b/plugins/channeltx/modam/ammod.h @@ -49,20 +49,23 @@ public: public: const AMModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAMMod* create(const AMModSettings& settings, bool force) + static MsgConfigureAMMod* create(const QStringList& settingsKeys, const AMModSettings& settings, bool force) { - return new MsgConfigureAMMod(settings, force); + return new MsgConfigureAMMod(settings, settingsKeys, force); } private: AMModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAMMod(const AMModSettings& settings, bool force) : + MsgConfigureAMMod(const AMModSettings& settings, const QStringList& settingsKeys, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -272,7 +275,7 @@ private: QObject *m_levelMeter = nullptr; virtual bool handleMessage(const Message& cmd); - void applySettings(const AMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AMModSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer() const; void openFileStream(); void seekFileStream(int seekPercentage); diff --git a/plugins/channeltx/modam/ammodbaseband.cpp b/plugins/channeltx/modam/ammodbaseband.cpp index df3726894..4b7f1a62c 100644 --- a/plugins/channeltx/modam/ammodbaseband.cpp +++ b/plugins/channeltx/modam/ammodbaseband.cpp @@ -150,7 +150,7 @@ bool AMModBaseband::handleMessage(const Message& cmd) MsgConfigureAMModBaseband& cfg = (MsgConfigureAMModBaseband&) cmd; qDebug() << "AMModBaseband::handleMessage: MsgConfigureAMModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -183,16 +183,16 @@ bool AMModBaseband::handleMessage(const Message& cmd) } } -void AMModBaseband::applySettings(const AMModSettings& settings, bool force) +void AMModBaseband::applySettings(const QStringList& settingsKeys, const AMModSettings& settings, bool force) { - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("m_inputFrequencyOffset") && (m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(m_source.getAudioSampleRate(), settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); m_source.applyAudioSampleRate(m_source.getAudioSampleRate()); // reapply in case of channel sample rate change } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("m_audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -207,7 +207,7 @@ void AMModBaseband::applySettings(const AMModSettings& settings, bool force) } } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("m_modAFInput") && (settings.m_modAFInput != m_settings.m_modAFInput)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -219,7 +219,7 @@ void AMModBaseband::applySettings(const AMModSettings& settings, bool force) } } - if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) + if ((settingsKeys.contains("m_feedbackAudioDeviceName") && (settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_feedbackAudioDeviceName); @@ -232,9 +232,13 @@ void AMModBaseband::applySettings(const AMModSettings& settings, bool force) } } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int AMModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modam/ammodbaseband.h b/plugins/channeltx/modam/ammodbaseband.h index c0926c610..df575ed95 100644 --- a/plugins/channeltx/modam/ammodbaseband.h +++ b/plugins/channeltx/modam/ammodbaseband.h @@ -40,20 +40,23 @@ public: public: const AMModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureAMModBaseband* create(const AMModSettings& settings, bool force) + static MsgConfigureAMModBaseband* create(const QStringList& settingsKeys, const AMModSettings& settings, bool force) { - return new MsgConfigureAMModBaseband(settings, force); + return new MsgConfigureAMModBaseband(settingsKeys, settings, force); } private: AMModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureAMModBaseband(const AMModSettings& settings, bool force) : + MsgConfigureAMModBaseband(const QStringList& settingsKeys, const AMModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -92,7 +95,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const AMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AMModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modam/ammodgui.cpp b/plugins/channeltx/modam/ammodgui.cpp index a0d5b8022..85764f26b 100644 --- a/plugins/channeltx/modam/ammodgui.cpp +++ b/plugins/channeltx/modam/ammodgui.cpp @@ -58,7 +58,7 @@ void AMModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray AMModGUI::serialize() const @@ -70,7 +70,7 @@ bool AMModGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -133,7 +133,7 @@ void AMModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void AMModGUI::handleSourceMessages() @@ -154,7 +154,7 @@ void AMModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency((int) value); m_settings.m_inputFrequencyOffset = value; updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void AMModGUI::on_rfBW_valueChanged(int value) @@ -162,41 +162,41 @@ void AMModGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1)); m_settings.m_rfBandwidth = (float) value * 100.0f; m_channelMarker.setBandwidth(value * 100); - applySettings(); + applySettings(QStringList("rfBandwidth")); } void AMModGUI::on_modPercent_valueChanged(int value) { ui->modPercentText->setText(QString("%1").arg(value)); m_settings.m_modFactor = (float) value / 100.0f; - applySettings(); + applySettings(QStringList("modFactor")); } void AMModGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volumeFactor = (float) value / 10.0f; - applySettings(); + applySettings(QStringList("volumeFactor")); } void AMModGUI::on_toneFrequency_valueChanged(int value) { ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2)); m_settings.m_toneFrequency = (float) value * 10.0f; - applySettings(); + applySettings(QStringList("toneFrequency")); } void AMModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void AMModGUI::on_playLoop_toggled(bool checked) { m_settings.m_playLoop = checked; - applySettings(); + applySettings(QStringList("playLoop")); } void AMModGUI::on_play_toggled(bool checked) @@ -205,7 +205,7 @@ void AMModGUI::on_play_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? AMModSettings::AMModInputFile : AMModSettings::AMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); ui->navTimeSlider->setEnabled(!checked); m_enableNavTime = !checked; } @@ -216,7 +216,7 @@ void AMModGUI::on_tone_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? AMModSettings::AMModInputTone : AMModSettings::AMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void AMModGUI::on_morseKeyer_toggled(bool checked) @@ -225,7 +225,7 @@ void AMModGUI::on_morseKeyer_toggled(bool checked) ui->tone->setEnabled(!checked); // release other source inputs ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? AMModSettings::AMModInputCWTone : AMModSettings::AMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void AMModGUI::on_mic_toggled(bool checked) @@ -234,20 +234,20 @@ void AMModGUI::on_mic_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->tone->setEnabled(!checked); // release other source inputs m_settings.m_modAFInput = checked ? AMModSettings::AMModInputAudio : AMModSettings::AMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void AMModGUI::on_feedbackEnable_toggled(bool checked) { m_settings.m_feedbackAudioEnable = checked; - applySettings(); + applySettings(QStringList("feedbackAudioEnable")); } void AMModGUI::on_feedbackVolume_valueChanged(int value) { ui->feedbackVolumeText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2)); m_settings.m_feedbackVolumeFactor = (float) value / 100.0f; - applySettings(); + applySettings(QStringList("feedbackVolumeFactor")); } void AMModGUI::on_navTimeSlider_valueChanged(int value) @@ -291,7 +291,7 @@ void AMModGUI::onWidgetRolled(const QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void AMModGUI::onMenuDialogCalled(const QPoint &p) @@ -336,7 +336,8 @@ void AMModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -413,7 +414,7 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -430,12 +431,12 @@ void AMModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void AMModGUI::applySettings(bool force) +void AMModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - AMMod::MsgConfigureAMMod* message = AMMod::MsgConfigureAMMod::create( m_settings, force); + AMMod::MsgConfigureAMMod* message = AMMod::MsgConfigureAMMod::create(settingsKeys, m_settings, force); m_amMod->getInputMessageQueue()->push(message); } } @@ -517,7 +518,7 @@ void AMModGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -532,7 +533,7 @@ void AMModGUI::audioFeedbackSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_feedbackAudioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("feedbackAudioDeviceName")); } } diff --git a/plugins/channeltx/modam/ammodgui.h b/plugins/channeltx/modam/ammodgui.h index 1ee214775..bc2031d4e 100644 --- a/plugins/channeltx/modam/ammodgui.h +++ b/plugins/channeltx/modam/ammodgui.h @@ -96,7 +96,7 @@ private: ~AMModGUI() final; void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void updateWithStreamData(); void updateWithStreamTime(); diff --git a/plugins/channeltx/modam/ammodsettings.cpp b/plugins/channeltx/modam/ammodsettings.cpp index b0479cc34..eb6df7dd6 100644 --- a/plugins/channeltx/modam/ammodsettings.cpp +++ b/plugins/channeltx/modam/ammodsettings.cpp @@ -187,3 +187,153 @@ bool AMModSettings::deserialize(const QByteArray& data) return false; } } + +void AMModSettings::applySettings(const QStringList& settingsKeys, const AMModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("modFactor")) { + m_modFactor = settings.m_modFactor; + } + if (settingsKeys.contains("toneFrequency")) { + m_toneFrequency = settings.m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor")) { + m_volumeFactor = settings.m_volumeFactor; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("playLoop")) { + m_playLoop = settings.m_playLoop; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("modAFInput")) { + m_modAFInput = settings.m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("feedbackAudioDeviceName")) { + m_feedbackAudioDeviceName = settings.m_feedbackAudioDeviceName; + } + if (settingsKeys.contains("feedbackVolumeFactor")) { + m_feedbackVolumeFactor = settings.m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable")) { + m_feedbackAudioEnable = settings.m_feedbackAudioEnable; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("cwKeyerSettings")) { + m_cwKeyerSettings = settings.m_cwKeyerSettings; + } +} + +QString AMModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("modFactor") || force) { + ostr << " m_modFactor: " << m_modFactor; + } + if (settingsKeys.contains("toneFrequency") || force) { + ostr << " m_toneFrequency: " << m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor") || force) { + ostr << " m_volumeFactor: " << m_volumeFactor; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("playLoop") || force) { + ostr << " m_playLoop: " << m_playLoop; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("modAFInput") || force) { + ostr << " m_modAFInput: " << m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackAudioDeviceName") || force) { + ostr << " m_feedbackAudioDeviceName: " << m_feedbackAudioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackVolumeFactor") || force) { + ostr << " m_feedbackVolumeFactor: " << m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable") || force) { + ostr << " m_feedbackAudioEnable: " << m_feedbackAudioEnable; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modam/ammodsettings.h b/plugins/channeltx/modam/ammodsettings.h index be4c16c13..2130fadda 100644 --- a/plugins/channeltx/modam/ammodsettings.h +++ b/plugins/channeltx/modam/ammodsettings.h @@ -77,6 +77,8 @@ struct AMModSettings bool deserialize(const QByteArray& data); const CWKeyerSettings& getCWKeyerSettings() const { return m_cwKeyerSettings; } void setCWKeyerSettings(const CWKeyerSettings& cwKeyerSettings) { m_cwKeyerSettings = cwKeyerSettings; } + void applySettings(const QStringList& settingsKeys, const AMModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channeltx/modam/ammodsource.cpp b/plugins/channeltx/modam/ammodsource.cpp index 165a2f426..895ed2b3e 100644 --- a/plugins/channeltx/modam/ammodsource.cpp +++ b/plugins/channeltx/modam/ammodsource.cpp @@ -46,7 +46,7 @@ AMModSource::AMModSource() : m_magsq = 0.0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -350,19 +350,19 @@ void AMModSource::applyFeedbackAudioSampleRate(int sampleRate) m_feedbackAudioSampleRate = sampleRate; } -void AMModSource::applySettings(const AMModSettings& settings, bool force) +void AMModSource::applySettings(const QStringList& settingsKeys, const AMModSettings& settings, bool force) { - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { m_settings.m_rfBandwidth = settings.m_rfBandwidth; applyAudioSampleRate(m_audioSampleRate); } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { + if ((settingsKeys.contains("toneFrequency") && settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { m_toneNco.setFreq(settings.m_toneFrequency, (float) m_audioSampleRate); } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("modAFInput") && settings.m_modAFInput != m_settings.m_modAFInput) || force) { if (settings.m_modAFInput == AMModSettings::AMModInputAudio) { connect(&m_audioFifo, SIGNAL(dataReady()), this, SLOT(handleAudio())); @@ -371,7 +371,11 @@ void AMModSource::applySettings(const AMModSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void AMModSource::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) diff --git a/plugins/channeltx/modam/ammodsource.h b/plugins/channeltx/modam/ammodsource.h index 2bfeb7c9c..4b6499243 100644 --- a/plugins/channeltx/modam/ammodsource.h +++ b/plugins/channeltx/modam/ammodsource.h @@ -65,7 +65,7 @@ public: peakLevel = m_peakLevelOut; numSamples = m_levelNbSamples; } - void applySettings(const AMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const AMModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); private: diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index 06b0f1470..69d748e7f 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -65,7 +65,7 @@ ATVMod::ATVMod(DeviceAPI *deviceAPI) : m_basebandSource = new ATVModBaseband(); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -163,7 +163,7 @@ bool ATVMod::handleMessage(const Message& cmd) MsgConfigureATVMod& cfg = (MsgConfigureATVMod&) cmd; qDebug() << "ATVMod::handleMessage: MsgConfigureATVMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -242,103 +242,20 @@ void ATVMod::setCenterFrequency(qint64 frequency) { ATVModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureATVMod *msgToGUI = MsgConfigureATVMod::create(settings, false); + MsgConfigureATVMod *msgToGUI = MsgConfigureATVMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void ATVMod::applySettings(const ATVModSettings& settings, bool force) +void ATVMod::applySettings(const QStringList& settingsKeys, const ATVModSettings& settings, bool force) { - qDebug() << "ATVMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_rfOppBandwidth: " << settings.m_rfOppBandwidth - << " m_atvStd: " << (int) settings.m_atvStd - << " m_nbLines: " << settings.m_nbLines - << " m_fps: " << settings.m_fps - << " m_atvModInput: " << (int) settings.m_atvModInput - << " m_uniformLevel: " << settings.m_uniformLevel - << " m_atvModulation: " << (int) settings.m_atvModulation - << " m_videoPlayLoop: " << settings.m_videoPlayLoop - << " m_videoPlay: " << settings.m_videoPlay - << " m_cameraPlay: " << settings.m_cameraPlay - << " m_channelMute: " << settings.m_channelMute - << " m_invertedVideo: " << settings.m_invertedVideo - << " m_rfScalingFactor: " << settings.m_rfScalingFactor - << " m_fmExcursion: " << settings.m_fmExcursion - << " m_forceDecimator: " << settings.m_forceDecimator - << " m_showOverlayText: " << settings.m_showOverlayText - << " m_overlayText: " << settings.m_overlayText - << " force: " << force; + qDebug() << "ATVMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_rfOppBandwidth != m_settings.m_rfOppBandwidth) || force) { - reverseAPIKeys.append("rfOppBandwidth"); - } - if ((settings.m_atvStd != m_settings.m_atvStd) || force) { - reverseAPIKeys.append("atvStd"); - } - if ((settings.m_nbLines != m_settings.m_nbLines) || force) { - reverseAPIKeys.append("nbLines"); - } - if ((settings.m_fps != m_settings.m_fps) || force) { - reverseAPIKeys.append("fps"); - } - if ((settings.m_atvModInput != m_settings.m_atvModInput) || force) { - reverseAPIKeys.append("atvModInput"); - } - if ((settings.m_uniformLevel != m_settings.m_uniformLevel) || force) { - reverseAPIKeys.append("uniformLevel"); - } - if ((settings.m_uniformLevel != m_settings.m_uniformLevel) || force) { - reverseAPIKeys.append("uniformLevel"); - } - if ((settings.m_atvModulation != m_settings.m_atvModulation) || force) { - reverseAPIKeys.append("atvModulation"); - } - if ((settings.m_videoPlayLoop != m_settings.m_videoPlayLoop) || force) { - reverseAPIKeys.append("videoPlayLoop"); - } - if ((settings.m_videoPlay != m_settings.m_videoPlay) || force) { - reverseAPIKeys.append("videoPlay"); - } - if ((settings.m_cameraPlay != m_settings.m_cameraPlay) || force) { - reverseAPIKeys.append("cameraPlay"); - } - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - if ((settings.m_invertedVideo != m_settings.m_invertedVideo) || force) { - reverseAPIKeys.append("invertedVideo"); - } - if ((settings.m_rfScalingFactor != m_settings.m_rfScalingFactor) || force) { - reverseAPIKeys.append("rfScalingFactor"); - } - if ((settings.m_fmExcursion != m_settings.m_fmExcursion) || force) { - reverseAPIKeys.append("fmExcursion"); - } - if ((settings.m_forceDecimator != m_settings.m_forceDecimator) || force) { - reverseAPIKeys.append("forceDecimator"); - } - if ((settings.m_showOverlayText != m_settings.m_showOverlayText) || force) { - reverseAPIKeys.append("showOverlayText"); - } - if ((settings.m_overlayText != m_settings.m_overlayText) || force) { - reverseAPIKeys.append("overlayText"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -349,28 +266,26 @@ void ATVMod::applySettings(const ATVModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - ATVModBaseband::MsgConfigureATVModBaseband *msg = ATVModBaseband::MsgConfigureATVModBaseband::create(settings, force); + ATVModBaseband::MsgConfigureATVModBaseband *msg = ATVModBaseband::MsgConfigureATVModBaseband::create(settingsKeys,settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -385,14 +300,14 @@ bool ATVMod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureATVMod *msg = MsgConfigureATVMod::create(m_settings, true); + MsgConfigureATVMod *msg = MsgConfigureATVMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureATVMod *msg = MsgConfigureATVMod::create(m_settings, true); + MsgConfigureATVMod *msg = MsgConfigureATVMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -435,12 +350,12 @@ int ATVMod::webapiSettingsPutPatch( m_inputMessageQueue.push(msgChan); } - MsgConfigureATVMod *msg = MsgConfigureATVMod::create(settings, force); + MsgConfigureATVMod *msg = MsgConfigureATVMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureATVMod *msgToGUI = MsgConfigureATVMod::create(settings, force); + MsgConfigureATVMod *msgToGUI = MsgConfigureATVMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -676,7 +591,7 @@ void ATVMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getAtvModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void ATVMod::webapiReverseSendSettings(QList& channelSettingsKeys, const ATVModSettings& settings, bool force) +void ATVMod::webapiReverseSendSettings(const QList& channelSettingsKeys, const ATVModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -703,7 +618,7 @@ void ATVMod::webapiReverseSendSettings(QList& channelSettingsKeys, cons void ATVMod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const ATVModSettings& settings, bool force) { @@ -727,7 +642,7 @@ void ATVMod::sendChannelSettings( } void ATVMod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const ATVModSettings& settings, bool force diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h index 164b8a010..a96963d0c 100644 --- a/plugins/channeltx/modatv/atvmod.h +++ b/plugins/channeltx/modatv/atvmod.h @@ -46,20 +46,23 @@ public: public: const ATVModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureATVMod* create(const ATVModSettings& settings, bool force) + static MsgConfigureATVMod* create(const QStringList& settingsKeys, const ATVModSettings& settings, bool force) { - return new MsgConfigureATVMod(settings, force); + return new MsgConfigureATVMod(settingsKeys, settings, force); } private: ATVModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureATVMod(const ATVModSettings& settings, bool force) : + MsgConfigureATVMod(const QStringList& settingsKeys, const ATVModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -324,17 +327,17 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const ATVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ATVModSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const ATVModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const ATVModSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const ATVModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const ATVModSettings& settings, bool force diff --git a/plugins/channeltx/modatv/atvmodbaseband.cpp b/plugins/channeltx/modatv/atvmodbaseband.cpp index 9eea0390d..fd17603e8 100644 --- a/plugins/channeltx/modatv/atvmodbaseband.cpp +++ b/plugins/channeltx/modatv/atvmodbaseband.cpp @@ -145,7 +145,7 @@ bool ATVModBaseband::handleMessage(const Message& cmd) MsgConfigureATVModBaseband& cfg = (MsgConfigureATVModBaseband&) cmd; qDebug() << "AMModBaseband::handleMessage: MsgConfigureATVModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -227,32 +227,17 @@ bool ATVModBaseband::handleMessage(const Message& cmd) } } -void ATVModBaseband::applySettings(const ATVModSettings& settings, bool force) +void ATVModBaseband::applySettings(const QStringList& settingsKeys, const ATVModSettings& settings, bool force) { - qDebug() << "ATVModBaseband::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_rfOppBandwidth: " << settings.m_rfOppBandwidth - << " m_atvStd: " << (int) settings.m_atvStd - << " m_nbLines: " << settings.m_nbLines - << " m_fps: " << settings.m_fps - << " m_atvModInput: " << (int) settings.m_atvModInput - << " m_uniformLevel: " << settings.m_uniformLevel - << " m_atvModulation: " << (int) settings.m_atvModulation - << " m_videoPlayLoop: " << settings.m_videoPlayLoop - << " m_videoPlay: " << settings.m_videoPlay - << " m_cameraPlay: " << settings.m_cameraPlay - << " m_channelMute: " << settings.m_channelMute - << " m_invertedVideo: " << settings.m_invertedVideo - << " m_rfScalingFactor: " << settings.m_rfScalingFactor - << " m_fmExcursion: " << settings.m_fmExcursion - << " m_forceDecimator: " << settings.m_forceDecimator - << " m_showOverlayText: " << settings.m_showOverlayText - << " m_overlayText: " << settings.m_overlayText - << " force: " << force; + qDebug() << "ATVModBaseband::applySettings:" << settings.getDebugString(settingsKeys, force); - m_source.applySettings(settings, force); - m_settings = settings; + m_source.applySettings(settingsKeys, settings, force); + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int ATVModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modatv/atvmodbaseband.h b/plugins/channeltx/modatv/atvmodbaseband.h index 68dca07c9..a76e94d6a 100644 --- a/plugins/channeltx/modatv/atvmodbaseband.h +++ b/plugins/channeltx/modatv/atvmodbaseband.h @@ -39,20 +39,23 @@ public: public: const ATVModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureATVModBaseband* create(const ATVModSettings& settings, bool force) + static MsgConfigureATVModBaseband* create(const QStringList& settingsKeys, const ATVModSettings& settings, bool force) { - return new MsgConfigureATVModBaseband(settings, force); + return new MsgConfigureATVModBaseband(settingsKeys, settings, force); } private: ATVModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureATVModBaseband(const ATVModSettings& settings, bool force) : + MsgConfigureATVModBaseband(const QStringList& settingsKeys, const ATVModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -242,7 +245,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const ATVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ATVModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modatv/atvmodgui.cpp b/plugins/channeltx/modatv/atvmodgui.cpp index 409b2e7c6..8979604d1 100644 --- a/plugins/channeltx/modatv/atvmodgui.cpp +++ b/plugins/channeltx/modatv/atvmodgui.cpp @@ -124,7 +124,7 @@ ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -149,14 +149,14 @@ bool ATVModGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); // will have true + applySettings(QStringList(), true); return true; } else { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); // will have true + applySettings(QStringList(), true); return false; } } @@ -260,7 +260,7 @@ void ATVModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void ATVModGUI::setRFFiltersSlidersRange(int sampleRate) @@ -458,7 +458,7 @@ void ATVModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = value; updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void ATVModGUI::on_modulation_currentIndexChanged(int index) @@ -466,21 +466,21 @@ void ATVModGUI::on_modulation_currentIndexChanged(int index) m_settings.m_atvModulation = (ATVModSettings::ATVModulation) index; setRFFiltersSlidersRange(m_atvMod->getEffectiveSampleRate()); setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("atvModulation")); } void ATVModGUI::on_rfScaling_valueChanged(int value) { ui->rfScalingText->setText(tr("%1").arg(value)); m_settings.m_rfScalingFactor = value * 327.68f; - applySettings(); + applySettings(QStringList("rfScalingFactor")); } void ATVModGUI::on_fmExcursion_valueChanged(int value) { ui->fmExcursionText->setText(tr("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmExcursion = value / 1000.0; // pro mill - applySettings(); + applySettings(QStringList("fmExcursion")); } void ATVModGUI::on_rfBW_valueChanged(int value) @@ -488,7 +488,7 @@ void ATVModGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg((value*m_rfSliderDivisor) / 1000.0, 0, 'f', 1)); m_settings.m_rfBandwidth = value * m_rfSliderDivisor * 1.0f; setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("rfBandwidth")); } void ATVModGUI::on_rfOppBW_valueChanged(int value) @@ -496,7 +496,7 @@ void ATVModGUI::on_rfOppBW_valueChanged(int value) ui->rfOppBWText->setText(QString("%1k").arg((value*m_rfSliderDivisor) / 1000.0, 0, 'f', 1)); m_settings.m_rfOppBandwidth = value * m_rfSliderDivisor * 1.0f; setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("rfOppBandwidth")); } void ATVModGUI::setChannelMarkerBandwidth() @@ -534,52 +534,52 @@ void ATVModGUI::on_nbLines_currentIndexChanged(int index) { (void) index; m_settings.m_nbLines = getNbLines(); - applySettings(); + applySettings(QStringList("nbLines")); } void ATVModGUI::on_fps_currentIndexChanged(int index) { (void) index; m_settings.m_fps = getFPS(); - applySettings(); + applySettings(QStringList("fps")); } void ATVModGUI::on_standard_currentIndexChanged(int index) { m_settings.m_atvStd = (ATVModSettings::ATVStd) index; - applySettings(); + applySettings(QStringList("atvStd")); } void ATVModGUI::on_uniformLevel_valueChanged(int value) { ui->uniformLevelText->setText(QString("%1").arg(value)); m_settings.m_uniformLevel = value / 100.0f; - applySettings(); + applySettings(QStringList("uniformLevel")); } void ATVModGUI::on_invertVideo_clicked(bool checked) { m_settings.m_invertedVideo = checked; - applySettings(); + applySettings(QStringList("invertedVideo")); } void ATVModGUI::on_inputSelect_currentIndexChanged(int index) { m_settings.m_atvModInput = (ATVModSettings::ATVModInput) index; - applySettings(); + applySettings(QStringList("atvModInput")); } void ATVModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void ATVModGUI::on_forceDecimator_toggled(bool checked) { m_settings.m_forceDecimator = checked; - applySettings(); + applySettings(QStringList("forceDecimator")); } void ATVModGUI::on_imageFileDialog_clicked(bool checked) @@ -613,7 +613,7 @@ void ATVModGUI::on_videoFileDialog_clicked(bool checked) void ATVModGUI::on_playLoop_toggled(bool checked) { m_settings.m_videoPlayLoop = checked; - applySettings(); + applySettings(QStringList("videoPlayLoop")); } void ATVModGUI::on_playVideo_toggled(bool checked) @@ -621,7 +621,7 @@ void ATVModGUI::on_playVideo_toggled(bool checked) m_settings.m_videoPlay = checked; ui->navTimeSlider->setEnabled(!checked); m_enableNavTime = !checked; - applySettings(); + applySettings(QStringList("videoPlay")); } void ATVModGUI::on_navTimeSlider_valueChanged(int value) @@ -636,7 +636,7 @@ void ATVModGUI::on_navTimeSlider_valueChanged(int value) void ATVModGUI::on_playCamera_toggled(bool checked) { m_settings.m_cameraPlay = checked; - applySettings(); + applySettings(QStringList("cameraPlay")); } void ATVModGUI::on_camSelect_currentIndexChanged(int index) @@ -667,14 +667,14 @@ void ATVModGUI::on_cameraManualFPS_valueChanged(int value) void ATVModGUI::on_overlayTextShow_toggled(bool checked) { m_settings.m_showOverlayText = checked; - applySettings(); + applySettings(QStringList("showOverlayText")); } void ATVModGUI::on_overlayText_textEdited(const QString& arg1) { (void) arg1; m_settings.m_overlayText = arg1; - applySettings(); + applySettings(QStringList("overlayText")); } void ATVModGUI::configureImageFileName() @@ -697,7 +697,7 @@ void ATVModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void ATVModGUI::onMenuDialogCalled(const QPoint &p) @@ -742,7 +742,9 @@ void ATVModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", + "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -753,7 +755,7 @@ void ATVModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void ATVModGUI::applySettings(bool force) +void ATVModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { @@ -761,7 +763,7 @@ void ATVModGUI::applySettings(bool force) m_channelMarker.getCenterFrequency()); m_atvMod->getInputMessageQueue()->push(msgChan); - ATVMod::MsgConfigureATVMod *msg = ATVMod::MsgConfigureATVMod::create(m_settings, force); + ATVMod::MsgConfigureATVMod *msg = ATVMod::MsgConfigureATVMod::create(settingsKeys, m_settings, force); m_atvMod->getInputMessageQueue()->push(msg); } } diff --git a/plugins/channeltx/modatv/atvmodgui.h b/plugins/channeltx/modatv/atvmodgui.h index f2f7ee676..6c43709c9 100644 --- a/plugins/channeltx/modatv/atvmodgui.h +++ b/plugins/channeltx/modatv/atvmodgui.h @@ -92,7 +92,7 @@ private: virtual ~ATVModGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void updateWithStreamData(); void updateWithStreamTime(); diff --git a/plugins/channeltx/modatv/atvmodsettings.cpp b/plugins/channeltx/modatv/atvmodsettings.cpp index ab7bad8dd..8a7c38789 100644 --- a/plugins/channeltx/modatv/atvmodsettings.cpp +++ b/plugins/channeltx/modatv/atvmodsettings.cpp @@ -187,3 +187,204 @@ bool ATVModSettings::deserialize(const QByteArray& data) return false; } } + +void ATVModSettings::applySettings(const QStringList& settingsKeys, const ATVModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("rfOppBandwidth")) { + m_rfOppBandwidth = settings.m_rfOppBandwidth; + } + if (settingsKeys.contains("atvStd")) { + m_atvStd = settings.m_atvStd; + } + if (settingsKeys.contains("nbLines")) { + m_nbLines = settings.m_nbLines; + } + if (settingsKeys.contains("fps")) { + m_fps = settings.m_fps; + } + if (settingsKeys.contains("atvModInput")) { + m_atvModInput = settings.m_atvModInput; + } + if (settingsKeys.contains("uniformLevel")) { + m_uniformLevel = settings.m_uniformLevel; + } + if (settingsKeys.contains("atvModulation")) { + m_atvModulation = settings.m_atvModulation; + } + if (settingsKeys.contains("videoPlayLoop")) { + m_videoPlayLoop = settings.m_videoPlayLoop; + } + if (settingsKeys.contains("videoPlay")) { + m_videoPlay = settings.m_videoPlay; + } + if (settingsKeys.contains("cameraPlay")) { + m_cameraPlay = settings.m_cameraPlay; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("invertedVideo")) { + m_invertedVideo = settings.m_invertedVideo; + } + if (settingsKeys.contains("rfScalingFactor")) { + m_rfScalingFactor = settings.m_rfScalingFactor; + } + if (settingsKeys.contains("fmExcursion")) { + m_fmExcursion = settings.m_fmExcursion; + } + if (settingsKeys.contains("forceDecimator")) { + m_forceDecimator = settings.m_forceDecimator; + } + if (settingsKeys.contains("showOverlayText")) { + m_showOverlayText = settings.m_showOverlayText; + } + if (settingsKeys.contains("overlayText")) { + m_overlayText = settings.m_overlayText; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("imageFileName")) { + m_imageFileName = settings.m_imageFileName; + } + if (settingsKeys.contains("videoFileName")) { + m_videoFileName = settings.m_videoFileName; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString ATVModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("rfOppBandwidth") || force) { + ostr << " m_rfOppBandwidth: " << m_rfOppBandwidth; + } + if (settingsKeys.contains("atvStd") || force) { + ostr << " m_atvStd: " << m_atvStd; + } + if (settingsKeys.contains("nbLines") || force) { + ostr << " m_nbLines: " << m_nbLines; + } + if (settingsKeys.contains("fps") || force) { + ostr << " m_fps: " << m_fps; + } + if (settingsKeys.contains("atvModInput") || force) { + ostr << " m_atvModInput: " << m_atvModInput; + } + if (settingsKeys.contains("uniformLevel") || force) { + ostr << " m_uniformLevel: " << m_uniformLevel; + } + if (settingsKeys.contains("atvModulation") || force) { + ostr << " m_atvModulation: " << m_atvModulation; + } + if (settingsKeys.contains("videoPlayLoop") || force) { + ostr << " m_videoPlayLoop: " << m_videoPlayLoop; + } + if (settingsKeys.contains("videoPlay") || force) { + ostr << " m_videoPlay: " << m_videoPlay; + } + if (settingsKeys.contains("cameraPlay") || force) { + ostr << " m_cameraPlay: " << m_cameraPlay; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("invertedVideo") || force) { + ostr << " m_invertedVideo: " << m_invertedVideo; + } + if (settingsKeys.contains("rfScalingFactor") || force) { + ostr << " m_rfScalingFactor: " << m_rfScalingFactor; + } + if (settingsKeys.contains("fmExcursion") || force) { + ostr << " m_fmExcursion: " << m_fmExcursion; + } + if (settingsKeys.contains("forceDecimator") || force) { + ostr << " m_forceDecimator: " << m_forceDecimator; + } + if (settingsKeys.contains("showOverlayText") || force) { + ostr << " m_showOverlayText: " << m_showOverlayText; + } + if (settingsKeys.contains("overlayText") || force) { + ostr << " m_overlayText: " << m_overlayText.toStdString(); + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("imageFileName") || force) { + ostr << " m_imageFileName: " << m_imageFileName.toStdString(); + } + if (settingsKeys.contains("videoFileName") || force) { + ostr << " m_videoFileName: " << m_videoFileName.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modatv/atvmodsettings.h b/plugins/channeltx/modatv/atvmodsettings.h index bece85709..00d6b03cf 100644 --- a/plugins/channeltx/modatv/atvmodsettings.h +++ b/plugins/channeltx/modatv/atvmodsettings.h @@ -103,6 +103,8 @@ struct ATVModSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const ATVModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* PLUGINS_CHANNELTX_MODATV_ATVMODSETTINGS_H_ */ diff --git a/plugins/channeltx/modatv/atvmodsource.cpp b/plugins/channeltx/modatv/atvmodsource.cpp index e4bd6fdc8..c43b61af3 100644 --- a/plugins/channeltx/modatv/atvmodsource.cpp +++ b/plugins/channeltx/modatv/atvmodsource.cpp @@ -145,7 +145,7 @@ ATVModSource::ATVModSource() : m_interpolatorDistance = 1.0f; applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); // does applyStandard() too; + applySettings(QStringList(), m_settings, true); // does applyStandard() too; m_lineType = getLineType(m_settings.m_atvStd, m_lineCount); } @@ -978,35 +978,15 @@ void ATVModSource::applyChannelSettings(int channelSampleRate, int channelFreque m_channelFrequencyOffset = channelFrequencyOffset; } -void ATVModSource::applySettings(const ATVModSettings& settings, bool force) +void ATVModSource::applySettings(const QStringList& settingsKeys, const ATVModSettings& settings, bool force) { - qDebug() << "ATVModSource::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_rfOppBandwidth: " << settings.m_rfOppBandwidth - << " m_atvStd: " << (int) settings.m_atvStd - << " m_nbLines: " << settings.m_nbLines - << " m_fps: " << settings.m_fps - << " m_atvModInput: " << (int) settings.m_atvModInput - << " m_uniformLevel: " << settings.m_uniformLevel - << " m_atvModulation: " << (int) settings.m_atvModulation - << " m_videoPlayLoop: " << settings.m_videoPlayLoop - << " m_videoPlay: " << settings.m_videoPlay - << " m_cameraPlay: " << settings.m_cameraPlay - << " m_channelMute: " << settings.m_channelMute - << " m_invertedVideo: " << settings.m_invertedVideo - << " m_rfScalingFactor: " << settings.m_rfScalingFactor - << " m_fmExcursion: " << settings.m_fmExcursion - << " m_forceDecimator: " << settings.m_forceDecimator - << " m_showOverlayText: " << settings.m_showOverlayText - << " m_overlayText: " << settings.m_overlayText - << " force: " << force; + qDebug() << "ATVModSource::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_atvStd != m_settings.m_atvStd) - || (settings.m_nbLines != m_settings.m_nbLines) - || (settings.m_fps != m_settings.m_fps) - || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_atvModulation != m_settings.m_atvModulation) || force) + if ((settingsKeys.contains("atvStd") && (settings.m_atvStd != m_settings.m_atvStd)) + || (settingsKeys.contains("nbLines") && (settings.m_nbLines != m_settings.m_nbLines)) + || (settingsKeys.contains("fps") && (settings.m_fps != m_settings.m_fps)) + || (settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) + || (settingsKeys.contains("atvModulation") && (settings.m_atvModulation != m_settings.m_atvModulation)) || force) { getBaseValues(m_channelSampleRate, settings.m_nbLines * settings.m_fps, m_tvSampleRate, m_pointsPerLine); @@ -1034,10 +1014,10 @@ void ATVModSource::applySettings(const ATVModSettings& settings, bool force) } } - if ((settings.m_rfOppBandwidth != m_settings.m_rfOppBandwidth) - || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_nbLines != m_settings.m_nbLines) // difference in line period may have changed TV sample rate - || (settings.m_fps != m_settings.m_fps) // + if ((settingsKeys.contains("rfOppBandwidth") && (settings.m_rfOppBandwidth != m_settings.m_rfOppBandwidth)) + || (settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) + || (settingsKeys.contains("nbLines") && (settings.m_nbLines != m_settings.m_nbLines)) // difference in line period may have changed TV sample rate + || (settingsKeys.contains("fps") && (settings.m_fps != m_settings.m_fps)) // || force) { m_DSBFilter->create_asym_filter( @@ -1048,7 +1028,7 @@ void ATVModSource::applySettings(const ATVModSettings& settings, bool force) m_DSBFilterBufferIndex = 0; } - if ((settings.m_showOverlayText != m_settings.m_showOverlayText) || force) + if ((settingsKeys.contains("showOverlayText") && (settings.m_showOverlayText != m_settings.m_showOverlayText)) || force) { if (!m_imageFromFile.empty()) { @@ -1065,7 +1045,11 @@ void ATVModSource::applySettings(const ATVModSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void ATVModSource::reportVideoFileSourceStreamTiming() diff --git a/plugins/channeltx/modatv/atvmodsource.h b/plugins/channeltx/modatv/atvmodsource.h index 48d465d21..74e79e42f 100644 --- a/plugins/channeltx/modatv/atvmodsource.h +++ b/plugins/channeltx/modatv/atvmodsource.h @@ -64,7 +64,7 @@ public: } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const ATVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const ATVModSettings& settings, bool force = false); void openImage(const QString& fileName); void openVideo(const QString& fileName); void seekVideoFileStream(int seekPercentage); diff --git a/plugins/channeltx/moddatv/datvmod.cpp b/plugins/channeltx/moddatv/datvmod.cpp index 7968a9fe4..73ef86ef9 100644 --- a/plugins/channeltx/moddatv/datvmod.cpp +++ b/plugins/channeltx/moddatv/datvmod.cpp @@ -66,7 +66,7 @@ DATVMod::DATVMod(DeviceAPI *deviceAPI) : m_basebandSource = new DATVModBaseband(); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -164,7 +164,7 @@ bool DATVMod::handleMessage(const Message& cmd) MsgConfigureDATVMod& cfg = (MsgConfigureDATVMod&) cmd; qDebug() << "DATVMod::handleMessage: MsgConfigureDATVMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -228,102 +228,18 @@ void DATVMod::setCenterFrequency(qint64 frequency) { DATVModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) { - m_guiMessageQueue->push(MsgConfigureDATVMod::create(settings, false)); + m_guiMessageQueue->push(MsgConfigureDATVMod::create(QStringList("inputFrequencyOffset"), settings, false)); } } -void DATVMod::applySettings(const DATVModSettings& settings, bool force) +void DATVMod::applySettings(const QStringList& settingsKeys, const DATVModSettings& settings, bool force) { - qDebug() << "DATVMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_standard: " << (int) settings.m_standard - << " m_source: " << (int) settings.m_source - << " m_modulation: " << (int) settings.m_modulation - << " m_fec: " << (int) settings.m_fec - << " m_symbolRate: " << settings.m_symbolRate - << " m_rollOff: " << settings.m_rollOff - << " m_source: " << settings.m_source - << " m_imageFileName: " << settings.m_imageFileName - << " m_imageOverlayTimestamp: " << settings.m_imageOverlayTimestamp - << " m_imageServiceProvider: " << settings.m_imageServiceProvider - << " m_imageServiceName: " << settings.m_imageServiceName - << " m_imageCodec: " << (int) settings.m_imageCodec - << " m_tsFileName: " << settings.m_tsFileName - << " m_tsFilePlayLoop: " << settings.m_tsFilePlayLoop - << " m_tsFilePlay: " << settings.m_tsFilePlay - << " m_udpAddress: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " m_channelMute: " << settings.m_channelMute - << " force: " << force; + qDebug() << "DATVMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_standard != m_settings.m_standard) || force) { - reverseAPIKeys.append("standard"); - } - if ((settings.m_modulation != m_settings.m_modulation) || force) { - reverseAPIKeys.append("modulation"); - } - if ((settings.m_modulation != m_settings.m_modulation) || force) { - reverseAPIKeys.append("modulation"); - } - if ((settings.m_fec != m_settings.m_fec) || force) { - reverseAPIKeys.append("fec"); - } - if ((settings.m_symbolRate != m_settings.m_symbolRate) || force) { - reverseAPIKeys.append("symbolRate"); - } - if ((settings.m_rollOff != m_settings.m_rollOff) || force) { - reverseAPIKeys.append("rollOff"); - } - if ((settings.m_tsFilePlayLoop != m_settings.m_tsFilePlayLoop) || force) { - reverseAPIKeys.append("tsSource"); - } - if ((settings.m_imageFileName != m_settings.m_imageFileName) || force) { - reverseAPIKeys.append("imageFileName"); - } - if ((settings.m_imageOverlayTimestamp != m_settings.m_imageOverlayTimestamp) || force) { - reverseAPIKeys.append("imageOverlayTimestamp"); - } - if ((settings.m_imageServiceProvider != m_settings.m_imageServiceProvider) || force) { - reverseAPIKeys.append("imageServiceProvider"); - } - if ((settings.m_imageServiceName != m_settings.m_imageServiceName) || force) { - reverseAPIKeys.append("imageServiceName"); - } - if ((settings.m_imageCodec != m_settings.m_imageCodec) || force) { - reverseAPIKeys.append("imageCodec"); - } - if ((settings.m_tsFileName != m_settings.m_tsFileName) || force) { - reverseAPIKeys.append("tsFileName"); - } - if ((settings.m_tsFilePlayLoop != m_settings.m_tsFilePlayLoop) || force) { - reverseAPIKeys.append("tsFilePlayLoop"); - } - if ((settings.m_tsFilePlay != m_settings.m_tsFilePlay) || force) { - reverseAPIKeys.append("tsFilePlay"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -334,28 +250,26 @@ void DATVMod::applySettings(const DATVModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(settings, force); + MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -370,14 +284,14 @@ bool DATVMod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(m_settings, true); + MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(m_settings, true); + MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -420,11 +334,11 @@ int DATVMod::webapiSettingsPutPatch( m_inputMessageQueue.push(msgChan); } - MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(settings, force); + MsgConfigureDATVMod *msg = MsgConfigureDATVMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) { - m_guiMessageQueue->push(MsgConfigureDATVMod::create(settings, force)); + m_guiMessageQueue->push(MsgConfigureDATVMod::create(channelSettingsKeys, settings, force)); } if (channelSettingsKeys.contains("tsFileName")) @@ -641,7 +555,7 @@ void DATVMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getDatvModReport()->setUdpByteCount(udpBytes); } -void DATVMod::webapiReverseSendSettings(QList& channelSettingsKeys, const DATVModSettings& settings, bool force) +void DATVMod::webapiReverseSendSettings(const QList& channelSettingsKeys, const DATVModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -668,7 +582,7 @@ void DATVMod::webapiReverseSendSettings(QList& channelSettingsKeys, con void DATVMod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const DATVModSettings& settings, bool force) { @@ -692,7 +606,7 @@ void DATVMod::sendChannelSettings( } void DATVMod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DATVModSettings& settings, bool force diff --git a/plugins/channeltx/moddatv/datvmod.h b/plugins/channeltx/moddatv/datvmod.h index 5d8f49aff..e77eac989 100644 --- a/plugins/channeltx/moddatv/datvmod.h +++ b/plugins/channeltx/moddatv/datvmod.h @@ -46,20 +46,23 @@ public: public: const DATVModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDATVMod* create(const DATVModSettings& settings, bool force) + static MsgConfigureDATVMod* create(const QStringList& settingsKeys, const DATVModSettings& settings, bool force) { - return new MsgConfigureDATVMod(settings, force); + return new MsgConfigureDATVMod(settingsKeys, settings, force); } private: DATVModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDATVMod(const DATVModSettings& settings, bool force) : + MsgConfigureDATVMod(const QStringList& settingsKeys, const DATVModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -277,17 +280,17 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const DATVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DATVModSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const DATVModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const DATVModSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const DATVModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const DATVModSettings& settings, bool force diff --git a/plugins/channeltx/moddatv/datvmodbaseband.cpp b/plugins/channeltx/moddatv/datvmodbaseband.cpp index e4bf84606..aceda4bb0 100644 --- a/plugins/channeltx/moddatv/datvmodbaseband.cpp +++ b/plugins/channeltx/moddatv/datvmodbaseband.cpp @@ -135,7 +135,7 @@ bool DATVModBaseband::handleMessage(const Message& cmd) QMutexLocker mutexLocker(&m_mutex); DATVMod::MsgConfigureDATVMod& cfg = (DATVMod::MsgConfigureDATVMod&) cmd; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -201,9 +201,9 @@ bool DATVModBaseband::handleMessage(const Message& cmd) } } -void DATVModBaseband::applySettings(const DATVModSettings& settings, bool force) +void DATVModBaseband::applySettings(const QStringList& settingsKeys, const DATVModSettings& settings, bool force) { - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); m_settings = settings; } diff --git a/plugins/channeltx/moddatv/datvmodbaseband.h b/plugins/channeltx/moddatv/datvmodbaseband.h index c2478e07c..7d601d81a 100644 --- a/plugins/channeltx/moddatv/datvmodbaseband.h +++ b/plugins/channeltx/moddatv/datvmodbaseband.h @@ -70,7 +70,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const DATVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DATVModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/moddatv/datvmodgui.cpp b/plugins/channeltx/moddatv/datvmodgui.cpp index 520523f7a..4f33220da 100644 --- a/plugins/channeltx/moddatv/datvmodgui.cpp +++ b/plugins/channeltx/moddatv/datvmodgui.cpp @@ -112,7 +112,7 @@ DATVModGUI::DATVModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); if (!m_settings.m_tsFileName.isEmpty()) configureTsFileName(); @@ -138,7 +138,7 @@ bool DATVModGUI::deserialize(const QByteArray& data) if (m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); if (!m_settings.m_tsFileName.isEmpty()) configureTsFileName(); return true; @@ -147,7 +147,7 @@ bool DATVModGUI::deserialize(const QByteArray& data) { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return false; } } @@ -233,7 +233,7 @@ void DATVModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void DATVModGUI::handleSourceMessages() @@ -254,7 +254,7 @@ void DATVModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = value; updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void DATVModGUI::on_dvbStandard_currentIndexChanged(int index) @@ -305,7 +305,7 @@ void DATVModGUI::on_dvbStandard_currentIndexChanged(int index) m_doApplySettings = true; - applySettings(); + applySettings(QStringList("standard")); } void DATVModGUI::updateFEC() @@ -380,14 +380,14 @@ void DATVModGUI::on_modulation_currentIndexChanged(int index) updateFEC(); setImageBitrate(); m_doApplySettings = true; - applySettings(); + applySettings(QStringList("modulation")); } void DATVModGUI::on_rollOff_currentIndexChanged(int index) { (void) index; m_settings.m_rollOff = ui->rollOff->currentText().toFloat(); - applySettings(); + applySettings(QStringList("rollOff")); } void DATVModGUI::on_fec_currentIndexChanged(int index) @@ -395,14 +395,14 @@ void DATVModGUI::on_fec_currentIndexChanged(int index) (void) index; m_settings.m_fec = DATVModSettings::mapCodeRate(ui->fec->currentText()); setImageBitrate(); - applySettings(); + applySettings(QStringList("fec")); } void DATVModGUI::on_symbolRate_valueChanged(int value) { m_settings.m_symbolRate = value; setImageBitrate(); - applySettings(); + applySettings(QStringList("symbolRate")); } void DATVModGUI::on_rfBW_valueChanged(int value) @@ -410,7 +410,7 @@ void DATVModGUI::on_rfBW_valueChanged(int value) m_settings.m_rfBandwidth = value * 100000; ui->rfBWText->setText(QString("%1M").arg(m_settings.m_rfBandwidth / 1e6, 0, 'f', 1)); setChannelMarkerBandwidth(); - applySettings(); + applySettings(QStringList("rfBandwidth")); } void DATVModGUI::setChannelMarkerBandwidth() @@ -426,13 +426,13 @@ void DATVModGUI::on_inputSelect_currentIndexChanged(int index) { m_settings.m_source = (DATVModSettings::DATVSource) index; setImageBitrate(); - applySettings(); + applySettings(QStringList("source")); } void DATVModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void DATVModGUI::on_imageFileDialog_clicked(bool checked) @@ -447,32 +447,32 @@ void DATVModGUI::on_imageFileDialog_clicked(bool checked) m_settings.m_imageFileName = fileName; ui->tsImageFileText->setText(m_settings.m_imageFileName); m_settings.m_imageFileName = fileName; - applySettings(); + applySettings(QStringList("imageFileName")); } } void DATVModGUI::on_tsImageTimestamp_toggled(bool checked) { m_settings.m_imageOverlayTimestamp = checked; - applySettings(); + applySettings(QStringList("imageOverlayTimestamp")); } void DATVModGUI::on_imageServiceProvider_editingFinished() { m_settings.m_imageServiceProvider = ui->imageServiceProvider->text(); - applySettings(); + applySettings(QStringList("imageServiceProvider")); } void DATVModGUI::on_imageServiceName_editingFinished() { m_settings.m_imageServiceName = ui->imageServiceName->text(); - applySettings(); + applySettings(QStringList("imageServiceName")); } void DATVModGUI::on_imageCodec_currentIndexChanged(int index) { m_settings.m_imageCodec = (DATVModSettings::DATVCodec) index; - applySettings(); + applySettings(QStringList("imageCodec")); } void DATVModGUI::on_tsFileDialog_clicked(bool checked) @@ -493,7 +493,7 @@ void DATVModGUI::on_tsFileDialog_clicked(bool checked) void DATVModGUI::on_playLoop_toggled(bool checked) { m_settings.m_tsFilePlayLoop = checked; - applySettings(); + applySettings(QStringList("tsFilePlayLoop")); } void DATVModGUI::on_playFile_toggled(bool checked) @@ -501,7 +501,7 @@ void DATVModGUI::on_playFile_toggled(bool checked) m_settings.m_tsFilePlay = checked; ui->navTimeSlider->setEnabled(!checked); m_enableNavTime = !checked; - applySettings(); + applySettings(QStringList("tsFilePlay")); } void DATVModGUI::on_navTimeSlider_valueChanged(int value) @@ -522,13 +522,13 @@ void DATVModGUI::configureTsFileName() void DATVModGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void DATVModGUI::on_udpPort_valueChanged(int value) { m_settings.m_udpPort = value; - applySettings(); + applySettings(QStringList("udpPort")); } void DATVModGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -537,7 +537,7 @@ void DATVModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void DATVModGUI::onMenuDialogCalled(const QPoint &p) @@ -582,7 +582,10 @@ void DATVModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", + "reverseAPIAddress", "reverseAPIPort", + "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); @@ -593,7 +596,7 @@ void DATVModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void DATVModGUI::applySettings(bool force) +void DATVModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { @@ -601,7 +604,7 @@ void DATVModGUI::applySettings(bool force) m_channelMarker.getCenterFrequency()); m_datvMod->getInputMessageQueue()->push(msgChan); - DATVMod::MsgConfigureDATVMod *msg = DATVMod::MsgConfigureDATVMod::create(m_settings, force); + DATVMod::MsgConfigureDATVMod *msg = DATVMod::MsgConfigureDATVMod::create(settingsKeys, m_settings, force); m_datvMod->getInputMessageQueue()->push(msg); } } diff --git a/plugins/channeltx/moddatv/datvmodgui.h b/plugins/channeltx/moddatv/datvmodgui.h index 016f94986..caef5f3a2 100644 --- a/plugins/channeltx/moddatv/datvmodgui.h +++ b/plugins/channeltx/moddatv/datvmodgui.h @@ -92,7 +92,7 @@ private: virtual ~DATVModGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void updateWithStreamData(); void updateWithStreamTime(); diff --git a/plugins/channeltx/moddatv/datvmodsettings.cpp b/plugins/channeltx/moddatv/datvmodsettings.cpp index fc75581a3..eb6addab7 100644 --- a/plugins/channeltx/moddatv/datvmodsettings.cpp +++ b/plugins/channeltx/moddatv/datvmodsettings.cpp @@ -355,3 +355,192 @@ int DATVModSettings::getDVBSDataBitrate() const return std::round(m_symbolRate * bitsPerSymbol * fecFactor * plFactor); } + +void DATVModSettings::applySettings(const QStringList& settingsKeys, const DATVModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("standard")) { + m_standard = settings.m_standard; + } + if (settingsKeys.contains("modulation")) { + m_modulation = settings.m_modulation; + } + if (settingsKeys.contains("fec")) { + m_fec = settings.m_fec; + } + if (settingsKeys.contains("symbolRate")) { + m_symbolRate = settings.m_symbolRate; + } + if (settingsKeys.contains("rollOff")) { + m_rollOff = settings.m_rollOff; + } + if (settingsKeys.contains("source")) { + m_source = settings.m_source; + } + if (settingsKeys.contains("imageFileName")) { + m_imageFileName = settings.m_imageFileName; + } + if (settingsKeys.contains("imageOverlayTimestamp")) { + m_imageOverlayTimestamp = settings.m_imageOverlayTimestamp; + } + if (settingsKeys.contains("imageServiceProvider")) { + m_imageServiceProvider = settings.m_imageServiceProvider; + } + if (settingsKeys.contains("imageServiceName")) { + m_imageServiceName = settings.m_imageServiceName; + } + if (settingsKeys.contains("imageCodec")) { + m_imageCodec = settings.m_imageCodec; + } + if (settingsKeys.contains("tsFileName")) { + m_tsFileName = settings.m_tsFileName; + } + if (settingsKeys.contains("tsFilePlayLoop")) { + m_tsFilePlayLoop = settings.m_tsFilePlayLoop; + } + if (settingsKeys.contains("tsFilePlay")) { + m_tsFilePlay = settings.m_tsFilePlay; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString DATVModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("standard") || force) { + ostr << " m_standard: " << m_standard; + } + if (settingsKeys.contains("modulation") || force) { + ostr << " m_modulation: " << m_modulation; + } + if (settingsKeys.contains("fec") || force) { + ostr << " m_fec: " << m_fec; + } + if (settingsKeys.contains("symbolRate") || force) { + ostr << " m_symbolRate: " << m_symbolRate; + } + if (settingsKeys.contains("rollOff") || force) { + ostr << " m_rollOff: " << m_rollOff; + } + if (settingsKeys.contains("source") || force) { + ostr << " m_source: " << m_source; + } + if (settingsKeys.contains("imageFileName") || force) { + ostr << " m_imageFileName: " << m_imageFileName.toStdString(); + } + if (settingsKeys.contains("imageOverlayTimestamp") || force) { + ostr << " m_imageOverlayTimestamp: " << m_imageOverlayTimestamp; + } + if (settingsKeys.contains("imageServiceProvider") || force) { + ostr << " m_imageServiceProvider: " << m_imageServiceProvider.toStdString(); + } + if (settingsKeys.contains("imageServiceName") || force) { + ostr << " m_imageServiceName: " << m_imageServiceName.toStdString(); + } + if (settingsKeys.contains("imageCodec") || force) { + ostr << " m_imageCodec: " << m_imageCodec; + } + if (settingsKeys.contains("tsFileName") || force) { + ostr << " m_tsFileName: " << m_tsFileName.toStdString(); + } + if (settingsKeys.contains("tsFilePlayLoop") || force) { + ostr << " m_tsFilePlayLoop: " << m_tsFilePlayLoop; + } + if (settingsKeys.contains("tsFilePlay") || force) { + ostr << " m_tsFilePlay: " << m_tsFilePlay; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/moddatv/datvmodsettings.h b/plugins/channeltx/moddatv/datvmodsettings.h index 21316d466..2739bcf5f 100644 --- a/plugins/channeltx/moddatv/datvmodsettings.h +++ b/plugins/channeltx/moddatv/datvmodsettings.h @@ -126,6 +126,8 @@ struct DATVModSettings static QString mapCodeRate(DATVCodeRate codeRate); static DATVModulation mapModulation(const QString& string); static QString mapModulation(DATVModulation modulation); + void applySettings(const QStringList& settingsKeys, const DATVModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static const int m_udpBufferSize = 5000000; diff --git a/plugins/channeltx/moddatv/datvmodsource.cpp b/plugins/channeltx/moddatv/datvmodsource.cpp index 9f1d6e739..63ec75257 100644 --- a/plugins/channeltx/moddatv/datvmodsource.cpp +++ b/plugins/channeltx/moddatv/datvmodsource.cpp @@ -239,7 +239,7 @@ DATVModSource::DATVModSource() : m_interpolatorDistance = 1.0f; applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); } DATVModSource::~DATVModSource() @@ -688,32 +688,13 @@ void DATVModSource::applyChannelSettings(int channelSampleRate, int channelFrequ m_pulseShapeQ.create(m_settings.m_rollOff, 8, m_samplesPerSymbol, RootRaisedCosine::Energy); } -void DATVModSource::applySettings(const DATVModSettings& settings, bool force) +void DATVModSource::applySettings(const QStringList& settingsKeys, const DATVModSettings& settings, bool force) { - qDebug() << "DATVModSource::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_source: " << (int) settings.m_source - << " m_standard: " << (int) settings.m_standard - << " m_modulation: " << (int) settings.m_modulation - << " m_fec: " << (int) settings.m_fec - << " m_symbolRate: " << (int) settings.m_symbolRate - << " m_rollOff: " << (int) settings.m_rollOff - << " m_imageFileName: " << settings.m_imageFileName - << " m_imageOverlayTimestamp: " << settings.m_imageOverlayTimestamp - << " m_imageServiceProvider: " << settings.m_imageServiceProvider - << " m_imageServiceName: " << settings.m_imageServiceName - << " m_tsFileName: " << settings.m_tsFileName - << " m_tsFilePlayLoop: " << settings.m_tsFilePlayLoop - << " m_tsFilePlay: " << settings.m_tsFilePlay - << " m_udpAddress: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " m_channelMute: " << settings.m_channelMute - << " force: " << force; + qDebug() << "DATVModSource::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_modulation != m_settings.m_modulation) - || (settings.m_symbolRate != m_settings.m_symbolRate) + if ((settingsKeys.contains("m_rfBandwidth") && settings.m_rfBandwidth != m_settings.m_rfBandwidth) + || (settingsKeys.contains("m_modulation") && settings.m_modulation != m_settings.m_modulation) + || (settingsKeys.contains("m_symbolRate") && settings.m_symbolRate != m_settings.m_symbolRate) || force) { if (settings.m_symbolRate > 0) @@ -737,9 +718,9 @@ void DATVModSource::applySettings(const DATVModSettings& settings, bool force) qWarning() << "DATVModSource::applySettings: symbolRate must be greater than 0."; } - if ((settings.m_source != m_settings.m_source) - || (settings.m_udpAddress != m_settings.m_udpAddress) - || (settings.m_udpPort != m_settings.m_udpPort) + if ((settingsKeys.contains("m_source") && settings.m_source != m_settings.m_source) + || (settingsKeys.contains("m_udpAddress") && settings.m_udpAddress != m_settings.m_udpAddress) + || (settingsKeys.contains("m_udpPort") && settings.m_udpPort != m_settings.m_udpPort) || force) { if (m_udpSocket) @@ -759,8 +740,8 @@ void DATVModSource::applySettings(const DATVModSettings& settings, bool force) } } - if ((settings.m_standard != m_settings.m_standard) - || (settings.m_modulation != m_settings.m_modulation) + if ((settingsKeys.contains("m_standard") && settings.m_standard != m_settings.m_standard) + || (settingsKeys.contains("m_modulation") && settings.m_modulation != m_settings.m_modulation) || force) { m_symbolSel = 0; @@ -769,10 +750,10 @@ void DATVModSource::applySettings(const DATVModSettings& settings, bool force) m_sampleIdx = 0; } - if ((settings.m_standard != m_settings.m_standard) - || (settings.m_modulation != m_settings.m_modulation) - || (settings.m_fec != m_settings.m_fec) - || (settings.m_rollOff != m_settings.m_rollOff) + if ((settingsKeys.contains("m_standard") && settings.m_standard != m_settings.m_standard) + || (settingsKeys.contains("m_modulation") && settings.m_modulation != m_settings.m_modulation) + || (settingsKeys.contains("m_fec") && settings.m_fec != m_settings.m_fec) + || (settingsKeys.contains("m_rollOff") && settings.m_rollOff != m_settings.m_rollOff) || force) { if (settings.m_standard == DATVModSettings::DVB_S) @@ -884,15 +865,15 @@ void DATVModSource::applySettings(const DATVModSettings& settings, bool force) } } - if (settings.m_imageServiceProvider != m_settings.m_imageServiceProvider || force) { + if ((settingsKeys.contains("m_imageServiceProvider") && settings.m_imageServiceProvider != m_settings.m_imageServiceProvider) || force) { m_tsGenerator.set_service_provider(settings.m_imageServiceProvider.toStdString()); } - if (settings.m_imageServiceName != m_settings.m_imageServiceName || force) { + if ((settingsKeys.contains("m_imageServiceName") && settings.m_imageServiceName != m_settings.m_imageServiceName) || force) { m_tsGenerator.set_service_name(settings.m_imageServiceName.toStdString()); } - if (settings.m_imageCodec != m_settings.m_imageCodec || force) { + if ((settingsKeys.contains("m_imageCodec") && settings.m_imageCodec != m_settings.m_imageCodec) || force) { m_tsGenerator.set_codec(settings.m_imageCodec); } diff --git a/plugins/channeltx/moddatv/datvmodsource.h b/plugins/channeltx/moddatv/datvmodsource.h index 06defaf00..706daff1e 100644 --- a/plugins/channeltx/moddatv/datvmodsource.h +++ b/plugins/channeltx/moddatv/datvmodsource.h @@ -67,7 +67,7 @@ public: int getDataRate() const { return getDVBSDataBitrate(m_settings); } void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const DATVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DATVModSettings& settings, bool force = false); void openTsFile(const QString& fileName); void seekTsFileStream(int seekPercentage); void reportTsFileSourceStreamTiming(); diff --git a/plugins/channeltx/modfreedv/freedvmod.cpp b/plugins/channeltx/modfreedv/freedvmod.cpp index 59ab0e8b0..b722a1e30 100644 --- a/plugins/channeltx/modfreedv/freedvmod.cpp +++ b/plugins/channeltx/modfreedv/freedvmod.cpp @@ -68,7 +68,7 @@ FreeDVMod::FreeDVMod(DeviceAPI *deviceAPI) : m_basebandSource->setInputFileStream(&m_ifstream); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -138,11 +138,11 @@ void FreeDVMod::setCenterFrequency(qint64 frequency) { FreeDVModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFreeDVMod *msgToGUI = MsgConfigureFreeDVMod::create(settings, false); + MsgConfigureFreeDVMod *msgToGUI = MsgConfigureFreeDVMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -154,7 +154,7 @@ bool FreeDVMod::handleMessage(const Message& cmd) MsgConfigureFreeDVMod& cfg = (MsgConfigureFreeDVMod&) cmd; qDebug() << "FreeDVMod::handleMessage: MsgConfigureFreeDVMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -259,57 +259,9 @@ void FreeDVMod::seekFileStream(int seekPercentage) } } -void FreeDVMod::applySettings(const FreeDVModSettings& settings, bool force) +void FreeDVMod::applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force) { - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { - reverseAPIKeys.append("toneFrequency"); - } - if ((settings.m_volumeFactor != m_settings.m_volumeFactor) || force) { - reverseAPIKeys.append("volumeFactor"); - } - if ((settings.m_spanLog2 != m_settings.m_spanLog2) || force) { - reverseAPIKeys.append("spanLog2"); - } - if ((settings.m_audioMute != m_settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((settings.m_playLoop != m_settings.m_playLoop) || force) { - reverseAPIKeys.append("playLoop"); - } - if ((settings.m_playLoop != m_settings.m_gaugeInputElseModem) || force) { - reverseAPIKeys.append("gaugeInputElseModem"); - } - if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((settings.m_freeDVMode != m_settings.m_freeDVMode) || force) { - reverseAPIKeys.append("freeDVMode"); - } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) { - reverseAPIKeys.append("modAFInput"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { - reverseAPIKeys.append("toneFrequency"); - } - if ((m_settings.m_freeDVMode != settings.m_freeDVMode) || force) { - reverseAPIKeys.append("freeDVMode"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -320,12 +272,10 @@ void FreeDVMod::applySettings(const FreeDVModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - if ((settings.m_freeDVMode != m_settings.m_freeDVMode) - || (settings.m_spanLog2 != m_settings.m_spanLog2) || force) + if ((settingsKeys.contains("freeDVMode") && settings.m_freeDVMode != m_settings.m_freeDVMode) + || (settingsKeys.contains("spanLog2") && settings.m_spanLog2 != m_settings.m_spanLog2) || force) { DSPSignalNotification *msg = new DSPSignalNotification( FreeDVModSettings::getModSampleRate(settings.m_freeDVMode)/(1<push(msg); } - FreeDVModBaseband::MsgConfigureFreeDVModBaseband *msg = FreeDVModBaseband::MsgConfigureFreeDVModBaseband::create(settings, force); + FreeDVModBaseband::MsgConfigureFreeDVModBaseband *msg = FreeDVModBaseband::MsgConfigureFreeDVModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -365,14 +315,14 @@ bool FreeDVMod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureFreeDVMod *msg = MsgConfigureFreeDVMod::create(m_settings, true); + MsgConfigureFreeDVMod *msg = MsgConfigureFreeDVMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureFreeDVMod *msg = MsgConfigureFreeDVMod::create(m_settings, true); + MsgConfigureFreeDVMod *msg = MsgConfigureFreeDVMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -429,12 +379,12 @@ int FreeDVMod::webapiSettingsPutPatch( } } - MsgConfigureFreeDVMod *msg = MsgConfigureFreeDVMod::create(settings, force); + MsgConfigureFreeDVMod *msg = MsgConfigureFreeDVMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureFreeDVMod *msgToGUI = MsgConfigureFreeDVMod::create(settings, force); + MsgConfigureFreeDVMod *msgToGUI = MsgConfigureFreeDVMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -616,7 +566,7 @@ void FreeDVMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons response.getFreeDvModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void FreeDVMod::webapiReverseSendSettings(QList& channelSettingsKeys, const FreeDVModSettings& settings, bool force) +void FreeDVMod::webapiReverseSendSettings(const QList& channelSettingsKeys, const FreeDVModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -675,7 +625,7 @@ void FreeDVMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettin void FreeDVMod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FreeDVModSettings& settings, bool force) { @@ -699,7 +649,7 @@ void FreeDVMod::sendChannelSettings( } void FreeDVMod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FreeDVModSettings& settings, bool force diff --git a/plugins/channeltx/modfreedv/freedvmod.h b/plugins/channeltx/modfreedv/freedvmod.h index a4bdb1fa3..7350f8cdd 100644 --- a/plugins/channeltx/modfreedv/freedvmod.h +++ b/plugins/channeltx/modfreedv/freedvmod.h @@ -51,20 +51,23 @@ public: public: const FreeDVModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFreeDVMod* create(const FreeDVModSettings& settings, bool force) + static MsgConfigureFreeDVMod* create(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force) { - return new MsgConfigureFreeDVMod(settings, force); + return new MsgConfigureFreeDVMod(settingsKeys, settings, force); } private: FreeDVModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFreeDVMod(const FreeDVModSettings& settings, bool force) : + MsgConfigureFreeDVMod(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -273,20 +276,20 @@ private: QNetworkRequest m_networkRequest; virtual bool handleMessage(const Message& cmd); - void applySettings(const FreeDVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force = false); void openFileStream(); void seekFileStream(int seekPercentage); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const FreeDVModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const FreeDVModSettings& settings, bool force); void webapiReverseSendCWSettings(const CWKeyerSettings& settings); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const FreeDVModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const FreeDVModSettings& settings, bool force diff --git a/plugins/channeltx/modfreedv/freedvmodbaseband.cpp b/plugins/channeltx/modfreedv/freedvmodbaseband.cpp index e3a077635..a158fba5a 100644 --- a/plugins/channeltx/modfreedv/freedvmodbaseband.cpp +++ b/plugins/channeltx/modfreedv/freedvmodbaseband.cpp @@ -140,7 +140,7 @@ bool FreeDVModBaseband::handleMessage(const Message& cmd) MsgConfigureFreeDVModBaseband& cfg = (MsgConfigureFreeDVModBaseband&) cmd; qDebug() << "FreeDVModBaseband::handleMessage: MsgConfigureFreeDVModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -171,9 +171,9 @@ bool FreeDVModBaseband::handleMessage(const Message& cmd) } } -void FreeDVModBaseband::applySettings(const FreeDVModSettings& settings, bool force) +void FreeDVModBaseband::applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force) { - if ((settings.m_freeDVMode != m_settings.m_freeDVMode) || force) + if ((settingsKeys.contains("m_freeDVMode") && settings.m_freeDVMode != m_settings.m_freeDVMode) || force) { int modemSampleRate = FreeDVModSettings::getModSampleRate(settings.m_freeDVMode); m_source.applyFreeDVMode(settings.m_freeDVMode); @@ -181,13 +181,13 @@ void FreeDVModBaseband::applySettings(const FreeDVModSettings& settings, bool fo m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("m_inputFrequencyOffset") && settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { m_channelizer->setChannelization(m_source.getModemSampleRate(), settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("m_audioDeviceName") && settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -199,7 +199,7 @@ void FreeDVModBaseband::applySettings(const FreeDVModSettings& settings, bool fo } } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("m_modAFInput") && settings.m_modAFInput != m_settings.m_modAFInput) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -211,9 +211,13 @@ void FreeDVModBaseband::applySettings(const FreeDVModSettings& settings, bool fo } } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int FreeDVModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modfreedv/freedvmodbaseband.h b/plugins/channeltx/modfreedv/freedvmodbaseband.h index b2f57c608..ad0e3646c 100644 --- a/plugins/channeltx/modfreedv/freedvmodbaseband.h +++ b/plugins/channeltx/modfreedv/freedvmodbaseband.h @@ -39,20 +39,23 @@ public: public: const FreeDVModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureFreeDVModBaseband* create(const FreeDVModSettings& settings, bool force) + static MsgConfigureFreeDVModBaseband* create(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force) { - return new MsgConfigureFreeDVModBaseband(settings, force); + return new MsgConfigureFreeDVModBaseband(settingsKeys, settings, force); } private: FreeDVModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureFreeDVModBaseband(const FreeDVModSettings& settings, bool force) : + MsgConfigureFreeDVModBaseband(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -92,7 +95,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const FreeDVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modfreedv/freedvmodgui.cpp b/plugins/channeltx/modfreedv/freedvmodgui.cpp index c63a5c802..31f18f046 100644 --- a/plugins/channeltx/modfreedv/freedvmodgui.cpp +++ b/plugins/channeltx/modfreedv/freedvmodgui.cpp @@ -142,14 +142,14 @@ void FreeDVModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void FreeDVModGUI::channelMarkerUpdate() { m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); displaySettings(); - applySettings(); + applySettings(QStringList("rgbColor")); } void FreeDVModGUI::handleSourceMessages() @@ -170,7 +170,7 @@ void FreeDVModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void FreeDVModGUI::on_spanLog2_valueChanged(int value) @@ -185,27 +185,27 @@ void FreeDVModGUI::on_spanLog2_valueChanged(int value) void FreeDVModGUI::on_gaugeInput_toggled(bool checked) { m_settings.m_gaugeInputElseModem = checked; - applySettings(); + applySettings(QStringList("gaugeInputElseModem")); } void FreeDVModGUI::on_toneFrequency_valueChanged(int value) { ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2)); m_settings.m_toneFrequency = value * 10.0; - applySettings(); + applySettings(QStringList("toneFrequency")); } void FreeDVModGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volumeFactor = value / 10.0; - applySettings(); + applySettings(QStringList("volumeFactor")); } void FreeDVModGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void FreeDVModGUI::on_freeDVMode_currentIndexChanged(int index) @@ -213,13 +213,13 @@ void FreeDVModGUI::on_freeDVMode_currentIndexChanged(int index) m_settings.m_freeDVMode = (FreeDVModSettings::FreeDVMode) index; m_channelMarker.setBandwidth(FreeDVModSettings::getHiCutoff(m_settings.m_freeDVMode) * 2); m_channelMarker.setLowCutoff(FreeDVModSettings::getLowCutoff(m_settings.m_freeDVMode)); - applySettings(); + applySettings(QStringList("freeDVMode")); } void FreeDVModGUI::on_playLoop_toggled(bool checked) { m_settings.m_playLoop = checked; - applySettings(); + applySettings(QStringList("playLoop")); } void FreeDVModGUI::on_play_toggled(bool checked) @@ -228,7 +228,7 @@ void FreeDVModGUI::on_play_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? FreeDVModSettings::FreeDVModInputFile : FreeDVModSettings::FreeDVModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); ui->navTimeSlider->setEnabled(!checked); m_enableNavTime = !checked; } @@ -239,7 +239,7 @@ void FreeDVModGUI::on_tone_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? FreeDVModSettings::FreeDVModInputTone : FreeDVModSettings::FreeDVModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void FreeDVModGUI::on_morseKeyer_toggled(bool checked) @@ -248,7 +248,7 @@ void FreeDVModGUI::on_morseKeyer_toggled(bool checked) ui->tone->setEnabled(!checked); // release other source inputs ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? FreeDVModSettings::FreeDVModInputCWTone : FreeDVModSettings::FreeDVModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void FreeDVModGUI::on_mic_toggled(bool checked) @@ -257,7 +257,7 @@ void FreeDVModGUI::on_mic_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->tone->setEnabled(!checked); // release other source inputs m_settings.m_modAFInput = checked ? FreeDVModSettings::FreeDVModInputAudio : FreeDVModSettings::FreeDVModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void FreeDVModGUI::on_navTimeSlider_valueChanged(int value) @@ -301,7 +301,7 @@ void FreeDVModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void FreeDVModGUI::onMenuDialogCalled(const QPoint &p) @@ -346,7 +346,16 @@ void FreeDVModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", + "streamIndex" + })); } resetContextMenuType(); @@ -442,11 +451,11 @@ bool FreeDVModGUI::blockApplySettings(bool block) return ret; } -void FreeDVModGUI::applySettings(bool force) +void FreeDVModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - FreeDVMod::MsgConfigureFreeDVMod *msg = FreeDVMod::MsgConfigureFreeDVMod::create(m_settings, force); + FreeDVMod::MsgConfigureFreeDVMod *msg = FreeDVMod::MsgConfigureFreeDVMod::create(settingsKeys, m_settings, force); m_freeDVMod->getInputMessageQueue()->push(msg); } } @@ -455,7 +464,7 @@ void FreeDVModGUI::applyBandwidths(int spanLog2, bool force) { displayBandwidths(spanLog2); m_settings.m_spanLog2 = spanLog2; - applySettings(force); + applySettings(QStringList("spanLog2"), force); } void FreeDVModGUI::displayBandwidths(int spanLog2) @@ -560,7 +569,7 @@ void FreeDVModGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } diff --git a/plugins/channeltx/modfreedv/freedvmodgui.h b/plugins/channeltx/modfreedv/freedvmodgui.h index 3e404c6b9..f73e70d35 100644 --- a/plugins/channeltx/modfreedv/freedvmodgui.h +++ b/plugins/channeltx/modfreedv/freedvmodgui.h @@ -94,7 +94,7 @@ private: virtual ~FreeDVModGUI(); bool blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applyBandwidths(int spanLog2, bool force = false); void displayBandwidths(int spanLog2); void displaySettings(); diff --git a/plugins/channeltx/modfreedv/freedvmodsettings.cpp b/plugins/channeltx/modfreedv/freedvmodsettings.cpp index 152b5ac74..d3cbeb5c2 100644 --- a/plugins/channeltx/modfreedv/freedvmodsettings.cpp +++ b/plugins/channeltx/modfreedv/freedvmodsettings.cpp @@ -245,3 +245,141 @@ int FreeDVModSettings::getModSampleRate(FreeDVMode freeDVMode) return 8000; } } + +void FreeDVModSettings::applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("toneFrequency")) { + m_toneFrequency = settings.m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor")) { + m_volumeFactor = settings.m_volumeFactor; + } + if (settingsKeys.contains("spanLog2")) { + m_spanLog2 = settings.m_spanLog2; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("playLoop")) { + m_playLoop = settings.m_playLoop; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("modAFInput")) { + m_modAFInput = settings.m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("freeDVMode")) { + m_freeDVMode = settings.m_freeDVMode; + } + if (settingsKeys.contains("gaugeInputElseModem")) { + m_gaugeInputElseModem = settings.m_gaugeInputElseModem; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("cwKeyerSettings")) { + m_cwKeyerSettings = settings.m_cwKeyerSettings; + } +} + +QString FreeDVModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("toneFrequency") || force) { + ostr << " m_toneFrequency: " << m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor") || force) { + ostr << " m_volumeFactor: " << m_volumeFactor; + } + if (settingsKeys.contains("spanLog2") || force) { + ostr << " m_spanLog2: " << m_spanLog2; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("playLoop") || force) { + ostr << " m_playLoop: " << m_playLoop; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("modAFInput") || force) { + ostr << " m_modAFInput: " << m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("freeDVMode") || force) { + ostr << " m_freeDVMode: " << m_freeDVMode; + } + if (settingsKeys.contains("gaugeInputElseModem") || force) { + ostr << " m_gaugeInputElseModem: " << m_gaugeInputElseModem; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modfreedv/freedvmodsettings.h b/plugins/channeltx/modfreedv/freedvmodsettings.h index 4c73e2efd..57a1ef507 100644 --- a/plugins/channeltx/modfreedv/freedvmodsettings.h +++ b/plugins/channeltx/modfreedv/freedvmodsettings.h @@ -94,6 +94,8 @@ struct FreeDVModSettings static int getHiCutoff(FreeDVMode freeDVMode); static int getLowCutoff(FreeDVMode freeDVMode); static int getModSampleRate(FreeDVMode freeDVMode); + void applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channeltx/modfreedv/freedvmodsource.cpp b/plugins/channeltx/modfreedv/freedvmodsource.cpp index 6298b6595..acc5f7def 100644 --- a/plugins/channeltx/modfreedv/freedvmodsource.cpp +++ b/plugins/channeltx/modfreedv/freedvmodsource.cpp @@ -66,7 +66,7 @@ FreeDVModSource::FreeDVModSource() : m_magsq = 0.0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -536,13 +536,13 @@ void FreeDVModSource::applyFreeDVMode(FreeDVModSettings::FreeDVMode mode) } } -void FreeDVModSource::applySettings(const FreeDVModSettings& settings, bool force) +void FreeDVModSource::applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force) { - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { + if ((settingsKeys.contains("toneFrequency") && (settings.m_toneFrequency != m_settings.m_toneFrequency)) || force) { m_toneNco.setFreq(settings.m_toneFrequency, m_channelSampleRate); } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("modAFInput") && (settings.m_modAFInput != m_settings.m_modAFInput)) || force) { if (settings.m_modAFInput == FreeDVModSettings::FreeDVModInputAudio) { connect(&m_audioFifo, SIGNAL(dataReady()), this, SLOT(handleAudio())); @@ -551,7 +551,11 @@ void FreeDVModSource::applySettings(const FreeDVModSettings& settings, bool forc } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void FreeDVModSource::handleAudio() diff --git a/plugins/channeltx/modfreedv/freedvmodsource.h b/plugins/channeltx/modfreedv/freedvmodsource.h index 78465855c..bd9d99e23 100644 --- a/plugins/channeltx/modfreedv/freedvmodsource.h +++ b/plugins/channeltx/modfreedv/freedvmodsource.h @@ -66,7 +66,7 @@ public: Real getHiCutoff() const { return m_hiCutoff; } void setSpectrumSink(BasebandSampleSink *sampleSink) { m_spectrumSink = sampleSink; } - void applySettings(const FreeDVModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const FreeDVModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void applyFreeDVMode(FreeDVModSettings::FreeDVMode mode); diff --git a/plugins/channeltx/modm17/m17mod.cpp b/plugins/channeltx/modm17/m17mod.cpp index 36180028e..e70c4eb8f 100644 --- a/plugins/channeltx/modm17/m17mod.cpp +++ b/plugins/channeltx/modm17/m17mod.cpp @@ -292,25 +292,7 @@ void M17Mod::seekFileStream(int seekPercentage) void M17Mod::applySettings(const M17ModSettings& settings, const QList& settingsKeys, bool force) { - qDebug() << "M17Mod::applySettings:" - << " settingsKeys: " << settingsKeys - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volumeFactor: " << settings.m_volumeFactor - << " m_toneFrequency: " << settings.m_toneFrequency - << " m_channelMute: " << settings.m_channelMute - << " m_playLoop: " << settings.m_playLoop - << " m_m17Mode " << settings.m_m17Mode - << " m_audioType " << settings.m_audioType - << " m_packetType " << settings.m_packetType - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "M17Mod::applySettings:" << settings.getDebugString(settingsKeys, force); if (settingsKeys.contains("loopPacketInterval") || force) { m_loopPacketTimer.setInterval(settings.m_loopPacketInterval*1000); diff --git a/plugins/channeltx/modm17/m17modbaseband.cpp b/plugins/channeltx/modm17/m17modbaseband.cpp index 107a58e46..62a44f756 100644 --- a/plugins/channeltx/modm17/m17modbaseband.cpp +++ b/plugins/channeltx/modm17/m17modbaseband.cpp @@ -221,7 +221,7 @@ void M17ModBaseband::applySettings(const M17ModSettings& settings, const QListmoveToThread(&m_processorThread); m_processorThread.start(); - applySettings(m_settings, QList(), true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -525,7 +525,7 @@ void M17ModSource::applyFeedbackAudioSampleRate(int sampleRate) m_feedbackAudioSampleRate = sampleRate; } -void M17ModSource::applySettings(const M17ModSettings& settings, const QList& settingsKeys, bool force) +void M17ModSource::applySettings(const QStringList& settingsKeys, const M17ModSettings& settings, bool force) { if (settingsKeys.contains("rfBandwidth") || force) { diff --git a/plugins/channeltx/modm17/m17modsource.h b/plugins/channeltx/modm17/m17modsource.h index 6a168deaa..2fde8a91b 100644 --- a/plugins/channeltx/modm17/m17modsource.h +++ b/plugins/channeltx/modm17/m17modsource.h @@ -67,7 +67,7 @@ public: peakLevel = m_peakLevelOut; numSamples = m_levelNbSamples; } - void applySettings(const M17ModSettings& settings, const QList& settingsKeys, bool force = false); + void applySettings(const QStringList& settingsKeys, const M17ModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void sendPacket(); diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index f102f08a3..81b64257a 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -62,7 +62,7 @@ NFMMod::NFMMod(DeviceAPI *deviceAPI) : { setObjectName(m_channelId); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -139,7 +139,7 @@ void NFMMod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSource->getInputMessageQueue()->push(dspMsg); - NFMModBaseband::MsgConfigureNFMModBaseband *msg = NFMModBaseband::MsgConfigureNFMModBaseband::create(m_settings, true); + NFMModBaseband::MsgConfigureNFMModBaseband *msg = NFMModBaseband::MsgConfigureNFMModBaseband::create(QStringList(), m_settings, true); m_basebandSource->getInputMessageQueue()->push(msg); m_running = true; @@ -168,11 +168,11 @@ void NFMMod::setCenterFrequency(qint64 frequency) { NFMModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNFMMod *msgToGUI = MsgConfigureNFMMod::create(settings, false); + MsgConfigureNFMMod *msgToGUI = MsgConfigureNFMMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -184,7 +184,7 @@ bool NFMMod::handleMessage(const Message& cmd) auto& cfg = (const MsgConfigureNFMMod&) cmd; qDebug() << "NFMMod::handleMessage: MsgConfigureNFMMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -271,7 +271,7 @@ bool NFMMod::handleMessage(const Message& cmd) else if (DSPSignalNotification::match(cmd)) { auto& notif = (const DSPSignalNotification&) cmd; - + m_centerFrequency = notif.getCenterFrequency(); m_basebandSampleRate = notif.getSampleRate(); @@ -337,83 +337,11 @@ void NFMMod::seekFileStream(int seekPercentage) } } -void NFMMod::applySettings(const NFMModSettings& settings, bool force) +void NFMMod::applySettings(const QStringList& settingsKeys, const NFMModSettings& settings, bool force) { - qDebug() << "NFMMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volumeFactor: " << settings.m_volumeFactor - << " m_toneFrequency: " << settings.m_toneFrequency - << " m_ctcssIndex: " << settings.m_ctcssIndex - << " m_ctcssOn: " << settings.m_ctcssOn - << " m_dcsOn: " << settings.m_dcsOn - << " m_dcsCode: " << settings.m_dcsCode - << " m_dcsPositive: " << settings.m_dcsPositive - << " m_channelMute: " << settings.m_channelMute - << " m_playLoop: " << settings.m_playLoop - << " m_modAFInput " << settings.m_modAFInput - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "NFMMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_volumeFactor != m_settings.m_volumeFactor) || force) { - reverseAPIKeys.append("volumeFactor"); - } - if ((settings.m_ctcssOn != m_settings.m_ctcssOn) || force) { - reverseAPIKeys.append("ctcssOn"); - } - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - if ((settings.m_playLoop != m_settings.m_playLoop) || force) { - reverseAPIKeys.append("playLoop"); - } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) { - reverseAPIKeys.append("modAFInput"); - } - if((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { - reverseAPIKeys.append("afBandwidth"); - } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { - reverseAPIKeys.append("toneFrequency"); - } - if ((settings.m_ctcssIndex != m_settings.m_ctcssIndex) || force) { - reverseAPIKeys.append("ctcssIndex"); - } - if ((settings.m_dcsOn != m_settings.m_dcsOn) || force) { - reverseAPIKeys.append("dcsOn"); - } - if ((settings.m_dcsCode != m_settings.m_dcsCode) || force) { - reverseAPIKeys.append("dcsCode"); - } - if ((settings.m_dcsPositive != m_settings.m_dcsPositive) || force) { - reverseAPIKeys.append("dcsPositive"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) { - reverseAPIKeys.append("feedbackAudioDeviceName"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -424,31 +352,29 @@ void NFMMod::applySettings(const NFMModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } if (m_running) { - NFMModBaseband::MsgConfigureNFMModBaseband *msg = NFMModBaseband::MsgConfigureNFMModBaseband::create(settings, force); + NFMModBaseband::MsgConfigureNFMModBaseband *msg = NFMModBaseband::MsgConfigureNFMModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (!pipes.empty()) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -469,7 +395,7 @@ bool NFMMod::deserialize(const QByteArray& data) success = false; } - MsgConfigureNFMMod *msg = MsgConfigureNFMMod::create(m_settings, true); + MsgConfigureNFMMod *msg = MsgConfigureNFMMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return success; @@ -545,12 +471,12 @@ int NFMMod::webapiSettingsPutPatch( } } - MsgConfigureNFMMod *msg = MsgConfigureNFMMod::create(settings, force); + MsgConfigureNFMMod *msg = MsgConfigureNFMMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureNFMMod *msgToGUI = MsgConfigureNFMMod::create(settings, force); + MsgConfigureNFMMod *msgToGUI = MsgConfigureNFMMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } diff --git a/plugins/channeltx/modnfm/nfmmod.h b/plugins/channeltx/modnfm/nfmmod.h index e4a150a6c..c308e1a8b 100644 --- a/plugins/channeltx/modnfm/nfmmod.h +++ b/plugins/channeltx/modnfm/nfmmod.h @@ -49,20 +49,23 @@ public: public: const NFMModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNFMMod* create(const NFMModSettings& settings, bool force) + static MsgConfigureNFMMod* create(const QStringList& settingsKeys, const NFMModSettings& settings, bool force) { - return new MsgConfigureNFMMod(settings, force); + return new MsgConfigureNFMMod(settingsKeys, settings, force); } private: NFMModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNFMMod(const NFMModSettings& settings, bool force) : + MsgConfigureNFMMod(const QStringList& settingsKeys, const NFMModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -273,7 +276,7 @@ private: QObject *m_levelMeter = nullptr; bool handleMessage(const Message& cmd) final; - void applySettings(const NFMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NFMModSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer() const; void openFileStream(); void seekFileStream(int seekPercentage); diff --git a/plugins/channeltx/modnfm/nfmmodbaseband.cpp b/plugins/channeltx/modnfm/nfmmodbaseband.cpp index ca7d35def..872e59104 100644 --- a/plugins/channeltx/modnfm/nfmmodbaseband.cpp +++ b/plugins/channeltx/modnfm/nfmmodbaseband.cpp @@ -150,7 +150,7 @@ bool NFMModBaseband::handleMessage(const Message& cmd) MsgConfigureNFMModBaseband& cfg = (MsgConfigureNFMModBaseband&) cmd; qDebug() << "NFMModBaseband::handleMessage: MsgConfigureNFMModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -182,9 +182,9 @@ bool NFMModBaseband::handleMessage(const Message& cmd) } } -void NFMModBaseband::applySettings(const NFMModSettings& settings, bool force) +void NFMModBaseband::applySettings(const QStringList& settingsKeys, const NFMModSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("m_inputFrequencyOffset") && settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { m_channelizer->setChannelization(m_source.getAudioSampleRate(), settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); @@ -192,7 +192,7 @@ void NFMModBaseband::applySettings(const NFMModSettings& settings, bool force) } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("m_audioDeviceName") && settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -207,7 +207,7 @@ void NFMModBaseband::applySettings(const NFMModSettings& settings, bool force) } } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("m_modAFInput") && settings.m_modAFInput != m_settings.m_modAFInput) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -219,7 +219,7 @@ void NFMModBaseband::applySettings(const NFMModSettings& settings, bool force) } } - if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) + if ((settingsKeys.contains("m_feedbackAudioDeviceName") && settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_feedbackAudioDeviceName); @@ -232,9 +232,13 @@ void NFMModBaseband::applySettings(const NFMModSettings& settings, bool force) } } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int NFMModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modnfm/nfmmodbaseband.h b/plugins/channeltx/modnfm/nfmmodbaseband.h index 69a1480c4..dc0cc1db9 100644 --- a/plugins/channeltx/modnfm/nfmmodbaseband.h +++ b/plugins/channeltx/modnfm/nfmmodbaseband.h @@ -40,20 +40,23 @@ public: public: const NFMModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureNFMModBaseband* create(const NFMModSettings& settings, bool force) + static MsgConfigureNFMModBaseband* create(const QStringList& settingsKeys, const NFMModSettings& settings, bool force) { - return new MsgConfigureNFMModBaseband(settings, force); + return new MsgConfigureNFMModBaseband(settingsKeys, settings, force); } private: NFMModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureNFMModBaseband(const NFMModSettings& settings, bool force) : + MsgConfigureNFMModBaseband(const QStringList& settingsKeys, const NFMModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -92,7 +95,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const NFMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NFMModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modnfm/nfmmodgui.cpp b/plugins/channeltx/modnfm/nfmmodgui.cpp index 180a5e04e..af19161d3 100644 --- a/plugins/channeltx/modnfm/nfmmodgui.cpp +++ b/plugins/channeltx/modnfm/nfmmodgui.cpp @@ -59,7 +59,7 @@ void NFMModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray NFMModGUI::serialize() const @@ -71,7 +71,7 @@ bool NFMModGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -132,7 +132,7 @@ void NFMModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NFMModGUI::handleSourceMessages() @@ -153,7 +153,7 @@ void NFMModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void NFMModGUI::on_channelSpacingApply_clicked() @@ -175,7 +175,7 @@ void NFMModGUI::on_channelSpacingApply_clicked() ui->rfBW->blockSignals(false); ui->afBW->blockSignals(false); ui->fmDev->blockSignals(false); - applySettings(); + applySettings(QStringList({ "rfBandwidth", "afBandwidth", "fmDeviation" })); } void NFMModGUI::on_rfBW_valueChanged(int value) @@ -188,53 +188,53 @@ void NFMModGUI::on_rfBW_valueChanged(int value) ui->channelSpacing->setCurrentIndex(NFMModSettings::getChannelSpacingIndex(m_settings.m_rfBandwidth)); ui->channelSpacing->blockSignals(false); - applySettings(); + applySettings(QStringList("rfBandwidth")); } void NFMModGUI::on_afBW_valueChanged(int value) { ui->afBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_afBandwidth = value * 100.0; - applySettings(); + applySettings(QStringList("afBandwidth")); } void NFMModGUI::on_preEmphasis_toggled(bool checked) { m_settings.m_preEmphasisOn = checked; - applySettings(); + applySettings(QStringList("preEmphasisOn")); } void NFMModGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1%2k").arg(QChar(0xB1, 0x00)).arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 200.0; - applySettings(); + applySettings(QStringList("fmDeviation")); } void NFMModGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volumeFactor = value / 10.0; - applySettings(); + applySettings(QStringList("volumeFactor")); } void NFMModGUI::on_toneFrequency_valueChanged(int value) { ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2)); m_settings.m_toneFrequency = value * 10.0; - applySettings(); + applySettings(QStringList("toneFrequency")); } void NFMModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void NFMModGUI::on_playLoop_toggled(bool checked) { m_settings.m_playLoop = checked; - applySettings(); + applySettings(QStringList("playLoop")); } void NFMModGUI::on_play_toggled(bool checked) @@ -243,7 +243,7 @@ void NFMModGUI::on_play_toggled(bool checked) ui->mic->setEnabled(!checked); ui->morseKeyer->setEnabled(!checked); m_settings.m_modAFInput = checked ? NFMModSettings::NFMModInputFile : NFMModSettings::NFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); ui->navTimeSlider->setEnabled(!checked); m_enableNavTime = !checked; } @@ -254,7 +254,7 @@ void NFMModGUI::on_tone_toggled(bool checked) ui->mic->setEnabled(!checked); ui->morseKeyer->setEnabled(!checked); m_settings.m_modAFInput = checked ? NFMModSettings::NFMModInputTone : NFMModSettings::NFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void NFMModGUI::on_morseKeyer_toggled(bool checked) @@ -263,7 +263,7 @@ void NFMModGUI::on_morseKeyer_toggled(bool checked) ui->mic->setEnabled(!checked); ui->play->setEnabled(!checked); m_settings.m_modAFInput = checked ? NFMModSettings::NFMModInputCWTone : NFMModSettings::NFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void NFMModGUI::on_mic_toggled(bool checked) @@ -272,26 +272,26 @@ void NFMModGUI::on_mic_toggled(bool checked) ui->tone->setEnabled(!checked); // release other source inputs ui->morseKeyer->setEnabled(!checked); m_settings.m_modAFInput = checked ? NFMModSettings::NFMModInputAudio : NFMModSettings::NFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void NFMModGUI::on_compressor_toggled(bool checked) { m_settings.m_compressorEnable = checked; - applySettings(); + applySettings(QStringList("compressorEnable")); } void NFMModGUI::on_feedbackEnable_toggled(bool checked) { m_settings.m_feedbackAudioEnable = checked; - applySettings(); + applySettings(QStringList("feedbackAudioEnable")); } void NFMModGUI::on_feedbackVolume_valueChanged(int value) { ui->feedbackVolumeText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2)); m_settings.m_feedbackVolumeFactor = value / 100.0; - applySettings(); + applySettings(QStringList("feedbackVolumeFactor")); } void NFMModGUI::on_navTimeSlider_valueChanged(int value) @@ -325,21 +325,21 @@ void NFMModGUI::on_showFileDialog_clicked(bool checked) void NFMModGUI::on_ctcss_currentIndexChanged(int index) { m_settings.m_ctcssIndex = index; - applySettings(); + applySettings(QStringList("ctcssIndex")); } void NFMModGUI::on_ctcssOn_toggled(bool checked) { ui->dcsOn->setEnabled(!checked); m_settings.m_ctcssOn = checked; - applySettings(); + applySettings(QStringList("ctcssOn")); } void NFMModGUI::on_dcsOn_toggled(bool checked) { ui->ctcssOn->setEnabled(!checked); m_settings.m_dcsOn = checked; - applySettings(); + applySettings(QStringList("dcsOn")); } void NFMModGUI::on_dcsCode_editingFinished() @@ -350,20 +350,20 @@ void NFMModGUI::on_dcsCode_editingFinished() if (ok) { m_settings.m_dcsCode = dcsCode; - applySettings(); + applySettings(QStringList("dcsCode")); } } void NFMModGUI::on_dcsPositive_toggled(bool checked) { m_settings.m_dcsPositive = checked; - applySettings(); + applySettings(QStringList("dcsPositive")); } void NFMModGUI::on_bpf_toggled(bool checked) { m_settings.m_bpfOn = checked; - applySettings(); + applySettings(QStringList("bpfOn")); } void NFMModGUI::configureFileName() @@ -379,7 +379,7 @@ void NFMModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void NFMModGUI::onMenuDialogCalled(const QPoint &p) @@ -424,7 +424,8 @@ void NFMModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({ "rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex" })); } resetContextMenuType(); @@ -517,7 +518,7 @@ NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam displaySettings(); makeUIConnections(); - applySettings(); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -532,11 +533,11 @@ void NFMModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void NFMModGUI::applySettings(bool force) +void NFMModGUI::applySettings(const QStringList& settingsKeys, const bool force) { if (m_doApplySettings) { - NFMMod::MsgConfigureNFMMod *msg = NFMMod::MsgConfigureNFMMod::create(m_settings, force); + NFMMod::MsgConfigureNFMMod *msg = NFMMod::MsgConfigureNFMMod::create(settingsKeys, m_settings, force); m_nfmMod->getInputMessageQueue()->push(msg); } } @@ -633,7 +634,7 @@ void NFMModGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -648,7 +649,7 @@ void NFMModGUI::audioFeedbackSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_feedbackAudioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("feedbackAudioDeviceName")); } } diff --git a/plugins/channeltx/modnfm/nfmmodgui.h b/plugins/channeltx/modnfm/nfmmodgui.h index 7061b234b..ba4626ae0 100644 --- a/plugins/channeltx/modnfm/nfmmodgui.h +++ b/plugins/channeltx/modnfm/nfmmodgui.h @@ -94,7 +94,7 @@ private: virtual ~NFMModGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void updateWithStreamData(); void updateWithStreamTime(); diff --git a/plugins/channeltx/modnfm/nfmmodsettings.cpp b/plugins/channeltx/modnfm/nfmmodsettings.cpp index 4e9a63b2b..598bfb364 100644 --- a/plugins/channeltx/modnfm/nfmmodsettings.cpp +++ b/plugins/channeltx/modnfm/nfmmodsettings.cpp @@ -359,3 +359,206 @@ int NFMModSettings::getCTCSSFreqIndex(float ctcssFreq) return CTCSSFrequencies::m_nbFreqs - 1; } +void NFMModSettings::applySettings(const QStringList& settingsKeys, const NFMModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth")) { + m_afBandwidth = settings.m_afBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("toneFrequency")) { + m_toneFrequency = settings.m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor")) { + m_volumeFactor = settings.m_volumeFactor; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("playLoop")) { + m_playLoop = settings.m_playLoop; + } + if (settingsKeys.contains("ctcssOn")) { + m_ctcssOn = settings.m_ctcssOn; + } + if (settingsKeys.contains("ctcssIndex")) { + m_ctcssIndex = settings.m_ctcssIndex; + } + if (settingsKeys.contains("dcsOn")) { + m_dcsOn = settings.m_dcsOn; + } + if (settingsKeys.contains("dcsCode")) { + m_dcsCode = settings.m_dcsCode; + } + if (settingsKeys.contains("dcsPositive")) { + m_dcsPositive = settings.m_dcsPositive; + } + if (settingsKeys.contains("preEmphasisOn")) { + m_preEmphasisOn = settings.m_preEmphasisOn; + } + if (settingsKeys.contains("bpfOn")) { + m_bpfOn = settings.m_bpfOn; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("modAFInput")) { + m_modAFInput = settings.m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("feedbackAudioDeviceName")) { + m_feedbackAudioDeviceName = settings.m_feedbackAudioDeviceName; + } + if (settingsKeys.contains("feedbackVolumeFactor")) { + m_feedbackVolumeFactor = settings.m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable")) { + m_feedbackAudioEnable = settings.m_feedbackAudioEnable; + } + if (settingsKeys.contains("compressorEnable")) { + m_compressorEnable = settings.m_compressorEnable; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("cwKeyerSettings")) { + m_cwKeyerSettings = settings.m_cwKeyerSettings; + } +} + +QString NFMModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth") || force) { + ostr << " m_afBandwidth: " << m_afBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("toneFrequency") || force) { + ostr << " m_toneFrequency: " << m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor") || force) { + ostr << " m_volumeFactor: " << m_volumeFactor; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("playLoop") || force) { + ostr << " m_playLoop: " << m_playLoop; + } + if (settingsKeys.contains("ctcssOn") || force) { + ostr << " m_ctcssOn: " << m_ctcssOn; + } + if (settingsKeys.contains("ctcssIndex") || force) { + ostr << " m_ctcssIndex: " << m_ctcssIndex; + } + if (settingsKeys.contains("dcsOn") || force) { + ostr << " m_dcsOn: " << m_dcsOn; + } + if (settingsKeys.contains("dcsCode") || force) { + ostr << " m_dcsCode: " << m_dcsCode; + } + if (settingsKeys.contains("dcsPositive") || force) { + ostr << " m_dcsPositive: " << m_dcsPositive; + } + if (settingsKeys.contains("preEmphasisOn") || force) { + ostr << " m_preEmphasisOn: " << m_preEmphasisOn; + } + if (settingsKeys.contains("bpfOn") || force) { + ostr << " m_bpfOn: " << m_bpfOn; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("modAFInput") || force) { + ostr << " m_modAFInput: " << m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackAudioDeviceName") || force) { + ostr << " m_feedbackAudioDeviceName: " << m_feedbackAudioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackVolumeFactor") || force) { + ostr << " m_feedbackVolumeFactor: " << m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable") || force) { + ostr << " m_feedbackAudioEnable: " << m_feedbackAudioEnable; + } + if (settingsKeys.contains("compressorEnable") || force) { + ostr << " m_compressorEnable: " << m_compressorEnable; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modnfm/nfmmodsettings.h b/plugins/channeltx/modnfm/nfmmodsettings.h index 536d2295d..0b2d0e109 100644 --- a/plugins/channeltx/modnfm/nfmmodsettings.h +++ b/plugins/channeltx/modnfm/nfmmodsettings.h @@ -105,6 +105,8 @@ struct NFMModSettings static int getNbCTCSSFreq(); static float getCTCSSFreq(int index); static int getCTCSSFreqIndex(float ctcssFreq); + void applySettings(const QStringList& settingsKeys, const NFMModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channeltx/modnfm/nfmmodsource.cpp b/plugins/channeltx/modnfm/nfmmodsource.cpp index 7d54cb13f..9e2d295e1 100644 --- a/plugins/channeltx/modnfm/nfmmodsource.cpp +++ b/plugins/channeltx/modnfm/nfmmodsource.cpp @@ -59,7 +59,7 @@ NFMModSource::NFMModSource() : 0.25 // release (s) ); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -416,33 +416,33 @@ void NFMModSource::applyFeedbackAudioSampleRate(int sampleRate) m_feedbackAudioSampleRate = sampleRate; } -void NFMModSource::applySettings(const NFMModSettings& settings, bool force) +void NFMModSource::applySettings(const QStringList& settingsKeys, const NFMModSettings& settings, bool force) { - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) - || (settings.m_afBandwidth != m_settings.m_afBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && settings.m_rfBandwidth != m_settings.m_rfBandwidth) + || (settingsKeys.contains("afBandwidth") && settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { m_settings.m_rfBandwidth = settings.m_rfBandwidth; m_settings.m_afBandwidth = settings.m_afBandwidth; applyAudioSampleRate(m_audioSampleRate); } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { + if ((settingsKeys.contains("toneFrequency") && settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { m_toneNco.setFreq(settings.m_toneFrequency, (float) m_audioSampleRate); } - if ((settings.m_ctcssIndex != m_settings.m_ctcssIndex) || force) { + if ((settingsKeys.contains("ctcssIndex") && settings.m_ctcssIndex != m_settings.m_ctcssIndex) || force) { m_ctcssNco.setFreq(NFMModSettings::getCTCSSFreq(settings.m_ctcssIndex), (float) m_audioSampleRate); } - if ((settings.m_dcsCode != m_settings.m_dcsCode) || force) { + if ((settingsKeys.contains("dcsCode") && settings.m_dcsCode != m_settings.m_dcsCode) || force) { m_dcsMod.setDCS(settings.m_dcsCode); } - if ((settings.m_dcsPositive != m_settings.m_dcsPositive) || force) { + if ((settingsKeys.contains("dcsPositive") && settings.m_dcsPositive != m_settings.m_dcsPositive) || force) { m_dcsMod.setPositive(settings.m_dcsPositive); } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("modAFInput") && settings.m_modAFInput != m_settings.m_modAFInput) || force) { if (settings.m_modAFInput == NFMModSettings::NFMModInputAudio) { connect(&m_audioFifo, SIGNAL(dataReady()), this, SLOT(handleAudio())); @@ -451,7 +451,11 @@ void NFMModSource::applySettings(const NFMModSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void NFMModSource::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) diff --git a/plugins/channeltx/modnfm/nfmmodsource.h b/plugins/channeltx/modnfm/nfmmodsource.h index 02b32a9b4..236853cfc 100644 --- a/plugins/channeltx/modnfm/nfmmodsource.h +++ b/plugins/channeltx/modnfm/nfmmodsource.h @@ -69,7 +69,7 @@ public: peakLevel = m_peakLevelOut; numSamples = m_levelNbSamples; } - void applySettings(const NFMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const NFMModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); private: diff --git a/plugins/channeltx/modpacket/packetmod.cpp b/plugins/channeltx/modpacket/packetmod.cpp index 5e826762b..3aaea86df 100644 --- a/plugins/channeltx/modpacket/packetmod.cpp +++ b/plugins/channeltx/modpacket/packetmod.cpp @@ -69,7 +69,7 @@ PacketMod::PacketMod(DeviceAPI *deviceAPI) : m_basebandSource->setChannel(this); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -138,7 +138,7 @@ bool PacketMod::handleMessage(const Message& cmd) MsgConfigurePacketMod& cfg = (MsgConfigurePacketMod&) cmd; qDebug() << "PacketMod::handleMessage: MsgConfigurePacketMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -180,220 +180,23 @@ void PacketMod::setCenterFrequency(qint64 frequency) { PacketModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePacketMod *msgToGUI = MsgConfigurePacketMod::create(settings, false); + MsgConfigurePacketMod *msgToGUI = MsgConfigurePacketMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void PacketMod::applySettings(const PacketModSettings& settings, bool force) +void PacketMod::applySettings(const QStringList& settingsKeys, const PacketModSettings& settings, bool force) { - qDebug() << "PacketMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_modulation: " << settings.m_modulation - << " m_baud: " << settings.m_baud - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_gain: " << settings.m_gain - << " m_channelMute: " << settings.m_channelMute - << " m_repeat: " << settings.m_repeat - << " m_repeatDelay: " << settings.m_repeatDelay - << " m_repeatCount: " << settings.m_repeatCount - << " m_ax25PreFlags: " << settings.m_ax25PreFlags - << " m_ax25PostFlags: " << settings.m_ax25PostFlags - << " m_preEmphasis: " << settings.m_preEmphasis - << " m_preEmphasisTau: " << settings.m_preEmphasisTau - << " m_preEmphasisHighFreq: " << settings.m_preEmphasisHighFreq - << " m_bpf: " << settings.m_bpf - << " m_bpfLowCutoff: " << settings.m_bpfLowCutoff - << " m_bpfHighCutoff: " << settings.m_bpfHighCutoff - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "PacketMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - - if ((settings.m_modulation != m_settings.m_modulation) || force) { - reverseAPIKeys.append("modulation"); - } - - if ((settings.m_baud != m_settings.m_baud) || force) { - reverseAPIKeys.append("baud"); - } - - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - - if ((settings.m_gain != m_settings.m_gain) || force) { - reverseAPIKeys.append("gain"); - } - - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - - if ((settings.m_repeat != m_settings.m_repeat) || force) { - reverseAPIKeys.append("repeat"); - } - - if ((settings.m_repeatDelay != m_settings.m_repeatDelay) || force) { - reverseAPIKeys.append("repeatDelay"); - } - - if ((settings.m_repeatCount != m_settings.m_repeatCount) || force) { - reverseAPIKeys.append("repeatCount"); - } - - if ((settings.m_rampUpBits != m_settings.m_rampUpBits) || force) { - reverseAPIKeys.append("rampUpBits"); - } - - if ((settings.m_rampDownBits != m_settings.m_rampDownBits) || force) { - reverseAPIKeys.append("rampDownBits"); - } - - if ((settings.m_rampRange != m_settings.m_rampRange) || force) { - reverseAPIKeys.append("rampRange"); - } - - if ((settings.m_modulateWhileRamping != m_settings.m_modulateWhileRamping) || force) { - reverseAPIKeys.append("modulateWhileRamping"); - } - - if ((settings.m_markFrequency != m_settings.m_markFrequency) || force) { - reverseAPIKeys.append("markFrequency"); - } - - if ((settings.m_spaceFrequency != m_settings.m_spaceFrequency) || force) { - reverseAPIKeys.append("spaceFrequency"); - } - - if ((settings.m_ax25PreFlags != m_settings.m_ax25PreFlags) || force) { - reverseAPIKeys.append("ax25PreFlags"); - } - - if ((settings.m_ax25PostFlags != m_settings.m_ax25PostFlags) || force) { - reverseAPIKeys.append("ax25PostFlags"); - } - - if ((settings.m_ax25Control != m_settings.m_ax25Control) || force) { - reverseAPIKeys.append("ax25Control"); - } - - if ((settings.m_ax25PID != m_settings.m_ax25PID) || force) { - reverseAPIKeys.append("ax25PID"); - } - - if ((settings.m_preEmphasis != m_settings.m_preEmphasis) || force) { - reverseAPIKeys.append("preEmphasis"); - } - - if ((settings.m_preEmphasisTau != m_settings.m_preEmphasisTau) || force) { - reverseAPIKeys.append("preEmphasisTau"); - } - - if ((settings.m_preEmphasisHighFreq != m_settings.m_preEmphasisHighFreq) || force) { - reverseAPIKeys.append("preEmphasisHighFreq"); - } - - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || force) { - reverseAPIKeys.append("lpfTaps"); - } - - if ((settings.m_bbNoise != m_settings.m_bbNoise) || force) { - reverseAPIKeys.append("bbNoise"); - } - - if ((settings.m_rfNoise != m_settings.m_rfNoise) || force) { - reverseAPIKeys.append("rfNoise"); - } - - if ((settings.m_writeToFile != m_settings.m_writeToFile) || force) { - reverseAPIKeys.append("writeToFile"); - } - - if ((settings.m_spectrumRate != m_settings.m_spectrumRate) || force) { - reverseAPIKeys.append("spectrumRate"); - } - - if ((settings.m_callsign != m_settings.m_callsign) || force) { - reverseAPIKeys.append("callsign"); - } - - if ((settings.m_to != m_settings.m_to) || force) { - reverseAPIKeys.append("to"); - } - - if ((settings.m_via != m_settings.m_via) || force) { - reverseAPIKeys.append("via"); - } - - if ((settings.m_data != m_settings.m_data) || force) { - reverseAPIKeys.append("data"); - } - - if ((settings.m_bpf != m_settings.m_bpf) || force) { - reverseAPIKeys.append("bpf"); - } - - if ((settings.m_bpfLowCutoff != m_settings.m_bpfLowCutoff) || force) { - reverseAPIKeys.append("bpfLowCutoff"); - } - - if ((settings.m_bpfHighCutoff != m_settings.m_bpfHighCutoff) || force) { - reverseAPIKeys.append("bpfHighCutoff"); - } - - if ((settings.m_bpfTaps != m_settings.m_bpfTaps) || force) { - reverseAPIKeys.append("bpfTaps"); - } - - if ((settings.m_scramble != m_settings.m_scramble) || force) { - reverseAPIKeys.append("scramble"); - } - - if ((settings.m_polynomial != m_settings.m_polynomial) || force) { - reverseAPIKeys.append("polynomial"); - } - - if ((settings.m_beta != m_settings.m_beta) || force) { - reverseAPIKeys.append("beta"); - } - - if ((settings.m_symbolSpan != m_settings.m_symbolSpan) || force) { - reverseAPIKeys.append("symbolSpan"); - } - - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - - if ( (settings.m_udpEnabled != m_settings.m_udpEnabled) - || (settings.m_udpAddress != m_settings.m_udpAddress) - || (settings.m_udpPort != m_settings.m_udpPort) + if ((settingsKeys.contains("udpEnabled") && (settings.m_udpEnabled != m_settings.m_udpEnabled)) + || (settingsKeys.contains("udpAddress") && (settings.m_udpAddress != m_settings.m_udpAddress)) + || (settingsKeys.contains("udpPort") && (settings.m_udpPort != m_settings.m_udpPort)) || force) { if (settings.m_udpEnabled) @@ -402,7 +205,7 @@ void PacketMod::applySettings(const PacketModSettings& settings, bool force) closeUDP(); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -413,28 +216,26 @@ void PacketMod::applySettings(const PacketModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - PacketModBaseband::MsgConfigurePacketModBaseband *msg = PacketModBaseband::MsgConfigurePacketModBaseband::create(settings, force); + PacketModBaseband::MsgConfigurePacketModBaseband *msg = PacketModBaseband::MsgConfigurePacketModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -455,7 +256,7 @@ bool PacketMod::deserialize(const QByteArray& data) success = false; } - MsgConfigurePacketMod *msg = MsgConfigurePacketMod::create(m_settings, true); + MsgConfigurePacketMod *msg = MsgConfigurePacketMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return success; @@ -511,12 +312,12 @@ int PacketMod::webapiSettingsPutPatch( PacketModSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigurePacketMod *msg = MsgConfigurePacketMod::create(settings, force); + MsgConfigurePacketMod *msg = MsgConfigurePacketMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePacketMod *msgToGUI = MsgConfigurePacketMod::create(settings, force); + MsgConfigurePacketMod *msgToGUI = MsgConfigurePacketMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -885,7 +686,7 @@ void PacketMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons response.getPacketModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void PacketMod::webapiReverseSendSettings(QList& channelSettingsKeys, const PacketModSettings& settings, bool force) +void PacketMod::webapiReverseSendSettings(const QList& channelSettingsKeys, const PacketModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -912,7 +713,7 @@ void PacketMod::webapiReverseSendSettings(QList& channelSettingsKeys, c void PacketMod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const PacketModSettings& settings, bool force) { @@ -936,7 +737,7 @@ void PacketMod::sendChannelSettings( } void PacketMod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PacketModSettings& settings, bool force diff --git a/plugins/channeltx/modpacket/packetmod.h b/plugins/channeltx/modpacket/packetmod.h index 74783e636..dda22ef8b 100644 --- a/plugins/channeltx/modpacket/packetmod.h +++ b/plugins/channeltx/modpacket/packetmod.h @@ -50,20 +50,23 @@ public: public: const PacketModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePacketMod* create(const PacketModSettings& settings, bool force) + static MsgConfigurePacketMod* create(const QStringList& settingsKeys, const PacketModSettings& settings, bool force) { - return new MsgConfigurePacketMod(settings, force); + return new MsgConfigurePacketMod(settingsKeys, settings, force); } private: PacketModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePacketMod(const PacketModSettings& settings, bool force) : + MsgConfigurePacketMod(const QStringList& settingsKeys, const PacketModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -234,18 +237,18 @@ private: QUdpSocket *m_udpSocket; virtual bool handleMessage(const Message& cmd); - void applySettings(const PacketModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PacketModSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const PacketModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const PacketModSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const PacketModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PacketModSettings& settings, bool force diff --git a/plugins/channeltx/modpacket/packetmodbaseband.cpp b/plugins/channeltx/modpacket/packetmodbaseband.cpp index 8c9c08854..967b1cf80 100644 --- a/plugins/channeltx/modpacket/packetmodbaseband.cpp +++ b/plugins/channeltx/modpacket/packetmodbaseband.cpp @@ -145,7 +145,7 @@ bool PacketModBaseband::handleMessage(const Message& cmd) MsgConfigurePacketModBaseband& cfg = (MsgConfigurePacketModBaseband&) cmd; qDebug() << "PacketModBaseband::handleMessage: MsgConfigurePacketModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -188,7 +188,7 @@ bool PacketModBaseband::handleMessage(const Message& cmd) } } -void PacketModBaseband::applySettings(const PacketModSettings& settings, bool force) +void PacketModBaseband::applySettings(const QStringList& settingsKeys, const PacketModSettings& settings, bool force) { if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { @@ -196,9 +196,13 @@ void PacketModBaseband::applySettings(const PacketModSettings& settings, bool fo m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int PacketModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modpacket/packetmodbaseband.h b/plugins/channeltx/modpacket/packetmodbaseband.h index 44956c907..63bb535d9 100644 --- a/plugins/channeltx/modpacket/packetmodbaseband.h +++ b/plugins/channeltx/modpacket/packetmodbaseband.h @@ -41,20 +41,23 @@ public: public: const PacketModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePacketModBaseband* create(const PacketModSettings& settings, bool force) + static MsgConfigurePacketModBaseband* create(const QStringList& settingsKeys, const PacketModSettings& settings, bool force) { - return new MsgConfigurePacketModBaseband(settings, force); + return new MsgConfigurePacketModBaseband(settingsKeys, settings, force); } private: PacketModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePacketModBaseband(const PacketModSettings& settings, bool force) : + MsgConfigurePacketModBaseband(const QStringList& settingsKeys, const PacketModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -89,7 +92,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const PacketModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PacketModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modpacket/packetmodgui.cpp b/plugins/channeltx/modpacket/packetmodgui.cpp index adc634962..4f35aa7af 100644 --- a/plugins/channeltx/modpacket/packetmodgui.cpp +++ b/plugins/channeltx/modpacket/packetmodgui.cpp @@ -58,7 +58,7 @@ void PacketModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray PacketModGUI::serialize() const @@ -70,7 +70,7 @@ bool PacketModGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -116,7 +116,7 @@ void PacketModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void PacketModGUI::handleSourceMessages() @@ -137,7 +137,7 @@ void PacketModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void PacketModGUI::on_mode_currentIndexChanged(int value) @@ -155,7 +155,7 @@ void PacketModGUI::on_mode_currentIndexChanged(int value) ui->fmDev->setValue(m_settings.m_fmDeviation / 100.0); ui->glSpectrum->setCenterFrequency(m_settings.m_spectrumRate/4); ui->glSpectrum->setSampleRate(m_settings.m_spectrumRate/2); - applySettings(); + applySettings(QStringList("mode")); // Remove custom mode when deselected, as we no longer know how to set it if (value < 2) @@ -168,27 +168,27 @@ void PacketModGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void PacketModGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); m_settings.m_fmDeviation = value * 100.0; - applySettings(); + applySettings(QStringList("fmDeviation")); } void PacketModGUI::on_gain_valueChanged(int value) { ui->gainText->setText(QString("%1dB").arg(value)); m_settings.m_gain = value; - applySettings(); + applySettings(QStringList("gain")); } void PacketModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void PacketModGUI::on_txButton_clicked() @@ -204,25 +204,25 @@ void PacketModGUI::on_packet_returnPressed() void PacketModGUI::on_callsign_editingFinished() { m_settings.m_callsign = ui->callsign->text(); - applySettings(); + applySettings(QStringList("callsign")); } void PacketModGUI::on_to_currentTextChanged(const QString &text) { m_settings.m_to = text; - applySettings(); + applySettings(QStringList("to")); } void PacketModGUI::on_via_currentTextChanged(const QString &text) { m_settings.m_via = text; - applySettings(); + applySettings(QStringList("via")); } void PacketModGUI::on_packet_editingFinished() { m_settings.m_data = ui->packet->text(); - applySettings(); + applySettings(QStringList("data")); } void PacketModGUI::on_insertPosition_clicked() @@ -267,19 +267,19 @@ void PacketModGUI::on_insertPosition_clicked() void PacketModGUI::on_repeat_toggled(bool checked) { m_settings.m_repeat = checked; - applySettings(); + applySettings(QStringList("repeat")); } void PacketModGUI::on_preEmphasis_toggled(bool checked) { m_settings.m_preEmphasis = checked; - applySettings(); + applySettings(QStringList("preEmphasis")); } void PacketModGUI::on_bpf_toggled(bool checked) { m_settings.m_bpf = checked; - applySettings(); + applySettings(QStringList("bpf")); } void PacketModGUI::preEmphasisSelect(const QPoint& p) @@ -292,7 +292,7 @@ void PacketModGUI::preEmphasisSelect(const QPoint& p) { m_settings.m_preEmphasisTau = dialog.m_tau; m_settings.m_preEmphasisHighFreq = dialog.m_highFreq; - applySettings(); + applySettings(QStringList({"preEmphasisTau", "preEmphasisHighFreq"})); } } @@ -307,7 +307,7 @@ void PacketModGUI::bpfSelect(const QPoint& p) m_settings.m_bpfLowCutoff = dialog.m_lowFreq; m_settings.m_bpfHighCutoff = dialog.m_highFreq; m_settings.m_bpfTaps = dialog.m_taps; - applySettings(); + applySettings(QStringList({"bpfLowCutoff", "bpfHighCutoff", "bpfTaps"})); } } @@ -321,7 +321,7 @@ void PacketModGUI::repeatSelect(const QPoint& p) { m_settings.m_repeatDelay = dialog.m_repeatDelay; m_settings.m_repeatCount = dialog.m_repeatCount; - applySettings(); + applySettings(QStringList({"repeatDelay", "repeatCount"})); } } @@ -366,26 +366,26 @@ void PacketModGUI::txSettingsSelect(const QPoint& p) m_settings.m_rfNoise = dialog.m_rfNoise; m_settings.m_writeToFile = dialog.m_writeToFile; displaySettings(); - applySettings(); + applySettings(QStringList({"rampUpBits", "rampDownBits", "rampRange", "modulateWhileRamping", "modulation", "baud", "markFrequency", "spaceFrequency", "pulseShaping", "beta", "symbolSpan", "scramble", "polynomial", "ax25PreFlags", "ax25PostFlags", "ax25Control", "ax25PID", "lpfTaps", "bbNoise", "rfNoise", "writeToFile"})); } } void PacketModGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void PacketModGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void PacketModGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void PacketModGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -394,7 +394,7 @@ void PacketModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void PacketModGUI::onMenuDialogCalled(const QPoint &p) @@ -439,7 +439,7 @@ void PacketModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"useReverseAPI", "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "title", "rgbColor", "streamIndex"})); } resetContextMenuType(); @@ -527,7 +527,7 @@ PacketModGUI::PacketModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb displaySettings(); makeUIConnections(); - applySettings(); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -551,11 +551,11 @@ void PacketModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void PacketModGUI::applySettings(bool force) +void PacketModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - PacketMod::MsgConfigurePacketMod *msg = PacketMod::MsgConfigurePacketMod::create(m_settings, force); + PacketMod::MsgConfigurePacketMod *msg = PacketMod::MsgConfigurePacketMod::create(settingsKeys, m_settings, force); m_packetMod->getInputMessageQueue()->push(msg); } } diff --git a/plugins/channeltx/modpacket/packetmodgui.h b/plugins/channeltx/modpacket/packetmodgui.h index e8a7de30b..40cf931da 100644 --- a/plugins/channeltx/modpacket/packetmodgui.h +++ b/plugins/channeltx/modpacket/packetmodgui.h @@ -85,7 +85,7 @@ private: void transmit(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channeltx/modpacket/packetmodsettings.cpp b/plugins/channeltx/modpacket/packetmodsettings.cpp index 483aafb35..b0f45f07b 100644 --- a/plugins/channeltx/modpacket/packetmodsettings.cpp +++ b/plugins/channeltx/modpacket/packetmodsettings.cpp @@ -350,3 +350,342 @@ bool PacketModSettings::deserialize(const QByteArray& data) return false; } } + +void PacketModSettings::applySettings(const QStringList& settingsKeys, const PacketModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("modulation")) { + m_modulation = settings.m_modulation; + } + if (settingsKeys.contains("baud")) { + m_baud = settings.m_baud; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("gain")) { + m_gain = settings.m_gain; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("repeat")) { + m_repeat = settings.m_repeat; + } + if (settingsKeys.contains("repeatDelay")) { + m_repeatDelay = settings.m_repeatDelay; + } + if (settingsKeys.contains("repeatCount")) { + m_repeatCount = settings.m_repeatCount; + } + if (settingsKeys.contains("rampUpBits")) { + m_rampUpBits = settings.m_rampUpBits; + } + if (settingsKeys.contains("rampDownBits")) { + m_rampDownBits = settings.m_rampDownBits; + } + if (settingsKeys.contains("rampRange")) { + m_rampRange = settings.m_rampRange; + } + if (settingsKeys.contains("modulateWhileRamping")) { + m_modulateWhileRamping = settings.m_modulateWhileRamping; + } + if (settingsKeys.contains("markFrequency")) { + m_markFrequency = settings.m_markFrequency; + } + if (settingsKeys.contains("spaceFrequency")) { + m_spaceFrequency = settings.m_spaceFrequency; + } + if (settingsKeys.contains("ax25PreFlags")) { + m_ax25PreFlags = settings.m_ax25PreFlags; + } + if (settingsKeys.contains("ax25PostFlags")) { + m_ax25PostFlags = settings.m_ax25PostFlags; + } + if (settingsKeys.contains("ax25Control")) { + m_ax25Control = settings.m_ax25Control; + } + if (settingsKeys.contains("ax25PID")) { + m_ax25PID = settings.m_ax25PID; + } + if (settingsKeys.contains("preEmphasis")) { + m_preEmphasis = settings.m_preEmphasis; + } + if (settingsKeys.contains("preEmphasisTau")) { + m_preEmphasisTau = settings.m_preEmphasisTau; + } + if (settingsKeys.contains("preEmphasisHighFreq")) { + m_preEmphasisHighFreq = settings.m_preEmphasisHighFreq; + } + if (settingsKeys.contains("lpfTaps")) { + m_lpfTaps = settings.m_lpfTaps; + } + if (settingsKeys.contains("bbNoise")) { + m_bbNoise = settings.m_bbNoise; + } + if (settingsKeys.contains("rfNoise")) { + m_rfNoise = settings.m_rfNoise; + } + if (settingsKeys.contains("writeToFile")) { + m_writeToFile = settings.m_writeToFile; + } + if (settingsKeys.contains("spectrumRate")) { + m_spectrumRate = settings.m_spectrumRate; + } + if (settingsKeys.contains("callsign")) { + m_callsign = settings.m_callsign; + } + if (settingsKeys.contains("to")) { + m_to = settings.m_to; + } + if (settingsKeys.contains("via")) { + m_via = settings.m_via; + } + if (settingsKeys.contains("data")) { + m_data = settings.m_data; + } + if (settingsKeys.contains("bpf")) { + m_bpf = settings.m_bpf; + } + if (settingsKeys.contains("bpfLowCutoff")) { + m_bpfLowCutoff = settings.m_bpfLowCutoff; + } + if (settingsKeys.contains("bpfHighCutoff")) { + m_bpfHighCutoff = settings.m_bpfHighCutoff; + } + if (settingsKeys.contains("bpfTaps")) { + m_bpfTaps = settings.m_bpfTaps; + } + if (settingsKeys.contains("scramble")) { + m_scramble = settings.m_scramble; + } + if (settingsKeys.contains("polynomial")) { + m_polynomial = settings.m_polynomial; + } + if (settingsKeys.contains("pulseShaping")) { + m_pulseShaping = settings.m_pulseShaping; + } + if (settingsKeys.contains("beta")) { + m_beta = settings.m_beta; + } + if (settingsKeys.contains("symbolSpan")) { + m_symbolSpan = settings.m_symbolSpan; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString PacketModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("modulation") || force) { + ostr << " m_modulation: " << m_modulation; + } + if (settingsKeys.contains("baud") || force) { + ostr << " m_baud: " << m_baud; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("gain") || force) { + ostr << " m_gain: " << m_gain; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("repeat") || force) { + ostr << " m_repeat: " << m_repeat; + } + if (settingsKeys.contains("repeatDelay") || force) { + ostr << " m_repeatDelay: " << m_repeatDelay; + } + if (settingsKeys.contains("repeatCount") || force) { + ostr << " m_repeatCount: " << m_repeatCount; + } + if (settingsKeys.contains("rampUpBits") || force) { + ostr << " m_rampUpBits: " << m_rampUpBits; + } + if (settingsKeys.contains("rampDownBits") || force) { + ostr << " m_rampDownBits: " << m_rampDownBits; + } + if (settingsKeys.contains("rampRange") || force) { + ostr << " m_rampRange: " << m_rampRange; + } + if (settingsKeys.contains("modulateWhileRamping") || force) { + ostr << " m_modulateWhileRamping: " << m_modulateWhileRamping; + } + if (settingsKeys.contains("markFrequency") || force) { + ostr << " m_markFrequency: " << m_markFrequency; + } + if (settingsKeys.contains("spaceFrequency") || force) { + ostr << " m_spaceFrequency: " << m_spaceFrequency; + } + if (settingsKeys.contains("ax25PreFlags") || force) { + ostr << " m_ax25PreFlags: " << m_ax25PreFlags; + } + if (settingsKeys.contains("ax25PostFlags") || force) { + ostr << " m_ax25PostFlags: " << m_ax25PostFlags; + } + if (settingsKeys.contains("ax25Control") || force) { + ostr << " m_ax25Control: " << m_ax25Control; + } + if (settingsKeys.contains("ax25PID") || force) { + ostr << " m_ax25PID: " << m_ax25PID; + } + if (settingsKeys.contains("preEmphasis") || force) { + ostr << " m_preEmphasis: " << m_preEmphasis; + } + if (settingsKeys.contains("preEmphasisTau") || force) { + ostr << " m_preEmphasisTau: " << m_preEmphasisTau; + } + if (settingsKeys.contains("preEmphasisHighFreq") || force) { + ostr << " m_preEmphasisHighFreq: " << m_preEmphasisHighFreq; + } + if (settingsKeys.contains("lpfTaps") || force) { + ostr << " m_lpfTaps: " << m_lpfTaps; + } + if (settingsKeys.contains("bbNoise") || force) { + ostr << " m_bbNoise: " << m_bbNoise; + } + if (settingsKeys.contains("rfNoise") || force) { + ostr << " m_rfNoise: " << m_rfNoise; + } + if (settingsKeys.contains("writeToFile") || force) { + ostr << " m_writeToFile: " << m_writeToFile; + } + if (settingsKeys.contains("spectrumRate") || force) { + ostr << " m_spectrumRate: " << m_spectrumRate; + } + if (settingsKeys.contains("callsign") || force) { + ostr << " m_callsign: " << m_callsign.toStdString(); + } + if (settingsKeys.contains("to") || force) { + ostr << " m_to: " << m_to.toStdString(); + } + if (settingsKeys.contains("via") || force) { + ostr << " m_via: " << m_via.toStdString(); + } + if (settingsKeys.contains("data") || force) { + ostr << " m_data: " << m_data.toStdString(); + } + if (settingsKeys.contains("bpf") || force) { + ostr << " m_bpf: " << m_bpf; + } + if (settingsKeys.contains("bpfLowCutoff") || force) { + ostr << " m_bpfLowCutoff: " << m_bpfLowCutoff; + } + if (settingsKeys.contains("bpfHighCutoff") || force) { + ostr << " m_bpfHighCutoff: " << m_bpfHighCutoff; + } + if (settingsKeys.contains("bpfTaps") || force) { + ostr << " m_bpfTaps: " << m_bpfTaps; + } + if (settingsKeys.contains("scramble") || force) { + ostr << " m_scramble: " << m_scramble; + } + if (settingsKeys.contains("polynomial") || force) { + ostr << " m_polynomial: " << m_polynomial; + } + if (settingsKeys.contains("pulseShaping") || force) { + ostr << " m_pulseShaping: " << m_pulseShaping; + } + if (settingsKeys.contains("beta") || force) { + ostr << " m_beta: " << m_beta; + } + if (settingsKeys.contains("symbolSpan") || force) { + ostr << " m_symbolSpan: " << m_symbolSpan; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modpacket/packetmodsettings.h b/plugins/channeltx/modpacket/packetmodsettings.h index 57fde47a1..c03d9b19b 100644 --- a/plugins/channeltx/modpacket/packetmodsettings.h +++ b/plugins/channeltx/modpacket/packetmodsettings.h @@ -97,6 +97,8 @@ struct PacketModSettings bool deserialize(const QByteArray& data); bool setMode(QString mode); QString getMode() const; + void applySettings(const QStringList& settingsKeys, const PacketModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* PLUGINS_CHANNELTX_MODPACKET_PACKETMODSETTINGS_H */ diff --git a/plugins/channeltx/modpacket/packetmodsource.cpp b/plugins/channeltx/modpacket/packetmodsource.cpp index a166e335d..cfae4a203 100644 --- a/plugins/channeltx/modpacket/packetmodsource.cpp +++ b/plugins/channeltx/modpacket/packetmodsource.cpp @@ -54,7 +54,7 @@ PacketModSource::PacketModSource() : m_demodBuffer.resize(1<<12); m_demodBufferFill = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -319,21 +319,21 @@ void PacketModSource::calculateLevel(Real& sample) } } -void PacketModSource::applySettings(const PacketModSettings& settings, bool force) +void PacketModSource::applySettings(const QStringList& settingsKeys, const PacketModSettings& settings, bool force) { // Only recreate filters if settings have changed - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("lpfTaps") && (settings.m_lpfTaps != m_settings.m_lpfTaps)) || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { qDebug() << "PacketModSource::applySettings: Creating new lpf with taps " << settings.m_lpfTaps << " rfBW " << settings.m_rfBandwidth; m_lowpass.create(settings.m_lpfTaps, m_channelSampleRate, settings.m_rfBandwidth / 2.0); } - if ((settings.m_preEmphasisTau != m_settings.m_preEmphasisTau) || (settings.m_preEmphasisHighFreq != m_settings.m_preEmphasisHighFreq) || force) + if ((settingsKeys.contains("preEmphasisTau") && (settings.m_preEmphasisTau != m_settings.m_preEmphasisTau)) || (settingsKeys.contains("preEmphasisHighFreq") && (settings.m_preEmphasisHighFreq != m_settings.m_preEmphasisHighFreq)) || force) { qDebug() << "PacketModSource::applySettings: Creating new preemphasis filter with tau " << settings.m_preEmphasisTau << " highFreq " << settings.m_preEmphasisHighFreq << " sampleRate " << m_channelSampleRate; m_preemphasisFilter.configure(m_channelSampleRate, settings.m_preEmphasisTau, settings.m_preEmphasisHighFreq); } - if ((settings.m_bpfLowCutoff != m_settings.m_bpfLowCutoff) || (settings.m_bpfHighCutoff != m_settings.m_bpfHighCutoff) - || (settings.m_bpfTaps != m_settings.m_bpfTaps)|| force) + if ((settingsKeys.contains("bpfLowCutoff") && (settings.m_bpfLowCutoff != m_settings.m_bpfLowCutoff)) || (settingsKeys.contains("bpfHighCutoff") && (settings.m_bpfHighCutoff != m_settings.m_bpfHighCutoff)) + || (settingsKeys.contains("bpfTaps") && (settings.m_bpfTaps != m_settings.m_bpfTaps))|| force) { qDebug() << "PacketModSource::applySettings: Recreating bandpass filter: " << " m_bpfTaps: " << settings.m_bpfTaps @@ -342,7 +342,7 @@ void PacketModSource::applySettings(const PacketModSettings& settings, bool forc << " m_bpfHighCutoff: " << settings.m_bpfHighCutoff; m_bandpass.create(settings.m_bpfTaps, m_channelSampleRate, settings.m_bpfLowCutoff, settings.m_bpfHighCutoff); } - if ((settings.m_beta != m_settings.m_beta) || (settings.m_symbolSpan != m_settings.m_symbolSpan) || (settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("beta") && (settings.m_beta != m_settings.m_beta)) || (settingsKeys.contains("symbolSpan") && (settings.m_symbolSpan != m_settings.m_symbolSpan)) || (settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { qDebug() << "PacketModSource::applySettings: Recreating pulse shaping filter: " << " beta: " << settings.m_beta @@ -351,9 +351,9 @@ void PacketModSource::applySettings(const PacketModSettings& settings, bool forc << " baud:" << settings.m_baud; m_pulseShape.create(settings.m_beta, settings.m_symbolSpan, m_channelSampleRate/settings.m_baud); } - if ((settings.m_polynomial != m_settings.m_polynomial) || force) + if ((settingsKeys.contains("polynomial") && (settings.m_polynomial != m_settings.m_polynomial)) || force) m_scrambler.setPolynomial(settings.m_polynomial); - if ((settings.m_spectrumRate != m_settings.m_spectrumRate) || force) + if ((settingsKeys.contains("spectrumRate") && (settings.m_spectrumRate != m_settings.m_spectrumRate)) || force) { m_interpolatorDistanceRemain = 0; m_interpolatorConsumed = false; @@ -361,7 +361,11 @@ void PacketModSource::applySettings(const PacketModSettings& settings, bool forc m_interpolator.create(48, settings.m_spectrumRate, settings.m_spectrumRate / 2.2, 3.0); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } // Precalculate FM sensensity and linear gain to save doing it in the loop m_phaseSensitivity = 2.0f * M_PI * m_settings.m_fmDeviation / (double)m_channelSampleRate; diff --git a/plugins/channeltx/modpacket/packetmodsource.h b/plugins/channeltx/modpacket/packetmodsource.h index 8a1e9e467..f0e0a1cfc 100644 --- a/plugins/channeltx/modpacket/packetmodsource.h +++ b/plugins/channeltx/modpacket/packetmodsource.h @@ -64,7 +64,7 @@ public: numSamples = m_levelNbSamples; } void setSpectrumSink(BasebandSampleSink *sampleSink) { m_spectrumSink = sampleSink; } - void applySettings(const PacketModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PacketModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void addTXPacket(QString callsign, QString to, QString via, QString data); void addTXPacket(QByteArray data); diff --git a/plugins/channeltx/modpsk31/psk31mod.cpp b/plugins/channeltx/modpsk31/psk31mod.cpp index 9ff7aa6dd..28934c72c 100644 --- a/plugins/channeltx/modpsk31/psk31mod.cpp +++ b/plugins/channeltx/modpsk31/psk31mod.cpp @@ -65,7 +65,7 @@ PSK31::PSK31(DeviceAPI *deviceAPI) : m_basebandSource->setChannel(this); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -134,7 +134,7 @@ bool PSK31::handleMessage(const Message& cmd) MsgConfigurePSK31& cfg = (MsgConfigurePSK31&) cmd; qDebug() << "PSK31::handleMessage: MsgConfigurePSK31"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -183,108 +183,22 @@ void PSK31::setCenterFrequency(qint64 frequency) { PSK31Settings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePSK31 *msgToGUI = MsgConfigurePSK31::create(settings, false); + MsgConfigurePSK31 *msgToGUI = MsgConfigurePSK31::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void PSK31::applySettings(const PSK31Settings& settings, bool force) +void PSK31::applySettings(const QStringList& settingsKeys, const PSK31Settings& settings, bool force) { - qDebug() << "PSK31::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_baud: " << settings.m_baud - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_gain: " << settings.m_gain - << " m_channelMute: " << settings.m_channelMute - << " m_repeat: " << settings.m_repeat - << " m_repeatCount: " << settings.m_repeatCount - << " m_text: " << settings.m_text - << " m_prefixCRLF: " << settings.m_prefixCRLF - << " m_postfixCRLF: " << settings.m_postfixCRLF - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "PSK31::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - - if ((settings.m_baud != m_settings.m_baud) || force) { - reverseAPIKeys.append("baud"); - } - - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - - if ((settings.m_gain != m_settings.m_gain) || force) { - reverseAPIKeys.append("gain"); - } - - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - - if ((settings.m_repeat != m_settings.m_repeat) || force) { - reverseAPIKeys.append("repeat"); - } - - if ((settings.m_repeatCount != m_settings.m_repeatCount) || force) { - reverseAPIKeys.append("repeatCount"); - } - - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || force) { - reverseAPIKeys.append("lpfTaps"); - } - - if ((settings.m_rfNoise != m_settings.m_rfNoise) || force) { - reverseAPIKeys.append("rfNoise"); - } - - if ((settings.m_text != m_settings.m_text) || force) { - reverseAPIKeys.append("text"); - } - - if ((settings.m_beta != m_settings.m_beta) || force) { - reverseAPIKeys.append("beta"); - } - - if ((settings.m_symbolSpan != m_settings.m_symbolSpan) || force) { - reverseAPIKeys.append("symbolSpan"); - } - - if ((settings.m_prefixCRLF != m_settings.m_prefixCRLF) || force) { - reverseAPIKeys.append("prefixCRLF"); - } - - if ((settings.m_postfixCRLF != m_settings.m_postfixCRLF) || force) { - reverseAPIKeys.append("postfixCRLF"); - } - - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - - if ( (settings.m_udpEnabled != m_settings.m_udpEnabled) - || (settings.m_udpAddress != m_settings.m_udpAddress) - || (settings.m_udpPort != m_settings.m_udpPort) + if ((settingsKeys.contains("udpEnabled") && (settings.m_udpEnabled != m_settings.m_udpEnabled)) + || (settingsKeys.contains("udpAddress") && (settings.m_udpAddress != m_settings.m_udpAddress)) + || (settingsKeys.contains("udpPort") && (settings.m_udpPort != m_settings.m_udpPort)) || force) { if (settings.m_udpEnabled) @@ -293,7 +207,7 @@ void PSK31::applySettings(const PSK31Settings& settings, bool force) closeUDP(); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -304,31 +218,33 @@ void PSK31::applySettings(const PSK31Settings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - PSK31Baseband::MsgConfigurePSK31Baseband *msg = PSK31Baseband::MsgConfigurePSK31Baseband::create(settings, force); + PSK31Baseband::MsgConfigurePSK31Baseband *msg = PSK31Baseband::MsgConfigurePSK31Baseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray PSK31::serialize() const @@ -346,7 +262,7 @@ bool PSK31::deserialize(const QByteArray& data) success = false; } - MsgConfigurePSK31 *msg = MsgConfigurePSK31::create(m_settings, true); + MsgConfigurePSK31 *msg = MsgConfigurePSK31::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return success; @@ -402,12 +318,12 @@ int PSK31::webapiSettingsPutPatch( PSK31Settings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigurePSK31 *msg = MsgConfigurePSK31::create(settings, force); + MsgConfigurePSK31 *msg = MsgConfigurePSK31::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigurePSK31 *msgToGUI = MsgConfigurePSK31::create(settings, force); + MsgConfigurePSK31 *msgToGUI = MsgConfigurePSK31::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -644,7 +560,7 @@ void PSK31::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getPsk31ModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void PSK31::webapiReverseSendSettings(QList& channelSettingsKeys, const PSK31Settings& settings, bool force) +void PSK31::webapiReverseSendSettings(const QList& channelSettingsKeys, const PSK31Settings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -671,7 +587,7 @@ void PSK31::webapiReverseSendSettings(QList& channelSettingsKeys, const void PSK31::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const PSK31Settings& settings, bool force) { @@ -695,7 +611,7 @@ void PSK31::sendChannelSettings( } void PSK31::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PSK31Settings& settings, bool force diff --git a/plugins/channeltx/modpsk31/psk31mod.h b/plugins/channeltx/modpsk31/psk31mod.h index c9be22276..bdfa7d67f 100644 --- a/plugins/channeltx/modpsk31/psk31mod.h +++ b/plugins/channeltx/modpsk31/psk31mod.h @@ -50,20 +50,23 @@ public: public: const PSK31Settings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePSK31* create(const PSK31Settings& settings, bool force) + static MsgConfigurePSK31* create(const QStringList& settingsKeys, const PSK31Settings& settings, bool force) { - return new MsgConfigurePSK31(settings, force); + return new MsgConfigurePSK31(settingsKeys, settings, force); } private: PSK31Settings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePSK31(const PSK31Settings& settings, bool force) : + MsgConfigurePSK31(const QStringList& settingsKeys, const PSK31Settings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -219,18 +222,18 @@ private: QUdpSocket *m_udpSocket; virtual bool handleMessage(const Message& cmd); - void applySettings(const PSK31Settings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PSK31Settings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const PSK31Settings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const PSK31Settings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const PSK31Settings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const PSK31Settings& settings, bool force diff --git a/plugins/channeltx/modpsk31/psk31modbaseband.cpp b/plugins/channeltx/modpsk31/psk31modbaseband.cpp index 7304cbeff..42f040180 100644 --- a/plugins/channeltx/modpsk31/psk31modbaseband.cpp +++ b/plugins/channeltx/modpsk31/psk31modbaseband.cpp @@ -145,7 +145,7 @@ bool PSK31Baseband::handleMessage(const Message& cmd) MsgConfigurePSK31Baseband& cfg = (MsgConfigurePSK31Baseband&) cmd; qDebug() << "PSK31Baseband::handleMessage: MsgConfigurePSK31Baseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -181,18 +181,22 @@ bool PSK31Baseband::handleMessage(const Message& cmd) } } -void PSK31Baseband::applySettings(const PSK31Settings& settings, bool force) +void PSK31Baseband::applySettings(const QStringList& settingsKeys, const PSK31Settings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { // Use fixed sample rate of 48000, so Cosine filter doesn't have a massive number of taps at high baseband sample rates (See #1862) m_channelizer->setChannelization(48000, settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int PSK31Baseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modpsk31/psk31modbaseband.h b/plugins/channeltx/modpsk31/psk31modbaseband.h index 89ea2be40..9892925ac 100644 --- a/plugins/channeltx/modpsk31/psk31modbaseband.h +++ b/plugins/channeltx/modpsk31/psk31modbaseband.h @@ -41,20 +41,23 @@ public: public: const PSK31Settings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigurePSK31Baseband* create(const PSK31Settings& settings, bool force) + static MsgConfigurePSK31Baseband* create(const QStringList& settingsKeys, const PSK31Settings& settings, bool force) { - return new MsgConfigurePSK31Baseband(settings, force); + return new MsgConfigurePSK31Baseband(settingsKeys, settings, force); } private: PSK31Settings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigurePSK31Baseband(const PSK31Settings& settings, bool force) : + MsgConfigurePSK31Baseband(const QStringList& settingsKeys, const PSK31Settings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -90,7 +93,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const PSK31Settings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PSK31Settings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modpsk31/psk31modgui.cpp b/plugins/channeltx/modpsk31/psk31modgui.cpp index 1bc3956f8..0fdfb29d3 100644 --- a/plugins/channeltx/modpsk31/psk31modgui.cpp +++ b/plugins/channeltx/modpsk31/psk31modgui.cpp @@ -58,7 +58,7 @@ void PSK31GUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray PSK31GUI::serialize() const @@ -70,7 +70,7 @@ bool PSK31GUI::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -154,7 +154,7 @@ void PSK31GUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void PSK31GUI::handleSourceMessages() @@ -175,7 +175,7 @@ void PSK31GUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void PSK31GUI::on_rfBW_valueChanged(int value) @@ -184,7 +184,7 @@ void PSK31GUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(QString("%1 Hz").arg(bw)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void PSK31GUI::on_clearTransmittedText_clicked() @@ -196,13 +196,13 @@ void PSK31GUI::on_gain_valueChanged(int value) { ui->gainText->setText(QString("%1dB").arg(value)); m_settings.m_gain = value; - applySettings(); + applySettings(QStringList("gain")); } void PSK31GUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void PSK31GUI::on_txButton_clicked() @@ -219,13 +219,13 @@ void PSK31GUI::on_text_returnPressed() void PSK31GUI::on_text_editingFinished() { m_settings.m_text = ui->text->currentText(); - applySettings(); + applySettings(QStringList("text")); } void PSK31GUI::on_repeat_toggled(bool checked) { m_settings.m_repeat = checked; - applySettings(); + applySettings(QStringList("repeat")); } void PSK31GUI::repeatSelect(const QPoint& p) @@ -237,7 +237,7 @@ void PSK31GUI::repeatSelect(const QPoint& p) if (dialog.exec() == QDialog::Accepted) { m_settings.m_repeatCount = dialog.m_repeatCount; - applySettings(); + applySettings(QStringList("repeatCount")); } } @@ -250,26 +250,26 @@ void PSK31GUI::txSettingsSelect(const QPoint& p) if (dialog.exec() == QDialog::Accepted) { displaySettings(); - applySettings(); + applySettings(QStringList({"modulationType", "filterAlpha", "filterBeta", "preemphasis", "udpEnabled", "udpAddress", "udpPort"})); } } void PSK31GUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void PSK31GUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void PSK31GUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void PSK31GUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -278,7 +278,7 @@ void PSK31GUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void PSK31GUI::onMenuDialogCalled(const QPoint &p) @@ -323,7 +323,7 @@ void PSK31GUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"channelMarker", "useReverseAPI", "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -406,7 +406,7 @@ PSK31GUI::PSK31GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl displaySettings(); makeUIConnections(); - applySettings(); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); @@ -431,11 +431,11 @@ void PSK31GUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void PSK31GUI::applySettings(bool force) +void PSK31GUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - PSK31::MsgConfigurePSK31 *msg = PSK31::MsgConfigurePSK31::create(m_settings, force); + PSK31::MsgConfigurePSK31 *msg = PSK31::MsgConfigurePSK31::create(settingsKeys, m_settings, force); m_psk31Mod->getInputMessageQueue()->push(msg); } } diff --git a/plugins/channeltx/modpsk31/psk31modgui.h b/plugins/channeltx/modpsk31/psk31modgui.h index b9134314e..5aa4e5af4 100644 --- a/plugins/channeltx/modpsk31/psk31modgui.h +++ b/plugins/channeltx/modpsk31/psk31modgui.h @@ -86,7 +86,7 @@ private: void transmit(const QString& str); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); bool handleMessage(const Message& message); void makeUIConnections(); diff --git a/plugins/channeltx/modpsk31/psk31modsettings.cpp b/plugins/channeltx/modpsk31/psk31modsettings.cpp index ebb38ddc0..a6ebec285 100644 --- a/plugins/channeltx/modpsk31/psk31modsettings.cpp +++ b/plugins/channeltx/modpsk31/psk31modsettings.cpp @@ -205,3 +205,189 @@ bool PSK31Settings::deserialize(const QByteArray& data) return false; } } + +void PSK31Settings::applySettings(const QStringList& settingsKeys, const PSK31Settings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("baud")) { + m_baud = settings.m_baud; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("gain")) { + m_gain = settings.m_gain; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("repeat")) { + m_repeat = settings.m_repeat; + } + if (settingsKeys.contains("repeatCount")) { + m_repeatCount = settings.m_repeatCount; + } + if (settingsKeys.contains("lpfTaps")) { + m_lpfTaps = settings.m_lpfTaps; + } + if (settingsKeys.contains("rfNoise")) { + m_rfNoise = settings.m_rfNoise; + } + if (settingsKeys.contains("text")) { + m_text = settings.m_text; + } + if (settingsKeys.contains("pulseShaping")) { + m_pulseShaping = settings.m_pulseShaping; + } + if (settingsKeys.contains("beta")) { + m_beta = settings.m_beta; + } + if (settingsKeys.contains("symbolSpan")) { + m_symbolSpan = settings.m_symbolSpan; + } + if (settingsKeys.contains("prefixCRLF")) { + m_prefixCRLF = settings.m_prefixCRLF; + } + if (settingsKeys.contains("postfixCRLF")) { + m_postfixCRLF = settings.m_postfixCRLF; + } + if (settingsKeys.contains("predefinedTexts")) { + m_predefinedTexts = settings.m_predefinedTexts; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString PSK31Settings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("baud") || force) { + ostr << " m_baud: " << m_baud; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("gain") || force) { + ostr << " m_gain: " << m_gain; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("repeat") || force) { + ostr << " m_repeat: " << m_repeat; + } + if (settingsKeys.contains("repeatCount") || force) { + ostr << " m_repeatCount: " << m_repeatCount; + } + if (settingsKeys.contains("lpfTaps") || force) { + ostr << " m_lpfTaps: " << m_lpfTaps; + } + if (settingsKeys.contains("rfNoise") || force) { + ostr << " m_rfNoise: " << m_rfNoise; + } + if (settingsKeys.contains("text") || force) { + ostr << " m_text: " << m_text.toStdString(); + } + if (settingsKeys.contains("pulseShaping") || force) { + ostr << " m_pulseShaping: " << m_pulseShaping; + } + if (settingsKeys.contains("beta") || force) { + ostr << " m_beta: " << m_beta; + } + if (settingsKeys.contains("symbolSpan") || force) { + ostr << " m_symbolSpan: " << m_symbolSpan; + } + if (settingsKeys.contains("prefixCRLF") || force) { + ostr << " m_prefixCRLF: " << m_prefixCRLF; + } + if (settingsKeys.contains("postfixCRLF") || force) { + ostr << " m_postfixCRLF: " << m_postfixCRLF; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modpsk31/psk31modsettings.h b/plugins/channeltx/modpsk31/psk31modsettings.h index 5ff658dd3..c27bc4d21 100644 --- a/plugins/channeltx/modpsk31/psk31modsettings.h +++ b/plugins/channeltx/modpsk31/psk31modsettings.h @@ -70,6 +70,8 @@ struct PSK31Settings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const PSK31Settings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* PLUGINS_CHANNELTX_MODPSK31_PSK31MODSETTINGS_H */ diff --git a/plugins/channeltx/modpsk31/psk31modsource.cpp b/plugins/channeltx/modpsk31/psk31modsource.cpp index 607a7b212..ae8babd94 100644 --- a/plugins/channeltx/modpsk31/psk31modsource.cpp +++ b/plugins/channeltx/modpsk31/psk31modsource.cpp @@ -52,7 +52,7 @@ PSK31Source::PSK31Source() : m_interpolatorDistance = (Real)m_channelSampleRate / (Real)m_spectrumRate; m_interpolator.create(48, m_spectrumRate, m_spectrumRate / 2.2, 3.0); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -231,20 +231,20 @@ void PSK31Source::calculateLevel(Real& sample) } } -void PSK31Source::applySettings(const PSK31Settings& settings, bool force) +void PSK31Source::applySettings(const QStringList& settingsKeys, const PSK31Settings& settings, bool force) { - if ((settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { m_samplesPerSymbol = m_channelSampleRate / settings.m_baud; qDebug() << "m_samplesPerSymbol: " << m_samplesPerSymbol << " (" << m_channelSampleRate << "/" << settings.m_baud << ")"; } - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("lpfTaps") && (settings.m_lpfTaps != m_settings.m_lpfTaps)) || (settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { qDebug() << "PSK31Source::applySettings: Creating new lpf with taps " << settings.m_lpfTaps << " rfBW " << settings.m_rfBandwidth; m_lowpass.create(settings.m_lpfTaps, m_channelSampleRate, settings.m_rfBandwidth / 2.0); } - if ((settings.m_beta != m_settings.m_beta) || (settings.m_symbolSpan != m_settings.m_symbolSpan) || (settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("beta") && (settings.m_beta != m_settings.m_beta)) || (settingsKeys.contains("symbolSpan") && (settings.m_symbolSpan != m_settings.m_symbolSpan)) || (settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { qDebug() << "PSK31Source::applySettings: Recreating pulse shaping filter: " << " beta: " << settings.m_beta @@ -254,7 +254,11 @@ void PSK31Source::applySettings(const PSK31Settings& settings, bool force) m_pulseShape.create(settings.m_beta, settings.m_symbolSpan, m_channelSampleRate/settings.m_baud, true); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } m_linearGain = powf(10.0f, m_settings.m_gain/20.0f); } diff --git a/plugins/channeltx/modpsk31/psk31modsource.h b/plugins/channeltx/modpsk31/psk31modsource.h index dbf766b6e..92433d157 100644 --- a/plugins/channeltx/modpsk31/psk31modsource.h +++ b/plugins/channeltx/modpsk31/psk31modsource.h @@ -55,7 +55,7 @@ public: } void setMessageQueueToGUI(MessageQueue* messageQueue) { m_messageQueueToGUI = messageQueue; } void setSpectrumSink(BasebandSampleSink *sampleSink) { m_spectrumSink = sampleSink; } - void applySettings(const PSK31Settings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const PSK31Settings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void addTXText(QString data); void setChannel(ChannelAPI *channel) { m_channel = channel; } diff --git a/plugins/channeltx/modrtty/rttymod.cpp b/plugins/channeltx/modrtty/rttymod.cpp index e6391a5f8..e0f1e5daa 100644 --- a/plugins/channeltx/modrtty/rttymod.cpp +++ b/plugins/channeltx/modrtty/rttymod.cpp @@ -65,7 +65,7 @@ RttyMod::RttyMod(DeviceAPI *deviceAPI) : m_basebandSource->setChannel(this); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -134,7 +134,7 @@ bool RttyMod::handleMessage(const Message& cmd) MsgConfigureRttyMod& cfg = (MsgConfigureRttyMod&) cmd; qDebug() << "RttyMod::handleMessage: MsgConfigureRttyMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -183,133 +183,22 @@ void RttyMod::setCenterFrequency(qint64 frequency) { RttyModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRttyMod *msgToGUI = MsgConfigureRttyMod::create(settings, false); + MsgConfigureRttyMod *msgToGUI = MsgConfigureRttyMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } -void RttyMod::applySettings(const RttyModSettings& settings, bool force) +void RttyMod::applySettings(const QStringList& settingsKeys, const RttyModSettings& settings, bool force) { - qDebug() << "RttyMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_baud: " << settings.m_baud - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_frequencyShift: " << settings.m_frequencyShift - << " m_gain: " << settings.m_gain - << " m_channelMute: " << settings.m_channelMute - << " m_repeat: " << settings.m_repeat - << " m_repeatCount: " << settings.m_repeatCount - << " m_text: " << settings.m_text - << " m_characterSet: " << settings.m_characterSet - << " m_unshiftOnSpace: " << settings.m_unshiftOnSpace - << " m_msbFirst: " << settings.m_msbFirst - << " m_spaceHigh: " << settings.m_spaceHigh - << " m_prefixCRLF: " << settings.m_prefixCRLF - << " m_postfixCRLF: " << settings.m_postfixCRLF - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIAddress: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "RttyMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - - if ((settings.m_baud != m_settings.m_baud) || force) { - reverseAPIKeys.append("baud"); - } - - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - - if ((settings.m_frequencyShift != m_settings.m_frequencyShift) || force) { - reverseAPIKeys.append("frequencyShift"); - } - - if ((settings.m_gain != m_settings.m_gain) || force) { - reverseAPIKeys.append("gain"); - } - - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - - if ((settings.m_repeat != m_settings.m_repeat) || force) { - reverseAPIKeys.append("repeat"); - } - - if ((settings.m_repeatCount != m_settings.m_repeatCount) || force) { - reverseAPIKeys.append("repeatCount"); - } - - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || force) { - reverseAPIKeys.append("lpfTaps"); - } - - if ((settings.m_rfNoise != m_settings.m_rfNoise) || force) { - reverseAPIKeys.append("rfNoise"); - } - - if ((settings.m_text != m_settings.m_text) || force) { - reverseAPIKeys.append("text"); - } - - if ((settings.m_beta != m_settings.m_beta) || force) { - reverseAPIKeys.append("beta"); - } - - if ((settings.m_symbolSpan != m_settings.m_symbolSpan) || force) { - reverseAPIKeys.append("symbolSpan"); - } - - if ((settings.m_characterSet != m_settings.m_characterSet) || force) { - reverseAPIKeys.append("characterSet"); - } - - if ((settings.m_unshiftOnSpace != m_settings.m_unshiftOnSpace) || force) { - reverseAPIKeys.append("unshiftOnSpace"); - } - - if ((settings.m_msbFirst != m_settings.m_msbFirst) || force) { - reverseAPIKeys.append("msbFirst"); - } - - if ((settings.m_spaceHigh != m_settings.m_spaceHigh) || force) { - reverseAPIKeys.append("spaceHigh"); - } - - if ((settings.m_prefixCRLF != m_settings.m_prefixCRLF) || force) { - reverseAPIKeys.append("prefixCRLF"); - } - - if ((settings.m_postfixCRLF != m_settings.m_postfixCRLF) || force) { - reverseAPIKeys.append("postfixCRLF"); - } - - if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) { - reverseAPIKeys.append("udpEnabled"); - } - - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - - if ( (settings.m_udpEnabled != m_settings.m_udpEnabled) - || (settings.m_udpAddress != m_settings.m_udpAddress) - || (settings.m_udpPort != m_settings.m_udpPort) + if ((settingsKeys.contains("udpEnabled") && (settings.m_udpEnabled != m_settings.m_udpEnabled)) + || (settingsKeys.contains("udpAddress") && (settings.m_udpAddress != m_settings.m_udpAddress)) + || (settingsKeys.contains("udpPort") && (settings.m_udpPort != m_settings.m_udpPort)) || force) { if (settings.m_udpEnabled) @@ -318,7 +207,7 @@ void RttyMod::applySettings(const RttyModSettings& settings, bool force) closeUDP(); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -329,31 +218,33 @@ void RttyMod::applySettings(const RttyModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - RttyModBaseband::MsgConfigureRttyModBaseband *msg = RttyModBaseband::MsgConfigureRttyModBaseband::create(settings, force); + RttyModBaseband::MsgConfigureRttyModBaseband *msg = RttyModBaseband::MsgConfigureRttyModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } QByteArray RttyMod::serialize() const @@ -371,7 +262,7 @@ bool RttyMod::deserialize(const QByteArray& data) success = false; } - MsgConfigureRttyMod *msg = MsgConfigureRttyMod::create(m_settings, true); + MsgConfigureRttyMod *msg = MsgConfigureRttyMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return success; @@ -427,12 +318,12 @@ int RttyMod::webapiSettingsPutPatch( RttyModSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureRttyMod *msg = MsgConfigureRttyMod::create(settings, force); + MsgConfigureRttyMod *msg = MsgConfigureRttyMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRttyMod *msgToGUI = MsgConfigureRttyMod::create(settings, force); + MsgConfigureRttyMod *msgToGUI = MsgConfigureRttyMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -694,7 +585,7 @@ void RttyMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getRttyModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void RttyMod::webapiReverseSendSettings(QList& channelSettingsKeys, const RttyModSettings& settings, bool force) +void RttyMod::webapiReverseSendSettings(const QList& channelSettingsKeys, const RttyModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -721,7 +612,7 @@ void RttyMod::webapiReverseSendSettings(QList& channelSettingsKeys, con void RttyMod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const RttyModSettings& settings, bool force) { @@ -745,7 +636,7 @@ void RttyMod::sendChannelSettings( } void RttyMod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RttyModSettings& settings, bool force diff --git a/plugins/channeltx/modrtty/rttymod.h b/plugins/channeltx/modrtty/rttymod.h index cbc01e639..b8a6c9ba9 100644 --- a/plugins/channeltx/modrtty/rttymod.h +++ b/plugins/channeltx/modrtty/rttymod.h @@ -50,20 +50,23 @@ public: public: const RttyModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingKeys() const { return m_settingKeys; } bool getForce() const { return m_force; } - static MsgConfigureRttyMod* create(const RttyModSettings& settings, bool force) + static MsgConfigureRttyMod* create(const QStringList& settingKeys, const RttyModSettings& settings, bool force) { - return new MsgConfigureRttyMod(settings, force); + return new MsgConfigureRttyMod(settingKeys, settings, force); } private: RttyModSettings m_settings; + QStringList m_settingKeys; bool m_force; - MsgConfigureRttyMod(const RttyModSettings& settings, bool force) : + MsgConfigureRttyMod(const QStringList& settingKeys, const RttyModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingKeys(settingKeys), m_force(force) { } }; @@ -219,18 +222,18 @@ private: QUdpSocket *m_udpSocket; virtual bool handleMessage(const Message& cmd); - void applySettings(const RttyModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RttyModSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const RttyModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const RttyModSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const RttyModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RttyModSettings& settings, bool force diff --git a/plugins/channeltx/modrtty/rttymodbaseband.cpp b/plugins/channeltx/modrtty/rttymodbaseband.cpp index a5d1f27d9..902ac5c9e 100644 --- a/plugins/channeltx/modrtty/rttymodbaseband.cpp +++ b/plugins/channeltx/modrtty/rttymodbaseband.cpp @@ -145,7 +145,7 @@ bool RttyModBaseband::handleMessage(const Message& cmd) MsgConfigureRttyModBaseband& cfg = (MsgConfigureRttyModBaseband&) cmd; qDebug() << "RttyModBaseband::handleMessage: MsgConfigureRttyModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -181,18 +181,22 @@ bool RttyModBaseband::handleMessage(const Message& cmd) } } -void RttyModBaseband::applySettings(const RttyModSettings& settings, bool force) +void RttyModBaseband::applySettings(const QStringList& settingsKeys, const RttyModSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { // Use fixed sample rate of 48000, so Cosine filter doesn't have a massive number of taps at high baseband sample rates (See #1862) m_channelizer->setChannelization(48000, settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int RttyModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modrtty/rttymodbaseband.h b/plugins/channeltx/modrtty/rttymodbaseband.h index c37c45223..f6a5bc858 100644 --- a/plugins/channeltx/modrtty/rttymodbaseband.h +++ b/plugins/channeltx/modrtty/rttymodbaseband.h @@ -41,20 +41,23 @@ public: public: const RttyModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRttyModBaseband* create(const RttyModSettings& settings, bool force) + static MsgConfigureRttyModBaseband* create(const QStringList& settingsKeys, const RttyModSettings& settings, bool force) { - return new MsgConfigureRttyModBaseband(settings, force); + return new MsgConfigureRttyModBaseband(settingsKeys, settings, force); } private: RttyModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRttyModBaseband(const RttyModSettings& settings, bool force) : + MsgConfigureRttyModBaseband(const QStringList& settingsKeys, const RttyModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -90,7 +93,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const RttyModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RttyModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modrtty/rttymodgui.cpp b/plugins/channeltx/modrtty/rttymodgui.cpp index da26dfc28..a6151c2db 100644 --- a/plugins/channeltx/modrtty/rttymodgui.cpp +++ b/plugins/channeltx/modrtty/rttymodgui.cpp @@ -58,7 +58,7 @@ void RttyModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray RttyModGUI::serialize() const @@ -70,7 +70,7 @@ bool RttyModGUI::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -155,7 +155,7 @@ void RttyModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void RttyModGUI::handleSourceMessages() @@ -176,7 +176,7 @@ void RttyModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void RttyModGUI::on_mode_currentIndexChanged(int index) @@ -206,7 +206,7 @@ void RttyModGUI::on_mode_currentIndexChanged(int index) ui->rfBW->setEnabled(custom); ui->rfBWText->setEnabled(custom); - applySettings(); + applySettings(QStringList()); } void RttyModGUI::on_rfBW_valueChanged(int value) @@ -215,27 +215,27 @@ void RttyModGUI::on_rfBW_valueChanged(int value) ui->rfBWText->setText(formatFrequency(bw)); m_channelMarker.setBandwidth(bw); m_settings.m_rfBandwidth = bw; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void RttyModGUI::on_baudRate_currentIndexChanged(int index) { (void)index; m_settings.m_baud = ui->baudRate->currentText().toFloat(); - applySettings(); + applySettings(QStringList("baud")); } void RttyModGUI::on_frequencyShift_valueChanged(int value) { m_settings.m_frequencyShift = value; ui->frequencyShiftText->setText(formatFrequency(m_settings.m_frequencyShift)); - applySettings(); + applySettings(QStringList("frequencyShift")); } void RttyModGUI::on_characterSet_currentIndexChanged(int index) { m_settings.m_characterSet = (Baudot::CharacterSet)index; - applySettings(); + applySettings(QStringList("characterSet")); } void RttyModGUI::on_endian_clicked(bool checked) @@ -246,7 +246,7 @@ void RttyModGUI::on_endian_clicked(bool checked) } else { ui->endian->setText("LSB"); } - applySettings(); + applySettings(QStringList("msbFirst")); } void RttyModGUI::on_spaceHigh_clicked(bool checked) @@ -257,13 +257,13 @@ void RttyModGUI::on_spaceHigh_clicked(bool checked) } else { ui->spaceHigh->setText("S-M"); } - applySettings(); + applySettings(QStringList("spaceHigh")); } void RttyModGUI::on_unshiftOnSpace_clicked(bool checked) { m_settings.m_unshiftOnSpace = checked; - applySettings(); + applySettings(QStringList("unshiftOnSpace")); } void RttyModGUI::on_clearTransmittedText_clicked() @@ -275,13 +275,13 @@ void RttyModGUI::on_gain_valueChanged(int value) { ui->gainText->setText(QString("%1dB").arg(value)); m_settings.m_gain = value; - applySettings(); + applySettings(QStringList("gain")); } void RttyModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void RttyModGUI::on_txButton_clicked() @@ -298,13 +298,13 @@ void RttyModGUI::on_text_returnPressed() void RttyModGUI::on_text_editingFinished() { m_settings.m_text = ui->text->currentText(); - applySettings(); + applySettings(QStringList("text")); } void RttyModGUI::on_repeat_toggled(bool checked) { m_settings.m_repeat = checked; - applySettings(); + applySettings(QStringList("repeat")); } void RttyModGUI::repeatSelect(const QPoint& p) @@ -316,7 +316,7 @@ void RttyModGUI::repeatSelect(const QPoint& p) if (dialog.exec() == QDialog::Accepted) { m_settings.m_repeatCount = dialog.m_repeatCount; - applySettings(); + applySettings(QStringList("repeatCount")); } } @@ -329,26 +329,26 @@ void RttyModGUI::txSettingsSelect(const QPoint& p) if (dialog.exec() == QDialog::Accepted) { displaySettings(); - applySettings(); + applySettings(QStringList()); } } void RttyModGUI::on_udpEnabled_clicked(bool checked) { m_settings.m_udpEnabled = checked; - applySettings(); + applySettings(QStringList("udpEnabled")); } void RttyModGUI::on_udpAddress_editingFinished() { m_settings.m_udpAddress = ui->udpAddress->text(); - applySettings(); + applySettings(QStringList("udpAddress")); } void RttyModGUI::on_udpPort_editingFinished() { m_settings.m_udpPort = ui->udpPort->text().toInt(); - applySettings(); + applySettings(QStringList("udpPort")); } void RttyModGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -357,7 +357,7 @@ void RttyModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void RttyModGUI::onMenuDialogCalled(const QPoint &p) @@ -402,7 +402,8 @@ void RttyModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -485,7 +486,7 @@ RttyModGUI::RttyModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS displaySettings(); makeUIConnections(); - applySettings(); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); @@ -510,11 +511,11 @@ void RttyModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void RttyModGUI::applySettings(bool force) +void RttyModGUI::applySettings(const QStringList& settingKeys, bool force) { if (m_doApplySettings) { - RttyMod::MsgConfigureRttyMod *msg = RttyMod::MsgConfigureRttyMod::create(m_settings, force); + RttyMod::MsgConfigureRttyMod *msg = RttyMod::MsgConfigureRttyMod::create(settingKeys, m_settings, force); m_rttyMod->getInputMessageQueue()->push(msg); } } diff --git a/plugins/channeltx/modrtty/rttymodgui.h b/plugins/channeltx/modrtty/rttymodgui.h index db2f55a5b..e8cfcddb8 100644 --- a/plugins/channeltx/modrtty/rttymodgui.h +++ b/plugins/channeltx/modrtty/rttymodgui.h @@ -86,7 +86,7 @@ private: void transmit(const QString& str); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings( const QStringList& settingKeys, bool force = false); void displaySettings(); QString formatFrequency(int frequency) const; bool handleMessage(const Message& message); diff --git a/plugins/channeltx/modrtty/rttymodsettings.cpp b/plugins/channeltx/modrtty/rttymodsettings.cpp index 3d85b842b..1baf9e506 100644 --- a/plugins/channeltx/modrtty/rttymodsettings.cpp +++ b/plugins/channeltx/modrtty/rttymodsettings.cpp @@ -227,3 +227,225 @@ bool RttyModSettings::deserialize(const QByteArray& data) return false; } } + +void RttyModSettings::applySettings(const QStringList& settingsKeys, const RttyModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("baud")) { + m_baud = settings.m_baud; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("frequencyShift")) { + m_frequencyShift = settings.m_frequencyShift; + } + if (settingsKeys.contains("gain")) { + m_gain = settings.m_gain; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("repeat")) { + m_repeat = settings.m_repeat; + } + if (settingsKeys.contains("repeatCount")) { + m_repeatCount = settings.m_repeatCount; + } + if (settingsKeys.contains("lpfTaps")) { + m_lpfTaps = settings.m_lpfTaps; + } + if (settingsKeys.contains("rfNoise")) { + m_rfNoise = settings.m_rfNoise; + } + if (settingsKeys.contains("writeToFile")) { + m_writeToFile = settings.m_writeToFile; + } + if (settingsKeys.contains("text")) { + m_text = settings.m_text; + } + if (settingsKeys.contains("pulseShaping")) { + m_pulseShaping = settings.m_pulseShaping; + } + if (settingsKeys.contains("beta")) { + m_beta = settings.m_beta; + } + if (settingsKeys.contains("symbolSpan")) { + m_symbolSpan = settings.m_symbolSpan; + } + if (settingsKeys.contains("characterSet")) { + m_characterSet = settings.m_characterSet; + } + if (settingsKeys.contains("unshiftOnSpace")) { + m_unshiftOnSpace = settings.m_unshiftOnSpace; + } + if (settingsKeys.contains("msbFirst")) { + m_msbFirst = settings.m_msbFirst; + } + if (settingsKeys.contains("spaceHigh")) { + m_spaceHigh = settings.m_spaceHigh; + } + if (settingsKeys.contains("prefixCRLF")) { + m_prefixCRLF = settings.m_prefixCRLF; + } + if (settingsKeys.contains("postfixCRLF")) { + m_postfixCRLF = settings.m_postfixCRLF; + } + if (settingsKeys.contains("predefinedTexts")) { + m_predefinedTexts = settings.m_predefinedTexts; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled")) { + m_udpEnabled = settings.m_udpEnabled; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString RttyModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("baud") || force) { + ostr << " m_baud: " << m_baud; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("frequencyShift") || force) { + ostr << " m_frequencyShift: " << m_frequencyShift; + } + if (settingsKeys.contains("gain") || force) { + ostr << " m_gain: " << m_gain; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("repeat") || force) { + ostr << " m_repeat: " << m_repeat; + } + if (settingsKeys.contains("repeatCount") || force) { + ostr << " m_repeatCount: " << m_repeatCount; + } + if (settingsKeys.contains("lpfTaps") || force) { + ostr << " m_lpfTaps: " << m_lpfTaps; + } + if (settingsKeys.contains("rfNoise") || force) { + ostr << " m_rfNoise: " << m_rfNoise; + } + if (settingsKeys.contains("writeToFile") || force) { + ostr << " m_writeToFile: " << m_writeToFile; + } + if (settingsKeys.contains("text") || force) { + ostr << " m_text: " << m_text.toStdString(); + } + if (settingsKeys.contains("pulseShaping") || force) { + ostr << " m_pulseShaping: " << m_pulseShaping; + } + if (settingsKeys.contains("beta") || force) { + ostr << " m_beta: " << m_beta; + } + if (settingsKeys.contains("symbolSpan") || force) { + ostr << " m_symbolSpan: " << m_symbolSpan; + } + if (settingsKeys.contains("characterSet") || force) { + ostr << " m_characterSet: " << (int)m_characterSet; + } + if (settingsKeys.contains("unshiftOnSpace") || force) { + ostr << " m_unshiftOnSpace: " << m_unshiftOnSpace; + } + if (settingsKeys.contains("msbFirst") || force) { + ostr << " m_msbFirst: " << m_msbFirst; + } + if (settingsKeys.contains("spaceHigh") || force) { + ostr << " m_spaceHigh: " << m_spaceHigh; + } + if (settingsKeys.contains("prefixCRLF") || force) { + ostr << " m_prefixCRLF: " << m_prefixCRLF; + } + if (settingsKeys.contains("postfixCRLF") || force) { + ostr << " m_postfixCRLF: " << m_postfixCRLF; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("udpEnabled") || force) { + ostr << " m_udpEnabled: " << m_udpEnabled; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modrtty/rttymodsettings.h b/plugins/channeltx/modrtty/rttymodsettings.h index f7ad38e68..a4872b3d6 100644 --- a/plugins/channeltx/modrtty/rttymodsettings.h +++ b/plugins/channeltx/modrtty/rttymodsettings.h @@ -76,6 +76,8 @@ struct RttyModSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const RttyModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; QString getMode() const; }; diff --git a/plugins/channeltx/modrtty/rttymodsource.cpp b/plugins/channeltx/modrtty/rttymodsource.cpp index 062d08d10..852f0e7b8 100644 --- a/plugins/channeltx/modrtty/rttymodsource.cpp +++ b/plugins/channeltx/modrtty/rttymodsource.cpp @@ -53,7 +53,7 @@ RttyModSource::RttyModSource() : m_interpolatorDistance = (Real)m_channelSampleRate / (Real)m_spectrumRate; m_interpolator.create(48, m_spectrumRate, m_spectrumRate / 2.2, 3.0); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -238,20 +238,20 @@ void RttyModSource::calculateLevel(Real& sample) } } -void RttyModSource::applySettings(const RttyModSettings& settings, bool force) +void RttyModSource::applySettings(const QStringList& settingsKeys, const RttyModSettings& settings, bool force) { - if ((settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { m_samplesPerSymbol = m_channelSampleRate / settings.m_baud; qDebug() << "m_samplesPerSymbol: " << m_samplesPerSymbol << " (" << m_channelSampleRate << "/" << settings.m_baud << ")"; } - if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("lpfTaps") && (settings.m_lpfTaps != m_settings.m_lpfTaps)) || (settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { qDebug() << "RttyModSource::applySettings: Creating new lpf with taps " << settings.m_lpfTaps << " rfBW " << settings.m_rfBandwidth; m_lowpass.create(settings.m_lpfTaps, m_channelSampleRate, settings.m_rfBandwidth / 2.0); } - if ((settings.m_beta != m_settings.m_beta) || (settings.m_symbolSpan != m_settings.m_symbolSpan) || (settings.m_baud != m_settings.m_baud) || force) + if ((settingsKeys.contains("beta") && (settings.m_beta != m_settings.m_beta)) || (settingsKeys.contains("symbolSpan") && (settings.m_symbolSpan != m_settings.m_symbolSpan)) || (settingsKeys.contains("baud") && (settings.m_baud != m_settings.m_baud)) || force) { qDebug() << "RttyModSource::applySettings: Recreating pulse shaping filter: " << " beta: " << settings.m_beta @@ -261,17 +261,21 @@ void RttyModSource::applySettings(const RttyModSettings& settings, bool force) m_pulseShape.create(settings.m_beta, settings.m_symbolSpan, m_channelSampleRate/settings.m_baud, true); } - if ((settings.m_characterSet != m_settings.m_characterSet) || force) { + if ((settingsKeys.contains("characterSet") && (settings.m_characterSet != m_settings.m_characterSet)) || force) { m_rttyEncoder.setCharacterSet(settings.m_characterSet); } - if ((settings.m_unshiftOnSpace != m_settings.m_unshiftOnSpace) || force) { + if ((settingsKeys.contains("unshiftOnSpace") && (settings.m_unshiftOnSpace != m_settings.m_unshiftOnSpace)) || force) { m_rttyEncoder.setUnshiftOnSpace(settings.m_unshiftOnSpace); } - if ((settings.m_msbFirst != m_settings.m_msbFirst) || force) { + if ((settingsKeys.contains("msbFirst") && (settings.m_msbFirst != m_settings.m_msbFirst)) || force) { m_rttyEncoder.setMsbFirst(settings.m_msbFirst); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } // Precalculate FM sensensity and linear gain to save doing it in the loop m_phaseSensitivity = 2.0f * M_PI * (m_settings.m_frequencyShift/2.0f) / (double)m_channelSampleRate; diff --git a/plugins/channeltx/modrtty/rttymodsource.h b/plugins/channeltx/modrtty/rttymodsource.h index 245da2921..65aef96ee 100644 --- a/plugins/channeltx/modrtty/rttymodsource.h +++ b/plugins/channeltx/modrtty/rttymodsource.h @@ -55,7 +55,7 @@ public: } void setMessageQueueToGUI(MessageQueue* messageQueue) { m_messageQueueToGUI = messageQueue; } void setSpectrumSink(BasebandSampleSink *sampleSink) { m_spectrumSink = sampleSink; } - void applySettings(const RttyModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RttyModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void addTXText(QString data); void setChannel(ChannelAPI *channel) { m_channel = channel; } diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index ac2df1c41..10050ac31 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -71,7 +71,7 @@ SSBMod::SSBMod(DeviceAPI *deviceAPI) : m_basebandSource->setCWKeyer(&m_cwKeyer); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -126,7 +126,7 @@ void SSBMod::start() DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); m_basebandSource->getInputMessageQueue()->push(dspMsg); - SSBModBaseband::MsgConfigureSSBModBaseband *msg = SSBModBaseband::MsgConfigureSSBModBaseband::create(m_settings, true); + SSBModBaseband::MsgConfigureSSBModBaseband *msg = SSBModBaseband::MsgConfigureSSBModBaseband::create(QStringList(), m_settings, true); m_basebandSource->getInputMessageQueue()->push(msg); m_running = true; @@ -155,11 +155,11 @@ void SSBMod::setCenterFrequency(qint64 frequency) { SSBModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureSSBMod *msgToGUI = MsgConfigureSSBMod::create(settings, false); + MsgConfigureSSBMod *msgToGUI = MsgConfigureSSBMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -171,7 +171,7 @@ bool SSBMod::handleMessage(const Message& cmd) auto& cfg = (const MsgConfigureSSBMod&) cmd; qDebug() << "SSBMod::handleMessage: MsgConfigureSSBMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -290,78 +290,13 @@ void SSBMod::seekFileStream(int seekPercentage) } } -void SSBMod::applySettings(const SSBModSettings& settings, bool force) +void SSBMod::applySettings(const QStringList& settingKeys, const SSBModSettings& settings, bool force) { float band = settings.m_bandwidth; float lowCutoff = settings.m_lowCutoff; bool usb = settings.m_usb; - QList reverseAPIKeys; - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_bandwidth != m_settings.m_bandwidth) || force) { - reverseAPIKeys.append("bandwidth"); - } - if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) { - reverseAPIKeys.append("lowCutoff"); - } - if ((settings.m_usb != m_settings.m_usb) || force) { - reverseAPIKeys.append("usb"); - } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { - reverseAPIKeys.append("toneFrequency"); - } - if ((settings.m_volumeFactor != m_settings.m_volumeFactor) || force) { - reverseAPIKeys.append("volumeFactor"); - } - if ((settings.m_spanLog2 != m_settings.m_spanLog2) || force) { - reverseAPIKeys.append("spanLog2"); - } - if ((settings.m_audioBinaural != m_settings.m_audioBinaural) || force) { - reverseAPIKeys.append("audioBinaural"); - } - if ((settings.m_audioFlipChannels != m_settings.m_audioFlipChannels) || force) { - reverseAPIKeys.append("audioFlipChannels"); - } - if ((settings.m_dsb != m_settings.m_dsb) || force) { - reverseAPIKeys.append("dsb"); - } - if ((settings.m_audioMute != m_settings.m_audioMute) || force) { - reverseAPIKeys.append("audioMute"); - } - if ((settings.m_playLoop != m_settings.m_playLoop) || force) { - reverseAPIKeys.append("playLoop"); - } - if ((settings.m_agc != m_settings.m_agc) || force) { - reverseAPIKeys.append("agc"); - } - if ((settings.m_cmpPreGainDB != m_settings.m_cmpPreGainDB) || force) { - reverseAPIKeys.append("cmpPreGainDB"); - } - if ((settings.m_cmpThresholdDB != m_settings.m_cmpThresholdDB) || force) { - reverseAPIKeys.append("cmpThresholdDB"); - } - if ((settings.m_rgbColor != m_settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); - } - if ((settings.m_title != m_settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) { - reverseAPIKeys.append("modAFInput"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) { - reverseAPIKeys.append("feedbackAudioDeviceName"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -372,12 +307,10 @@ void SSBMod::applySettings(const SSBModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - if ((settings.m_dsb != m_settings.m_dsb) - || (settings.m_usb != m_settings.m_usb) || force) + if ((settingKeys.contains("dsb") && (settings.m_dsb != m_settings.m_dsb)) + || (settingKeys.contains("usb") && (settings.m_usb != m_settings.m_usb)) || force) { SpectrumSettings spectrumSettings = m_spectrumVis.getSettings(); spectrumSettings.m_ssb = !settings.m_dsb; @@ -388,25 +321,25 @@ void SSBMod::applySettings(const SSBModSettings& settings, bool force) if (m_running) { - SSBModBaseband::MsgConfigureSSBModBaseband *msg = SSBModBaseband::MsgConfigureSSBModBaseband::create(settings, force); + SSBModBaseband::MsgConfigureSSBModBaseband *msg = SSBModBaseband::MsgConfigureSSBModBaseband::create(settingKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (!pipes.empty()) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingKeys, settings, force); } m_settings = settings; @@ -424,14 +357,14 @@ bool SSBMod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(m_settings, true); + MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(m_settings, true); + MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -507,12 +440,12 @@ int SSBMod::webapiSettingsPutPatch( } } - MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(settings, force); + MsgConfigureSSBMod *msg = MsgConfigureSSBMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureSSBMod *msgToGUI = MsgConfigureSSBMod::create(settings, force); + MsgConfigureSSBMod *msgToGUI = MsgConfigureSSBMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } diff --git a/plugins/channeltx/modssb/ssbmod.h b/plugins/channeltx/modssb/ssbmod.h index d68e2b631..a0b8f1178 100644 --- a/plugins/channeltx/modssb/ssbmod.h +++ b/plugins/channeltx/modssb/ssbmod.h @@ -50,20 +50,23 @@ public: public: const SSBModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingKeys() const { return m_settingKeys; } bool getForce() const { return m_force; } - static MsgConfigureSSBMod* create(const SSBModSettings& settings, bool force) + static MsgConfigureSSBMod* create(const QStringList& settingKeys, const SSBModSettings& settings, bool force) { - return new MsgConfigureSSBMod(settings, force); + return new MsgConfigureSSBMod(settingKeys, settings, force); } private: SSBModSettings m_settings; + QStringList m_settingKeys; bool m_force; - MsgConfigureSSBMod(const SSBModSettings& settings, bool force) : + MsgConfigureSSBMod(const QStringList& settingKeys, const SSBModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingKeys(settingKeys), m_force(force) { } }; @@ -275,7 +278,7 @@ private: QObject *m_levelMeter; bool handleMessage(const Message& cmd) final; - void applySettings(const SSBModSettings& settings, bool force = false); + void applySettings(const QStringList& settingKeys, const SSBModSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer() const; void openFileStream(); void seekFileStream(int seekPercentage); diff --git a/plugins/channeltx/modssb/ssbmodbaseband.cpp b/plugins/channeltx/modssb/ssbmodbaseband.cpp index c58d7f926..8b1c9fa88 100644 --- a/plugins/channeltx/modssb/ssbmodbaseband.cpp +++ b/plugins/channeltx/modssb/ssbmodbaseband.cpp @@ -150,7 +150,7 @@ bool SSBModBaseband::handleMessage(const Message& cmd) MsgConfigureSSBModBaseband& cfg = (MsgConfigureSSBModBaseband&) cmd; qDebug() << "SSBModBaseband::handleMessage: MsgConfigureSSBModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -182,22 +182,22 @@ bool SSBModBaseband::handleMessage(const Message& cmd) } } -void SSBModBaseband::applySettings(const SSBModSettings& settings, bool force) +void SSBModBaseband::applySettings( const QStringList& settingKeys, const SSBModSettings& settings, bool force) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if ((settingKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)) || force) { m_channelizer->setChannelization(m_source.getAudioSampleRate(), settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); m_source.applyAudioSampleRate(m_source.getAudioSampleRate()); // reapply in case of channel sample rate change } - if ((settings.m_spanLog2 != m_settings.m_spanLog2) || force) + if ((settingKeys.contains("spanLog2") && (settings.m_spanLog2 != m_settings.m_spanLog2)) || force) { DSPSignalNotification *msg = new DSPSignalNotification(getAudioSampleRate()/(1<getInputMessageQueue()->push(msg); } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingKeys.contains("audioDeviceName") && (settings.m_audioDeviceName != m_settings.m_audioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -214,7 +214,7 @@ void SSBModBaseband::applySettings(const SSBModSettings& settings, bool force) } } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingKeys.contains("modAFInput") && (settings.m_modAFInput != m_settings.m_modAFInput)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -226,7 +226,7 @@ void SSBModBaseband::applySettings(const SSBModSettings& settings, bool force) } } - if ((settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName) || force) + if ((settingKeys.contains("feedbackAudioDeviceName") && (settings.m_feedbackAudioDeviceName != m_settings.m_feedbackAudioDeviceName)) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_feedbackAudioDeviceName); @@ -239,8 +239,13 @@ void SSBModBaseband::applySettings(const SSBModSettings& settings, bool force) } } - m_source.applySettings(settings, force); - m_settings = settings; + m_source.applySettings(settingKeys, settings, force); + + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingKeys, settings); + } } int SSBModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modssb/ssbmodbaseband.h b/plugins/channeltx/modssb/ssbmodbaseband.h index 96688f2a5..bd1ff66fe 100644 --- a/plugins/channeltx/modssb/ssbmodbaseband.h +++ b/plugins/channeltx/modssb/ssbmodbaseband.h @@ -42,20 +42,23 @@ public: public: const SSBModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingKeys() const { return m_settingKeys; } bool getForce() const { return m_force; } - static MsgConfigureSSBModBaseband* create(const SSBModSettings& settings, bool force) + static MsgConfigureSSBModBaseband* create(const QStringList& settingKeys, const SSBModSettings& settings, bool force) { - return new MsgConfigureSSBModBaseband(settings, force); + return new MsgConfigureSSBModBaseband(settingKeys, settings, force); } private: SSBModSettings m_settings; + QStringList m_settingKeys; bool m_force; - MsgConfigureSSBModBaseband(const SSBModSettings& settings, bool force) : + MsgConfigureSSBModBaseband(const QStringList& settingKeys, const SSBModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingKeys(settingKeys), m_force(force) { } }; @@ -96,7 +99,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const SSBModSettings& settings, bool force = false); + void applySettings(const QStringList& settingKeys, const SSBModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modssb/ssbmodgui.cpp b/plugins/channeltx/modssb/ssbmodgui.cpp index eda497cfb..bff59f8e4 100644 --- a/plugins/channeltx/modssb/ssbmodgui.cpp +++ b/plugins/channeltx/modssb/ssbmodgui.cpp @@ -149,14 +149,14 @@ void SSBModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void SSBModGUI::channelMarkerUpdate() { m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); displaySettings(); - applySettings(); + applySettings(QStringList("rgbColor")); } void SSBModGUI::handleSourceMessages() @@ -177,7 +177,7 @@ void SSBModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void SSBModGUI::on_flipSidebands_clicked(bool checked) @@ -198,13 +198,13 @@ void SSBModGUI::on_dsb_toggled(bool dsb) void SSBModGUI::on_audioBinaural_toggled(bool checked) { m_settings.m_audioBinaural = checked; - applySettings(); + applySettings(QStringList("audioBinaural")); } void SSBModGUI::on_audioFlipChannels_toggled(bool checked) { m_settings.m_audioFlipChannels = checked; - applySettings(); + applySettings(QStringList("audioFlipChannels")); } void SSBModGUI::on_spanLog2_valueChanged(int value) @@ -232,26 +232,26 @@ void SSBModGUI::on_toneFrequency_valueChanged(int value) { ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2)); m_settings.m_toneFrequency = value * 10.0; - applySettings(); + applySettings(QStringList("toneFrequency")); } void SSBModGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volumeFactor = value / 10.0; - applySettings(); + applySettings(QStringList("volumeFactor")); } void SSBModGUI::on_audioMute_toggled(bool checked) { m_settings.m_audioMute = checked; - applySettings(); + applySettings(QStringList("audioMute")); } void SSBModGUI::on_playLoop_toggled(bool checked) { m_settings.m_playLoop = checked; - applySettings(); + applySettings(QStringList("playLoop")); } void SSBModGUI::on_play_toggled(bool checked) @@ -260,7 +260,7 @@ void SSBModGUI::on_play_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? SSBModSettings::SSBModInputFile : SSBModSettings::SSBModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); ui->navTimeSlider->setEnabled(!checked); m_enableNavTime = !checked; } @@ -271,7 +271,7 @@ void SSBModGUI::on_tone_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? SSBModSettings::SSBModInputTone : SSBModSettings::SSBModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void SSBModGUI::on_morseKeyer_toggled(bool checked) @@ -280,7 +280,7 @@ void SSBModGUI::on_morseKeyer_toggled(bool checked) ui->tone->setEnabled(!checked); // release other source inputs ui->mic->setEnabled(!checked); m_settings.m_modAFInput = checked ? SSBModSettings::SSBModInputCWTone : SSBModSettings::SSBModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void SSBModGUI::on_mic_toggled(bool checked) @@ -289,40 +289,40 @@ void SSBModGUI::on_mic_toggled(bool checked) ui->morseKeyer->setEnabled(!checked); ui->tone->setEnabled(!checked); // release other source inputs m_settings.m_modAFInput = checked ? SSBModSettings::SSBModInputAudio : SSBModSettings::SSBModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void SSBModGUI::on_feedbackEnable_toggled(bool checked) { m_settings.m_feedbackAudioEnable = checked; - applySettings(); + applySettings(QStringList("feedbackAudioEnable")); } void SSBModGUI::on_feedbackVolume_valueChanged(int value) { ui->feedbackVolumeText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2)); m_settings.m_feedbackVolumeFactor = value / 100.0; - applySettings(); + applySettings(QStringList("feedbackVolumeFactor")); } void SSBModGUI::on_agc_toggled(bool checked) { m_settings.m_agc = checked; - applySettings(); + applySettings(QStringList("agc")); } void SSBModGUI::on_cmpPreGain_valueChanged(int value) { m_settings.m_cmpPreGainDB = value; ui->cmpPreGainText->setText(QString("%1").arg(value)); - applySettings(); + applySettings(QStringList("cmpPreGainDB")); } void SSBModGUI::on_cmpThreshold_valueChanged(int value) { m_settings.m_cmpThresholdDB = value; ui->cmpThresholdText->setText(QString("%1").arg(value)); - applySettings(); + applySettings(QStringList("cmpThresholdDB")); } void SSBModGUI::on_navTimeSlider_valueChanged(int value) @@ -366,7 +366,7 @@ void SSBModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void SSBModGUI::onMenuDialogCalled(const QPoint &p) @@ -411,7 +411,8 @@ void SSBModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -524,7 +525,7 @@ bool SSBModGUI::blockApplySettings(bool block) return ret; } -void SSBModGUI::applySettings(bool force) +void SSBModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { @@ -542,7 +543,7 @@ void SSBModGUI::applySettings(bool force) mod_settings.m_usb = false; } - SSBMod::MsgConfigureSSBMod *msg = SSBMod::MsgConfigureSSBMod::create(mod_settings, force); + SSBMod::MsgConfigureSSBMod *msg = SSBMod::MsgConfigureSSBMod::create(settingsKeys, mod_settings, force); m_ssbMod->getInputMessageQueue()->push(msg); } } @@ -664,7 +665,7 @@ void SSBModGUI::applyBandwidths(int spanLog2, bool force) m_settings.m_bandwidth = bw * 100; m_settings.m_lowCutoff = lw * 100; - applySettings(force); + applySettings(QStringList({"dsb", "spanLog2", "bandwidth", "lowCutoff"}), force); bool applySettingsWereBlocked = blockApplySettings(true); m_channelMarker.setBandwidth(bw * 200); @@ -797,7 +798,7 @@ void SSBModGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -812,7 +813,7 @@ void SSBModGUI::audioFeedbackSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_feedbackAudioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("feedbackAudioDeviceName")); } } diff --git a/plugins/channeltx/modssb/ssbmodgui.h b/plugins/channeltx/modssb/ssbmodgui.h index ecd59f75a..7953c1a3d 100644 --- a/plugins/channeltx/modssb/ssbmodgui.h +++ b/plugins/channeltx/modssb/ssbmodgui.h @@ -98,7 +98,7 @@ private: virtual ~SSBModGUI(); bool blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingKeys, bool force = false); void applyBandwidths(int spanLog2, bool force = false); void displaySettings(); void updateWithStreamData(); diff --git a/plugins/channeltx/modssb/ssbmodsettings.cpp b/plugins/channeltx/modssb/ssbmodsettings.cpp index d001a2806..9e7281965 100644 --- a/plugins/channeltx/modssb/ssbmodsettings.cpp +++ b/plugins/channeltx/modssb/ssbmodsettings.cpp @@ -238,3 +238,201 @@ bool SSBModSettings::deserialize(const QByteArray& data) return false; } } + +void SSBModSettings::applySettings(const QStringList& settingsKeys, const SSBModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("bandwidth")) { + m_bandwidth = settings.m_bandwidth; + } + if (settingsKeys.contains("lowCutoff")) { + m_lowCutoff = settings.m_lowCutoff; + } + if (settingsKeys.contains("usb")) { + m_usb = settings.m_usb; + } + if (settingsKeys.contains("toneFrequency")) { + m_toneFrequency = settings.m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor")) { + m_volumeFactor = settings.m_volumeFactor; + } + if (settingsKeys.contains("spanLog2")) { + m_spanLog2 = settings.m_spanLog2; + } + if (settingsKeys.contains("audioBinaural")) { + m_audioBinaural = settings.m_audioBinaural; + } + if (settingsKeys.contains("audioFlipChannels")) { + m_audioFlipChannels = settings.m_audioFlipChannels; + } + if (settingsKeys.contains("dsb")) { + m_dsb = settings.m_dsb; + } + if (settingsKeys.contains("audioMute")) { + m_audioMute = settings.m_audioMute; + } + if (settingsKeys.contains("playLoop")) { + m_playLoop = settings.m_playLoop; + } + if (settingsKeys.contains("agc")) { + m_agc = settings.m_agc; + } + if (settingsKeys.contains("cmpPreGainDB")) { + m_cmpPreGainDB = settings.m_cmpPreGainDB; + } + if (settingsKeys.contains("cmpThresholdDB")) { + m_cmpThresholdDB = settings.m_cmpThresholdDB; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("modAFInput")) { + m_modAFInput = settings.m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("feedbackAudioDeviceName")) { + m_feedbackAudioDeviceName = settings.m_feedbackAudioDeviceName; + } + if (settingsKeys.contains("feedbackVolumeFactor")) { + m_feedbackVolumeFactor = settings.m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable")) { + m_feedbackAudioEnable = settings.m_feedbackAudioEnable; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("cwKeyerSettings")) { + m_cwKeyerSettings = settings.m_cwKeyerSettings; + } +} + +QString SSBModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("bandwidth") || force) { + ostr << " m_bandwidth: " << m_bandwidth; + } + if (settingsKeys.contains("lowCutoff") || force) { + ostr << " m_lowCutoff: " << m_lowCutoff; + } + if (settingsKeys.contains("usb") || force) { + ostr << " m_usb: " << m_usb; + } + if (settingsKeys.contains("toneFrequency") || force) { + ostr << " m_toneFrequency: " << m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor") || force) { + ostr << " m_volumeFactor: " << m_volumeFactor; + } + if (settingsKeys.contains("spanLog2") || force) { + ostr << " m_spanLog2: " << m_spanLog2; + } + if (settingsKeys.contains("audioBinaural") || force) { + ostr << " m_audioBinaural: " << m_audioBinaural; + } + if (settingsKeys.contains("audioFlipChannels") || force) { + ostr << " m_audioFlipChannels: " << m_audioFlipChannels; + } + if (settingsKeys.contains("dsb") || force) { + ostr << " m_dsb: " << m_dsb; + } + if (settingsKeys.contains("audioMute") || force) { + ostr << " m_audioMute: " << m_audioMute; + } + if (settingsKeys.contains("playLoop") || force) { + ostr << " m_playLoop: " << m_playLoop; + } + if (settingsKeys.contains("agc") || force) { + ostr << " m_agc: " << m_agc; + } + if (settingsKeys.contains("cmpPreGainDB") || force) { + ostr << " m_cmpPreGainDB: " << m_cmpPreGainDB; + } + if (settingsKeys.contains("cmpThresholdDB") || force) { + ostr << " m_cmpThresholdDB: " << m_cmpThresholdDB; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("modAFInput") || force) { + ostr << " m_modAFInput: " << (int)m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackAudioDeviceName") || force) { + ostr << " m_feedbackAudioDeviceName: " << m_feedbackAudioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackVolumeFactor") || force) { + ostr << " m_feedbackVolumeFactor: " << m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable") || force) { + ostr << " m_feedbackAudioEnable: " << m_feedbackAudioEnable; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/modssb/ssbmodsettings.h b/plugins/channeltx/modssb/ssbmodsettings.h index 2bdc6d603..bda5595ce 100644 --- a/plugins/channeltx/modssb/ssbmodsettings.h +++ b/plugins/channeltx/modssb/ssbmodsettings.h @@ -93,6 +93,8 @@ struct SSBModSettings void setCWKeyerGUI(Serializable *cwKeyerGUI) { m_cwKeyerGUI = cwKeyerGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const SSBModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; const CWKeyerSettings& getCWKeyerSettings() const { return m_cwKeyerSettings; } void setCWKeyerSettings(const CWKeyerSettings& cwKeyerSettings) { m_cwKeyerSettings = cwKeyerSettings; } }; diff --git a/plugins/channeltx/modssb/ssbmodsource.cpp b/plugins/channeltx/modssb/ssbmodsource.cpp index 3d7e2483b..bea9c2dbf 100644 --- a/plugins/channeltx/modssb/ssbmodsource.cpp +++ b/plugins/channeltx/modssb/ssbmodsource.cpp @@ -71,7 +71,7 @@ SSBModSource::SSBModSource() : 0.25 // release (s) ); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -652,14 +652,14 @@ void SSBModSource::applyFeedbackAudioSampleRate(int sampleRate) m_feedbackAudioSampleRate = sampleRate; } -void SSBModSource::applySettings(const SSBModSettings& settings, bool force) +void SSBModSource::applySettings(const QStringList& settingKeys, const SSBModSettings& settings, bool force) { float band = settings.m_bandwidth; float lowCutoff = settings.m_lowCutoff; bool usb = settings.m_usb; - if ((settings.m_bandwidth != m_settings.m_bandwidth) || - (settings.m_lowCutoff != m_settings.m_lowCutoff) || force) + if ((settingKeys.contains("bandwidth") && (settings.m_bandwidth != m_settings.m_bandwidth)) || + (settingKeys.contains("lowCutoff") && (settings.m_lowCutoff != m_settings.m_lowCutoff)) || force) { if (band < 100.0f) // at least 100 Hz { @@ -679,11 +679,11 @@ void SSBModSource::applySettings(const SSBModSettings& settings, bool force) m_DSBFilter->create_dsb_filter((2.0f * band) / (float) m_audioSampleRate); } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { + if ((settingKeys.contains("toneFrequency") && (settings.m_toneFrequency != m_settings.m_toneFrequency)) || force) { m_toneNco.setFreq(settings.m_toneFrequency, (float) m_audioSampleRate); } - if ((settings.m_dsb != m_settings.m_dsb) || force) + if ((settingKeys.contains("dsb") && (settings.m_dsb != m_settings.m_dsb)) || force) { if (settings.m_dsb) { @@ -697,7 +697,7 @@ void SSBModSource::applySettings(const SSBModSettings& settings, bool force) } } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingKeys.contains("modAFInput") && (settings.m_modAFInput != m_settings.m_modAFInput)) || force) { if (settings.m_modAFInput == SSBModSettings::SSBModInputAudio) { connect(&m_audioFifo, SIGNAL(dataReady()), this, SLOT(handleAudio())); @@ -706,8 +706,8 @@ void SSBModSource::applySettings(const SSBModSettings& settings, bool force) } } - if ((settings.m_cmpThresholdDB != m_settings.m_cmpThresholdDB) || - (settings.m_cmpPreGainDB != m_settings.m_cmpPreGainDB) || force) + if ((settingKeys.contains("cmpThresholdDB") && (settings.m_cmpThresholdDB != m_settings.m_cmpThresholdDB)) || + (settingKeys.contains("cmpPreGainDB") && (settings.m_cmpPreGainDB != m_settings.m_cmpPreGainDB)) || force) { m_audioCompressor.initSimple( m_audioSampleRate, @@ -720,7 +720,12 @@ void SSBModSource::applySettings(const SSBModSettings& settings, bool force) ); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingKeys, settings); + } + m_settings.m_bandwidth = band; m_settings.m_lowCutoff = lowCutoff; m_settings.m_usb = usb; diff --git a/plugins/channeltx/modssb/ssbmodsource.h b/plugins/channeltx/modssb/ssbmodsource.h index 6531bde6a..c22a801e2 100644 --- a/plugins/channeltx/modssb/ssbmodsource.h +++ b/plugins/channeltx/modssb/ssbmodsource.h @@ -69,7 +69,7 @@ public: peakLevel = m_peakLevelOut; numSamples = m_levelNbSamples; } - void applySettings(const SSBModSettings& settings, bool force = false); + void applySettings(const QStringList& settingKeys, const SSBModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void setSpectrumSink(SpectrumVis *sampleSink) { m_spectrumSink = sampleSink; } diff --git a/plugins/channeltx/modwfm/wfmmod.cpp b/plugins/channeltx/modwfm/wfmmod.cpp index b2491e602..67d9701a0 100644 --- a/plugins/channeltx/modwfm/wfmmod.cpp +++ b/plugins/channeltx/modwfm/wfmmod.cpp @@ -66,7 +66,7 @@ WFMMod::WFMMod(DeviceAPI *deviceAPI) : m_basebandSource->setChannel(this); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -131,11 +131,11 @@ void WFMMod::setCenterFrequency(qint64 frequency) { WFMModSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureWFMMod *msgToGUI = MsgConfigureWFMMod::create(settings, false); + MsgConfigureWFMMod *msgToGUI = MsgConfigureWFMMod::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -149,7 +149,7 @@ bool WFMMod::handleMessage(const Message& cmd) WFMModSettings settings = cfg.getSettings(); - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), settings, cfg.getForce()); return true; } @@ -256,60 +256,11 @@ void WFMMod::seekFileStream(int seekPercentage) } } -void WFMMod::applySettings(const WFMModSettings& settings, bool force) +void WFMMod::applySettings(const QStringList& settingsKeys, const WFMModSettings& settings, bool force) { - qDebug() << "WFMMod::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volumeFactor: " << settings.m_volumeFactor - << " m_toneFrequency: " << settings.m_toneFrequency - << " m_channelMute: " << settings.m_channelMute - << " m_playLoop: " << settings.m_playLoop - << " m_modAFInput: " << settings.m_modAFInput - << " m_audioDeviceName: " << settings.m_audioDeviceName - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + qDebug() << "WFMMod::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_volumeFactor != m_settings.m_volumeFactor) || force) { - reverseAPIKeys.append("volumeFactor"); - } - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - if ((settings.m_playLoop != m_settings.m_playLoop) || force) { - reverseAPIKeys.append("playLoop"); - } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) { - reverseAPIKeys.append("modAFInput"); - } - if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { - reverseAPIKeys.append("afBandwidth"); - } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { - reverseAPIKeys.append("toneFrequency"); - } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { - reverseAPIKeys.append("audioDeviceName"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && m_settings.m_streamIndex != settings.m_streamIndex) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -320,28 +271,26 @@ void WFMMod::applySettings(const WFMModSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - WFMModBaseband::MsgConfigureWFMModBaseband *msg = WFMModBaseband::MsgConfigureWFMModBaseband::create(settings, force); + WFMModBaseband::MsgConfigureWFMModBaseband *msg = WFMModBaseband::MsgConfigureWFMModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (settingsKeys.contains("reverseAPIPort") && m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (settingsKeys.contains("reverseAPIDeviceIndex") && m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (settingsKeys.contains("reverseAPIChannelIndex") && m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -356,14 +305,14 @@ bool WFMMod::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(m_settings, true); + MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(m_settings, true); + MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -439,12 +388,12 @@ int WFMMod::webapiSettingsPutPatch( } } - MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(settings, force); + MsgConfigureWFMMod *msg = MsgConfigureWFMMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureWFMMod *msgToGUI = MsgConfigureWFMMod::create(settings, force); + MsgConfigureWFMMod *msgToGUI = MsgConfigureWFMMod::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -606,7 +555,7 @@ void WFMMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) response.getWfmModReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void WFMMod::webapiReverseSendSettings(QList& channelSettingsKeys, const WFMModSettings& settings, bool force) +void WFMMod::webapiReverseSendSettings(const QList& channelSettingsKeys, const WFMModSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -665,7 +614,7 @@ void WFMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings) void WFMMod::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const WFMModSettings& settings, bool force) { @@ -689,7 +638,7 @@ void WFMMod::sendChannelSettings( } void WFMMod::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const WFMModSettings& settings, bool force diff --git a/plugins/channeltx/modwfm/wfmmod.h b/plugins/channeltx/modwfm/wfmmod.h index b538e003a..afb304638 100644 --- a/plugins/channeltx/modwfm/wfmmod.h +++ b/plugins/channeltx/modwfm/wfmmod.h @@ -48,20 +48,23 @@ public: public: const WFMModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureWFMMod* create(const WFMModSettings& settings, bool force) + static MsgConfigureWFMMod* create(const QStringList& settingsKeys, const WFMModSettings& settings, bool force) { - return new MsgConfigureWFMMod(settings, force); + return new MsgConfigureWFMMod(settingsKeys, settings, force); } private: WFMModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureWFMMod(const WFMModSettings& settings, bool force) : + MsgConfigureWFMMod(const QStringList& settingsKeys, const WFMModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -278,21 +281,21 @@ private: static const int m_levelNbSamples; virtual bool handleMessage(const Message& cmd); - void applySettings(const WFMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WFMModSettings& settings, bool force = false); void sendSampleRateToDemodAnalyzer(); void openFileStream(); void seekFileStream(int seekPercentage); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const WFMModSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const WFMModSettings& settings, bool force); void webapiReverseSendCWSettings(const CWKeyerSettings& settings); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const WFMModSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const WFMModSettings& settings, bool force diff --git a/plugins/channeltx/modwfm/wfmmodbaseband.cpp b/plugins/channeltx/modwfm/wfmmodbaseband.cpp index c8019d6f1..dae3492f9 100644 --- a/plugins/channeltx/modwfm/wfmmodbaseband.cpp +++ b/plugins/channeltx/modwfm/wfmmodbaseband.cpp @@ -149,7 +149,7 @@ bool WFMModBaseband::handleMessage(const Message& cmd) MsgConfigureWFMModBaseband& cfg = (MsgConfigureWFMModBaseband&) cmd; qDebug() << "WFMModBaseband::handleMessage: MsgConfigureWFMModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -181,17 +181,17 @@ bool WFMModBaseband::handleMessage(const Message& cmd) } } -void WFMModBaseband::applySettings(const WFMModSettings& settings, bool force) +void WFMModBaseband::applySettings(const QStringList& settingsKeys, const WFMModSettings& settings, bool force) { - if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) - || (m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) + if ((settingsKeys.contains("rfBandwidth") && m_settings.m_rfBandwidth != settings.m_rfBandwidth) + || (settingsKeys.contains("inputFrequencyOffset") && m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || force) { m_channelizer->setChannelization(settings.m_rfBandwidth, settings.m_inputFrequencyOffset); m_source.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); m_source.applyAudioSampleRate(m_source.getAudioSampleRate()); // reapply in case of channel sample rate change } - if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + if ((settingsKeys.contains("audioDeviceName") && settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -203,7 +203,7 @@ void WFMModBaseband::applySettings(const WFMModSettings& settings, bool force) } } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("modAFInput") && settings.m_modAFInput != m_settings.m_modAFInput) || force) { AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getInputDeviceIndex(settings.m_audioDeviceName); @@ -215,9 +215,13 @@ void WFMModBaseband::applySettings(const WFMModSettings& settings, bool force) } } - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int WFMModBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/modwfm/wfmmodbaseband.h b/plugins/channeltx/modwfm/wfmmodbaseband.h index 900fbb8d9..fc41bc5bb 100644 --- a/plugins/channeltx/modwfm/wfmmodbaseband.h +++ b/plugins/channeltx/modwfm/wfmmodbaseband.h @@ -40,20 +40,23 @@ public: public: const WFMModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureWFMModBaseband* create(const WFMModSettings& settings, bool force) + static MsgConfigureWFMModBaseband* create(const QStringList& settingsKeys, const WFMModSettings& settings, bool force) { - return new MsgConfigureWFMModBaseband(settings, force); + return new MsgConfigureWFMModBaseband(settingsKeys, settings, force); } private: WFMModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureWFMModBaseband(const WFMModSettings& settings, bool force) : + MsgConfigureWFMModBaseband(const QStringList& settingsKeys, const WFMModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -91,7 +94,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const WFMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WFMModSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/modwfm/wfmmodgui.cpp b/plugins/channeltx/modwfm/wfmmodgui.cpp index 8697e1841..745fb8c44 100644 --- a/plugins/channeltx/modwfm/wfmmodgui.cpp +++ b/plugins/channeltx/modwfm/wfmmodgui.cpp @@ -58,7 +58,7 @@ void WFMModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray WFMModGUI::serialize() const @@ -70,7 +70,7 @@ bool WFMModGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -131,7 +131,7 @@ void WFMModGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void WFMModGUI::handleSourceMessages() @@ -152,7 +152,7 @@ void WFMModGUI::on_deltaFrequency_changed(qint64 value) m_channelMarker.setCenterFrequency(value); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void WFMModGUI::on_rfBW_currentIndexChanged(int index) @@ -160,47 +160,47 @@ void WFMModGUI::on_rfBW_currentIndexChanged(int index) float rfBW = WFMModSettings::getRFBW(index); m_channelMarker.setBandwidth(rfBW); m_settings.m_rfBandwidth = rfBW; - applySettings(); + applySettings(QStringList("rfBandwidth")); } void WFMModGUI::on_afBW_valueChanged(int value) { ui->afBWText->setText(QString("%1k").arg(value)); m_settings.m_afBandwidth = value * 1000.0; - applySettings(); + applySettings(QStringList("afBandwidth")); } void WFMModGUI::on_fmDev_valueChanged(int value) { ui->fmDevText->setText(QString("%1k").arg(value)); m_settings.m_fmDeviation = value * 1000.0; - applySettings(); + applySettings(QStringList("fmDeviation")); } void WFMModGUI::on_volume_valueChanged(int value) { ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); m_settings.m_volumeFactor = value / 10.0; - applySettings(); + applySettings(QStringList("volumeFactor")); } void WFMModGUI::on_toneFrequency_valueChanged(int value) { ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2)); m_settings.m_toneFrequency = value * 10.0; - applySettings(); + applySettings(QStringList("toneFrequency")); } void WFMModGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void WFMModGUI::on_playLoop_toggled(bool checked) { m_settings.m_playLoop = checked; - applySettings(); + applySettings(QStringList("playLoop")); } void WFMModGUI::on_play_toggled(bool checked) @@ -209,7 +209,7 @@ void WFMModGUI::on_play_toggled(bool checked) ui->mic->setEnabled(!checked); ui->morseKeyer->setEnabled(!checked); m_settings.m_modAFInput = checked ? WFMModSettings::WFMModInputFile : WFMModSettings::WFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); ui->navTimeSlider->setEnabled(!checked); m_enableNavTime = !checked; } @@ -220,7 +220,7 @@ void WFMModGUI::on_tone_toggled(bool checked) ui->mic->setEnabled(!checked); ui->morseKeyer->setEnabled(!checked); m_settings.m_modAFInput = checked ? WFMModSettings::WFMModInputTone : WFMModSettings::WFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void WFMModGUI::on_morseKeyer_toggled(bool checked) @@ -229,7 +229,7 @@ void WFMModGUI::on_morseKeyer_toggled(bool checked) ui->mic->setEnabled(!checked); ui->play->setEnabled(!checked); m_settings.m_modAFInput = checked ? WFMModSettings::WFMModInputCWTone : WFMModSettings::WFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void WFMModGUI::on_mic_toggled(bool checked) @@ -238,20 +238,20 @@ void WFMModGUI::on_mic_toggled(bool checked) ui->tone->setEnabled(!checked); // release other source inputs ui->morseKeyer->setEnabled(!checked); m_settings.m_modAFInput = checked ? WFMModSettings::WFMModInputAudio : WFMModSettings::WFMModInputNone; - applySettings(); + applySettings(QStringList("modAFInput")); } void WFMModGUI::on_feedbackEnable_toggled(bool checked) { m_settings.m_feedbackAudioEnable = checked; - applySettings(); + applySettings(QStringList("feedbackAudioEnable")); } void WFMModGUI::on_feedbackVolume_valueChanged(int value) { ui->feedbackVolumeText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2)); m_settings.m_feedbackVolumeFactor = value / 100.0; - applySettings(); + applySettings(QStringList("feedbackVolumeFactor")); } void WFMModGUI::on_navTimeSlider_valueChanged(int value) @@ -295,7 +295,7 @@ void WFMModGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void WFMModGUI::onMenuDialogCalled(const QPoint &p) @@ -340,7 +340,9 @@ void WFMModGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"title", "rgbColor", "useReverseAPI", + "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", + "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -427,7 +429,7 @@ WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -442,11 +444,11 @@ void WFMModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void WFMModGUI::applySettings(bool force) +void WFMModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { - WFMMod::MsgConfigureWFMMod *msgConf = WFMMod::MsgConfigureWFMMod::create(m_settings, force); + WFMMod::MsgConfigureWFMMod *msgConf = WFMMod::MsgConfigureWFMMod::create(settingsKeys, m_settings, force); m_wfmMod->getInputMessageQueue()->push(msgConf); } } @@ -528,7 +530,7 @@ void WFMModGUI::audioSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("audioDeviceName")); } } @@ -543,7 +545,7 @@ void WFMModGUI::audioFeedbackSelect(const QPoint& p) if (audioSelect.m_selected) { m_settings.m_feedbackAudioDeviceName = audioSelect.m_audioDeviceName; - applySettings(); + applySettings(QStringList("feedbackAudioDeviceName")); } } diff --git a/plugins/channeltx/modwfm/wfmmodgui.h b/plugins/channeltx/modwfm/wfmmodgui.h index 57432b5af..72c52668c 100644 --- a/plugins/channeltx/modwfm/wfmmodgui.h +++ b/plugins/channeltx/modwfm/wfmmodgui.h @@ -90,7 +90,7 @@ private: virtual ~WFMModGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void updateWithStreamData(); void updateWithStreamTime(); diff --git a/plugins/channeltx/modwfm/wfmmodsettings.cpp b/plugins/channeltx/modwfm/wfmmodsettings.cpp index 58f45d571..857b6e9bd 100644 --- a/plugins/channeltx/modwfm/wfmmodsettings.cpp +++ b/plugins/channeltx/modwfm/wfmmodsettings.cpp @@ -200,6 +200,162 @@ bool WFMModSettings::deserialize(const QByteArray& data) } } +void WFMModSettings::applySettings(const QStringList& settingsKeys, const WFMModSettings& settings) +{ + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth")) { + m_afBandwidth = settings.m_afBandwidth; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("toneFrequency")) { + m_toneFrequency = settings.m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor")) { + m_volumeFactor = settings.m_volumeFactor; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("playLoop")) { + m_playLoop = settings.m_playLoop; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("modAFInput")) { + m_modAFInput = settings.m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName")) { + m_audioDeviceName = settings.m_audioDeviceName; + } + if (settingsKeys.contains("feedbackAudioDeviceName")) { + m_feedbackAudioDeviceName = settings.m_feedbackAudioDeviceName; + } + if (settingsKeys.contains("feedbackVolumeFactor")) { + m_feedbackVolumeFactor = settings.m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable")) { + m_feedbackAudioEnable = settings.m_feedbackAudioEnable; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } + if (settingsKeys.contains("cwKeyerSettings")) { + m_cwKeyerSettings = settings.m_cwKeyerSettings; + } +} + +QString WFMModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("afBandwidth") || force) { + ostr << " m_afBandwidth: " << m_afBandwidth; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("toneFrequency") || force) { + ostr << " m_toneFrequency: " << m_toneFrequency; + } + if (settingsKeys.contains("volumeFactor") || force) { + ostr << " m_volumeFactor: " << m_volumeFactor; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("playLoop") || force) { + ostr << " m_playLoop: " << m_playLoop; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("modAFInput") || force) { + ostr << " m_modAFInput: " << (int)m_modAFInput; + } + if (settingsKeys.contains("audioDeviceName") || force) { + ostr << " m_audioDeviceName: " << m_audioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackAudioDeviceName") || force) { + ostr << " m_feedbackAudioDeviceName: " << m_feedbackAudioDeviceName.toStdString(); + } + if (settingsKeys.contains("feedbackVolumeFactor") || force) { + ostr << " m_feedbackVolumeFactor: " << m_feedbackVolumeFactor; + } + if (settingsKeys.contains("feedbackAudioEnable") || force) { + ostr << " m_feedbackAudioEnable: " << m_feedbackAudioEnable; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + int WFMModSettings::getRFBW(int index) { if (index < 0) { diff --git a/plugins/channeltx/modwfm/wfmmodsettings.h b/plugins/channeltx/modwfm/wfmmodsettings.h index 2185d74f0..3f82d5b41 100644 --- a/plugins/channeltx/modwfm/wfmmodsettings.h +++ b/plugins/channeltx/modwfm/wfmmodsettings.h @@ -80,6 +80,8 @@ struct WFMModSettings void setCWKeyerGUI(Serializable *cwKeyerGUI) { m_cwKeyerGUI = cwKeyerGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const WFMModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; const CWKeyerSettings& getCWKeyerSettings() const { return m_cwKeyerSettings; } void setCWKeyerSettings(const CWKeyerSettings& cwKeyerSettings) { m_cwKeyerSettings = cwKeyerSettings; } diff --git a/plugins/channeltx/modwfm/wfmmodsource.cpp b/plugins/channeltx/modwfm/wfmmodsource.cpp index 2b01569d4..c03698a1a 100644 --- a/plugins/channeltx/modwfm/wfmmodsource.cpp +++ b/plugins/channeltx/modwfm/wfmmodsource.cpp @@ -56,7 +56,7 @@ WFMModSource::WFMModSource() : m_demodBuffer.resize(1<<12); m_demodBufferFill = 0; - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -407,9 +407,9 @@ void WFMModSource::applyFeedbackAudioSampleRate(int sampleRate) m_feedbackAudioSampleRate = sampleRate; } -void WFMModSource::applySettings(const WFMModSettings& settings, bool force) +void WFMModSource::applySettings(const QStringList& settingsKeys, const WFMModSettings& settings, bool force) { - if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) + if ((settingsKeys.contains("afBandwidth") && (settings.m_afBandwidth != m_settings.m_afBandwidth)) || force) { m_interpolatorDistanceRemain = 0; m_interpolatorConsumed = false; @@ -417,20 +417,20 @@ void WFMModSource::applySettings(const WFMModSettings& settings, bool force) m_interpolator.create(48, m_audioSampleRate, settings.m_afBandwidth / 2.2, 3.0); } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if ((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || force) { Real lowCut = -(settings.m_rfBandwidth / 2.2) / m_channelSampleRate; Real hiCut = (settings.m_rfBandwidth / 2.2) / m_channelSampleRate; m_rfFilter->create_filter(lowCut, hiCut); } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) + if ((settingsKeys.contains("toneFrequency") && (settings.m_toneFrequency != m_settings.m_toneFrequency)) || force) { m_toneNco.setFreq(settings.m_toneFrequency, m_channelSampleRate); m_cwToneNco.setFreq(settings.m_toneFrequency, m_audioSampleRate); } - if ((settings.m_modAFInput != m_settings.m_modAFInput) || force) + if ((settingsKeys.contains("modAFInput") && (settings.m_modAFInput != m_settings.m_modAFInput)) || force) { if (settings.m_modAFInput == WFMModSettings::WFMModInputAudio) { connect(&m_audioFifo, SIGNAL(dataReady()), this, SLOT(handleAudio())); @@ -439,7 +439,11 @@ void WFMModSource::applySettings(const WFMModSettings& settings, bool force) } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void WFMModSource::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) diff --git a/plugins/channeltx/modwfm/wfmmodsource.h b/plugins/channeltx/modwfm/wfmmodsource.h index 3edb71840..96de90394 100644 --- a/plugins/channeltx/modwfm/wfmmodsource.h +++ b/plugins/channeltx/modwfm/wfmmodsource.h @@ -66,7 +66,7 @@ public: peakLevel = m_peakLevelOut; numSamples = m_levelNbSamples; } - void applySettings(const WFMModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const WFMModSettings& settings, bool force = false); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); private: diff --git a/plugins/channeltx/remotesource/remotesource.cpp b/plugins/channeltx/remotesource/remotesource.cpp index e0595c30c..16451aaef 100644 --- a/plugins/channeltx/remotesource/remotesource.cpp +++ b/plugins/channeltx/remotesource/remotesource.cpp @@ -60,7 +60,7 @@ RemoteSource::RemoteSource(DeviceAPI *deviceAPI) : m_basebandSource = new RemoteSourceBaseband(); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -147,7 +147,7 @@ bool RemoteSource::handleMessage(const Message& cmd) { MsgConfigureRemoteSource& cfg = (MsgConfigureRemoteSource&) cmd; qDebug() << "MsgConfigureRemoteSource::handleMessage: MsgConfigureRemoteSource"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -189,56 +189,29 @@ bool RemoteSource::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureRemoteSource *msg = MsgConfigureRemoteSource::create(m_settings, true); + MsgConfigureRemoteSource *msg = MsgConfigureRemoteSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureRemoteSource *msg = MsgConfigureRemoteSource::create(m_settings, true); + MsgConfigureRemoteSource *msg = MsgConfigureRemoteSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } } -void RemoteSource::applySettings(const RemoteSourceSettings& settings, bool force) +void RemoteSource::applySettings(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force) { - qDebug() << "RemoteSource::applySettings:" - << "m_log2Interp:" << settings.m_log2Interp - << "m_filterChainHash:" << settings.m_filterChainHash - << "m_dataAddress:" << settings.m_dataAddress - << "m_dataPort:" << settings.m_dataPort - << "m_rgbColor:" << settings.m_rgbColor - << "m_title:" << settings.m_title - << "m_useReverseAPI:" << settings.m_useReverseAPI - << "m_reverseAPIAddress:" << settings.m_reverseAPIAddress - << "m_reverseAPIChannelIndex:" << settings.m_reverseAPIChannelIndex - << "m_reverseAPIDeviceIndex:" << settings.m_reverseAPIDeviceIndex - << "m_reverseAPIPort:" << settings.m_reverseAPIPort - << "force:" << force; + qDebug() << "RemoteSource::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((m_settings.m_log2Interp != settings.m_log2Interp) || force) { - reverseAPIKeys.append("log2Interp"); - } - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) { - reverseAPIKeys.append("filterChainHash"); - } - if ((m_settings.m_dataAddress != settings.m_dataAddress) || force) { - reverseAPIKeys.append("dataAddress"); - } - if ((m_settings.m_dataPort != settings.m_dataPort) || force) { - reverseAPIKeys.append("dataPort"); - } - - if ((m_settings.m_log2Interp != settings.m_log2Interp) - || (m_settings.m_filterChainHash != settings.m_filterChainHash) || force) { + if ((settingsKeys.contains("log2Interp") && (m_settings.m_log2Interp != settings.m_log2Interp)) + || (settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) || force) { calculateFrequencyOffset(settings.m_log2Interp, settings.m_filterChainHash); } - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -249,11 +222,9 @@ void RemoteSource::applySettings(const RemoteSourceSettings& settings, bool forc m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - RemoteSourceBaseband::MsgConfigureRemoteSourceBaseband *msg = RemoteSourceBaseband::MsgConfigureRemoteSourceBaseband::create(settings, force); + RemoteSourceBaseband::MsgConfigureRemoteSourceBaseband *msg = RemoteSourceBaseband::MsgConfigureRemoteSourceBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); if (settings.m_useReverseAPI) @@ -263,14 +234,14 @@ void RemoteSource::applySettings(const RemoteSourceSettings& settings, bool forc (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -323,13 +294,13 @@ int RemoteSource::webapiSettingsPutPatch( RemoteSourceSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureRemoteSource *msg = MsgConfigureRemoteSource::create(settings, force); + MsgConfigureRemoteSource *msg = MsgConfigureRemoteSource::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); qDebug("RemoteSource::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureRemoteSource *msgToGUI = MsgConfigureRemoteSource::create(settings, force); + MsgConfigureRemoteSource *msgToGUI = MsgConfigureRemoteSource::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -487,7 +458,7 @@ void RemoteSource::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& resp response.getRemoteSourceReport()->setDeviceSampleRate(m_deviceAPI->getSampleSink()->getSampleRate()); } -void RemoteSource::webapiReverseSendSettings(QList& channelSettingsKeys, const RemoteSourceSettings& settings, bool force) +void RemoteSource::webapiReverseSendSettings(const QList& channelSettingsKeys, const RemoteSourceSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -514,7 +485,7 @@ void RemoteSource::webapiReverseSendSettings(QList& channelSettingsKeys void RemoteSource::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const RemoteSourceSettings& settings, bool force) { @@ -538,7 +509,7 @@ void RemoteSource::sendChannelSettings( } void RemoteSource::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RemoteSourceSettings& settings, bool force diff --git a/plugins/channeltx/remotesource/remotesource.h b/plugins/channeltx/remotesource/remotesource.h index 02fcfd29d..86423f162 100644 --- a/plugins/channeltx/remotesource/remotesource.h +++ b/plugins/channeltx/remotesource/remotesource.h @@ -47,20 +47,23 @@ public: public: const RemoteSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRemoteSource* create(const RemoteSourceSettings& settings, bool force) + static MsgConfigureRemoteSource* create(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force) { - return new MsgConfigureRemoteSource(settings, force); + return new MsgConfigureRemoteSource(settingsKeys, settings, force); } private: RemoteSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRemoteSource(const RemoteSourceSettings& settings, bool force) : + MsgConfigureRemoteSource(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -236,19 +239,19 @@ private: uint32_t m_basebandSampleRate; virtual bool handleMessage(const Message& cmd); - void applySettings(const RemoteSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force = false); static void validateFilterChainHash(RemoteSourceSettings& settings); void calculateFrequencyOffset(uint32_t log2Interp, uint32_t filterChainHash); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const RemoteSourceSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const RemoteSourceSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const RemoteSourceSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const RemoteSourceSettings& settings, bool force diff --git a/plugins/channeltx/remotesource/remotesourcebaseband.cpp b/plugins/channeltx/remotesource/remotesourcebaseband.cpp index 197fae2ad..d14af1046 100644 --- a/plugins/channeltx/remotesource/remotesourcebaseband.cpp +++ b/plugins/channeltx/remotesource/remotesourcebaseband.cpp @@ -137,7 +137,7 @@ bool RemoteSourceBaseband::handleMessage(const Message& cmd) MsgConfigureRemoteSourceBaseband& cfg = (MsgConfigureRemoteSourceBaseband&) cmd; qDebug() << "RemoteSourceBaseband::handleMessage: MsgConfigureRemoteSourceBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -161,27 +161,26 @@ bool RemoteSourceBaseband::handleMessage(const Message& cmd) } } -void RemoteSourceBaseband::applySettings(const RemoteSourceSettings& settings, bool force) +void RemoteSourceBaseband::applySettings(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force) { - qDebug() << "RemoteSourceBaseband::applySettings:" - << "m_log2Interp:" << settings.m_log2Interp - << "m_filterChainHash:" << settings.m_filterChainHash - << "m_dataAddress:" << settings.m_dataAddress - << "m_dataPort:" << settings.m_dataPort - << "force:" << force; + qDebug() << "RemoteSourceBaseband::applySettings:" << settings.getDebugString(settingsKeys, force); - if ((settings.m_dataAddress != m_settings.m_dataAddress) - || (settings.m_dataPort != m_settings.m_dataPort) || force) { + if ((settingsKeys.contains("dataAddress") && (settings.m_dataAddress != m_settings.m_dataAddress)) + || (settingsKeys.contains("dataPort") && (settings.m_dataPort != m_settings.m_dataPort)) || force) { m_source.dataBind(settings.m_dataAddress, settings.m_dataPort); } - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) - || (m_settings.m_log2Interp != settings.m_log2Interp) || force) + if ((settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) + || (settingsKeys.contains("log2Interp") && (m_settings.m_log2Interp != settings.m_log2Interp)) || force) { m_channelizer->setInterpolation(settings.m_log2Interp, settings.m_filterChainHash); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } int RemoteSourceBaseband::getChannelSampleRate() const diff --git a/plugins/channeltx/remotesource/remotesourcebaseband.h b/plugins/channeltx/remotesource/remotesourcebaseband.h index 8eb3561f2..3ea3ea8b0 100644 --- a/plugins/channeltx/remotesource/remotesourcebaseband.h +++ b/plugins/channeltx/remotesource/remotesourcebaseband.h @@ -40,20 +40,23 @@ public: public: const RemoteSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureRemoteSourceBaseband* create(const RemoteSourceSettings& settings, bool force) + static MsgConfigureRemoteSourceBaseband* create(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force) { - return new MsgConfigureRemoteSourceBaseband(settings, force); + return new MsgConfigureRemoteSourceBaseband(settingsKeys, settings, force); } private: RemoteSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureRemoteSourceBaseband(const RemoteSourceSettings& settings, bool force) : + MsgConfigureRemoteSourceBaseband(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -99,7 +102,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const RemoteSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const RemoteSourceSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/remotesource/remotesourcegui.cpp b/plugins/channeltx/remotesource/remotesourcegui.cpp index d60712bee..4a3ae7a4d 100644 --- a/plugins/channeltx/remotesource/remotesourcegui.cpp +++ b/plugins/channeltx/remotesource/remotesourcegui.cpp @@ -45,7 +45,7 @@ void RemoteSourceGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray RemoteSourceGUI::serialize() const @@ -57,7 +57,7 @@ bool RemoteSourceGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -208,7 +208,7 @@ RemoteSourceGUI::RemoteSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, makeUIConnections(); displayPosition(); displayRateAndShift(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -222,13 +222,13 @@ void RemoteSourceGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void RemoteSourceGUI::applySettings(bool force) +void RemoteSourceGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - RemoteSource::MsgConfigureRemoteSource* message = RemoteSource::MsgConfigureRemoteSource::create(m_settings, force); + RemoteSource::MsgConfigureRemoteSource* message = RemoteSource::MsgConfigureRemoteSource::create(settingsKeys, m_settings, force); m_remoteSrc->getInputMessageQueue()->push(message); } } @@ -305,7 +305,7 @@ void RemoteSourceGUI::onWidgetRolled(QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void RemoteSourceGUI::onMenuDialogCalled(const QPoint &p) @@ -350,7 +350,7 @@ void RemoteSourceGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"color", "title", "useReverseAPI", "reverseAPIAddress", "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", "streamIndex"})); } resetContextMenuType(); @@ -371,7 +371,7 @@ void RemoteSourceGUI::on_position_valueChanged(int value) void RemoteSourceGUI::on_dataAddress_returnPressed() { m_settings.m_dataAddress = ui->dataAddress->text(); - applySettings(); + applySettings(QStringList({"dataAddress"})); } void RemoteSourceGUI::on_dataPort_returnPressed() @@ -385,7 +385,7 @@ void RemoteSourceGUI::on_dataPort_returnPressed() m_settings.m_dataPort = dataPort; } - applySettings(); + applySettings(QStringList({"dataPort"})); } void RemoteSourceGUI::on_dataApplyButton_clicked(bool checked) @@ -400,7 +400,7 @@ void RemoteSourceGUI::on_dataApplyButton_clicked(bool checked) m_settings.m_dataPort = udpDataPort; } - applySettings(); + applySettings(QStringList({"dataAddress", "dataPort"})); } void RemoteSourceGUI::on_eventCountsReset_clicked(bool checked) @@ -436,7 +436,7 @@ void RemoteSourceGUI::applyPosition() updateAbsoluteCenterFrequency(); displayRateAndShift(); - applySettings(); + applySettings(QStringList()); } void RemoteSourceGUI::displayEventCounts() @@ -505,4 +505,3 @@ void RemoteSourceGUI::updateAbsoluteCenterFrequency() int shift = m_shiftFrequencyFactor * m_basebandSampleRate; setStatusFrequency(m_deviceCenterFrequency + shift); } - diff --git a/plugins/channeltx/remotesource/remotesourcegui.h b/plugins/channeltx/remotesource/remotesourcegui.h index c8aaec1d8..d81ece6dc 100644 --- a/plugins/channeltx/remotesource/remotesourcegui.h +++ b/plugins/channeltx/remotesource/remotesourcegui.h @@ -96,7 +96,7 @@ private: virtual ~RemoteSourceGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displayRateAndShift(); void displayPosition(); diff --git a/plugins/channeltx/remotesource/remotesourcesettings.cpp b/plugins/channeltx/remotesource/remotesourcesettings.cpp index a4e10a890..f042c3eda 100644 --- a/plugins/channeltx/remotesource/remotesourcesettings.cpp +++ b/plugins/channeltx/remotesource/remotesourcesettings.cpp @@ -151,3 +151,102 @@ bool RemoteSourceSettings::deserialize(const QByteArray& data) return false; } } + +void RemoteSourceSettings::applySettings(const QStringList& settingsKeys, const RemoteSourceSettings& settings) +{ + if (settingsKeys.contains("dataAddress")) { + m_dataAddress = settings.m_dataAddress; + } + if (settingsKeys.contains("dataPort")) { + m_dataPort = settings.m_dataPort; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("log2Interp")) { + m_log2Interp = settings.m_log2Interp; + } + if (settingsKeys.contains("filterChainHash")) { + m_filterChainHash = settings.m_filterChainHash; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString RemoteSourceSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("dataAddress") || force) { + ostr << " m_dataAddress: " << m_dataAddress.toStdString(); + } + if (settingsKeys.contains("dataPort") || force) { + ostr << " m_dataPort: " << m_dataPort; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("log2Interp") || force) { + ostr << " m_log2Interp: " << m_log2Interp; + } + if (settingsKeys.contains("filterChainHash") || force) { + ostr << " m_filterChainHash: " << m_filterChainHash; + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/remotesource/remotesourcesettings.h b/plugins/channeltx/remotesource/remotesourcesettings.h index dd0a8dd9d..e95649328 100644 --- a/plugins/channeltx/remotesource/remotesourcesettings.h +++ b/plugins/channeltx/remotesource/remotesourcesettings.h @@ -53,6 +53,8 @@ struct RemoteSourceSettings void setRollupState(Serializable *rollupState) { m_rollupState = rollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const RemoteSourceSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* PLUGINS_CHANNELTX_REMOTESRC_REMOTESRCSETTINGS_H_ */ diff --git a/plugins/channeltx/udpsource/udpsource.cpp b/plugins/channeltx/udpsource/udpsource.cpp index 0a8bfe0e1..9909c6258 100644 --- a/plugins/channeltx/udpsource/udpsource.cpp +++ b/plugins/channeltx/udpsource/udpsource.cpp @@ -54,7 +54,7 @@ UDPSource::UDPSource(DeviceAPI *deviceAPI) : m_basebandSource->setSpectrumSink(&m_spectrumVis); m_basebandSource->moveToThread(m_thread); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); m_deviceAPI->addChannelSource(this); m_deviceAPI->addChannelSourceAPI(this); @@ -119,11 +119,11 @@ void UDPSource::setCenterFrequency(qint64 frequency) { UDPSourceSettings settings = m_settings; settings.m_inputFrequencyOffset = frequency; - applySettings(settings, false); + applySettings(QStringList("inputFrequencyOffset"), settings, false); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureUDPSource *msgToGUI = MsgConfigureUDPSource::create(settings, false); + MsgConfigureUDPSource *msgToGUI = MsgConfigureUDPSource::create(QStringList("inputFrequencyOffset"), settings, false); m_guiMessageQueue->push(msgToGUI); } } @@ -148,7 +148,7 @@ bool UDPSource::handleMessage(const Message& cmd) MsgConfigureUDPSource& cfg = (MsgConfigureUDPSource&) cmd; qDebug() << "UDPSource::handleMessage: MsgConfigureUDPSource"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -184,96 +184,17 @@ void UDPSource::resetReadIndex() m_basebandSource->getInputMessageQueue()->push(cmd); } -void UDPSource::applySettings(const UDPSourceSettings& settings, bool force) +void UDPSource::applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force) { - qDebug() << "UDPSource::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_sampleFormat: " << settings.m_sampleFormat - << " m_inputSampleRate: " << settings.m_inputSampleRate - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_lowCutoff: " << settings.m_lowCutoff - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_amModFactor: " << settings.m_amModFactor - << " m_udpAddressStr: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " m_multicastAddress: " << settings.m_multicastAddress - << " m_multicastJoin: " << settings.m_multicastJoin - << " m_channelMute: " << settings.m_channelMute - << " m_gainIn: " << settings.m_gainIn - << " m_gainOut: " << settings.m_gainOut - << " m_squelchGate: " << settings.m_squelchGate - << " m_squelch: " << settings.m_squelch << "dB" - << " m_squelchEnabled: " << settings.m_squelchEnabled - << " m_autoRWBalance: " << settings.m_autoRWBalance - << " m_stereoInput: " << settings.m_stereoInput - << " force: " << force; + qDebug() << "UDPSource::applySettings:" << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { - reverseAPIKeys.append("inputFrequencyOffset"); - } - if ((settings.m_sampleFormat != m_settings.m_sampleFormat) || force) { - reverseAPIKeys.append("sampleFormat"); - } - - if ((settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force) + if ((settingsKeys.contains("inputSampleRate") && (settings.m_inputSampleRate != m_settings.m_inputSampleRate)) || force) { - reverseAPIKeys.append("inputSampleRate"); DSPSignalNotification *msg = new DSPSignalNotification(settings.m_inputSampleRate, 0); m_spectrumVis.getInputMessageQueue()->push(msg); } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { - reverseAPIKeys.append("rfBandwidth"); - } - if ((settings.m_lowCutoff != m_settings.m_lowCutoff) || force) { - reverseAPIKeys.append("lowCutoff"); - } - if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { - reverseAPIKeys.append("fmDeviation"); - } - if ((settings.m_amModFactor != m_settings.m_amModFactor) || force) { - reverseAPIKeys.append("amModFactor"); - } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) { - reverseAPIKeys.append("udpAddress"); - } - if ((settings.m_udpPort != m_settings.m_udpPort) || force) { - reverseAPIKeys.append("udpPort"); - } - if ((settings.m_multicastAddress != m_settings.m_multicastAddress) || force) { - reverseAPIKeys.append("multicastAddress"); - } - if ((settings.m_multicastJoin != m_settings.m_multicastJoin) || force) { - reverseAPIKeys.append("multicastJoin"); - } - if ((settings.m_channelMute != m_settings.m_channelMute) || force) { - reverseAPIKeys.append("channelMute"); - } - if ((settings.m_gainIn != m_settings.m_gainIn) || force) { - reverseAPIKeys.append("gainIn"); - } - if ((settings.m_gainOut != m_settings.m_gainOut) || force) { - reverseAPIKeys.append("gainOut"); - } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) { - reverseAPIKeys.append("squelchGate"); - } - if ((settings.m_squelch != m_settings.m_squelch) || force) { - reverseAPIKeys.append("squelch"); - } - if ((settings.m_squelchEnabled != m_settings.m_squelchEnabled) || force) { - reverseAPIKeys.append("squelchEnabled"); - } - if ((settings.m_autoRWBalance != m_settings.m_autoRWBalance) || force) { - reverseAPIKeys.append("autoRWBalance"); - } - if ((settings.m_stereoInput != m_settings.m_stereoInput) || force) { - reverseAPIKeys.append("stereoInput"); - } - - if (m_settings.m_streamIndex != settings.m_streamIndex) + if (settingsKeys.contains("streamIndex") && (m_settings.m_streamIndex != settings.m_streamIndex)) { if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only { @@ -284,28 +205,26 @@ void UDPSource::applySettings(const UDPSourceSettings& settings, bool force) m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent emit streamIndexChanged(settings.m_streamIndex); } - - reverseAPIKeys.append("streamIndex"); } - UDPSourceBaseband::MsgConfigureUDPSourceBaseband *msg = UDPSourceBaseband::MsgConfigureUDPSourceBaseband::create(settings, force); + UDPSourceBaseband::MsgConfigureUDPSourceBaseband *msg = UDPSourceBaseband::MsgConfigureUDPSourceBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); - if (settings.m_useReverseAPI) + if (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) { - bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || - (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || - (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || - (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || - (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = ((settingsKeys.contains("useReverseAPI") && (m_settings.m_useReverseAPI != settings.m_useReverseAPI)) && settings.m_useReverseAPI) || + (settingsKeys.contains("reverseAPIAddress") && (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress)) || + (settingsKeys.contains("reverseAPIPort") && (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort)) || + (settingsKeys.contains("reverseAPIDeviceIndex") && (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex)) || + (settingsKeys.contains("reverseAPIChannelIndex") && (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex)); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } QList pipes; MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (pipes.size() > 0) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -320,14 +239,14 @@ bool UDPSource::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureUDPSource *msg = MsgConfigureUDPSource::create(m_settings, true); + MsgConfigureUDPSource *msg = MsgConfigureUDPSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureUDPSource *msg = MsgConfigureUDPSource::create(m_settings, true); + MsgConfigureUDPSource *msg = MsgConfigureUDPSource::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -371,12 +290,12 @@ int UDPSource::webapiSettingsPutPatch( m_inputMessageQueue.push(msgChan); } - MsgConfigureUDPSource *msg = MsgConfigureUDPSource::create(settings, force); + MsgConfigureUDPSource *msg = MsgConfigureUDPSource::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureUDPSource *msgToGUI = MsgConfigureUDPSource::create(settings, force); + MsgConfigureUDPSource *msgToGUI = MsgConfigureUDPSource::create(channelSettingsKeys, settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -598,7 +517,7 @@ void UDPSource::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons response.getUdpSourceReport()->setChannelSampleRate(m_basebandSource->getChannelSampleRate()); } -void UDPSource::webapiReverseSendSettings(QList& channelSettingsKeys, const UDPSourceSettings& settings, bool force) +void UDPSource::webapiReverseSendSettings(const QList& channelSettingsKeys, const UDPSourceSettings& settings, bool force) { SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); @@ -625,7 +544,7 @@ void UDPSource::webapiReverseSendSettings(QList& channelSettingsKeys, c void UDPSource::sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const UDPSourceSettings& settings, bool force) { @@ -649,7 +568,7 @@ void UDPSource::sendChannelSettings( } void UDPSource::webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const UDPSourceSettings& settings, bool force diff --git a/plugins/channeltx/udpsource/udpsource.h b/plugins/channeltx/udpsource/udpsource.h index 9bbe81a2b..97d111a39 100644 --- a/plugins/channeltx/udpsource/udpsource.h +++ b/plugins/channeltx/udpsource/udpsource.h @@ -44,20 +44,23 @@ public: public: const UDPSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureUDPSource* create(const UDPSourceSettings& settings, bool force) + static MsgConfigureUDPSource* create(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force) { - return new MsgConfigureUDPSource(settings, force); + return new MsgConfigureUDPSource(settingsKeys, settings, force); } private: UDPSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureUDPSource(const UDPSourceSettings& settings, bool force) : + MsgConfigureUDPSource(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } @@ -183,17 +186,17 @@ private: virtual bool handleMessage(const Message& cmd); - void applySettings(const UDPSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force = false); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); - void webapiReverseSendSettings(QList& channelSettingsKeys, const UDPSourceSettings& settings, bool force); + void webapiReverseSendSettings(const QList& channelSettingsKeys, const UDPSourceSettings& settings, bool force); void sendChannelSettings( const QList& pipes, - QList& channelSettingsKeys, + const QList& channelSettingsKeys, const UDPSourceSettings& settings, bool force ); void webapiFormatChannelSettings( - QList& channelSettingsKeys, + const QList& channelSettingsKeys, SWGSDRangel::SWGChannelSettings *swgChannelSettings, const UDPSourceSettings& settings, bool force diff --git a/plugins/channeltx/udpsource/udpsourcebaseband.cpp b/plugins/channeltx/udpsource/udpsourcebaseband.cpp index f68ab4ab6..b50e6de3d 100644 --- a/plugins/channeltx/udpsource/udpsourcebaseband.cpp +++ b/plugins/channeltx/udpsource/udpsourcebaseband.cpp @@ -143,7 +143,7 @@ bool UDPSourceBaseband::handleMessage(const Message& cmd) MsgConfigureUDPSourceBaseband& cfg = (MsgConfigureUDPSourceBaseband&) cmd; qDebug() << "UDPSourceBaseband::handleMessage: MsgConfigureAMModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -187,9 +187,9 @@ bool UDPSourceBaseband::handleMessage(const Message& cmd) } } -void UDPSourceBaseband::applySettings(const UDPSourceSettings& settings, bool force) +void UDPSourceBaseband::applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force) { - m_source.applySettings(settings, force); + m_source.applySettings(settingsKeys, settings, force); m_settings = settings; } diff --git a/plugins/channeltx/udpsource/udpsourcebaseband.h b/plugins/channeltx/udpsource/udpsourcebaseband.h index 77d9d01e0..8ab520f49 100644 --- a/plugins/channeltx/udpsource/udpsourcebaseband.h +++ b/plugins/channeltx/udpsource/udpsourcebaseband.h @@ -39,20 +39,23 @@ public: public: const UDPSourceSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureUDPSourceBaseband* create(const UDPSourceSettings& settings, bool force) + static MsgConfigureUDPSourceBaseband* create(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force) { - return new MsgConfigureUDPSourceBaseband(settings, force); + return new MsgConfigureUDPSourceBaseband(settingsKeys, settings, force); } private: UDPSourceSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureUDPSourceBaseband(const UDPSourceSettings& settings, bool force) : + MsgConfigureUDPSourceBaseband(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -149,7 +152,7 @@ private: void processFifo(SampleVector& data, unsigned int iBegin, unsigned int iEnd); bool handleMessage(const Message& cmd); - void applySettings(const UDPSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force = false); private slots: void handleInputMessages(); diff --git a/plugins/channeltx/udpsource/udpsourcegui.cpp b/plugins/channeltx/udpsource/udpsourcegui.cpp index 53830689d..b660f649b 100644 --- a/plugins/channeltx/udpsource/udpsourcegui.cpp +++ b/plugins/channeltx/udpsource/udpsourcegui.cpp @@ -46,7 +46,7 @@ void UDPSourceGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray UDPSourceGUI::serialize() const @@ -59,7 +59,7 @@ bool UDPSourceGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -175,7 +175,7 @@ UDPSourceGUI::UDPSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb displaySettings(); makeUIConnections(); - applySettings(true); + applySettings(QStringList(), true); DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); } @@ -190,7 +190,7 @@ void UDPSourceGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void UDPSourceGUI::applySettings(bool force) +void UDPSourceGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { @@ -199,7 +199,7 @@ void UDPSourceGUI::applySettings(bool force) m_settings.m_inputFrequencyOffset); m_udpSource->getInputMessageQueue()->push(msgChan); - UDPSource::MsgConfigureUDPSource* message = UDPSource::MsgConfigureUDPSource::create( m_settings, force); + UDPSource::MsgConfigureUDPSource* message = UDPSource::MsgConfigureUDPSource::create(settingsKeys, m_settings, force); m_udpSource->getInputMessageQueue()->push(message); ui->applyBtn->setEnabled(false); @@ -269,7 +269,7 @@ void UDPSourceGUI::channelMarkerChangedByCursor() { ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void UDPSourceGUI::on_deltaFrequency_changed(qint64 value) @@ -277,7 +277,7 @@ void UDPSourceGUI::on_deltaFrequency_changed(qint64 value) m_settings.m_inputFrequencyOffset = value; m_channelMarker.setCenterFrequency(value); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList("inputFrequencyOffset")); } void UDPSourceGUI::on_sampleFormat_currentIndexChanged(int index) @@ -415,14 +415,14 @@ void UDPSourceGUI::on_gainIn_valueChanged(int value) { m_settings.m_gainIn = value / 10.0; ui->gainInText->setText(tr("%1").arg(m_settings.m_gainIn, 0, 'f', 1)); - applySettings(); + applySettings(QStringList("gainIn")); } void UDPSourceGUI::on_gainOut_valueChanged(int value) { m_settings.m_gainOut = value / 10.0; ui->gainOutText->setText(tr("%1").arg(m_settings.m_gainOut, 0, 'f', 1)); - applySettings(); + applySettings(QStringList("gainOut")); } void UDPSourceGUI::on_squelch_valueChanged(int value) @@ -436,20 +436,20 @@ void UDPSourceGUI::on_squelch_valueChanged(int value) ui->squelchText->setText("---"); } - applySettings(); + applySettings(QStringList({"squelch", "squelchEnabled"})); } void UDPSourceGUI::on_squelchGate_valueChanged(int value) { m_settings.m_squelchGate = value / 100.0; ui->squelchGateText->setText(tr("%1").arg(roundf(value * 10.0), 0, 'f', 0)); - applySettings(); + applySettings(QStringList("squelchGate")); } void UDPSourceGUI::on_channelMute_toggled(bool checked) { m_settings.m_channelMute = checked; - applySettings(); + applySettings(QStringList("channelMute")); } void UDPSourceGUI::on_applyBtn_clicked() @@ -462,7 +462,7 @@ void UDPSourceGUI::on_applyBtn_clicked() ui->glSpectrum->setSampleRate(m_settings.m_inputSampleRate); - applySettings(); + applySettings(QStringList("inputSampleRate")); } void UDPSourceGUI::on_resetUDPReadIndex_clicked() @@ -473,13 +473,13 @@ void UDPSourceGUI::on_resetUDPReadIndex_clicked() void UDPSourceGUI::on_autoRWBalance_toggled(bool checked) { m_settings.m_autoRWBalance = checked; - applySettings(); + applySettings(QStringList("autoRWBalance")); } void UDPSourceGUI::on_stereoInput_toggled(bool checked) { m_settings.m_stereoInput = checked; - applySettings(); + applySettings(QStringList("stereoInput")); } void UDPSourceGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -490,7 +490,7 @@ void UDPSourceGUI::onWidgetRolled(QWidget* widget, bool rollDown) } getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void UDPSourceGUI::onMenuDialogCalled(const QPoint &p) @@ -534,7 +534,9 @@ void UDPSourceGUI::onMenuDialogCalled(const QPoint &p) updateIndexLabel(); } - applySettings(); + applySettings(QStringList({"rgbColor", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex", + "streamIndex"})); } resetContextMenuType(); diff --git a/plugins/channeltx/udpsource/udpsourcegui.h b/plugins/channeltx/udpsource/udpsourcegui.h index 1b2981622..630108b0f 100644 --- a/plugins/channeltx/udpsource/udpsourcegui.h +++ b/plugins/channeltx/udpsource/udpsourcegui.h @@ -89,7 +89,7 @@ private: virtual ~UDPSourceGUI(); void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void setSampleFormat(int index); void setSampleFormatIndex(const UDPSourceSettings::SampleFormat& sampleFormat); diff --git a/plugins/channeltx/udpsource/udpsourcesettings.cpp b/plugins/channeltx/udpsource/udpsourcesettings.cpp index 08ad66661..fc3d51da6 100644 --- a/plugins/channeltx/udpsource/udpsourcesettings.cpp +++ b/plugins/channeltx/udpsource/udpsourcesettings.cpp @@ -214,7 +214,191 @@ bool UDPSourceSettings::deserialize(const QByteArray& data) } } +void UDPSourceSettings::applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings) +{ + if (settingsKeys.contains("sampleFormat")) { + m_sampleFormat = settings.m_sampleFormat; + } + if (settingsKeys.contains("inputSampleRate")) { + m_inputSampleRate = settings.m_inputSampleRate; + } + if (settingsKeys.contains("inputFrequencyOffset")) { + m_inputFrequencyOffset = settings.m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth")) { + m_rfBandwidth = settings.m_rfBandwidth; + } + if (settingsKeys.contains("lowCutoff")) { + m_lowCutoff = settings.m_lowCutoff; + } + if (settingsKeys.contains("fmDeviation")) { + m_fmDeviation = settings.m_fmDeviation; + } + if (settingsKeys.contains("amModFactor")) { + m_amModFactor = settings.m_amModFactor; + } + if (settingsKeys.contains("channelMute")) { + m_channelMute = settings.m_channelMute; + } + if (settingsKeys.contains("gainIn")) { + m_gainIn = settings.m_gainIn; + } + if (settingsKeys.contains("gainOut")) { + m_gainOut = settings.m_gainOut; + } + if (settingsKeys.contains("squelch")) { + m_squelch = settings.m_squelch; + } + if (settingsKeys.contains("squelchGate")) { + m_squelchGate = settings.m_squelchGate; + } + if (settingsKeys.contains("squelchEnabled")) { + m_squelchEnabled = settings.m_squelchEnabled; + } + if (settingsKeys.contains("autoRWBalance")) { + m_autoRWBalance = settings.m_autoRWBalance; + } + if (settingsKeys.contains("stereoInput")) { + m_stereoInput = settings.m_stereoInput; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("udpAddress")) { + m_udpAddress = settings.m_udpAddress; + } + if (settingsKeys.contains("udpPort")) { + m_udpPort = settings.m_udpPort; + } + if (settingsKeys.contains("multicastAddress")) { + m_multicastAddress = settings.m_multicastAddress; + } + if (settingsKeys.contains("multicastJoin")) { + m_multicastJoin = settings.m_multicastJoin; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("streamIndex")) { + m_streamIndex = settings.m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString UDPSourceSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + if (settingsKeys.contains("sampleFormat") || force) { + ostr << " m_sampleFormat: " << (int)m_sampleFormat; + } + if (settingsKeys.contains("inputSampleRate") || force) { + ostr << " m_inputSampleRate: " << m_inputSampleRate; + } + if (settingsKeys.contains("inputFrequencyOffset") || force) { + ostr << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; + } + if (settingsKeys.contains("rfBandwidth") || force) { + ostr << " m_rfBandwidth: " << m_rfBandwidth; + } + if (settingsKeys.contains("lowCutoff") || force) { + ostr << " m_lowCutoff: " << m_lowCutoff; + } + if (settingsKeys.contains("fmDeviation") || force) { + ostr << " m_fmDeviation: " << m_fmDeviation; + } + if (settingsKeys.contains("amModFactor") || force) { + ostr << " m_amModFactor: " << m_amModFactor; + } + if (settingsKeys.contains("channelMute") || force) { + ostr << " m_channelMute: " << m_channelMute; + } + if (settingsKeys.contains("gainIn") || force) { + ostr << " m_gainIn: " << m_gainIn; + } + if (settingsKeys.contains("gainOut") || force) { + ostr << " m_gainOut: " << m_gainOut; + } + if (settingsKeys.contains("squelch") || force) { + ostr << " m_squelch: " << m_squelch; + } + if (settingsKeys.contains("squelchGate") || force) { + ostr << " m_squelchGate: " << m_squelchGate; + } + if (settingsKeys.contains("squelchEnabled") || force) { + ostr << " m_squelchEnabled: " << m_squelchEnabled; + } + if (settingsKeys.contains("autoRWBalance") || force) { + ostr << " m_autoRWBalance: " << m_autoRWBalance; + } + if (settingsKeys.contains("stereoInput") || force) { + ostr << " m_stereoInput: " << m_stereoInput; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("udpAddress") || force) { + ostr << " m_udpAddress: " << m_udpAddress.toStdString(); + } + if (settingsKeys.contains("udpPort") || force) { + ostr << " m_udpPort: " << m_udpPort; + } + if (settingsKeys.contains("multicastAddress") || force) { + ostr << " m_multicastAddress: " << m_multicastAddress.toStdString(); + } + if (settingsKeys.contains("multicastJoin") || force) { + ostr << " m_multicastJoin: " << m_multicastJoin; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("streamIndex") || force) { + ostr << " m_streamIndex: " << m_streamIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } - + return QString(ostr.str().c_str()); +} diff --git a/plugins/channeltx/udpsource/udpsourcesettings.h b/plugins/channeltx/udpsource/udpsourcesettings.h index ac731f5c3..b9b1e8422 100644 --- a/plugins/channeltx/udpsource/udpsourcesettings.h +++ b/plugins/channeltx/udpsource/udpsourcesettings.h @@ -85,6 +85,8 @@ struct UDPSourceSettings void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; diff --git a/plugins/channeltx/udpsource/udpsourcesource.cpp b/plugins/channeltx/udpsource/udpsourcesource.cpp index 71d6c563c..11d51e0aa 100644 --- a/plugins/channeltx/udpsource/udpsourcesource.cpp +++ b/plugins/channeltx/udpsource/udpsourcesource.cpp @@ -51,7 +51,7 @@ UDPSourceSource::UDPSourceSource() : m_udpHandler.start(); - applySettings(m_settings, true); + applySettings(QStringList(), m_settings, true); applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); } @@ -319,33 +319,13 @@ void UDPSourceSource::applyChannelSettings(int channelSampleRate, int channelFre m_channelFrequencyOffset = channelFrequencyOffset; } -void UDPSourceSource::applySettings(const UDPSourceSettings& settings, bool force) +void UDPSourceSource::applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force) { - qDebug() << "UDPSourceSource::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_sampleFormat: " << settings.m_sampleFormat - << " m_inputSampleRate: " << settings.m_inputSampleRate - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_lowCutoff: " << settings.m_lowCutoff - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_amModFactor: " << settings.m_amModFactor - << " m_udpAddressStr: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " m_multicastAddress: " << settings.m_multicastAddress - << " m_multicastJoin: " << settings.m_multicastJoin - << " m_channelMute: " << settings.m_channelMute - << " m_gainIn: " << settings.m_gainIn - << " m_gainOut: " << settings.m_gainOut - << " m_squelchGate: " << settings.m_squelchGate - << " m_squelch: " << settings.m_squelch << "dB" - << " m_squelchEnabled: " << settings.m_squelchEnabled - << " m_autoRWBalance: " << settings.m_autoRWBalance - << " m_stereoInput: " << settings.m_stereoInput - << " force: " << force; + qDebug() << "UDPSourceSource::applySettings:" << settings.getDebugString(settingsKeys, force); - if((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || - (settings.m_lowCutoff != m_settings.m_lowCutoff) || - (settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force) + if((settingsKeys.contains("rfBandwidth") && (settings.m_rfBandwidth != m_settings.m_rfBandwidth)) || + (settingsKeys.contains("lowCutoff") && (settings.m_lowCutoff != m_settings.m_lowCutoff)) || + (settingsKeys.contains("inputSampleRate") && (settings.m_inputSampleRate != m_settings.m_inputSampleRate)) || force) { m_interpolatorDistanceRemain = 0; m_interpolatorConsumed = false; @@ -368,33 +348,33 @@ void UDPSourceSource::applySettings(const UDPSourceSettings& settings, bool forc m_SSBFilter->create_filter(settings.m_lowCutoff / settings.m_inputSampleRate, settings.m_rfBandwidth / settings.m_inputSampleRate); } - if ((settings.m_squelch != m_settings.m_squelch) || force) + if ((settingsKeys.contains("squelch") && (settings.m_squelch != m_settings.m_squelch)) || force) { m_squelch = CalcDb::powerFromdB(settings.m_squelch); } - if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) + if ((settingsKeys.contains("squelchGate") && (settings.m_squelchGate != m_settings.m_squelchGate)) || force) { m_squelchThreshold = m_channelSampleRate * settings.m_squelchGate; initSquelch(m_squelchOpen); } - if ((settings.m_udpAddress != m_settings.m_udpAddress) || - (settings.m_udpPort != m_settings.m_udpPort) || - (settings.m_multicastAddress != m_settings.m_multicastAddress) || - (settings.m_multicastJoin != m_settings.m_multicastJoin) || force) + if ((settingsKeys.contains("udpAddress") && (settings.m_udpAddress != m_settings.m_udpAddress)) || + (settingsKeys.contains("udpPort") && (settings.m_udpPort != m_settings.m_udpPort)) || + (settingsKeys.contains("multicastAddress") && (settings.m_multicastAddress != m_settings.m_multicastAddress)) || + (settingsKeys.contains("multicastJoin") && (settings.m_multicastJoin != m_settings.m_multicastJoin)) || force) { m_udpHandler.configureUDPLink(settings.m_udpAddress, settings.m_udpPort, settings.m_multicastAddress, settings.m_multicastJoin); } - if ((settings.m_channelMute != m_settings.m_channelMute) || force) + if ((settingsKeys.contains("channelMute") && (settings.m_channelMute != m_settings.m_channelMute)) || force) { if (!settings.m_channelMute) { m_udpHandler.resetReadIndex(); } } - if ((settings.m_autoRWBalance != m_settings.m_autoRWBalance) || force) + if ((settingsKeys.contains("autoRWBalance") && (settings.m_autoRWBalance != m_settings.m_autoRWBalance)) || force) { m_udpHandler.setAutoRWBalance(settings.m_autoRWBalance); @@ -409,7 +389,11 @@ void UDPSourceSource::applySettings(const UDPSourceSettings& settings, bool forc } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void UDPSourceSource::sampleRateCorrection(float rawDeltaRatio, float correctionFactor) diff --git a/plugins/channeltx/udpsource/udpsourcesource.h b/plugins/channeltx/udpsource/udpsourcesource.h index 77d1b114d..9fb6443b7 100644 --- a/plugins/channeltx/udpsource/udpsourcesource.h +++ b/plugins/channeltx/udpsource/udpsourcesource.h @@ -52,7 +52,7 @@ public: void resetReadIndex(); void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); - void applySettings(const UDPSourceSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const UDPSourceSettings& settings, bool force = false); void getLevels(qreal& rmsLevel, qreal& peakLevel, int& numSamples) const { From c0b7232d74029040c354275abd380799a03459f3 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 1 Feb 2026 12:18:48 +0100 Subject: [PATCH 4/5] Apply atomic settings to channel MIMO plugins. Part of #1329 --- .../beamsteeringcwmod/beamsteeringcwmod.cpp | 55 +++----- .../beamsteeringcwmod/beamsteeringcwmod.h | 11 +- .../beamsteeringcwmodbaseband.cpp | 16 ++- .../beamsteeringcwmodbaseband.h | 11 +- .../beamsteeringcwmodgui.cpp | 28 +++-- .../beamsteeringcwmod/beamsteeringcwmodgui.h | 2 +- .../beamsteeringcwmodsettings.cpp | 90 +++++++++++++- .../beamsteeringcwmodsettings.h | 2 + plugins/channelmimo/doa2/doa2.cpp | 69 +++-------- plugins/channelmimo/doa2/doa2.h | 11 +- plugins/channelmimo/doa2/doa2gui.cpp | 29 ++--- plugins/channelmimo/doa2/doa2gui.h | 2 +- plugins/channelmimo/doa2/doa2settings.cpp | 117 ++++++++++++++++++ plugins/channelmimo/doa2/doa2settings.h | 2 + .../interferometer/interferometer.cpp | 2 +- 15 files changed, 306 insertions(+), 141 deletions(-) diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.cpp b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.cpp index e2c0952d7..c510b7cc1 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.cpp +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.cpp @@ -118,7 +118,7 @@ void BeamSteeringCWMod::startSources() m_basebandSource->getInputMessageQueue()->push(sig); BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create( - m_settings, true); + QStringList(), m_settings, true); m_basebandSource->getInputMessageQueue()->push(msg); } @@ -152,42 +152,13 @@ void BeamSteeringCWMod::feed(const SampleVector::const_iterator& begin, const Sa (void) sinkIndex; } -void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings, bool force) +void BeamSteeringCWMod::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) { - qDebug() << "BeamSteeringCWMod::applySettings: " - << "m_steerDegrees: " << settings.m_steerDegrees - << "m_channelOutput: " << settings.m_channelOutput - << "m_filterChainHash: " << settings.m_filterChainHash - << "m_log2Interp: " << settings.m_log2Interp - << "m_filterChainHash: " << settings.m_filterChainHash - << "m_useReverseAPI: " << settings.m_useReverseAPI - << "m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << "m_reverseAPIPort: " << settings.m_reverseAPIPort - << "m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << "m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << "m_title: " << settings.m_title; - - QList reverseAPIKeys; - - if ((m_settings.m_steerDegrees != settings.m_steerDegrees) || force) { - reverseAPIKeys.append("steerDegrees"); - } - if ((m_settings.m_channelOutput != settings.m_channelOutput) || force) { - reverseAPIKeys.append("channelOutput"); - } - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) { - reverseAPIKeys.append("filterChainHash"); - } - if ((m_settings.m_log2Interp != settings.m_log2Interp) || force) { - reverseAPIKeys.append("log2Interp"); - } - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) { - reverseAPIKeys.append("filterChainHash"); - } + qDebug() << "BeamSteeringCWMod::applySettings: " << settings.getDebugString(settingsKeys, force); if (m_running) { - BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(settings, force); + BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband *msg = BeamSteeringCWModBaseband::MsgConfigureBeamSteeringCWModBaseband::create(settingsKeys, settings, force); m_basebandSource->getInputMessageQueue()->push(msg); } @@ -195,10 +166,14 @@ void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings, MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (!pipes.empty()) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void BeamSteeringCWMod::handleInputMessages() @@ -220,7 +195,7 @@ bool BeamSteeringCWMod::handleMessage(const Message& cmd) { auto& cfg = (const MsgConfigureBeamSteeringCWMod&) cmd; qDebug() << "BeamSteeringCWMod::handleMessage: MsgConfigureBeamSteeringCWMod"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } else if (DSPMIMOSignalNotification::match(cmd)) @@ -274,14 +249,14 @@ bool BeamSteeringCWMod::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(m_settings, true); + MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(m_settings, true); + MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -334,12 +309,12 @@ int BeamSteeringCWMod::webapiSettingsPutPatch( BeamSteeringCWModSettings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(settings, force); + MsgConfigureBeamSteeringCWMod *msg = MsgConfigureBeamSteeringCWMod::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (getMessageQueueToGUI()) // forward to GUI if any { - MsgConfigureBeamSteeringCWMod *msgToGUI = MsgConfigureBeamSteeringCWMod::create(settings, force); + MsgConfigureBeamSteeringCWMod *msgToGUI = MsgConfigureBeamSteeringCWMod::create(channelSettingsKeys, settings, force); getMessageQueueToGUI()->push(msgToGUI); } diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h index e676afc5e..b0e68ddfb 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmod.h @@ -45,20 +45,23 @@ public: public: const BeamSteeringCWModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureBeamSteeringCWMod* create(const BeamSteeringCWModSettings& settings, bool force) + static MsgConfigureBeamSteeringCWMod* create(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) { - return new MsgConfigureBeamSteeringCWMod(settings, force); + return new MsgConfigureBeamSteeringCWMod(settingsKeys, settings, force); } private: BeamSteeringCWModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureBeamSteeringCWMod(const BeamSteeringCWModSettings& settings, bool force) : + MsgConfigureBeamSteeringCWMod(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -164,7 +167,7 @@ private: uint32_t m_basebandSampleRate; bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed - void applySettings(const BeamSteeringCWModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force = false); static void validateFilterChainHash(BeamSteeringCWModSettings& settings); void calculateFrequencyOffset(); void webapiReverseSendSettings(const QList& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force); diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.cpp b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.cpp index 72e31d48c..faacdbe4a 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.cpp +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.cpp @@ -170,7 +170,7 @@ bool BeamSteeringCWModBaseband::handleMessage(const Message& cmd) MsgConfigureBeamSteeringCWModBaseband& cfg = (MsgConfigureBeamSteeringCWModBaseband&) cmd; qDebug() << "BeamSteeringCWModBaseband::handleMessage: MsgConfigureBeamSteeringCWModBaseband"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } @@ -200,9 +200,9 @@ bool BeamSteeringCWModBaseband::handleMessage(const Message& cmd) } } -void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& settings, bool force) +void BeamSteeringCWModBaseband::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) { - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || (m_settings.m_log2Interp != settings.m_log2Interp) || force) + if ((settingsKeys.contains("filterChainHash") && (m_settings.m_filterChainHash != settings.m_filterChainHash)) || (settingsKeys.contains("log2Interp") && (m_settings.m_log2Interp != settings.m_log2Interp)) || force) { for (int i = 0; i < 2; i++) { @@ -211,14 +211,14 @@ void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& s } } - if ((m_settings.m_steerDegrees != settings.m_steerDegrees) || force) + if ((settingsKeys.contains("steerDegrees") && (m_settings.m_steerDegrees != settings.m_steerDegrees)) || force) { float steeringAngle = settings.m_steerDegrees / 180.0f; steeringAngle = steeringAngle < -M_PI ? -M_PI : steeringAngle > M_PI ? M_PI : steeringAngle; m_streamSources[1].setPhase(M_PI*cos(steeringAngle)); } - if ((m_settings.m_channelOutput != settings.m_channelOutput) || force) + if ((settingsKeys.contains("channelOutput") && (m_settings.m_channelOutput != settings.m_channelOutput)) || force) { if (settings.m_channelOutput == 0) { @@ -242,5 +242,9 @@ void BeamSteeringCWModBaseband::applySettings(const BeamSteeringCWModSettings& s } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.h b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.h index b6a45ac9b..84da2fdb5 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.h +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodbaseband.h @@ -39,20 +39,23 @@ public: public: const BeamSteeringCWModSettings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureBeamSteeringCWModBaseband* create(const BeamSteeringCWModSettings& settings, bool force) + static MsgConfigureBeamSteeringCWModBaseband* create(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) { - return new MsgConfigureBeamSteeringCWModBaseband(settings, force); + return new MsgConfigureBeamSteeringCWModBaseband(settingsKeys, settings, force); } private: BeamSteeringCWModSettings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureBeamSteeringCWModBaseband(const BeamSteeringCWModSettings& settings, bool force) : + MsgConfigureBeamSteeringCWModBaseband(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -85,7 +88,7 @@ public: private: void processFifo(std::vector& data, unsigned int ibegin, unsigned int iend); bool handleMessage(const Message& cmd); - void applySettings(const BeamSteeringCWModSettings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings, bool force = false); BeamSteeringCWModSettings m_settings; SampleMOFifo m_sampleMOFifo; diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.cpp b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.cpp index 1ead0427e..3a9c1292b 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.cpp +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.cpp @@ -38,7 +38,7 @@ void BeamSteeringCWModGUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray BeamSteeringCWModGUI::serialize() const @@ -50,7 +50,7 @@ bool BeamSteeringCWModGUI::deserialize(const QByteArray& data) { if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else { resetToDefaults(); @@ -128,7 +128,7 @@ BeamSteeringCWModGUI::BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *de displaySettings(); makeUIConnections(); displayRateAndShift(); - applySettings(true); + applySettings(QStringList(), true); m_resizer.enableChildMouseTracking(); } @@ -142,13 +142,13 @@ void BeamSteeringCWModGUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void BeamSteeringCWModGUI::applySettings(bool force) +void BeamSteeringCWModGUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod* message = BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::create(m_settings, force); + BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod* message = BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::create(settingsKeys, m_settings, force); m_bsCWSource->getInputMessageQueue()->push(message); } } @@ -216,7 +216,7 @@ void BeamSteeringCWModGUI::onWidgetRolled(const QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p) @@ -247,7 +247,15 @@ void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p) setTitle(m_channelMarker.getTitle()); setTitleColor(m_settings.m_rgbColor); - applySettings(); + applySettings(QStringList({ + "rgbColor", + "title", + "useReverseAPI", + "reverseAPIAddress", + "reverseAPIPort", + "reverseAPIDeviceIndex", + "reverseAPIChannelIndex" + })); } resetContextMenuType(); @@ -256,7 +264,7 @@ void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p) void BeamSteeringCWModGUI::on_channelOutput_currentIndexChanged(int index) { m_settings.m_channelOutput = index; - applySettings(); + applySettings(QStringList("channelOutput")); } void BeamSteeringCWModGUI::on_interpolationFactor_currentIndexChanged(int index) @@ -275,7 +283,7 @@ void BeamSteeringCWModGUI::on_steeringDegrees_valueChanged(int value) { m_settings.m_steerDegrees = value; ui->steeringDegreesText->setText(tr("%1").arg(m_settings.m_steerDegrees)); - applySettings(); + applySettings(QStringList("steerDegrees")); } void BeamSteeringCWModGUI::applyInterpolation() @@ -301,7 +309,7 @@ void BeamSteeringCWModGUI::applyPosition() displayRateAndShift(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"filterChainHash", "log2Interp"})); } void BeamSteeringCWModGUI::tick() diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.h b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.h index 643e66e2f..a08a7dcbe 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.h +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodgui.h @@ -84,7 +84,7 @@ private: ~BeamSteeringCWModGUI() final; void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void displaySettings(); void displayRateAndShift(); bool handleMessage(const Message& message); diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp index 710adf401..408adda69 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp @@ -134,7 +134,95 @@ bool BeamSteeringCWModSettings::deserialize(const QByteArray& data) } } +void BeamSteeringCWModSettings::applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings) +{ + if (settingsKeys.contains("steerDegrees")) { + m_steerDegrees = settings.m_steerDegrees; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("log2Interp")) { + m_log2Interp = settings.m_log2Interp; + } + if (settingsKeys.contains("filterChainHash")) { + m_filterChainHash = settings.m_filterChainHash; + } + if (settingsKeys.contains("channelOutput")) { + m_channelOutput = settings.m_channelOutput; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} +QString BeamSteeringCWModSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + if (settingsKeys.contains("steerDegrees") || force) { + ostr << " m_steerDegrees: " << m_steerDegrees; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("log2Interp") || force) { + ostr << " m_log2Interp: " << m_log2Interp; + } + if (settingsKeys.contains("filterChainHash") || force) { + ostr << " m_filterChainHash: " << m_filterChainHash; + } + if (settingsKeys.contains("channelOutput") || force) { + ostr << " m_channelOutput: " << m_channelOutput; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } - + return QString(ostr.str().c_str()); +} diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h index b5c2e6bfd..9d13b6037 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h @@ -52,6 +52,8 @@ struct BeamSteeringCWModSettings void setRollupState(Serializable *RollupState) { m_rollupState = RollupState; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const BeamSteeringCWModSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif /* INCLUDE_BEAMSTEERINGCWMODSETTINGS_H_ */ diff --git a/plugins/channelmimo/doa2/doa2.cpp b/plugins/channelmimo/doa2/doa2.cpp index d31ce0599..debc61704 100644 --- a/plugins/channelmimo/doa2/doa2.cpp +++ b/plugins/channelmimo/doa2/doa2.cpp @@ -156,82 +156,41 @@ void DOA2::pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned (void) sourceIndex; } -void DOA2::applySettings(const DOA2Settings& settings, bool force) +void DOA2::applySettings(const QStringList& settingsKeys, const DOA2Settings& settings, bool force) { - qDebug() << "DOA2::applySettings: " - << "m_correlationType: " << settings.m_correlationType - << "m_filterChainHash: " << settings.m_filterChainHash - << "m_log2Decim: " << settings.m_log2Decim - << "m_phase: " << settings.m_phase - << "m_antennaAz:" << settings.m_antennaAz - << "m_basebandDistance: " << settings.m_basebandDistance - << "m_squelchdB: " << settings.m_squelchdB - << "m_fftAveragingIndex: "<< settings.m_fftAveragingIndex - << "m_useReverseAPI: " << settings.m_useReverseAPI - << "m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << "m_reverseAPIPort: " << settings.m_reverseAPIPort - << "m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << "m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << "m_title: " << settings.m_title; + qDebug() << "DOA2::applySettings: " << settings.getDebugString(settingsKeys, force); - QList reverseAPIKeys; - if ((m_settings.m_correlationType != settings.m_correlationType) || force) { - reverseAPIKeys.append("correlationType"); - } - if ((m_settings.m_filterChainHash != settings.m_filterChainHash) || force) { - reverseAPIKeys.append("filterChainHash"); - } - if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) { - reverseAPIKeys.append("log2Decim"); - } - if ((m_settings.m_phase != settings.m_phase) || force) { - reverseAPIKeys.append("phase"); - } - if ((m_settings.m_title != settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((m_settings.m_antennaAz != settings.m_antennaAz) || force) { - reverseAPIKeys.append("antennaAz"); - } - if ((m_settings.m_basebandDistance != settings.m_basebandDistance) || force) { - reverseAPIKeys.append("basebandDistance"); - } - - if ((m_settings.m_squelchdB != settings.m_squelchdB) || force) + if ((settingsKeys.contains("squelchdB") && m_settings.m_squelchdB != settings.m_squelchdB) || force) { - reverseAPIKeys.append("squelchdB"); - if (m_running) { m_basebandSink->setMagThreshold((float) CalcDb::powerFromdB(settings.m_squelchdB)); } } - if ((m_settings.m_fftAveragingIndex != settings.m_fftAveragingIndex) || force) + if ((settingsKeys.contains("fftAveragingIndex") && m_settings.m_fftAveragingIndex != settings.m_fftAveragingIndex) || force) { - reverseAPIKeys.append("m_fftAveragingIndex"); - if (m_running) { m_basebandSink->setFFTAveraging(DOA2Settings::getAveragingValue(settings.m_fftAveragingIndex)); } } - if (m_running && ((m_settings.m_log2Decim != settings.m_log2Decim) - || (m_settings.m_filterChainHash != settings.m_filterChainHash) || force)) + if (m_running && ((settingsKeys.contains("log2Decim") && m_settings.m_log2Decim != settings.m_log2Decim) + || (settingsKeys.contains("filterChainHash") && m_settings.m_filterChainHash != settings.m_filterChainHash) || force)) { DOA2Baseband::MsgConfigureChannelizer *msg = DOA2Baseband::MsgConfigureChannelizer::create( settings.m_log2Decim, settings.m_filterChainHash); m_basebandSink->getInputMessageQueue()->push(msg); } - if (m_running && ((m_settings.m_correlationType != settings.m_correlationType) || force)) + if (m_running && ((settingsKeys.contains("correlationType") && m_settings.m_correlationType != settings.m_correlationType) || force)) { DOA2Baseband::MsgConfigureCorrelation *msg = DOA2Baseband::MsgConfigureCorrelation::create( settings.m_correlationType); m_basebandSink->getInputMessageQueue()->push(msg); } - if (m_running && ((m_settings.m_phase != settings.m_phase) || force)) { + if (m_running && ((settingsKeys.contains("phase") && m_settings.m_phase != settings.m_phase) || force)) { m_basebandSink->setPhase(settings.m_phase); } @@ -239,7 +198,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force) MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes); if (!pipes.empty()) { - sendChannelSettings(pipes, reverseAPIKeys, settings, force); + sendChannelSettings(pipes, settingsKeys, settings, force); } m_settings = settings; @@ -264,7 +223,7 @@ bool DOA2::handleMessage(const Message& cmd) { auto& cfg = (const MsgConfigureDOA2&) cmd; qDebug() << "DOA2::handleMessage: MsgConfigureDOA2"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettingsKeys(), cfg.getSettings(), cfg.getForce()); return true; } else if (DSPMIMOSignalNotification::match(cmd)) @@ -320,14 +279,14 @@ bool DOA2::deserialize(const QByteArray& data) (void) data; if (m_settings.deserialize(data)) { - MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(m_settings, true); + MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(m_settings, true); + MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(QStringList(), m_settings, true); m_inputMessageQueue.push(msg); return false; } @@ -400,12 +359,12 @@ int DOA2::webapiSettingsPutPatch( DOA2Settings settings = m_settings; webapiUpdateChannelSettings(settings, channelSettingsKeys, response); - MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(settings, force); + MsgConfigureDOA2 *msg = MsgConfigureDOA2::create(channelSettingsKeys, settings, force); m_inputMessageQueue.push(msg); if (getMessageQueueToGUI()) // forward to GUI if any { - MsgConfigureDOA2 *msgToGUI = MsgConfigureDOA2::create(settings, force); + MsgConfigureDOA2 *msgToGUI = MsgConfigureDOA2::create(channelSettingsKeys, settings, force); getMessageQueueToGUI()->push(msgToGUI); } diff --git a/plugins/channelmimo/doa2/doa2.h b/plugins/channelmimo/doa2/doa2.h index 418df527a..4685cf328 100644 --- a/plugins/channelmimo/doa2/doa2.h +++ b/plugins/channelmimo/doa2/doa2.h @@ -45,20 +45,23 @@ public: public: const DOA2Settings& getSettings() const { return m_settings; } + const QStringList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureDOA2* create(const DOA2Settings& settings, bool force) + static MsgConfigureDOA2* create(const QStringList& settingsKeys, const DOA2Settings& settings, bool force) { - return new MsgConfigureDOA2(settings, force); + return new MsgConfigureDOA2(settingsKeys, settings, force); } private: DOA2Settings m_settings; + QStringList m_settingsKeys; bool m_force; - MsgConfigureDOA2(const DOA2Settings& settings, bool force) : + MsgConfigureDOA2(const QStringList& settingsKeys, const DOA2Settings& settings, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -175,7 +178,7 @@ private: qint64 m_deviceCenterFrequency; bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed - void applySettings(const DOA2Settings& settings, bool force = false); + void applySettings(const QStringList& settingsKeys, const DOA2Settings& settings, bool force = false); static void validateFilterChainHash(DOA2Settings& settings); void calculateFrequencyOffset(); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const; diff --git a/plugins/channelmimo/doa2/doa2gui.cpp b/plugins/channelmimo/doa2/doa2gui.cpp index 972491b61..67405e23a 100644 --- a/plugins/channelmimo/doa2/doa2gui.cpp +++ b/plugins/channelmimo/doa2/doa2gui.cpp @@ -41,7 +41,7 @@ void DOA2GUI::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); + applySettings(QStringList(), true); } QByteArray DOA2GUI::serialize() const @@ -54,7 +54,7 @@ bool DOA2GUI::deserialize(const QByteArray& data) if (m_settings.deserialize(data)) { displaySettings(); - applySettings(true); + applySettings(QStringList(), true); return true; } else @@ -150,7 +150,7 @@ DOA2GUI::DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *ch displaySettings(); makeUIConnections(); displayRateAndShift(); - applySettings(true); + applySettings(QStringList(), true); connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); @@ -170,13 +170,13 @@ void DOA2GUI::blockApplySettings(bool block) m_doApplySettings = !block; } -void DOA2GUI::applySettings(bool force) +void DOA2GUI::applySettings(const QStringList& settingsKeys, bool force) { if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); - DOA2::MsgConfigureDOA2* message = DOA2::MsgConfigureDOA2::create(m_settings, force); + DOA2::MsgConfigureDOA2* message = DOA2::MsgConfigureDOA2::create(settingsKeys, m_settings, force); m_doa2->getInputMessageQueue()->push(message); } } @@ -284,7 +284,7 @@ void DOA2GUI::onWidgetRolled(const QWidget* widget, bool rollDown) (void) rollDown; getRollupContents()->saveState(m_rollupState); - applySettings(); + applySettings(QStringList()); } void DOA2GUI::onMenuDialogCalled(const QPoint &p) @@ -315,7 +315,8 @@ void DOA2GUI::onMenuDialogCalled(const QPoint &p) setTitle(m_channelMarker.getTitle()); setTitleColor(m_settings.m_rgbColor); - applySettings(); + applySettings(QStringList({"rgbColor", "title", "useReverseAPI", "reverseAPIAddress", + "reverseAPIPort", "reverseAPIDeviceIndex", "reverseAPIChannelIndex"})); } resetContextMenuType(); @@ -338,14 +339,14 @@ void DOA2GUI::on_phaseCorrection_valueChanged(int value) { m_settings.m_phase = value; ui->phaseCorrectionText->setText(tr("%1").arg(value)); - applySettings(); + applySettings(QStringList({"phase"})); } void DOA2GUI::on_correlationType_currentIndexChanged(int index) { m_settings.m_correlationType = (DOA2Settings::CorrelationType) index; updateScopeFScale(); - applySettings(); + applySettings(QStringList({"correlationType"})); } void DOA2GUI::on_antAz_valueChanged(int value) @@ -353,28 +354,28 @@ void DOA2GUI::on_antAz_valueChanged(int value) m_settings.m_antennaAz = value; ui->compass->setAzAnt(value); updateDOA(); - applySettings(); + applySettings(QStringList({"antennaAz"})); } void DOA2GUI::on_baselineDistance_valueChanged(int value) { m_settings.m_basebandDistance = value < 1 ? 1 : value; updateDOA(); - applySettings(); + applySettings(QStringList({"basebandDistance"})); } void DOA2GUI::on_squelch_valueChanged(int value) { m_settings.m_squelchdB = value; ui->squelchText->setText(tr("%1").arg(m_settings.m_squelchdB, 3)); - applySettings(); + applySettings(QStringList({"squelchdB"})); } void DOA2GUI::on_fftAveraging_currentIndexChanged(int index) { qDebug("DOA2GUI::on_averaging_currentIndexChanged: %d", index); m_settings.m_fftAveragingIndex = index; - applySettings(); + applySettings(QStringList({"fftAveragingIndex"})); setFFTAveragingTooltip(); } @@ -417,7 +418,7 @@ void DOA2GUI::applyPosition() displayRateAndShift(); updateAbsoluteCenterFrequency(); - applySettings(); + applySettings(QStringList({"filterChainHash", "log2Decim"})); } void DOA2GUI::tick() diff --git a/plugins/channelmimo/doa2/doa2gui.h b/plugins/channelmimo/doa2/doa2gui.h index f0d669f3c..04c47cbcc 100644 --- a/plugins/channelmimo/doa2/doa2gui.h +++ b/plugins/channelmimo/doa2/doa2gui.h @@ -84,7 +84,7 @@ private: ~DOA2GUI() final; void blockApplySettings(bool block); - void applySettings(bool force = false); + void applySettings(const QStringList& settingsKeys, bool force = false); void applyDecimation(); void applyPosition(); void displaySettings(); diff --git a/plugins/channelmimo/doa2/doa2settings.cpp b/plugins/channelmimo/doa2/doa2settings.cpp index f54d7d753..e168079c6 100644 --- a/plugins/channelmimo/doa2/doa2settings.cpp +++ b/plugins/channelmimo/doa2/doa2settings.cpp @@ -168,6 +168,123 @@ bool DOA2Settings::deserialize(const QByteArray& data) } } +void DOA2Settings::applySettings(const QStringList& settingsKeys, const DOA2Settings& settings) +{ + if (settingsKeys.contains("correlationType")) { + m_correlationType = settings.m_correlationType; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("log2Decim")) { + m_log2Decim = settings.m_log2Decim; + } + if (settingsKeys.contains("filterChainHash")) { + m_filterChainHash = settings.m_filterChainHash; + } + if (settingsKeys.contains("phase")) { + m_phase = settings.m_phase; + } + if (settingsKeys.contains("antennaAz")) { + m_antennaAz = settings.m_antennaAz; + } + if (settingsKeys.contains("basebandDistance")) { + m_basebandDistance = settings.m_basebandDistance; + } + if (settingsKeys.contains("squelchdB")) { + m_squelchdB = settings.m_squelchdB; + } + if (settingsKeys.contains("fftAveragingIndex")) { + m_fftAveragingIndex = settings.m_fftAveragingIndex; + } + if (settingsKeys.contains("useReverseAPI")) { + m_useReverseAPI = settings.m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress")) { + m_reverseAPIAddress = settings.m_reverseAPIAddress; + } + if (settingsKeys.contains("reverseAPIPort")) { + m_reverseAPIPort = settings.m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex")) { + m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex")) { + m_reverseAPIChannelIndex = settings.m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex")) { + m_workspaceIndex = settings.m_workspaceIndex; + } + if (settingsKeys.contains("geometryBytes")) { + m_geometryBytes = settings.m_geometryBytes; + } + if (settingsKeys.contains("hidden")) { + m_hidden = settings.m_hidden; + } +} + +QString DOA2Settings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("correlationType") || force) { + ostr << " m_correlationType: " << (int)m_correlationType; + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("log2Decim") || force) { + ostr << " m_log2Decim: " << m_log2Decim; + } + if (settingsKeys.contains("filterChainHash") || force) { + ostr << " m_filterChainHash: " << m_filterChainHash; + } + if (settingsKeys.contains("phase") || force) { + ostr << " m_phase: " << m_phase; + } + if (settingsKeys.contains("antennaAz") || force) { + ostr << " m_antennaAz: " << m_antennaAz; + } + if (settingsKeys.contains("basebandDistance") || force) { + ostr << " m_basebandDistance: " << m_basebandDistance; + } + if (settingsKeys.contains("squelchdB") || force) { + ostr << " m_squelchdB: " << m_squelchdB; + } + if (settingsKeys.contains("fftAveragingIndex") || force) { + ostr << " m_fftAveragingIndex: " << m_fftAveragingIndex; + } + if (settingsKeys.contains("useReverseAPI") || force) { + ostr << " m_useReverseAPI: " << m_useReverseAPI; + } + if (settingsKeys.contains("reverseAPIAddress") || force) { + ostr << " m_reverseAPIAddress: " << m_reverseAPIAddress.toStdString(); + } + if (settingsKeys.contains("reverseAPIPort") || force) { + ostr << " m_reverseAPIPort: " << m_reverseAPIPort; + } + if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { + ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; + } + if (settingsKeys.contains("reverseAPIChannelIndex") || force) { + ostr << " m_reverseAPIChannelIndex: " << m_reverseAPIChannelIndex; + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("hidden") || force) { + ostr << " m_hidden: " << m_hidden; + } + + return QString(ostr.str().c_str()); +} + int DOA2Settings::getAveragingValue(int averagingIndex) { if (averagingIndex <= 0) { diff --git a/plugins/channelmimo/doa2/doa2settings.h b/plugins/channelmimo/doa2/doa2settings.h index 2a60a58b7..dfee68758 100644 --- a/plugins/channelmimo/doa2/doa2settings.h +++ b/plugins/channelmimo/doa2/doa2settings.h @@ -65,6 +65,8 @@ struct DOA2Settings void setScopeGUI(Serializable *scopeGUI) { m_scopeGUI = scopeGUI; } QByteArray serialize() const; bool deserialize(const QByteArray& data); + void applySettings(const QStringList& settingsKeys, const DOA2Settings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; static int getAveragingValue(int averagingIndex); static int getAveragingIndex(int averagingValue); static const int m_averagingMaxExponent = 5; //!< Max 1M (10 * 10^5) diff --git a/plugins/channelmimo/interferometer/interferometer.cpp b/plugins/channelmimo/interferometer/interferometer.cpp index 2ac5f819a..93299598e 100644 --- a/plugins/channelmimo/interferometer/interferometer.cpp +++ b/plugins/channelmimo/interferometer/interferometer.cpp @@ -183,7 +183,7 @@ void Interferometer::pull(SampleVector::iterator& begin, unsigned int nbSamples, void Interferometer::applySettings(const InterferometerSettings& settings, const QList& settingsKeys, bool force) { - qDebug() << "Interferometer::applySettings:" << settings.getDebugString(settingsKeys, force) << "force: " << force; + qDebug() << "Interferometer::applySettings:" << settings.getDebugString(settingsKeys, force); if (m_running && (settingsKeys.contains("log2Decim") || settingsKeys.contains("filterChainHash") || force)) From ed81308b9f81d6b536eb8821596acd6e274a4ee2 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 1 Feb 2026 17:15:47 +0100 Subject: [PATCH 5/5] Fixed stringlist utils --- sdrbase/util/stringlist.cpp | 4 ++-- sdrbase/util/stringlist.h | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sdrbase/util/stringlist.cpp b/sdrbase/util/stringlist.cpp index 97f865244..41e79f30b 100644 --- a/sdrbase/util/stringlist.cpp +++ b/sdrbase/util/stringlist.cpp @@ -1,6 +1,6 @@ #include "stringlist.h" -static bool StringListUtil::containsAll(const QStringList &haystack, const QStringList &needles) +bool StringListUtil::containsAll(const QStringList &haystack, const QStringList &needles) { for (const auto &s : needles) { if (!haystack.contains(s)) // optionally add Qt::CaseSensitivity @@ -9,7 +9,7 @@ static bool StringListUtil::containsAll(const QStringList &haystack, const QStri return true; } -static bool StringListUtil::containsAny(const QStringList &haystack, const QStringList &needles) +bool StringListUtil::containsAny(const QStringList &haystack, const QStringList &needles) { for (const auto &s : needles) { if (haystack.contains(s)) // optionally add Qt::CaseSensitivity diff --git a/sdrbase/util/stringlist.h b/sdrbase/util/stringlist.h index 99fcc46cb..d909b3b5e 100644 --- a/sdrbase/util/stringlist.h +++ b/sdrbase/util/stringlist.h @@ -3,11 +3,13 @@ #include -namespace StringListUtil { +#include "export.h" +class SDRBASE_API StringListUtil { -static bool containsAll(const QStringList &haystack, const QStringList &needles); -static bool containsAny(const QStringList &haystack, const QStringList &needles); +public: + static bool containsAll(const QStringList &haystack, const QStringList &needles); + static bool containsAny(const QStringList &haystack, const QStringList &needles); -} // namespace StringListUtil +}; #endif // SDRBASE_UTIL_STRINGLIST_H_