diff --git a/plugins/feature/satellitetracker/satelliteradiocontroldialog.cpp b/plugins/feature/satellitetracker/satelliteradiocontroldialog.cpp index ca53750c1..85290379e 100644 --- a/plugins/feature/satellitetracker/satelliteradiocontroldialog.cpp +++ b/plugins/feature/satellitetracker/satelliteradiocontroldialog.cpp @@ -56,6 +56,7 @@ void SatelliteRadioControlDialog::accept() for (int i = 0; i < m_devSettingsGUIs.size(); i++) { m_devSettingsGUIs[i]->accept(); } + QDialog::accept(); m_settings->m_deviceSettings = m_deviceSettings; } diff --git a/plugins/feature/satellitetracker/satelliteselectiondialog.cpp b/plugins/feature/satellitetracker/satelliteselectiondialog.cpp index 1b6bc60e9..b8f61ed9d 100644 --- a/plugins/feature/satellitetracker/satelliteselectiondialog.cpp +++ b/plugins/feature/satellitetracker/satelliteselectiondialog.cpp @@ -76,8 +76,11 @@ SatelliteSelectionDialog::~SatelliteSelectionDialog() void SatelliteSelectionDialog::accept() { m_settings->m_satellites.clear(); - for (int i = 0; i < ui->selectedSats->count(); i++) + + for (int i = 0; i < ui->selectedSats->count(); i++) { m_settings->m_satellites.append(ui->selectedSats->item(i)->text()); + } + QDialog::accept(); } diff --git a/plugins/feature/satellitetracker/satellitetracker.cpp b/plugins/feature/satellitetracker/satellitetracker.cpp index 6dd9fa699..c79ad44cc 100644 --- a/plugins/feature/satellitetracker/satellitetracker.cpp +++ b/plugins/feature/satellitetracker/satellitetracker.cpp @@ -101,7 +101,7 @@ void SatelliteTracker::start() m_thread->start(); m_state = StRunning; - m_worker->getInputMessageQueue()->push(SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker::create(m_settings, true)); + m_worker->getInputMessageQueue()->push(SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker::create(m_settings, QList(), true)); m_worker->getInputMessageQueue()->push(MsgSatData::create(m_satellites)); } @@ -124,7 +124,7 @@ bool SatelliteTracker::handleMessage(const Message& cmd) { MsgConfigureSatelliteTracker& cfg = (MsgConfigureSatelliteTracker&) cmd; qDebug() << "SatelliteTracker::handleMessage: MsgConfigureSatelliteTracker"; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); return true; } @@ -185,170 +185,58 @@ bool SatelliteTracker::deserialize(const QByteArray& data) { if (m_settings.deserialize(data)) { - MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, true); + MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, QList(), true); m_inputMessageQueue.push(msg); return true; } else { m_settings.resetToDefaults(); - MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, true); + MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, QList(), true); m_inputMessageQueue.push(msg); return false; } } -void SatelliteTracker::applySettings(const SatelliteTrackerSettings& settings, bool force) +void SatelliteTracker::applySettings(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force) { bool tlesChanged = false; - qDebug() << "SatelliteTracker::applySettings:" - << " m_latitude: " << settings.m_latitude - << " m_longitude: " << settings.m_longitude - << " m_heightAboveSeaLevel: " << settings.m_heightAboveSeaLevel - << " m_target: " << settings.m_target - << " m_satellites: " << settings.m_satellites - << " m_tles: " << settings.m_tles - << " m_dateTime: " << settings.m_dateTime - << " m_minAOSElevation: " << settings.m_minAOSElevation - << " m_minPassElevation: " << settings.m_minPassElevation - << " m_azElUnits: " << settings.m_azElUnits - << " m_groundTrackPoints: " << settings.m_groundTrackPoints - << " m_dateFormat: " << settings.m_dateFormat - << " m_utc: " << settings.m_utc - << " m_updatePeriod: " << settings.m_updatePeriod - << " m_dopplerPeriod: " << settings.m_dopplerPeriod - << " m_defaultFrequency: " << settings.m_defaultFrequency - << " m_drawOnMap: " << settings.m_drawOnMap - << " m_autoTarget: " << settings.m_autoTarget - << " m_aosSpeech: " << settings.m_aosSpeech - << " m_losSpeech: " << settings.m_losSpeech - << " m_aosCommand: " << settings.m_aosCommand - << " m_losCommand: " << settings.m_losCommand - << " m_predictionPeriod: " << settings.m_predictionPeriod - << " m_passStartTime: " << settings.m_passStartTime - << " m_passFinishTime: " << settings.m_passFinishTime - << " m_deviceSettings: " << settings.m_deviceSettings - << " m_title: " << settings.m_title - << " m_rgbColor: " << settings.m_rgbColor - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIFeatureSetIndex: " << settings.m_reverseAPIFeatureSetIndex - << " m_reverseAPIFeatureIndex: " << settings.m_reverseAPIFeatureIndex - << " force: " << force; + qDebug() << "SatelliteTracker::applySettings:" << settings.getDebugString(settingsKeys, force) << " force: " << force; - QList reverseAPIKeys; - - if ((m_settings.m_latitude != settings.m_latitude) || force) { - reverseAPIKeys.append("latitude"); - } - if ((m_settings.m_longitude != settings.m_longitude) || force) { - reverseAPIKeys.append("longitude"); - } - if ((m_settings.m_heightAboveSeaLevel != settings.m_heightAboveSeaLevel) || force) { - reverseAPIKeys.append("heightAboveSeaLevel"); - } - if ((m_settings.m_target != settings.m_target) || force) { - reverseAPIKeys.append("target"); - } - if ((m_settings.m_satellites != settings.m_satellites) || force) { - reverseAPIKeys.append("satellites"); - } - if ((m_settings.m_tles != settings.m_tles) || force) { + if (settingsKeys.contains("tles") || force) { tlesChanged = true; - reverseAPIKeys.append("tles"); - } - if ((m_settings.m_dateTime != settings.m_dateTime) || force) { - reverseAPIKeys.append("dateTime"); - } - if ((m_settings.m_minAOSElevation != settings.m_minAOSElevation) || force) { - reverseAPIKeys.append("minAOSElevation"); - } - if ((m_settings.m_minPassElevation != settings.m_minPassElevation) || force) { - reverseAPIKeys.append("minPassElevation"); - } - if ((m_settings.m_azElUnits != settings.m_azElUnits) || force) { - reverseAPIKeys.append("azElUnits"); - } - if ((m_settings.m_groundTrackPoints != settings.m_groundTrackPoints) || force) { - reverseAPIKeys.append("groundTrackPoints"); - } - if ((m_settings.m_dateFormat != settings.m_dateFormat) || force) { - reverseAPIKeys.append("dateFormat"); - } - if ((m_settings.m_utc != settings.m_utc) || force) { - reverseAPIKeys.append("utc"); - } - if ((m_settings.m_updatePeriod != settings.m_updatePeriod) || force) { - reverseAPIKeys.append("updatePeriod"); - } - if ((m_settings.m_dopplerPeriod != settings.m_dopplerPeriod) || force) { - reverseAPIKeys.append("dopplerPeriod"); - } - if ((m_settings.m_defaultFrequency != settings.m_defaultFrequency) || force) { - reverseAPIKeys.append("defaultFrequency"); - } - if ((m_settings.m_drawOnMap != settings.m_drawOnMap) || force) { - reverseAPIKeys.append("drawOnMap"); - } - if ((m_settings.m_autoTarget != settings.m_autoTarget) || force) { - reverseAPIKeys.append("autoTarget"); - } - if ((m_settings.m_aosSpeech != settings.m_aosSpeech) || force) { - reverseAPIKeys.append("aosSpeech"); - } - if ((m_settings.m_losSpeech != settings.m_losSpeech) || force) { - reverseAPIKeys.append("losSpeech"); - } - if ((m_settings.m_aosCommand != settings.m_aosCommand) || force) { - reverseAPIKeys.append("aosCommand"); - } - if ((m_settings.m_losCommand != settings.m_losCommand) || force) { - reverseAPIKeys.append("losCommand"); - } - if ((m_settings.m_predictionPeriod != settings.m_predictionPeriod) || force) { - reverseAPIKeys.append("predictionPeriod"); - } - if ((m_settings.m_passStartTime != settings.m_passStartTime) || force) { - reverseAPIKeys.append("passStartTime"); - } - if ((m_settings.m_passFinishTime != settings.m_passFinishTime) || force) { - reverseAPIKeys.append("passFinishTime"); - } - if ((m_settings.m_deviceSettings != settings.m_deviceSettings) || force) { - reverseAPIKeys.append("deviceSettings"); - } - if ((m_settings.m_title != settings.m_title) || force) { - reverseAPIKeys.append("title"); - } - if ((m_settings.m_rgbColor != settings.m_rgbColor) || force) { - reverseAPIKeys.append("rgbColor"); } SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker *msg = SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker::create( - settings, force + settings, settingsKeys, force ); + if (m_worker) { m_worker->getInputMessageQueue()->push(msg); } - if (settings.m_useReverseAPI) + if (settingsKeys.contains("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_reverseAPIFeatureSetIndex != settings.m_reverseAPIFeatureSetIndex) || - (m_settings.m_reverseAPIFeatureIndex != settings.m_reverseAPIFeatureIndex); - webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) || + settingsKeys.contains("reverseAPIAddress") || + settingsKeys.contains("reverseAPIPort") || + settingsKeys.contains("reverseAPIFeatureSetIndex") || + settingsKeys.contains("m_reverseAPIFeatureIndex"); + webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force); } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } if (tlesChanged) { // Do we already have the TLE files, or do we need to download them? bool existing = true; + for (int i = 0; i < m_settings.m_tles.size(); i++) { QFile tlesFile(tleURLToFilename(m_settings.m_tles[i])); @@ -358,10 +246,12 @@ void SatelliteTracker::applySettings(const SatelliteTrackerSettings& settings, b break; } } - if (existing) + + if (existing) { readSatData(); - else + } else { updateSatData(); + } } // Remove unneeded satellite state @@ -410,13 +300,13 @@ int SatelliteTracker::webapiSettingsPutPatch( SatelliteTrackerSettings settings = m_settings; webapiUpdateFeatureSettings(settings, featureSettingsKeys, response); - MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(settings, force); + MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(settings, featureSettingsKeys, force); m_inputMessageQueue.push(msg); qDebug("SatelliteTracker::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureSatelliteTracker *msgToGUI = MsgConfigureSatelliteTracker::create(settings, force); + MsgConfigureSatelliteTracker *msgToGUI = MsgConfigureSatelliteTracker::create(settings, featureSettingsKeys, force); m_guiMessageQueue->push(msgToGUI); } @@ -769,7 +659,7 @@ void SatelliteTracker::webapiUpdateFeatureSettings( } } -void SatelliteTracker::webapiReverseSendSettings(QList& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force) +void SatelliteTracker::webapiReverseSendSettings(const QList& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force) { SWGSDRangel::SWGFeatureSettings *swgFeatureSettings = new SWGSDRangel::SWGFeatureSettings(); // swgFeatureSettings->setOriginatorFeatureIndex(getIndexInDeviceSet()); diff --git a/plugins/feature/satellitetracker/satellitetracker.h b/plugins/feature/satellitetracker/satellitetracker.h index fbddb736d..6f1d3542d 100644 --- a/plugins/feature/satellitetracker/satellitetracker.h +++ b/plugins/feature/satellitetracker/satellitetracker.h @@ -49,19 +49,22 @@ public: public: const SatelliteTrackerSettings& getSettings() const { return m_settings; } + const QList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureSatelliteTracker* create(const SatelliteTrackerSettings& settings, bool force) { - return new MsgConfigureSatelliteTracker(settings, force); + static MsgConfigureSatelliteTracker* create(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force) { + return new MsgConfigureSatelliteTracker(settings, settingsKeys, force); } private: SatelliteTrackerSettings m_settings; + QList m_settingsKeys; bool m_force; - MsgConfigureSatelliteTracker(const SatelliteTrackerSettings& settings, bool force) : + MsgConfigureSatelliteTracker(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -194,9 +197,9 @@ private: void start(); void stop(); - void applySettings(const SatelliteTrackerSettings& settings, bool force = false); + void applySettings(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force = false); void webapiFormatFeatureReport(SWGSDRangel::SWGFeatureReport& response); - void webapiReverseSendSettings(QList& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force); + void webapiReverseSendSettings(const QList& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force); QString satNogsSatellitesFilename(); QString satNogsTransmittersFilename(); diff --git a/plugins/feature/satellitetracker/satellitetrackergui.cpp b/plugins/feature/satellitetracker/satellitetrackergui.cpp index 2b7049161..2e9b33a38 100644 --- a/plugins/feature/satellitetracker/satellitetrackergui.cpp +++ b/plugins/feature/satellitetracker/satellitetrackergui.cpp @@ -104,7 +104,13 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message) { qDebug("SatelliteTrackerGUI::handleMessage: SatelliteTracker::MsgConfigureSatelliteTracker"); const SatelliteTracker::MsgConfigureSatelliteTracker& cfg = (SatelliteTracker::MsgConfigureSatelliteTracker&) message; - m_settings = cfg.getSettings(); + + if (cfg.getForce()) { + m_settings = cfg.getSettings(); + } else { + m_settings.applySettings(cfg.getSettingsKeys(), cfg.getSettings()); + } + blockApplySettings(true); displaySettings(); blockApplySettings(false); @@ -115,6 +121,7 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message) { SatelliteTrackerReport::MsgReportSat& satReport = (SatelliteTrackerReport::MsgReportSat&) message; SatelliteState *satState = satReport.getSatelliteState(); + if (satState->m_name == m_settings.m_target) { delete m_targetSatState; @@ -122,10 +129,12 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message) ui->azimuth->setText(convertDegreesToText(satState->m_azimuth)); ui->elevation->setText(convertDegreesToText(satState->m_elevation)); + if (satState->m_passes.size() > 0) { const SatellitePass &pass = satState->m_passes[0]; bool geostationary = !pass.m_aos.isValid() && !pass.m_los.isValid(); + if ((m_nextTargetAOS != pass.m_aos) || (m_nextTargetLOS != pass.m_los) || (geostationary != m_geostationarySatVisible)) { m_nextTargetAOS = pass.m_aos; @@ -136,9 +145,13 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message) } } } + updateTable(satState); - if (satState->m_name != m_settings.m_target) + + if (satState->m_name != m_settings.m_target) { delete satState; + } + return true; } else if (SatelliteTrackerReport::MsgReportAOS::match(message)) @@ -165,16 +178,21 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message) m_satellites = satData.getSatellites(); // Remove satellites that no longer exist QMutableListIterator itr(m_settings.m_satellites); + while (itr.hasNext()) { QString satellite = itr.next(); if (!m_satellites.contains(satellite)) itr.remove(); } - if (!m_satellites.contains(m_settings.m_target)) + + if (!m_satellites.contains(m_settings.m_target)) { setTarget(""); + } + // Update GUI updateSelectedSats(); + return true; } @@ -189,28 +207,37 @@ void SatelliteTrackerGUI::updateSelectedSats() { QString name = ui->target->itemText(i); int idx = m_settings.m_satellites.indexOf(name); + if (idx == -1) { ui->target->removeItem(i); QList matches = ui->satTable->findItems(name, Qt::MatchExactly); - for (int j = 0; j < matches.length(); j++) + + for (int j = 0; j < matches.length(); j++) { ui->satTable->removeRow(ui->satTable->row(matches[j])); + } } else + { i++; + } } + // Add new satellites to target combo for (int i = 0; i < m_settings.m_satellites.size(); i++) { - if (ui->target->findText(m_settings.m_satellites[i], Qt::MatchExactly) == -1) + if (ui->target->findText(m_settings.m_satellites[i], Qt::MatchExactly) == -1) { ui->target->addItem(m_settings.m_satellites[i]); + } } // Select current target, if it still exists int idx = ui->target->findText(m_settings.m_target); - if (idx != -1) + + if (idx != -1) { ui->target->setCurrentIndex(idx); - else + } else { setTarget(""); + } } void SatelliteTrackerGUI::handleInputMessages() @@ -232,7 +259,6 @@ void SatelliteTrackerGUI::onWidgetRolled(QWidget* widget, bool rollDown) RollupContents *rollupContents = getRollupContents(); rollupContents->saveState(m_rollupState); - applySettings(); } SatelliteTrackerGUI::SatelliteTrackerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent) : @@ -320,6 +346,7 @@ SatelliteTrackerGUI::~SatelliteTrackerGUI() void SatelliteTrackerGUI::setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; + m_settingsKeys.append("workspaceIndex"); m_feature->setWorkspaceIndex(index); } @@ -382,6 +409,14 @@ void SatelliteTrackerGUI::onMenuDialogCalled(const QPoint &p) setTitle(m_settings.m_title); setTitleColor(m_settings.m_rgbColor); + m_settingsKeys.append("title"); + m_settingsKeys.append("rgbColor"); + m_settingsKeys.append("useReverseAPI"); + m_settingsKeys.append("reverseAPIAddress"); + m_settingsKeys.append("reverseAPIPort"); + m_settingsKeys.append("reverseAPIFeatureSetIndex"); + m_settingsKeys.append("reverseAPIFeatureIndex"); + applySettings(); } @@ -418,6 +453,7 @@ void SatelliteTrackerGUI::on_startStop_toggled(bool checked) void SatelliteTrackerGUI::on_latitude_valueChanged(double value) { m_settings.m_latitude = value; + m_settingsKeys.append("latitude"); applySettings(); plotChart(); } @@ -425,6 +461,7 @@ void SatelliteTrackerGUI::on_latitude_valueChanged(double value) void SatelliteTrackerGUI::on_longitude_valueChanged(double value) { m_settings.m_longitude = value; + m_settingsKeys.append("longitude"); applySettings(); plotChart(); } @@ -434,6 +471,7 @@ void SatelliteTrackerGUI::setTarget(const QString& target) if (target != m_settings.m_target) { m_settings.m_target = target; + m_settingsKeys.append("target"); ui->azimuth->setText(""); ui->elevation->setText(""); ui->aos->setText(""); @@ -465,6 +503,7 @@ void SatelliteTrackerGUI::on_useMyPosition_clicked(bool checked) ui->latitude->setValue(stationLatitude); ui->longitude->setValue(stationLongitude); m_settings.m_heightAboveSeaLevel = stationAltitude; + m_settingsKeys.append("heightAboveSeaLevel"); applySettings(); plotChart(); } @@ -473,8 +512,10 @@ void SatelliteTrackerGUI::on_useMyPosition_clicked(bool checked) void SatelliteTrackerGUI::on_displaySettings_clicked() { SatelliteTrackerSettingsDialog dialog(&m_settings); + if (dialog.exec() == QDialog::Accepted) { + m_settingsKeys.append("deviceSettings"); applySettings(); plotChart(); } @@ -483,6 +524,7 @@ void SatelliteTrackerGUI::on_displaySettings_clicked() void SatelliteTrackerGUI::on_dateTimeSelect_currentIndexChanged(int index) { m_settings.m_dateTimeSelect = (SatelliteTrackerSettings::DateTimeSelect)index; + if (m_settings.m_dateTimeSelect != SatelliteTrackerSettings::CUSTOM) { m_settings.m_dateTime = ""; @@ -493,9 +535,13 @@ void SatelliteTrackerGUI::on_dateTimeSelect_currentIndexChanged(int index) m_settings.m_dateTime = ui->dateTime->dateTime().toString(Qt::ISODateWithMs); ui->dateTime->setVisible(true); } + ui->deviceFeatureSelect->setVisible(m_settings.m_dateTimeSelect >= SatelliteTrackerSettings::FROM_MAP); updateDeviceFeatureCombo(); + m_settingsKeys.append("dateTimeSelect"); + m_settingsKeys.append("dateTime"); + applySettings(); plotChart(); } @@ -503,9 +549,11 @@ void SatelliteTrackerGUI::on_dateTimeSelect_currentIndexChanged(int index) void SatelliteTrackerGUI::on_dateTime_dateTimeChanged(const QDateTime &datetime) { (void) datetime; + if (ui->dateTimeSelect->currentIndex() == 1) { m_settings.m_dateTime = ui->dateTime->dateTime().toString(Qt::ISODateWithMs); + m_settingsKeys.append("dateTime"); applySettings(); plotChart(); } @@ -514,8 +562,9 @@ void SatelliteTrackerGUI::on_dateTime_dateTimeChanged(const QDateTime &datetime) // Find target on the Map void SatelliteTrackerGUI::on_viewOnMap_clicked() { - if (!m_settings.m_target.isEmpty()) + if (!m_settings.m_target.isEmpty()) { FeatureWebAPIUtils::mapFind(m_settings.m_target); + } } void SatelliteTrackerGUI::on_updateSatData_clicked() @@ -526,9 +575,11 @@ void SatelliteTrackerGUI::on_updateSatData_clicked() void SatelliteTrackerGUI::on_selectSats_clicked() { SatelliteSelectionDialog dialog(&m_settings, m_satellites); + if (dialog.exec() == QDialog::Accepted) { updateSelectedSats(); + m_settingsKeys.append("satellites"); applySettings(); } } @@ -536,13 +587,18 @@ void SatelliteTrackerGUI::on_selectSats_clicked() void SatelliteTrackerGUI::on_radioControl_clicked() { SatelliteRadioControlDialog dialog(&m_settings, m_satellites); + if (dialog.exec() == QDialog::Accepted) + { + m_settingsKeys.append("deviceSettings"); applySettings(); + } } void SatelliteTrackerGUI::on_autoTarget_clicked(bool checked) { m_settings.m_autoTarget = checked; + m_settingsKeys.append("autoTarget"); applySettings(); } @@ -584,17 +640,19 @@ void SatelliteTrackerGUI::updateStatus() // Indicate if satellite data is being updated bool updatingSatData = m_satelliteTracker->isUpdatingSatData(); + if (updatingSatData != m_lastUpdatingSatData) { - if (updatingSatData) + if (updatingSatData) { ui->updateSatData->setStyleSheet("QToolButton { background-color : green; }"); - else + } else { ui->updateSatData->setStyleSheet("QToolButton { background: none; }"); + } + m_lastUpdatingSatData = updatingSatData; } updateTimeToAOS(); - updateDeviceFeatureCombo(); } @@ -602,33 +660,45 @@ void SatelliteTrackerGUI::updateStatus() void SatelliteTrackerGUI::updateTimeToAOS() { if (m_geostationarySatVisible) + { ui->aos->setText("Now"); + } else if (m_nextTargetAOS.isValid()) { QDateTime currentTime = m_satelliteTracker->currentDateTime(); // FIXME: UTC int secondsToAOS = m_nextTargetAOS.toSecsSinceEpoch() - currentTime.toSecsSinceEpoch(); + if (secondsToAOS > 0) { int seconds = secondsToAOS % 60; int minutes = (secondsToAOS / 60) % 60; int hours = (secondsToAOS / (60 * 60)) % 24; int days = secondsToAOS / (60 * 60 * 24); + if (days == 1) + { ui->aos->setText(QString("1 day")); + } else if (days > 0) + { ui->aos->setText(QString("%1 days").arg(days)); + } else { ui->aos->setText(QString("%1:%2:%3") - .arg(hours, 2, 10, QLatin1Char('0')) - .arg(minutes, 2, 10, QLatin1Char('0')) - .arg(seconds, 2, 10, QLatin1Char('0'))); + .arg(hours, 2, 10, QLatin1Char('0')) + .arg(minutes, 2, 10, QLatin1Char('0')) + .arg(seconds, 2, 10, QLatin1Char('0'))); } } else if (m_nextTargetLOS < currentTime) + { ui->aos->setText(""); + } else + { ui->aos->setText("Now"); + } } else ui->aos->setText(""); @@ -638,9 +708,12 @@ void SatelliteTrackerGUI::applySettings(bool force) { if (m_doApplySettings) { - SatelliteTracker::MsgConfigureSatelliteTracker* message = SatelliteTracker::MsgConfigureSatelliteTracker::create(m_settings, force); + SatelliteTracker::MsgConfigureSatelliteTracker* message = SatelliteTracker::MsgConfigureSatelliteTracker::create( + m_settings, m_settingsKeys, force); m_satelliteTracker->getInputMessageQueue()->push(message); } + + m_settingsKeys.clear(); } void SatelliteTrackerGUI::on_nextPass_clicked() @@ -670,6 +743,7 @@ void SatelliteTrackerGUI::on_darkTheme_clicked(bool checked) { m_settings.m_chartsDarkTheme = checked; plotChart(); + m_settingsKeys.append("chartsDarkTheme"); applySettings(); } @@ -681,10 +755,11 @@ void SatelliteTrackerGUI::on_chartSelect_currentIndexChanged(int index) void SatelliteTrackerGUI::plotChart() { - if (ui->chartSelect->currentIndex() == 0) + if (ui->chartSelect->currentIndex() == 0) { plotPolarChart(); - else + } else { plotAzElChart(); + } } // Linear interpolation @@ -709,6 +784,7 @@ void SatelliteTrackerGUI::plotPolarChart() m_plotPass = m_targetSatState->m_passes.size() - 1; ui->passLabel->setText(QString("%1").arg(m_plotPass)); } + const SatellitePass &pass = m_targetSatState->m_passes[m_plotPass]; // Always create a new chart, otherwise sometimes they aren't drawn properly @@ -741,18 +817,28 @@ void SatelliteTrackerGUI::plotPolarChart() if (pass.m_aos.isValid() && pass.m_los.isValid()) { QString title; - if (m_settings.m_utc) - title = pass.m_aos.date().toString(m_settings.m_dateFormat); - else - title = pass.m_aos.toLocalTime().date().toString(m_settings.m_dateFormat); - m_polarChart->setTitle(QString("%1").arg(title)); + if (m_settings.m_utc) { + title = pass.m_aos.date().toString(m_settings.m_dateFormat); + } else { + title = pass.m_aos.toLocalTime().date().toString(m_settings.m_dateFormat); + } + + m_polarChart->setTitle(QString("%1").arg(title)); QLineSeries *polarSeries = new QLineSeries(); - getPassAzEl(nullptr, nullptr, polarSeries, - sat->m_tle->m_tle0, sat->m_tle->m_tle1, sat->m_tle->m_tle2, - m_settings.m_latitude, m_settings.m_longitude, m_settings.m_heightAboveSeaLevel/1000.0, - pass.m_aos, pass.m_los); + getPassAzEl( + nullptr, + nullptr, + polarSeries, + sat->m_tle->m_tle0, + sat->m_tle->m_tle1, + sat->m_tle->m_tle2, + m_settings.m_latitude, + m_settings.m_longitude, + m_settings.m_heightAboveSeaLevel/1000.0, + pass.m_aos, pass.m_los + ); // Polar charts can't handle points that are more than 180 degrees apart, so // we need to split passes that cross from 359 -> 0 degrees (or the reverse) @@ -764,10 +850,12 @@ void SatelliteTrackerGUI::plotPolarChart() qreal prevAz = polarSeries->at(0).x(); qreal prevEl = polarSeries->at(0).y(); + for (int i = 1; i < polarSeries->count(); i++) { qreal az = polarSeries->at(i).x(); qreal el = polarSeries->at(i).y(); + if ((prevAz > 270.0) && (az <= 90.0)) { double elMid = interpolate(prevAz, prevEl, az+360.0, el, 360.0); @@ -789,7 +877,10 @@ void SatelliteTrackerGUI::plotPolarChart() s->append(az, el); } else + { s->append(polarSeries->at(i)); + } + prevAz = az; prevEl = el; } @@ -805,14 +896,19 @@ void SatelliteTrackerGUI::plotPolarChart() QLineSeries *aosSeries = new QLineSeries(); aosSeries->append(polarSeries->at(0)); QTime time; - if (m_settings.m_utc) + + if (m_settings.m_utc) { time = pass.m_aos.time(); - else + } else { time = pass.m_aos.toLocalTime().time(); - if (m_settings.m_utc) + } + + if (m_settings.m_utc) { aosSeries->setPointLabelsFormat(QString("AOS %1").arg(time.toString("hh:mm"))); - else + } else { aosSeries->setPointLabelsFormat(QString("AOS %1").arg(time.toString("hh:mm"))); + } + aosSeries->setPointLabelsVisible(true); aosSeries->setPointLabelsClipping(false); m_polarChart->addSeries(aosSeries); @@ -821,24 +917,29 @@ void SatelliteTrackerGUI::plotPolarChart() // Create series with single point, so we can plot time of LOS QLineSeries *losSeries = new QLineSeries(); losSeries->append(polarSeries->at(polarSeries->count()-1)); - if (m_settings.m_utc) + + if (m_settings.m_utc) { time = pass.m_los.time(); - else + } else { time = pass.m_los.toLocalTime().time(); + } + losSeries->setPointLabelsFormat(QString("LOS %1").arg(time.toString("hh:mm"))); losSeries->setPointLabelsVisible(true); losSeries->setPointLabelsClipping(false); m_polarChart->addSeries(losSeries); losSeries->attachAxis(angularAxis); losSeries->attachAxis(radialAxis); - QDateTime currentTime; - if (m_settings.m_dateTime == "") + + if (m_settings.m_dateTime == "") { currentTime = m_satelliteTracker->currentDateTimeUtc(); - else if (m_settings.m_utc) + } else if (m_settings.m_utc) { currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs); - else + } else { currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs).toUTC(); + } + if ((currentTime >= pass.m_aos) && (currentTime <= pass.m_los)) { // Create series with single point, so we can plot current time @@ -863,26 +964,39 @@ void SatelliteTrackerGUI::plotPolarChart() { // Possibly geostationary, just plot current position QDateTime currentTime; - if (m_settings.m_dateTime == "") + + if (m_settings.m_dateTime == "") { currentTime = m_satelliteTracker->currentDateTimeUtc(); - else if (m_settings.m_utc) + } else if (m_settings.m_utc) { currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs); - else + } else { currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs).toUTC(); + } + QString title; - if (m_settings.m_utc) + + if (m_settings.m_utc) { title = currentTime.date().toString(m_settings.m_dateFormat); - else + } else { title = currentTime.toLocalTime().date().toString(m_settings.m_dateFormat); + } + m_polarChart->setTitle(QString("%1").arg(title)); - QLineSeries *nowSeries = new QLineSeries(); - QDateTime endTime = currentTime.addSecs(1); - getPassAzEl(nullptr, nullptr, nowSeries, - sat->m_tle->m_tle0, sat->m_tle->m_tle1, sat->m_tle->m_tle2, - m_settings.m_latitude, m_settings.m_longitude, m_settings.m_heightAboveSeaLevel/1000.0, - currentTime, endTime); + + getPassAzEl( + nullptr, + nullptr, + nowSeries, + sat->m_tle->m_tle0, + sat->m_tle->m_tle1, + sat->m_tle->m_tle2, + m_settings.m_latitude, + m_settings.m_longitude, + m_settings.m_heightAboveSeaLevel/1000.0, + currentTime, endTime + ); nowSeries->setPointLabelsFormat(m_settings.m_target); nowSeries->setPointLabelsVisible(true); @@ -893,7 +1007,6 @@ void SatelliteTrackerGUI::plotPolarChart() } ui->passChart->setChart(m_polarChart); - delete oldChart; } @@ -913,20 +1026,22 @@ void SatelliteTrackerGUI::plotAzElChart() m_plotPass = m_targetSatState->m_passes.size() - 1; ui->passLabel->setText(QString("%1").arg(m_plotPass)); } - const SatellitePass &pass = m_targetSatState->m_passes[m_plotPass]; + const SatellitePass &pass = m_targetSatState->m_passes[m_plotPass]; // Always create a new chart, otherwise sometimes they aren't drawn properly m_lineChart = new QChart(); m_lineChart->setTheme(m_settings.m_chartsDarkTheme ? QChart::ChartThemeDark : QChart::ChartThemeLight); QDateTimeAxis *xAxis = new QDateTimeAxis(); QValueAxis *yLeftAxis = new QValueAxis(); QValueAxis *yRightAxis = new QValueAxis(); - QString title; - if (m_settings.m_utc) + + if (m_settings.m_utc) { title = pass.m_aos.date().toString(m_settings.m_dateFormat); - else + } else { title = pass.m_aos.toLocalTime().date().toString(m_settings.m_dateFormat); + } + m_lineChart->setTitle(QString("%1").arg(title)); m_lineChart->legend()->hide(); m_lineChart->addAxis(xAxis, Qt::AlignBottom); @@ -934,16 +1049,23 @@ void SatelliteTrackerGUI::plotAzElChart() m_lineChart->addAxis(yRightAxis, Qt::AlignRight); m_lineChart->layout()->setContentsMargins(0, 0, 0, 0); m_lineChart->setMargins(QMargins(1, 1, 1, 1)); - SatNogsSatellite *sat = m_satellites.value(m_settings.m_target); - QLineSeries *azSeries = new QLineSeries(); QLineSeries *elSeries = new QLineSeries(); - getPassAzEl(azSeries, elSeries, nullptr, - sat->m_tle->m_tle0, sat->m_tle->m_tle1, sat->m_tle->m_tle2, - m_settings.m_latitude, m_settings.m_longitude, m_settings.m_heightAboveSeaLevel/1000.0, - pass.m_aos, pass.m_los); + getPassAzEl( + azSeries, + elSeries, + nullptr, + sat->m_tle->m_tle0, + sat->m_tle->m_tle1, + sat->m_tle->m_tle2, + m_settings.m_latitude, + m_settings.m_longitude, + m_settings.m_heightAboveSeaLevel/1000.0, + pass.m_aos, + pass.m_los + ); // Split crossing of 360/0 degrees in to multiple series in the same colour QList azSeriesList; @@ -952,15 +1074,18 @@ void SatelliteTrackerGUI::plotAzElChart() azSeriesList.append(s); s->setPen(pen); qreal prevAz = azSeries->at(0).y(); + for (int i = 0; i < azSeries->count(); i++) { qreal az = azSeries->at(i).y(); + if (((prevAz >= 270) && (az < 90)) || ((prevAz < 90) && (az >= 270))) { s = new QLineSeries(); azSeriesList.append(s); s->setPen(pen); } + s->append(azSeries->at(i).x(), az); prevAz = az; } @@ -968,12 +1093,14 @@ void SatelliteTrackerGUI::plotAzElChart() m_lineChart->addSeries(elSeries); elSeries->attachAxis(xAxis); elSeries->attachAxis(yLeftAxis); + for (int i = 0; i < azSeriesList.size(); i++) { m_lineChart->addSeries(azSeriesList[i]); azSeriesList[i]->attachAxis(xAxis); azSeriesList[i]->attachAxis(yRightAxis); } + xAxis->setRange(pass.m_aos, pass.m_los); xAxis->setFormat("hh:mm"); yLeftAxis->setRange(0.0, 90.0); @@ -1022,32 +1149,39 @@ void SatelliteTrackerGUI::resizeTable() QString SatelliteTrackerGUI::formatDaysTime(qint64 days, QDateTime dateTime) { QDateTime dt; - if (m_settings.m_utc) + + if (m_settings.m_utc) { dt = dateTime.toUTC(); - else + } else { dt = dateTime.toLocalTime(); - if (abs(days) > 10) + } + + if (abs(days) > 10) { return dt.date().toString(m_settings.m_dateFormat); - else if (days == 0) + } else if (days == 0) { return dt.time().toString("hh:mm"); - else if (days > 0) + } else if (days > 0) { return dt.time().toString(QString("hh:mm +%1").arg(days)); - else + } else { return dt.time().toString(QString("hh:mm %1").arg(days)); + } } QString SatelliteTrackerGUI::formatSecondsAsHHMMSS(qint64 seconds) { char const* sign = ""; - if(seconds < 0) + + if (seconds < 0) { sign = "-"; seconds = -seconds; } + int minutes = seconds / 60; seconds = seconds % 60; int hours = minutes / 60; minutes = minutes % 60; + if (hours > 0) { return QString("%1%2:%3:%4").arg(sign).arg(hours).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0')); } else { @@ -1062,10 +1196,12 @@ public: { QVariant v1 = data(Qt::UserRole); QVariant v2 = other.data(Qt::UserRole); - if (v1.isValid() && v2.isValid()) + + if (v1.isValid() && v2.isValid()) { return v1.toDateTime() < v2.toDateTime(); - else + } else { return false; + } } }; @@ -1079,6 +1215,7 @@ public: QString t2 = other.text(); int t1Colons = t1.count(":"); int t2Colons = t2.count(":"); + if (t1Colons == t2Colons) { QCollator coll; @@ -1129,28 +1266,34 @@ void SatelliteTrackerGUI::updateTable(SatelliteState *satState) // Does the table already contain this satellite? QList matches = ui->satTable->findItems(satState->m_name, Qt::MatchExactly); QTableWidgetItem *items[SAT_COL_COLUMNS]; + if (matches.size() == 0) { // Add a new row ui->satTable->setSortingEnabled(false); int row = ui->satTable->rowCount(); ui->satTable->setRowCount(row + 1); + for (int i = 0; i < SAT_COL_COLUMNS; i++) { - if ((i == SAT_COL_AOS) || (i == SAT_COL_LOS)) + if ((i == SAT_COL_AOS) || (i == SAT_COL_LOS)) { items[i] = new DateTimeSortedTableWidgetItem(); - else if ((i == SAT_COL_NAME) || (i == SAT_COL_NORAD_ID)) + } else if ((i == SAT_COL_NAME) || (i == SAT_COL_NORAD_ID)) { items[i] = new QTableWidgetItem(); - else if (i == SAT_COL_TNE) + } else if (i == SAT_COL_TNE) { items[i] = new NextEventTableWidgetItem(); - else + } else { items[i] = new NaturallySortedTableWidgetItem(); + } + items[i]->setToolTip(ui->satTable->horizontalHeaderItem(i)->toolTip()); ui->satTable->setItem(row, i, items[i]); } + ui->satTable->setSortingEnabled(true); // Static columns items[SAT_COL_NAME]->setText(satState->m_name); + if (m_satellites.contains(satState->m_name)) { SatNogsSatellite *sat = m_satellites.value(satState->m_name); @@ -1159,41 +1302,51 @@ void SatelliteTrackerGUI::updateTable(SatelliteState *satState) // Text alignment for (int col : {SAT_COL_AZ, SAT_COL_EL, SAT_COL_TNE, SAT_COL_DUR, SAT_COL_MAX_EL, - SAT_COL_LATITUDE, SAT_COL_LONGITUDE, - SAT_COL_ALT, SAT_COL_RANGE, SAT_COL_RANGE_RATE, SAT_COL_DOPPLER, - SAT_COL_PATH_LOSS, SAT_COL_DELAY}) + SAT_COL_LATITUDE, SAT_COL_LONGITUDE, + SAT_COL_ALT, SAT_COL_RANGE, SAT_COL_RANGE_RATE, SAT_COL_DOPPLER, + SAT_COL_PATH_LOSS, SAT_COL_DELAY}) + { items[col]->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); + } } else { // Update existing row int row = ui->satTable->row(matches[0]); - for (int i = 0; i < SAT_COL_COLUMNS; i++) + + for (int i = 0; i < SAT_COL_COLUMNS; i++) { items[i] = ui->satTable->item(row, i); + } } items[SAT_COL_AZ]->setData(Qt::DisplayRole, (int)round(satState->m_azimuth)); items[SAT_COL_EL]->setData(Qt::DisplayRole, (int)round(satState->m_elevation)); + if (satState->m_passes.size() > 0) { // Get number of days to AOS/LOS QDateTime currentDateTime = m_satelliteTracker->currentDateTime(); int daysToAOS = currentDateTime.daysTo(satState->m_passes[0].m_aos); int daysToLOS = currentDateTime.daysTo(satState->m_passes[0].m_los); - if (satState->m_passes[0].m_aos > currentDateTime) + + if (satState->m_passes[0].m_aos > currentDateTime) { items[SAT_COL_TNE]->setText(formatSecondsAsHHMMSS(currentDateTime.secsTo(satState->m_passes[0].m_aos))+" AOS"); - else + } else { items[SAT_COL_TNE]->setText(formatSecondsAsHHMMSS(currentDateTime.secsTo(satState->m_passes[0].m_los))+" LOS"); + } + items[SAT_COL_DUR]->setText(formatSecondsAsHHMMSS(satState->m_passes[0].m_aos.secsTo(satState->m_passes[0].m_los))); items[SAT_COL_AOS]->setText(formatDaysTime(daysToAOS, satState->m_passes[0].m_aos)); items[SAT_COL_AOS]->setData(Qt::UserRole, satState->m_passes[0].m_aos); items[SAT_COL_LOS]->setText(formatDaysTime(daysToLOS, satState->m_passes[0].m_los)); items[SAT_COL_LOS]->setData(Qt::UserRole, satState->m_passes[0].m_los); items[SAT_COL_MAX_EL]->setData(Qt::DisplayRole, (int)round(satState->m_passes[0].m_maxElevation)); - if (satState->m_passes[0].m_northToSouth) + + if (satState->m_passes[0].m_northToSouth) { items[SAT_COL_DIR]->setText(QString("%1").arg(QChar(0x2193))); // Down arrow - else + } else { items[SAT_COL_DIR]->setText(QString("%1").arg(QChar(0x2191))); // Up arrow + } } else { @@ -1204,6 +1357,7 @@ void SatelliteTrackerGUI::updateTable(SatelliteState *satState) items[SAT_COL_MAX_EL]->setData(Qt::DisplayRole, QVariant()); items[SAT_COL_DIR]->setText(""); } + items[SAT_COL_LATITUDE]->setData(Qt::DisplayRole, satState->m_latitude); items[SAT_COL_LONGITUDE]->setData(Qt::DisplayRole, satState->m_longitude); items[SAT_COL_ALT]->setData(Qt::DisplayRole, (int)round(satState->m_altitude)); @@ -1226,6 +1380,9 @@ void SatelliteTrackerGUI::on_satTableHeader_sortIndicatorChanged(int logicalInde { m_settings.m_columnSort = logicalIndex; m_settings.m_columnSortOrder = order; + m_settingsKeys.append("columnSort"); + m_settingsKeys.append("columnSortOrder"); + applySettings(); } @@ -1254,6 +1411,7 @@ void SatelliteTrackerGUI::columnSelectMenuChecked(bool checked) { (void) checked; QAction* action = qobject_cast(sender()); + if (action != nullptr) { int idx = action->data().toInt(nullptr); @@ -1297,10 +1455,12 @@ void SatelliteTrackerGUI::updateDeviceFeatureCombo(const QStringList &items, con for (auto item : items) { int idx = ui->deviceFeatureSelect->findText(item); + if (idx == -1) { ui->deviceFeatureSelect->addItem(item); } } + ui->deviceFeatureSelect->setCurrentIndex(ui->deviceFeatureSelect->findText(selected)); } @@ -1310,12 +1470,14 @@ void SatelliteTrackerGUI::updateFileInputList() std::vector& deviceSets = MainCore::instance()->getDeviceSets(); int deviceIndex = 0; QStringList items; + for (std::vector::const_iterator it = deviceSets.begin(); it != deviceSets.end(); ++it, deviceIndex++) { if ((*it)->m_deviceAPI && (*it)->m_deviceAPI->getHardwareId() == "FileInput") { items.append(QString("R%1").arg(deviceIndex)); } } + updateDeviceFeatureCombo(items, m_settings.m_fileInputDevice); } @@ -1325,27 +1487,36 @@ void SatelliteTrackerGUI::updateMapList() std::vector& featureSets = MainCore::instance()->getFeatureeSets(); int featureIndex = 0; QStringList items; + for (std::vector::const_iterator it = featureSets.begin(); it != featureSets.end(); ++it, featureIndex++) { for (int fi = 0; fi < (*it)->getNumberOfFeatures(); fi++) { Feature *feature = (*it)->getFeatureAt(fi); + if (feature->getURI() == "sdrangel.feature.map") { items.append(QString("F%1:%2").arg(featureIndex).arg(fi)); } } } + updateDeviceFeatureCombo(items, m_settings.m_mapFeature); } void SatelliteTrackerGUI::on_deviceFeatureSelect_currentIndexChanged(int index) { (void) index; - if (m_settings.m_dateTimeSelect == SatelliteTrackerSettings::FROM_MAP) { + + if (m_settings.m_dateTimeSelect == SatelliteTrackerSettings::FROM_MAP) + { m_settings.m_mapFeature = ui->deviceFeatureSelect->currentText(); - } else { + m_settingsKeys.append("mapFeature"); + } else + { m_settings.m_fileInputDevice = ui->deviceFeatureSelect->currentText(); + m_settingsKeys.append("fileInputDevice"); } + applySettings(); } diff --git a/plugins/feature/satellitetracker/satellitetrackergui.h b/plugins/feature/satellitetracker/satellitetrackergui.h index 166161969..b12382582 100644 --- a/plugins/feature/satellitetracker/satellitetrackergui.h +++ b/plugins/feature/satellitetracker/satellitetrackergui.h @@ -64,6 +64,7 @@ private: PluginAPI* m_pluginAPI; FeatureUISet* m_featureUISet; SatelliteTrackerSettings m_settings; + QList m_settingsKeys; RollupState m_rollupState; bool m_doApplySettings; diff --git a/plugins/feature/satellitetracker/satellitetrackersettings.cpp b/plugins/feature/satellitetracker/satellitetrackersettings.cpp index 8b8e167ba..660564e92 100644 --- a/plugins/feature/satellitetracker/satellitetrackersettings.cpp +++ b/plugins/feature/satellitetracker/satellitetrackersettings.cpp @@ -344,3 +344,346 @@ SatelliteTrackerSettings::SatelliteDeviceSettings::SatelliteDeviceSettings() m_aosCommand = ""; m_losCommand = ""; } + +void SatelliteTrackerSettings::applySettings(const QStringList& settingsKeys, const SatelliteTrackerSettings& settings) +{ + if (settingsKeys.contains("latitude")) { + m_latitude = settings.m_latitude; + } + if (settingsKeys.contains("longitude")) { + m_longitude = settings.m_longitude; + } + if (settingsKeys.contains("heightAboveSeaLevel")) { + m_heightAboveSeaLevel = settings.m_heightAboveSeaLevel; + } + if (settingsKeys.contains("target")) { + m_target = settings.m_target; + } + if (settingsKeys.contains("satellites")) { + m_satellites = settings.m_satellites; + } + if (settingsKeys.contains("tles")) { + m_tles = settings.m_tles; + } + if (settingsKeys.contains("dateTime")) { + m_dateTime = settings.m_dateTime; + } + if (settingsKeys.contains("minAOSElevation")) { + m_minAOSElevation = settings.m_minAOSElevation; + } + if (settingsKeys.contains("minPassElevation")) { + m_minPassElevation = settings.m_minPassElevation; + } + if (settingsKeys.contains("rotatorMaxAzimuth")) { + m_rotatorMaxAzimuth = settings.m_rotatorMaxAzimuth; + } + if (settingsKeys.contains("rotatorMaxElevation")) { + m_rotatorMaxElevation = settings.m_rotatorMaxElevation; + } + if (settingsKeys.contains("azElUnits")) { + m_azElUnits = settings.m_azElUnits; + } + if (settingsKeys.contains("groundTrackPoints")) { + m_groundTrackPoints = settings.m_groundTrackPoints; + } + if (settingsKeys.contains("dateFormat")) { + m_dateFormat = settings.m_dateFormat; + } + if (settingsKeys.contains("utc")) { + m_utc = settings.m_utc; + } + if (settingsKeys.contains("updatePeriod")) { + m_updatePeriod = settings.m_updatePeriod; + } + if (settingsKeys.contains("dopplerPeriod")) { + m_dopplerPeriod = settings.m_dopplerPeriod; + } + if (settingsKeys.contains("defaultFrequency")) { + m_defaultFrequency = settings.m_defaultFrequency; + } + if (settingsKeys.contains("drawOnMap")) { + m_drawOnMap = settings.m_drawOnMap; + } + if (settingsKeys.contains("autoTarget")) { + m_autoTarget = settings.m_autoTarget; + } + if (settingsKeys.contains("aosSpeech")) { + m_aosSpeech = settings.m_aosSpeech; + } + if (settingsKeys.contains("aosCommand")) { + m_aosCommand = settings.m_aosCommand; + } + if (settingsKeys.contains("losCommand")) { + m_losCommand = settings.m_losCommand; + } + if (settingsKeys.contains("predictionPeriod")) { + m_predictionPeriod = settings.m_predictionPeriod; + } + if (settingsKeys.contains("passStartTime")) { + m_passStartTime = settings.m_passStartTime; + } + if (settingsKeys.contains("passFinishTime")) { + m_passFinishTime = settings.m_passFinishTime; + } + if (settingsKeys.contains("title")) { + m_title = settings.m_title; + } + if (settingsKeys.contains("rgbColor")) { + m_rgbColor = settings.m_rgbColor; + } + 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("reverseAPIFeatureSetIndex")) { + m_reverseAPIFeatureSetIndex = settings.m_reverseAPIFeatureSetIndex; + } + if (settingsKeys.contains("reverseAPIFeatureIndex")) { + m_reverseAPIFeatureIndex = settings.m_reverseAPIFeatureIndex; + } + if (settingsKeys.contains("chartsDarkTheme")) { + m_chartsDarkTheme = settings.m_chartsDarkTheme; + } + if (settingsKeys.contains("replayEnabled")) { + m_replayEnabled = settings.m_replayEnabled; + } + if (settingsKeys.contains("sendTimeToMap")) { + m_sendTimeToMap = settings.m_sendTimeToMap; + } + if (settingsKeys.contains("dateTimeSelect")) { + m_dateTimeSelect = settings.m_dateTimeSelect; + } + if (settingsKeys.contains("columnSort")) { + m_columnSort = settings.m_columnSort; + } + if (settingsKeys.contains("columnSortOrder")) { + m_columnSortOrder = settings.m_columnSortOrder; + } + + if (settingsKeys.contains("columnIndexes")) + { + for (int i = 0; i < SAT_COL_COLUMNS; i++) { + m_columnIndexes[i] = settings.m_columnIndexes[i]; + } + } + + if (settingsKeys.contains("columnSizes")) + { + for (int i = 0; i < SAT_COL_COLUMNS; i++) { + m_columnSizes[i] = settings.m_columnSizes[i]; + } + } + + if (settingsKeys.contains("deviceSettings")) { + m_deviceSettings = settings.m_deviceSettings; + } +} + +QString SatelliteTrackerSettings::getDebugString(const QStringList& settingsKeys, bool force) const +{ + std::ostringstream ostr; + + if (settingsKeys.contains("latitude") || force) { + ostr << " m_latitude: " << m_latitude; + } + if (settingsKeys.contains("longitude") || force) { + ostr << " m_longitude: " << m_longitude; + } + if (settingsKeys.contains("heightAboveSeaLevel") || force) { + ostr << " m_heightAboveSeaLevel: " << m_heightAboveSeaLevel; + } + + if (settingsKeys.contains("satellites") || force) + { + ostr << "m_satellites:"; + + for (auto satellite : m_satellites) { + ostr << " " << satellite.toStdString(); + } + } + + if (settingsKeys.contains("tles") || force) + { + ostr << " m_tles:"; + + for (auto tle : m_tles) { + ostr << " " << tle.toStdString(); + } + } + + if (settingsKeys.contains("dateTime") || force) { + ostr << " m_dateTime: " << m_dateTime.toStdString(); + } + if (settingsKeys.contains("minAOSElevation") || force) { + ostr << " m_minAOSElevation: " << m_minAOSElevation; + } + if (settingsKeys.contains("minPassElevation") || force) { + ostr << " m_minPassElevation: " << m_minPassElevation; + } + if (settingsKeys.contains("rotatorMaxAzimuth") || force) { + ostr << " m_rotatorMaxAzimuth: " << m_rotatorMaxAzimuth; + } + if (settingsKeys.contains("rotatorMaxElevation") || force) { + ostr << " m_rotatorMaxElevation: " << m_rotatorMaxElevation; + } + if (settingsKeys.contains("azElUnits") || force) { + ostr << " m_azElUnits: " << m_azElUnits; + } + if (settingsKeys.contains("groundTrackPoints") || force) { + ostr << " m_groundTrackPoints: " << m_groundTrackPoints; + } + if (settingsKeys.contains("dateFormat") || force) { + ostr << " m_dateFormat: " << m_dateFormat.toStdString(); + } + if (settingsKeys.contains("utc") || force) { + ostr << " m_utc: " << m_utc; + } + if (settingsKeys.contains("updatePeriod") || force) { + ostr << " m_updatePeriod: " << m_updatePeriod; + } + if (settingsKeys.contains("dopplerPeriod") || force) { + ostr << " m_dopplerPeriod: " << m_dopplerPeriod; + } + if (settingsKeys.contains("defaultFrequency") || force) { + ostr << " m_defaultFrequency: " << m_defaultFrequency; + } + if (settingsKeys.contains("drawOnMap") || force) { + ostr << " m_drawOnMap: " << m_drawOnMap; + } + if (settingsKeys.contains("autoTarget") || force) { + ostr << " m_autoTarget: " << m_autoTarget; + } + if (settingsKeys.contains("aosSpeech") || force) { + ostr << " m_aosSpeech: " << m_aosSpeech.toStdString(); + } + if (settingsKeys.contains("losSpeech") || force) { + ostr << " m_losSpeech: " << m_losSpeech.toStdString(); + } + if (settingsKeys.contains("aosCommand") || force) { + ostr << " m_aosCommand: " << m_aosCommand.toStdString(); + } + if (settingsKeys.contains("losCommand") || force) { + ostr << " m_losCommand: " << m_losCommand.toStdString(); + } + if (settingsKeys.contains("predictionPeriod") || force) { + ostr << " m_predictionPeriod: " << m_predictionPeriod; + } + if (settingsKeys.contains("passStartTime") || force) { + ostr << " m_passStartTime: " << m_passStartTime.toString().toStdString(); + } + if (settingsKeys.contains("passFinishTime") || force) { + ostr << " m_passFinishTime: " << m_passFinishTime.toString().toStdString(); + } + if (settingsKeys.contains("title") || force) { + ostr << " m_title: " << m_title.toStdString(); + } + if (settingsKeys.contains("rgbColor") || force) { + ostr << " m_rgbColor: " << m_rgbColor; + } + 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("reverseAPIFeatureSetIndex") || force) { + ostr << " m_reverseAPIFeatureSetIndex: " << m_reverseAPIFeatureSetIndex; + } + if (settingsKeys.contains("reverseAPIFeatureIndex") || force) { + ostr << " m_reverseAPIFeatureIndex: " << m_reverseAPIFeatureIndex; + } + if (settingsKeys.contains("chartsDarkTheme") || force) { + ostr << " m_chartsDarkTheme: " << m_chartsDarkTheme; + } + if (settingsKeys.contains("replayEnabled") || force) { + ostr << " m_replayEnabled: " << m_replayEnabled; + } + if (settingsKeys.contains("sendTimeToMap") || force) { + ostr << " m_sendTimeToMap: " << m_sendTimeToMap; + } + if (settingsKeys.contains("dateTimeSelect") || force) { + ostr << " m_dateTimeSelect: " << m_dateTimeSelect; + } + if (settingsKeys.contains("mapFeature") || force) { + ostr << " m_mapFeature: " << m_mapFeature.toStdString(); + } + if (settingsKeys.contains("fileInputDevice") || force) { + ostr << " m_fileInputDevice: " << m_fileInputDevice.toStdString(); + } + if (settingsKeys.contains("workspaceIndex") || force) { + ostr << " m_workspaceIndex: " << m_workspaceIndex; + } + if (settingsKeys.contains("columnSort") || force) { + ostr << " m_columnSort: " << m_columnSort; + } + if (settingsKeys.contains("columnSortOrder") || force) { + ostr << " m_columnSortOrder: " << m_columnSortOrder; + } + + if (settingsKeys.contains("columnIndexes")) + { + ostr << "m_columnIndexes:"; + + for (int i = 0; i < SAT_COL_COLUMNS; i++) { + ostr << " " << m_columnIndexes[i]; + } + } + + if (settingsKeys.contains("columnSizes")) + { + ostr << "m_columnSizes:"; + + for (int i = 0; i < SAT_COL_COLUMNS; i++) { + ostr << " " << m_columnSizes[i]; + } + } + + if (settingsKeys.contains("deviceSettings")) + { + ostr << "m_deviceSettings: ["; + + for (auto deviceSettingList : m_deviceSettings) + { + ostr << "["; + + for (auto deviceSettings : *deviceSettingList) { + deviceSettings->getDebugString(ostr); + } + + ostr << "]"; + } + + ostr << "]"; + } + + return QString(ostr.str().c_str()); +} + + +void SatelliteTrackerSettings::SatelliteDeviceSettings::getDebugString(std::ostringstream& ostr) +{ + ostr << " m_deviceSetIndex: " << m_deviceSetIndex + << " m_presetGroup: " << m_presetGroup.toStdString() + << " m_presetFrequency: " << m_presetFrequency + << " m_presetDescription" << m_presetDescription.toStdString() + << " m_doppler: ["; + + for (auto doppler : m_doppler) { + ostr << " " << doppler; + } + + ostr << "] m_startOnAOS: " << m_startOnAOS + << " m_stopOnLOS: " << m_stopOnLOS + << " m_startStopFileSink: " << m_startStopFileSink + << " m_frequency: " << m_frequency + << " m_aosCommand: " << m_aosCommand.toStdString() + << " m_losCommand: " << m_losCommand.toStdString(); +} diff --git a/plugins/feature/satellitetracker/satellitetrackersettings.h b/plugins/feature/satellitetracker/satellitetrackersettings.h index 3d02b5d86..9bd10a54f 100644 --- a/plugins/feature/satellitetracker/satellitetrackersettings.h +++ b/plugins/feature/satellitetracker/satellitetrackersettings.h @@ -45,6 +45,8 @@ struct SatelliteTrackerSettings QString m_aosCommand; //!< Command/script to execute on AOS QString m_losCommand; //!< Command/script to execute on LOS SatelliteDeviceSettings(); + + void getDebugString(std::ostringstream& ostr); }; double m_latitude; //!< Antenna location, degrees @@ -108,6 +110,8 @@ struct SatelliteTrackerSettings void deserializeStringList(const QByteArray& data, QList& strings); QByteArray serializeDeviceSettings(QHash *> deviceSettings) const; void deserializeDeviceSettings(const QByteArray& data, QHash *>& deviceSettings); + void applySettings(const QStringList& settingsKeys, const SatelliteTrackerSettings& settings); + QString getDebugString(const QStringList& settingsKeys, bool force=false) const; }; #endif // INCLUDE_FEATURE_SATELLITETRACKERSETTINGS_H_ diff --git a/plugins/feature/satellitetracker/satellitetrackerworker.cpp b/plugins/feature/satellitetracker/satellitetrackerworker.cpp index f8e66cc0f..aca2b00f7 100644 --- a/plugins/feature/satellitetracker/satellitetrackerworker.cpp +++ b/plugins/feature/satellitetracker/satellitetrackerworker.cpp @@ -126,7 +126,7 @@ bool SatelliteTrackerWorker::handleMessage(const Message& message) QMutexLocker mutexLocker(&m_mutex); MsgConfigureSatelliteTrackerWorker& cfg = (MsgConfigureSatelliteTrackerWorker&) message; - applySettings(cfg.getSettings(), cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce()); return true; } else if (SatelliteTracker::MsgSatData::match(message)) @@ -142,28 +142,22 @@ bool SatelliteTrackerWorker::handleMessage(const Message& message) } } -void SatelliteTrackerWorker::applySettings(const SatelliteTrackerSettings& settings, bool force) +void SatelliteTrackerWorker::applySettings(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force) { - qDebug() << "SatelliteTrackerWorker::applySettings:" - << " m_target: " << settings.m_target - << " m_satellites: " << settings.m_satellites - << " m_dateTime: " << settings.m_dateTime - << " m_utc: " << settings.m_utc - << " m_updatePeriod: " << settings.m_updatePeriod - << " force: " << force; + qDebug() << "SatelliteTrackerWorker::applySettings:" << settings.getDebugString(settingsKeys, force) << " force: " << force; - if ((m_settings.m_target != settings.m_target) - || (m_settings.m_latitude != settings.m_latitude) - || (m_settings.m_longitude != settings.m_longitude) - || (m_settings.m_heightAboveSeaLevel != settings.m_heightAboveSeaLevel) - || (m_settings.m_dateTime != settings.m_dateTime) - || (m_settings.m_utc != settings.m_utc) - || (m_settings.m_groundTrackPoints != settings.m_groundTrackPoints) - || (m_settings.m_minAOSElevation != settings.m_minAOSElevation) - || (m_settings.m_minPassElevation != settings.m_minPassElevation) - || (m_settings.m_predictionPeriod != settings.m_predictionPeriod) - || (m_settings.m_passStartTime != settings.m_passStartTime) - || (m_settings.m_passFinishTime != settings.m_passFinishTime) + if (settingsKeys.contains("target") + || settingsKeys.contains("latitude") + || settingsKeys.contains("longitude") + || settingsKeys.contains("heightAboveSeaLevel") + || settingsKeys.contains("dateTime") + || settingsKeys.contains("utc") + || settingsKeys.contains("groundTrackPoints") + || settingsKeys.contains("minAOSElevation") + || settingsKeys.contains("minPassElevation") + || settingsKeys.contains("predictionPeriod") + || settingsKeys.contains("passStartTime") + || settingsKeys.contains("passFinishTime") || (!m_settings.m_drawOnMap && settings.m_drawOnMap) || force) { @@ -172,7 +166,7 @@ void SatelliteTrackerWorker::applySettings(const SatelliteTrackerSettings& setti QTimer::singleShot(1, this, &SatelliteTrackerWorker::update); m_pollTimer.start((int)round(settings.m_updatePeriod*1000.0)); } - else if ((m_settings.m_updatePeriod != settings.m_updatePeriod) || force) + else if (settingsKeys.contains("updatePeriod") || force) { m_pollTimer.start((int)round(settings.m_updatePeriod*1000.0)); } @@ -213,7 +207,11 @@ void SatelliteTrackerWorker::applySettings(const SatelliteTrackerSettings& setti } } - m_settings = settings; + if (force) { + m_settings = settings; + } else { + m_settings.applySettings(settingsKeys, settings); + } } void SatelliteTrackerWorker::removeFromMap(QString id) diff --git a/plugins/feature/satellitetracker/satellitetrackerworker.h b/plugins/feature/satellitetracker/satellitetrackerworker.h index b59c1a46e..8f7384dd4 100644 --- a/plugins/feature/satellitetracker/satellitetrackerworker.h +++ b/plugins/feature/satellitetracker/satellitetrackerworker.h @@ -76,20 +76,22 @@ public: public: const SatelliteTrackerSettings& getSettings() const { return m_settings; } + const QList& getSettingsKeys() const { return m_settingsKeys; } bool getForce() const { return m_force; } - static MsgConfigureSatelliteTrackerWorker* create(const SatelliteTrackerSettings& settings, bool force) - { - return new MsgConfigureSatelliteTrackerWorker(settings, force); + static MsgConfigureSatelliteTrackerWorker* create(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force) { + return new MsgConfigureSatelliteTrackerWorker(settings, settingsKeys, force); } private: SatelliteTrackerSettings m_settings; + QList m_settingsKeys; bool m_force; - MsgConfigureSatelliteTrackerWorker(const SatelliteTrackerSettings& settings, bool force) : + MsgConfigureSatelliteTrackerWorker(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force) : Message(), m_settings(settings), + m_settingsKeys(settingsKeys), m_force(force) { } }; @@ -119,7 +121,7 @@ private: QDateTime m_lastUpdateDateTime; bool handleMessage(const Message& cmd); - void applySettings(const SatelliteTrackerSettings& settings, bool force = false); + void applySettings(const SatelliteTrackerSettings& settings, const QList& settingsKeys, bool force = false); MessageQueue *getMessageQueueToGUI() { return m_msgQueueToGUI; } void removeFromMap(QString id); void sendToMap(