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 {