From e33d6e9b647b7ea9e537847cfdea13471ed7cc68 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 16 Apr 2025 11:23:38 +0100 Subject: [PATCH 1/2] Satellite Tracker: Fix crash when doppler enabled. --- .../satellitetrackerworker.cpp | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/plugins/feature/satellitetracker/satellitetrackerworker.cpp b/plugins/feature/satellitetracker/satellitetrackerworker.cpp index 9b6db8e24..b9ad7d1d4 100644 --- a/plugins/feature/satellitetracker/satellitetrackerworker.cpp +++ b/plugins/feature/satellitetracker/satellitetrackerworker.cpp @@ -854,23 +854,26 @@ void SatelliteTrackerWorker::disableDoppler(SatWorkerState *satWorkerState) { for (int i = 0; i < m_deviceSettingsList->size(); i++) { - SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = m_deviceSettingsList->at(i); - if (devSettings->m_doppler.size() > 0) + if (i < satWorkerState->m_doppler.size()) { - for (int j = 0; j < devSettings->m_doppler.size(); j++) + SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = m_deviceSettingsList->at(i); + if (devSettings->m_doppler.size() > 0) { - int offset; - if (ChannelWebAPIUtils::getFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) + for (int j = 0; j < devSettings->m_doppler.size(); j++) { - // Remove old doppler - offset += satWorkerState->m_doppler[i]; - if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) - qDebug() << "SatelliteTrackerWorker::doppler: Failed to set frequency offset"; + int offset; + if (ChannelWebAPIUtils::getFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) + { + // Remove old doppler + offset += satWorkerState->m_doppler[i]; + if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) + qDebug() << "SatelliteTrackerWorker::disableDoppler: Failed to set frequency offset"; + } + else + qDebug() << "SatelliteTrackerWorker::disableDoppler: Failed to get frequency offset"; } - else - qDebug() << "SatelliteTrackerWorker::doppler: Failed to get frequency offset"; + satWorkerState->m_doppler[i] = 0; } - satWorkerState->m_doppler[i] = 0; } } } From bafcb7531327ab7d62dacb586bc01f29e8e07170 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 16 Apr 2025 14:43:47 +0100 Subject: [PATCH 2/2] Fix doppler correction. --- .../satellitetrackerworker.cpp | 46 +++++++++++++------ .../satellitetracker/satellitetrackerworker.h | 1 + 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/plugins/feature/satellitetracker/satellitetrackerworker.cpp b/plugins/feature/satellitetracker/satellitetrackerworker.cpp index b9ad7d1d4..122f2e913 100644 --- a/plugins/feature/satellitetracker/satellitetrackerworker.cpp +++ b/plugins/feature/satellitetracker/satellitetrackerworker.cpp @@ -826,9 +826,7 @@ void SatelliteTrackerWorker::enableDoppler(SatWorkerState *satWorkerState) if (devSettings->m_doppler.size() > 0) { requiresDoppler = true; - for (int j = 0; j < devSettings->m_doppler.size(); j++) { - satWorkerState->m_doppler.append(0); - } + satWorkerState->m_doppler.append(0); } } if (requiresDoppler) @@ -836,7 +834,8 @@ void SatelliteTrackerWorker::enableDoppler(SatWorkerState *satWorkerState) qDebug() << "SatelliteTrackerWorker::applyDeviceAOSSettings: Enabling doppler for " << satWorkerState->m_name; satWorkerState->m_dopplerTimer.setInterval(m_settings.m_dopplerPeriod * 1000); satWorkerState->m_dopplerTimer.start(); - connect(&satWorkerState->m_dopplerTimer, &QTimer::timeout, [this, satWorkerState]() { + disconnect(satWorkerState->m_connection); + satWorkerState->m_connection = connect(&satWorkerState->m_dopplerTimer, &QTimer::timeout, [this, satWorkerState]() { doppler(satWorkerState); }); } @@ -848,13 +847,16 @@ void SatelliteTrackerWorker::disableDoppler(SatWorkerState *satWorkerState) // Stop Doppler timer, and set interval to 0, so we don't restart it in start() satWorkerState->m_dopplerTimer.stop(); satWorkerState->m_dopplerTimer.setInterval(0); + disconnect(satWorkerState->m_connection); // Remove doppler correction from any channel - QList *m_deviceSettingsList = m_settings.m_deviceSettings.value(satWorkerState->m_name); - if (m_deviceSettingsList) + if (satWorkerState->m_doppler.size() > 0) { - for (int i = 0; i < m_deviceSettingsList->size(); i++) + QList *m_deviceSettingsList = m_settings.m_deviceSettings.value(satWorkerState->m_name); + if (m_deviceSettingsList) { - if (i < satWorkerState->m_doppler.size()) + int idx = 0; + + for (int i = 0; i < m_deviceSettingsList->size(); i++) { SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = m_deviceSettingsList->at(i); if (devSettings->m_doppler.size() > 0) @@ -865,14 +867,25 @@ void SatelliteTrackerWorker::disableDoppler(SatWorkerState *satWorkerState) if (ChannelWebAPIUtils::getFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) { // Remove old doppler - offset += satWorkerState->m_doppler[i]; - if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) + std::vector& deviceSets = MainCore::instance()->getDeviceSets(); + ChannelAPI *channel = deviceSets[devSettings->m_deviceSetIndex]->getChannelAt(j); + int tx = false; + if (channel) { + tx = channel->getStreamType() == ChannelAPI::StreamSingleSource; // What if MIMO? + } + if (tx) { + offset -= satWorkerState->m_doppler[idx]; + } else { + offset += satWorkerState->m_doppler[idx]; + } + if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) qDebug() << "SatelliteTrackerWorker::disableDoppler: Failed to set frequency offset"; } else qDebug() << "SatelliteTrackerWorker::disableDoppler: Failed to get frequency offset"; } - satWorkerState->m_doppler[i] = 0; + satWorkerState->m_doppler[idx] = 0; + idx++; } } } @@ -886,6 +899,8 @@ void SatelliteTrackerWorker::doppler(SatWorkerState *satWorkerState) QList *m_deviceSettingsList = m_settings.m_deviceSettings.value(satWorkerState->m_name); if (m_deviceSettingsList) { + int idx = 0; + for (int i = 0; i < m_deviceSettingsList->size(); i++) { SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = m_deviceSettingsList->at(i); @@ -918,15 +933,14 @@ void SatelliteTrackerWorker::doppler(SatWorkerState *satWorkerState) int initOffset; if (tx) { - initOffset = offset - satWorkerState->m_doppler[i]; + initOffset = offset - satWorkerState->m_doppler[idx]; offset = initOffset + doppler; } else { - initOffset = offset + satWorkerState->m_doppler[i]; + initOffset = offset + satWorkerState->m_doppler[idx]; offset = initOffset - doppler; } - if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) qDebug() << "SatelliteTrackerWorker::doppler: Failed to set frequency offset"; } @@ -934,10 +948,12 @@ void SatelliteTrackerWorker::doppler(SatWorkerState *satWorkerState) qDebug() << "SatelliteTrackerWorker::doppler: Failed to get frequency offset"; } - satWorkerState->m_doppler[i] = doppler; + satWorkerState->m_doppler[idx] = doppler; } else qDebug() << "SatelliteTrackerWorker::doppler: couldn't get centre frequency for device at " << devSettings->m_deviceSetIndex; + + idx++; } } } diff --git a/plugins/feature/satellitetracker/satellitetrackerworker.h b/plugins/feature/satellitetracker/satellitetrackerworker.h index 3e764d29b..e2df7c327 100644 --- a/plugins/feature/satellitetracker/satellitetrackerworker.h +++ b/plugins/feature/satellitetracker/satellitetrackerworker.h @@ -65,6 +65,7 @@ protected: QList m_doppler; // How much doppler we've applied to a channel SatelliteState m_satState; bool m_hasSignalledAOS; // For pass specified by m_aos and m_los + QMetaObject::Connection m_connection; friend SatelliteTrackerWorker; };