From be4f7f3178e0dd5aa8d03f9b54c7df864decaf6b Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 25 Oct 2020 11:34:47 +0100 Subject: [PATCH] AFC: added tracker adjustment period and fixes --- plugins/feature/afc/afc.cpp | 11 + plugins/feature/afc/afcgui.cpp | 9 + plugins/feature/afc/afcgui.h | 1 + plugins/feature/afc/afcgui.ui | 399 ++++++++++++++++------------ plugins/feature/afc/afcsettings.cpp | 3 + plugins/feature/afc/afcsettings.h | 1 + plugins/feature/afc/afcworker.cpp | 87 +++--- plugins/feature/afc/afcworker.h | 2 +- 8 files changed, 301 insertions(+), 212 deletions(-) diff --git a/plugins/feature/afc/afc.cpp b/plugins/feature/afc/afc.cpp index a74572c4c..2b9c1cf33 100644 --- a/plugins/feature/afc/afc.cpp +++ b/plugins/feature/afc/afc.cpp @@ -184,6 +184,7 @@ void AFC::applySettings(const AFCSettings& settings, bool force) << " m_transverterTarget: " << settings.m_transverterTarget << " m_targetFrequency: " << settings.m_targetFrequency << " m_freqTolerance: " << settings.m_freqTolerance + << " m_trackerAdjustPeriod:" << settings.m_trackerAdjustPeriod << " force: " << force; QList reverseAPIKeys; @@ -212,6 +213,9 @@ void AFC::applySettings(const AFCSettings& settings, bool force) if ((m_settings.m_freqTolerance != settings.m_freqTolerance) || force) { reverseAPIKeys.append("freqTolerance"); } + if ((m_settings.m_trackerAdjustPeriod != settings.m_trackerAdjustPeriod) || force) { + reverseAPIKeys.append("trackerAdjustPeriod"); + } if ((m_settings.m_trackerDeviceSetIndex != settings.m_trackerDeviceSetIndex) || force) { trackerDeviceChange(settings.m_trackerDeviceSetIndex); @@ -331,6 +335,7 @@ void AFC::webapiFormatFeatureSettings( response.getAfcSettings()->setTransverterTarget(settings.m_transverterTarget); response.getAfcSettings()->setTargetFrequency(settings.m_targetFrequency); response.getAfcSettings()->setFreqTolerance(settings.m_freqTolerance); + response.getAfcSettings()->setTrackerAdjustPeriod(settings.m_trackerAdjustPeriod); response.getAfcSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); @@ -374,6 +379,9 @@ void AFC::webapiUpdateFeatureSettings( if (featureSettingsKeys.contains("freqTolerance")) { settings.m_freqTolerance = response.getAfcSettings()->getFreqTolerance(); } + if (featureSettingsKeys.contains("trackerAdjustPeriod")) { + settings.m_trackerAdjustPeriod = response.getAfcSettings()->getTrackerAdjustPeriod(); + } if (featureSettingsKeys.contains("useReverseAPI")) { settings.m_useReverseAPI = response.getAfcSettings()->getUseReverseApi() != 0; } @@ -430,6 +438,9 @@ void AFC::webapiReverseSendSettings(QList& channelSettingsKeys, const A if (channelSettingsKeys.contains("freqTolerance") || force) { swgAFCSettings->setFreqTolerance(settings.m_freqTolerance); } + if (channelSettingsKeys.contains("trackerAdjustPeriod") || force) { + swgAFCSettings->setTrackerAdjustPeriod(settings.m_trackerAdjustPeriod); + } QString channelSettingsURL = QString("http://%1:%2/sdrangel/featureset/%3/feature/%4/settings") .arg(settings.m_reverseAPIAddress) diff --git a/plugins/feature/afc/afcgui.cpp b/plugins/feature/afc/afcgui.cpp index 97523323c..880989822 100644 --- a/plugins/feature/afc/afcgui.cpp +++ b/plugins/feature/afc/afcgui.cpp @@ -174,6 +174,8 @@ void AFCGUI::displaySettings() ui->transverterTarget->setChecked(m_settings.m_transverterTarget); ui->targetFrequency->setValue(m_settings.m_targetFrequency); ui->toleranceFrequency->setValue(m_settings.m_freqTolerance); + ui->targetPeriod->setValue(m_settings.m_trackerAdjustPeriod); + ui->targetPeriodText->setText(tr("%1").arg(m_settings.m_trackerAdjustPeriod)); blockApplySettings(false); } @@ -363,6 +365,13 @@ void AFCGUI::on_devicesApply_clicked() } +void AFCGUI::on_targetPeriod_valueChanged(int value) +{ + m_settings.m_trackerAdjustPeriod = value; + ui->targetPeriodText->setText(tr("%1").arg(m_settings.m_trackerAdjustPeriod)); + applySettings(); +} + void AFCGUI::updateStatus() { int state = m_afc->getState(); diff --git a/plugins/feature/afc/afcgui.h b/plugins/feature/afc/afcgui.h index 83e469f8d..d4bfa2b14 100644 --- a/plugins/feature/afc/afcgui.h +++ b/plugins/feature/afc/afcgui.h @@ -83,6 +83,7 @@ private slots: void on_trackerDevice_currentIndexChanged(int index); void on_trackedDevice_currentIndexChanged(int index); void on_devicesApply_clicked(); + void on_targetPeriod_valueChanged(int value); void updateStatus(); }; diff --git a/plugins/feature/afc/afcgui.ui b/plugins/feature/afc/afcgui.ui index 6bd30d584..bb6c85553 100644 --- a/plugins/feature/afc/afcgui.ui +++ b/plugins/feature/afc/afcgui.ui @@ -7,7 +7,7 @@ 0 0 340 - 181 + 160 @@ -34,9 +34,9 @@ - 10 - 10 - 311 + 0 + 0 + 340 151 @@ -76,178 +76,6 @@ - - - - Adjust device frequency to match tracker frequency - - - T - - - - - - - - 0 - 0 - - - - - 32 - 16 - - - - - Liberation Mono - 12 - - - - PointingHandCursor - - - Qt::StrongFocus - - - Tracker frequency in Hz - - - - - - - Hz - - - - - - - Use transverter frequency for tracker frequency adjustment - - - X - - - - - - - - - - - - - - Tol - - - - - - - - 0 - 0 - - - - - 32 - 16 - - - - - Liberation Mono - 12 - - - - PointingHandCursor - - - Qt::StrongFocus - - - Frequency tolerance before device frequency is changed (Hz) - - - - - - - Hz - - - - - - - - 24 - 24 - - - - Force device tracking update - - - - - - - :/arrow_left.png:/arrow_left.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 16 - 16 - - - - Idle - - - QLabel { background-color: gray; border-radius: 8px; } - - - - - - - - - - @@ -355,6 +183,225 @@ + + + + + + Tracker target frequency auto adjust + + + T + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + Tracker target tracker frequency in Hz + + + + + + + Hz + + + + + + + Use transverter frequency for tracker target frequency adjustment + + + X + + + + + + + + + + + + + + &plusmn; + + + Qt::RichText + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + Tracker target frequency error tolerance (Hz) + + + + + + + Hz + + + + + + + + 24 + 24 + + + + Tracker target frequency adjustment period (seconds) + + + 1 + + + 120 + + + 1 + + + 20 + + + + + + + + 24 + 0 + + + + Tracker target frequency adjustment period (seconds) + + + 000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 24 + 24 + + + + Force tracker target frequency adjustment + + + + + + + :/arrow_left.png:/arrow_left.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + Idle + + + QLabel { background-color: gray; border-radius: 8px; } + + + + + + + + diff --git a/plugins/feature/afc/afcsettings.cpp b/plugins/feature/afc/afcsettings.cpp index 4ca1bf8c4..0b4b1fa7c 100644 --- a/plugins/feature/afc/afcsettings.cpp +++ b/plugins/feature/afc/afcsettings.cpp @@ -37,6 +37,7 @@ void AFCSettings::resetToDefaults() m_transverterTarget = false; m_targetFrequency = 0; m_freqTolerance = 1000; + m_trackerAdjustPeriod = 20; m_useReverseAPI = false; m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; @@ -51,6 +52,7 @@ QByteArray AFCSettings::serialize() const s.writeString(1, m_title); s.writeU32(2, m_rgbColor); s.writeS32(3, m_trackerDeviceSetIndex); + s.writeU32(4, m_trackerAdjustPeriod); s.writeS32(5, m_trackedDeviceSetIndex); s.writeBool(6, m_hasTargetFrequency); s.writeBool(7, m_transverterTarget); @@ -85,6 +87,7 @@ bool AFCSettings::deserialize(const QByteArray& data) d.readString(1, &m_title, "AFC"); d.readU32(2, &m_rgbColor, QColor(255, 255, 0).rgb()); d.readS32(3, &m_trackerDeviceSetIndex, -1); + d.readU32(4, &m_trackerAdjustPeriod, 20); d.readS32(5, &m_trackedDeviceSetIndex, -1); d.readBool(6, &m_hasTargetFrequency, false); d.readBool(7, &m_transverterTarget, false); diff --git a/plugins/feature/afc/afcsettings.h b/plugins/feature/afc/afcsettings.h index e633e612f..a60022a64 100644 --- a/plugins/feature/afc/afcsettings.h +++ b/plugins/feature/afc/afcsettings.h @@ -33,6 +33,7 @@ struct AFCSettings bool m_transverterTarget; quint64 m_targetFrequency; quint64 m_freqTolerance; + unsigned int m_trackerAdjustPeriod; //!< tracker channel frequency adjustment period in seconds bool m_useReverseAPI; QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; diff --git a/plugins/feature/afc/afcworker.cpp b/plugins/feature/afc/afcworker.cpp index 0cbf59436..7ac54626f 100644 --- a/plugins/feature/afc/afcworker.cpp +++ b/plugins/feature/afc/afcworker.cpp @@ -49,6 +49,11 @@ AFCWorker::AFCWorker(WebAPIAdapterInterface *webAPIAdapterInterface) : m_mutex(QMutex::Recursive) { qDebug("AFCWorker::AFCWorker"); + connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateTarget())); + + if (m_settings.m_hasTargetFrequency) { + m_updateTimer.start(m_settings.m_trackerAdjustPeriod * 1000); + } } AFCWorker::~AFCWorker() @@ -115,7 +120,7 @@ bool AFCWorker::handleMessage(const Message& cmd) else if (MsgDeviceTrack::match(cmd)) { QMutexLocker mutexLocker(&m_mutex); - updateTarget(m_trackerChannelOffset); + updateTarget(); return true; } else if (MsgDevicesApply::match(cmd)) @@ -152,6 +157,19 @@ void AFCWorker::applySettings(const AFCSettings& settings, bool force) initTrackedDeviceSet(settings.m_trackedDeviceSetIndex); } + if ((settings.m_trackerAdjustPeriod != m_settings.m_trackerAdjustPeriod) || force) { + m_updateTimer.setInterval(settings.m_trackerAdjustPeriod * 1000); + } + + if ((settings.m_hasTargetFrequency != m_settings.m_hasTargetFrequency) || force) + { + if (settings.m_hasTargetFrequency) { + m_updateTimer.start(m_settings.m_trackerAdjustPeriod * 1000); + } else { + m_updateTimer.stop(); + } + } + m_settings = settings; } @@ -264,45 +282,44 @@ void AFCWorker::processChannelSettings( SWGSDRangel::SWGChannelSettings *swgChannelSettings) { MainCore *mainCore = MainCore::instance(); + QJsonObject *jsonObj = swgChannelSettings->asJsonObject(); + QJsonValue channelOffsetValue; - if (*swgChannelSettings->getChannelType() == "FreqTracker") + if (WebAPIUtils::extractValue(*jsonObj, "inputFrequencyOffset", channelOffsetValue)) { - int trackerChannelOffset = swgChannelSettings->getFreqTrackerSettings()->getInputFrequencyOffset(); + int channelOffset = channelOffsetValue.toInt(); - if (trackerChannelOffset != m_trackerChannelOffset) + if (*swgChannelSettings->getChannelType() == "FreqTracker") { - QMap::iterator it = m_channelsMap.begin(); - - for (; it != m_channelsMap.end(); ++it) + if (channelOffset != m_trackerChannelOffset) { - if (mainCore->existsChannel(it.key())) - { - int channelOffset = it.value().m_channelOffset + trackerChannelOffset - it.value().m_trackerOffset; - updateChannelOffset(it.key(), it.value().m_channelDirection, channelOffset); - } - else - { - m_channelsMap.erase(it); - } - } + qDebug("AFCWorker::processChannelSettings: FreqTracker offset change: %d", channelOffset); + QMap::iterator it = m_channelsMap.begin(); - if (m_settings.m_hasTargetFrequency) { - updateTarget(trackerChannelOffset); - } + for (; it != m_channelsMap.end(); ++it) + { + if (mainCore->existsChannel(it.key())) + { + int channelOffset = it.value().m_channelOffset + channelOffset - it.value().m_trackerOffset; + updateChannelOffset(it.key(), it.value().m_channelDirection, channelOffset); + } + else + { + m_channelsMap.erase(it); + } + } - m_trackerChannelOffset = trackerChannelOffset; + m_trackerChannelOffset = channelOffset; + } } - } - else if (m_channelsMap.contains(const_cast(channelAPI))) - { - QJsonObject *jsonObj = swgChannelSettings->asJsonObject(); - QJsonValue channelOffsetValue; - - if (WebAPIUtils::extractValue(*jsonObj, "inputFrequencyOffset", channelOffsetValue)) + else if (m_channelsMap.contains(const_cast(channelAPI))) { - int channelOffset = channelOffsetValue.toInt(); - m_channelsMap[const_cast(channelAPI)].m_channelOffset = channelOffset; - m_channelsMap[const_cast(channelAPI)].m_trackerOffset = m_trackerChannelOffset; + if (WebAPIUtils::extractValue(*jsonObj, "inputFrequencyOffset", channelOffsetValue)) + { + int channelOffset = channelOffsetValue.toInt(); + m_channelsMap[const_cast(channelAPI)].m_channelOffset = channelOffset; + m_channelsMap[const_cast(channelAPI)].m_trackerOffset = m_trackerChannelOffset; + } } } } @@ -346,7 +363,7 @@ bool AFCWorker::updateChannelOffset(ChannelAPI *channelAPI, int direction, int o return true; } -void AFCWorker::updateTarget(int& trackerChannelOffset) +void AFCWorker::updateTarget() { SWGSDRangel::SWGDeviceSettings resDevice; SWGSDRangel::SWGChannelSettings resChannel; @@ -376,7 +393,7 @@ void AFCWorker::updateTarget(int& trackerChannelOffset) return; } - int64_t trackerFrequency = m_trackerDeviceFrequency + trackerChannelOffset; + int64_t trackerFrequency = m_trackerDeviceFrequency + m_trackerChannelOffset; int64_t correction = m_settings.m_targetFrequency - trackerFrequency; int64_t tolerance = m_settings.m_freqTolerance; qDebug() << "AFCWorker::updateTarget: correction:" << correction << "tolerance:" << tolerance; @@ -403,8 +420,8 @@ void AFCWorker::updateTarget(int& trackerChannelOffset) } // adjust tracker offset - if (updateChannelOffset(m_freqTracker, 0, trackerChannelOffset + correction, 1)) { - trackerChannelOffset += correction; + if (updateChannelOffset(m_freqTracker, 0, m_trackerChannelOffset + correction, 1)) { + m_trackerChannelOffset += correction; } } else // act on device diff --git a/plugins/feature/afc/afcworker.h b/plugins/feature/afc/afcworker.h index 5c31acf0e..d1fc10140 100644 --- a/plugins/feature/afc/afcworker.h +++ b/plugins/feature/afc/afcworker.h @@ -163,12 +163,12 @@ private: SWGSDRangel::SWGChannelSettings *swgChannelSettings ); bool updateChannelOffset(ChannelAPI *channelAPI, int direction, int offset, unsigned int blockCount = 0); - void updateTarget(int& trackerChannelOffset); bool updateDeviceFrequency(DeviceSet *deviceSet, const QString& key, int64_t frequency); int getDeviceDirection(DeviceAPI *deviceAPI); void getDeviceSettingsKey(DeviceAPI *deviceAPI, QString& settingsKey); private slots: + void updateTarget(); void handleInputMessages(); };