1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-06-13 20:12:29 -04:00

Merge pull request #2433 from srcejon/fix_sat_tracker_doppler_crash

Fix sat tracker doppler crash
This commit is contained in:
Edouard Griffiths 2025-04-17 17:38:28 +02:00 committed by GitHub
commit 1c6b167527
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 43 additions and 23 deletions

View File

@ -826,9 +826,7 @@ void SatelliteTrackerWorker::enableDoppler(SatWorkerState *satWorkerState)
if (devSettings->m_doppler.size() > 0) if (devSettings->m_doppler.size() > 0)
{ {
requiresDoppler = true; requiresDoppler = true;
for (int j = 0; j < devSettings->m_doppler.size(); j++) { satWorkerState->m_doppler.append(0);
satWorkerState->m_doppler.append(0);
}
} }
} }
if (requiresDoppler) if (requiresDoppler)
@ -836,7 +834,8 @@ void SatelliteTrackerWorker::enableDoppler(SatWorkerState *satWorkerState)
qDebug() << "SatelliteTrackerWorker::applyDeviceAOSSettings: Enabling doppler for " << satWorkerState->m_name; qDebug() << "SatelliteTrackerWorker::applyDeviceAOSSettings: Enabling doppler for " << satWorkerState->m_name;
satWorkerState->m_dopplerTimer.setInterval(m_settings.m_dopplerPeriod * 1000); satWorkerState->m_dopplerTimer.setInterval(m_settings.m_dopplerPeriod * 1000);
satWorkerState->m_dopplerTimer.start(); 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); doppler(satWorkerState);
}); });
} }
@ -848,29 +847,46 @@ void SatelliteTrackerWorker::disableDoppler(SatWorkerState *satWorkerState)
// Stop Doppler timer, and set interval to 0, so we don't restart it in start() // Stop Doppler timer, and set interval to 0, so we don't restart it in start()
satWorkerState->m_dopplerTimer.stop(); satWorkerState->m_dopplerTimer.stop();
satWorkerState->m_dopplerTimer.setInterval(0); satWorkerState->m_dopplerTimer.setInterval(0);
disconnect(satWorkerState->m_connection);
// Remove doppler correction from any channel // Remove doppler correction from any channel
QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *m_deviceSettingsList = m_settings.m_deviceSettings.value(satWorkerState->m_name); if (satWorkerState->m_doppler.size() > 0)
if (m_deviceSettingsList)
{ {
for (int i = 0; i < m_deviceSettingsList->size(); i++) QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *m_deviceSettingsList = m_settings.m_deviceSettings.value(satWorkerState->m_name);
if (m_deviceSettingsList)
{ {
SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = m_deviceSettingsList->at(i); int idx = 0;
if (devSettings->m_doppler.size() > 0)
for (int i = 0; i < m_deviceSettingsList->size(); i++)
{ {
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; for (int j = 0; j < devSettings->m_doppler.size(); j++)
if (ChannelWebAPIUtils::getFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset))
{ {
// Remove old doppler int offset;
offset += satWorkerState->m_doppler[i]; if (ChannelWebAPIUtils::getFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset))
if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) {
qDebug() << "SatelliteTrackerWorker::doppler: Failed to set frequency offset"; // Remove old doppler
std::vector<DeviceSet*>& 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";
} }
else satWorkerState->m_doppler[idx] = 0;
qDebug() << "SatelliteTrackerWorker::doppler: Failed to get frequency offset"; idx++;
} }
satWorkerState->m_doppler[i] = 0;
} }
} }
} }
@ -883,6 +899,8 @@ void SatelliteTrackerWorker::doppler(SatWorkerState *satWorkerState)
QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *m_deviceSettingsList = m_settings.m_deviceSettings.value(satWorkerState->m_name); QList<SatelliteTrackerSettings::SatelliteDeviceSettings *> *m_deviceSettingsList = m_settings.m_deviceSettings.value(satWorkerState->m_name);
if (m_deviceSettingsList) if (m_deviceSettingsList)
{ {
int idx = 0;
for (int i = 0; i < m_deviceSettingsList->size(); i++) for (int i = 0; i < m_deviceSettingsList->size(); i++)
{ {
SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = m_deviceSettingsList->at(i); SatelliteTrackerSettings::SatelliteDeviceSettings *devSettings = m_deviceSettingsList->at(i);
@ -915,15 +933,14 @@ void SatelliteTrackerWorker::doppler(SatWorkerState *satWorkerState)
int initOffset; int initOffset;
if (tx) if (tx)
{ {
initOffset = offset - satWorkerState->m_doppler[i]; initOffset = offset - satWorkerState->m_doppler[idx];
offset = initOffset + doppler; offset = initOffset + doppler;
} }
else else
{ {
initOffset = offset + satWorkerState->m_doppler[i]; initOffset = offset + satWorkerState->m_doppler[idx];
offset = initOffset - doppler; offset = initOffset - doppler;
} }
if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset)) if (!ChannelWebAPIUtils::setFrequencyOffset(devSettings->m_deviceSetIndex, devSettings->m_doppler[j], offset))
qDebug() << "SatelliteTrackerWorker::doppler: Failed to set frequency offset"; qDebug() << "SatelliteTrackerWorker::doppler: Failed to set frequency offset";
} }
@ -931,10 +948,12 @@ void SatelliteTrackerWorker::doppler(SatWorkerState *satWorkerState)
qDebug() << "SatelliteTrackerWorker::doppler: Failed to get frequency offset"; qDebug() << "SatelliteTrackerWorker::doppler: Failed to get frequency offset";
} }
satWorkerState->m_doppler[i] = doppler; satWorkerState->m_doppler[idx] = doppler;
} }
else else
qDebug() << "SatelliteTrackerWorker::doppler: couldn't get centre frequency for device at " << devSettings->m_deviceSetIndex; qDebug() << "SatelliteTrackerWorker::doppler: couldn't get centre frequency for device at " << devSettings->m_deviceSetIndex;
idx++;
} }
} }
} }

View File

@ -65,6 +65,7 @@ protected:
QList<int> m_doppler; // How much doppler we've applied to a channel QList<int> m_doppler; // How much doppler we've applied to a channel
SatelliteState m_satState; SatelliteState m_satState;
bool m_hasSignalledAOS; // For pass specified by m_aos and m_los bool m_hasSignalledAOS; // For pass specified by m_aos and m_los
QMetaObject::Connection m_connection;
friend SatelliteTrackerWorker; friend SatelliteTrackerWorker;
}; };