1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-07-12 22:05:23 -04:00

Satellite tracker feature: Make settings assignments atomic. Part of #1329

This commit is contained in:
f4exb 2022-11-28 21:52:06 +01:00
parent 618b4c91b9
commit b3e6ea95f3
10 changed files with 671 additions and 255 deletions

View File

@ -56,6 +56,7 @@ void SatelliteRadioControlDialog::accept()
for (int i = 0; i < m_devSettingsGUIs.size(); i++) { for (int i = 0; i < m_devSettingsGUIs.size(); i++) {
m_devSettingsGUIs[i]->accept(); m_devSettingsGUIs[i]->accept();
} }
QDialog::accept(); QDialog::accept();
m_settings->m_deviceSettings = m_deviceSettings; m_settings->m_deviceSettings = m_deviceSettings;
} }

View File

@ -76,8 +76,11 @@ SatelliteSelectionDialog::~SatelliteSelectionDialog()
void SatelliteSelectionDialog::accept() void SatelliteSelectionDialog::accept()
{ {
m_settings->m_satellites.clear(); 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()); m_settings->m_satellites.append(ui->selectedSats->item(i)->text());
}
QDialog::accept(); QDialog::accept();
} }

View File

@ -101,7 +101,7 @@ void SatelliteTracker::start()
m_thread->start(); m_thread->start();
m_state = StRunning; m_state = StRunning;
m_worker->getInputMessageQueue()->push(SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker::create(m_settings, true)); m_worker->getInputMessageQueue()->push(SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker::create(m_settings, QList<QString>(), true));
m_worker->getInputMessageQueue()->push(MsgSatData::create(m_satellites)); m_worker->getInputMessageQueue()->push(MsgSatData::create(m_satellites));
} }
@ -124,7 +124,7 @@ bool SatelliteTracker::handleMessage(const Message& cmd)
{ {
MsgConfigureSatelliteTracker& cfg = (MsgConfigureSatelliteTracker&) cmd; MsgConfigureSatelliteTracker& cfg = (MsgConfigureSatelliteTracker&) cmd;
qDebug() << "SatelliteTracker::handleMessage: MsgConfigureSatelliteTracker"; qDebug() << "SatelliteTracker::handleMessage: MsgConfigureSatelliteTracker";
applySettings(cfg.getSettings(), cfg.getForce()); applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true; return true;
} }
@ -185,170 +185,58 @@ bool SatelliteTracker::deserialize(const QByteArray& data)
{ {
if (m_settings.deserialize(data)) if (m_settings.deserialize(data))
{ {
MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, true); MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, QList<QString>(), true);
m_inputMessageQueue.push(msg); m_inputMessageQueue.push(msg);
return true; return true;
} }
else else
{ {
m_settings.resetToDefaults(); m_settings.resetToDefaults();
MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, true); MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(m_settings, QList<QString>(), true);
m_inputMessageQueue.push(msg); m_inputMessageQueue.push(msg);
return false; return false;
} }
} }
void SatelliteTracker::applySettings(const SatelliteTrackerSettings& settings, bool force) void SatelliteTracker::applySettings(const SatelliteTrackerSettings& settings, const QList<QString>& settingsKeys, bool force)
{ {
bool tlesChanged = false; bool tlesChanged = false;
qDebug() << "SatelliteTracker::applySettings:" qDebug() << "SatelliteTracker::applySettings:" << settings.getDebugString(settingsKeys, force) << " force: " << force;
<< " 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;
QList<QString> reverseAPIKeys; if (settingsKeys.contains("tles") || force) {
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) {
tlesChanged = true; 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( SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker *msg = SatelliteTrackerWorker::MsgConfigureSatelliteTrackerWorker::create(
settings, force settings, settingsKeys, force
); );
if (m_worker) { if (m_worker) {
m_worker->getInputMessageQueue()->push(msg); 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) || bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || settingsKeys.contains("reverseAPIAddress") ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || settingsKeys.contains("reverseAPIPort") ||
(m_settings.m_reverseAPIFeatureSetIndex != settings.m_reverseAPIFeatureSetIndex) || settingsKeys.contains("reverseAPIFeatureSetIndex") ||
(m_settings.m_reverseAPIFeatureIndex != settings.m_reverseAPIFeatureIndex); settingsKeys.contains("m_reverseAPIFeatureIndex");
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
} }
if (force) {
m_settings = settings; m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
if (tlesChanged) if (tlesChanged)
{ {
// Do we already have the TLE files, or do we need to download them? // Do we already have the TLE files, or do we need to download them?
bool existing = true; bool existing = true;
for (int i = 0; i < m_settings.m_tles.size(); i++) for (int i = 0; i < m_settings.m_tles.size(); i++)
{ {
QFile tlesFile(tleURLToFilename(m_settings.m_tles[i])); QFile tlesFile(tleURLToFilename(m_settings.m_tles[i]));
@ -358,11 +246,13 @@ void SatelliteTracker::applySettings(const SatelliteTrackerSettings& settings, b
break; break;
} }
} }
if (existing)
if (existing) {
readSatData(); readSatData();
else } else {
updateSatData(); updateSatData();
} }
}
// Remove unneeded satellite state // Remove unneeded satellite state
QMutableHashIterator<QString, SatelliteState *> itr(m_satState); QMutableHashIterator<QString, SatelliteState *> itr(m_satState);
@ -410,13 +300,13 @@ int SatelliteTracker::webapiSettingsPutPatch(
SatelliteTrackerSettings settings = m_settings; SatelliteTrackerSettings settings = m_settings;
webapiUpdateFeatureSettings(settings, featureSettingsKeys, response); webapiUpdateFeatureSettings(settings, featureSettingsKeys, response);
MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(settings, force); MsgConfigureSatelliteTracker *msg = MsgConfigureSatelliteTracker::create(settings, featureSettingsKeys, force);
m_inputMessageQueue.push(msg); m_inputMessageQueue.push(msg);
qDebug("SatelliteTracker::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); qDebug("SatelliteTracker::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
if (m_guiMessageQueue) // forward to GUI if any 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); m_guiMessageQueue->push(msgToGUI);
} }
@ -769,7 +659,7 @@ void SatelliteTracker::webapiUpdateFeatureSettings(
} }
} }
void SatelliteTracker::webapiReverseSendSettings(QList<QString>& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force) void SatelliteTracker::webapiReverseSendSettings(const QList<QString>& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force)
{ {
SWGSDRangel::SWGFeatureSettings *swgFeatureSettings = new SWGSDRangel::SWGFeatureSettings(); SWGSDRangel::SWGFeatureSettings *swgFeatureSettings = new SWGSDRangel::SWGFeatureSettings();
// swgFeatureSettings->setOriginatorFeatureIndex(getIndexInDeviceSet()); // swgFeatureSettings->setOriginatorFeatureIndex(getIndexInDeviceSet());

View File

@ -49,19 +49,22 @@ public:
public: public:
const SatelliteTrackerSettings& getSettings() const { return m_settings; } const SatelliteTrackerSettings& getSettings() const { return m_settings; }
const QList<QString>& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; } bool getForce() const { return m_force; }
static MsgConfigureSatelliteTracker* create(const SatelliteTrackerSettings& settings, bool force) { static MsgConfigureSatelliteTracker* create(const SatelliteTrackerSettings& settings, const QList<QString>& settingsKeys, bool force) {
return new MsgConfigureSatelliteTracker(settings, force); return new MsgConfigureSatelliteTracker(settings, settingsKeys, force);
} }
private: private:
SatelliteTrackerSettings m_settings; SatelliteTrackerSettings m_settings;
QList<QString> m_settingsKeys;
bool m_force; bool m_force;
MsgConfigureSatelliteTracker(const SatelliteTrackerSettings& settings, bool force) : MsgConfigureSatelliteTracker(const SatelliteTrackerSettings& settings, const QList<QString>& settingsKeys, bool force) :
Message(), Message(),
m_settings(settings), m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force) m_force(force)
{ } { }
}; };
@ -194,9 +197,9 @@ private:
void start(); void start();
void stop(); void stop();
void applySettings(const SatelliteTrackerSettings& settings, bool force = false); void applySettings(const SatelliteTrackerSettings& settings, const QList<QString>& settingsKeys, bool force = false);
void webapiFormatFeatureReport(SWGSDRangel::SWGFeatureReport& response); void webapiFormatFeatureReport(SWGSDRangel::SWGFeatureReport& response);
void webapiReverseSendSettings(QList<QString>& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force); void webapiReverseSendSettings(const QList<QString>& featureSettingsKeys, const SatelliteTrackerSettings& settings, bool force);
QString satNogsSatellitesFilename(); QString satNogsSatellitesFilename();
QString satNogsTransmittersFilename(); QString satNogsTransmittersFilename();

View File

@ -104,7 +104,13 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message)
{ {
qDebug("SatelliteTrackerGUI::handleMessage: SatelliteTracker::MsgConfigureSatelliteTracker"); qDebug("SatelliteTrackerGUI::handleMessage: SatelliteTracker::MsgConfigureSatelliteTracker");
const SatelliteTracker::MsgConfigureSatelliteTracker& cfg = (SatelliteTracker::MsgConfigureSatelliteTracker&) message; const SatelliteTracker::MsgConfigureSatelliteTracker& cfg = (SatelliteTracker::MsgConfigureSatelliteTracker&) message;
if (cfg.getForce()) {
m_settings = cfg.getSettings(); m_settings = cfg.getSettings();
} else {
m_settings.applySettings(cfg.getSettingsKeys(), cfg.getSettings());
}
blockApplySettings(true); blockApplySettings(true);
displaySettings(); displaySettings();
blockApplySettings(false); blockApplySettings(false);
@ -115,6 +121,7 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message)
{ {
SatelliteTrackerReport::MsgReportSat& satReport = (SatelliteTrackerReport::MsgReportSat&) message; SatelliteTrackerReport::MsgReportSat& satReport = (SatelliteTrackerReport::MsgReportSat&) message;
SatelliteState *satState = satReport.getSatelliteState(); SatelliteState *satState = satReport.getSatelliteState();
if (satState->m_name == m_settings.m_target) if (satState->m_name == m_settings.m_target)
{ {
delete m_targetSatState; delete m_targetSatState;
@ -122,10 +129,12 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message)
ui->azimuth->setText(convertDegreesToText(satState->m_azimuth)); ui->azimuth->setText(convertDegreesToText(satState->m_azimuth));
ui->elevation->setText(convertDegreesToText(satState->m_elevation)); ui->elevation->setText(convertDegreesToText(satState->m_elevation));
if (satState->m_passes.size() > 0) if (satState->m_passes.size() > 0)
{ {
const SatellitePass &pass = satState->m_passes[0]; const SatellitePass &pass = satState->m_passes[0];
bool geostationary = !pass.m_aos.isValid() && !pass.m_los.isValid(); bool geostationary = !pass.m_aos.isValid() && !pass.m_los.isValid();
if ((m_nextTargetAOS != pass.m_aos) || (m_nextTargetLOS != pass.m_los) || (geostationary != m_geostationarySatVisible)) if ((m_nextTargetAOS != pass.m_aos) || (m_nextTargetLOS != pass.m_los) || (geostationary != m_geostationarySatVisible))
{ {
m_nextTargetAOS = pass.m_aos; m_nextTargetAOS = pass.m_aos;
@ -136,9 +145,13 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message)
} }
} }
} }
updateTable(satState); updateTable(satState);
if (satState->m_name != m_settings.m_target)
if (satState->m_name != m_settings.m_target) {
delete satState; delete satState;
}
return true; return true;
} }
else if (SatelliteTrackerReport::MsgReportAOS::match(message)) else if (SatelliteTrackerReport::MsgReportAOS::match(message))
@ -165,16 +178,21 @@ bool SatelliteTrackerGUI::handleMessage(const Message& message)
m_satellites = satData.getSatellites(); m_satellites = satData.getSatellites();
// Remove satellites that no longer exist // Remove satellites that no longer exist
QMutableListIterator<QString> itr(m_settings.m_satellites); QMutableListIterator<QString> itr(m_settings.m_satellites);
while (itr.hasNext()) while (itr.hasNext())
{ {
QString satellite = itr.next(); QString satellite = itr.next();
if (!m_satellites.contains(satellite)) if (!m_satellites.contains(satellite))
itr.remove(); itr.remove();
} }
if (!m_satellites.contains(m_settings.m_target))
if (!m_satellites.contains(m_settings.m_target)) {
setTarget(""); setTarget("");
}
// Update GUI // Update GUI
updateSelectedSats(); updateSelectedSats();
return true; return true;
} }
@ -189,28 +207,37 @@ void SatelliteTrackerGUI::updateSelectedSats()
{ {
QString name = ui->target->itemText(i); QString name = ui->target->itemText(i);
int idx = m_settings.m_satellites.indexOf(name); int idx = m_settings.m_satellites.indexOf(name);
if (idx == -1) if (idx == -1)
{ {
ui->target->removeItem(i); ui->target->removeItem(i);
QList<QTableWidgetItem *> matches = ui->satTable->findItems(name, Qt::MatchExactly); QList<QTableWidgetItem *> 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])); ui->satTable->removeRow(ui->satTable->row(matches[j]));
} }
}
else else
{
i++; i++;
} }
}
// Add new satellites to target combo // Add new satellites to target combo
for (int i = 0; i < m_settings.m_satellites.size(); i++) 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]); ui->target->addItem(m_settings.m_satellites[i]);
} }
}
// Select current target, if it still exists // Select current target, if it still exists
int idx = ui->target->findText(m_settings.m_target); int idx = ui->target->findText(m_settings.m_target);
if (idx != -1)
if (idx != -1) {
ui->target->setCurrentIndex(idx); ui->target->setCurrentIndex(idx);
else } else {
setTarget(""); setTarget("");
}
} }
void SatelliteTrackerGUI::handleInputMessages() void SatelliteTrackerGUI::handleInputMessages()
@ -232,7 +259,6 @@ void SatelliteTrackerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
RollupContents *rollupContents = getRollupContents(); RollupContents *rollupContents = getRollupContents();
rollupContents->saveState(m_rollupState); rollupContents->saveState(m_rollupState);
applySettings();
} }
SatelliteTrackerGUI::SatelliteTrackerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent) : SatelliteTrackerGUI::SatelliteTrackerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent) :
@ -320,6 +346,7 @@ SatelliteTrackerGUI::~SatelliteTrackerGUI()
void SatelliteTrackerGUI::setWorkspaceIndex(int index) void SatelliteTrackerGUI::setWorkspaceIndex(int index)
{ {
m_settings.m_workspaceIndex = index; m_settings.m_workspaceIndex = index;
m_settingsKeys.append("workspaceIndex");
m_feature->setWorkspaceIndex(index); m_feature->setWorkspaceIndex(index);
} }
@ -382,6 +409,14 @@ void SatelliteTrackerGUI::onMenuDialogCalled(const QPoint &p)
setTitle(m_settings.m_title); setTitle(m_settings.m_title);
setTitleColor(m_settings.m_rgbColor); 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(); applySettings();
} }
@ -418,6 +453,7 @@ void SatelliteTrackerGUI::on_startStop_toggled(bool checked)
void SatelliteTrackerGUI::on_latitude_valueChanged(double value) void SatelliteTrackerGUI::on_latitude_valueChanged(double value)
{ {
m_settings.m_latitude = value; m_settings.m_latitude = value;
m_settingsKeys.append("latitude");
applySettings(); applySettings();
plotChart(); plotChart();
} }
@ -425,6 +461,7 @@ void SatelliteTrackerGUI::on_latitude_valueChanged(double value)
void SatelliteTrackerGUI::on_longitude_valueChanged(double value) void SatelliteTrackerGUI::on_longitude_valueChanged(double value)
{ {
m_settings.m_longitude = value; m_settings.m_longitude = value;
m_settingsKeys.append("longitude");
applySettings(); applySettings();
plotChart(); plotChart();
} }
@ -434,6 +471,7 @@ void SatelliteTrackerGUI::setTarget(const QString& target)
if (target != m_settings.m_target) if (target != m_settings.m_target)
{ {
m_settings.m_target = target; m_settings.m_target = target;
m_settingsKeys.append("target");
ui->azimuth->setText(""); ui->azimuth->setText("");
ui->elevation->setText(""); ui->elevation->setText("");
ui->aos->setText(""); ui->aos->setText("");
@ -465,6 +503,7 @@ void SatelliteTrackerGUI::on_useMyPosition_clicked(bool checked)
ui->latitude->setValue(stationLatitude); ui->latitude->setValue(stationLatitude);
ui->longitude->setValue(stationLongitude); ui->longitude->setValue(stationLongitude);
m_settings.m_heightAboveSeaLevel = stationAltitude; m_settings.m_heightAboveSeaLevel = stationAltitude;
m_settingsKeys.append("heightAboveSeaLevel");
applySettings(); applySettings();
plotChart(); plotChart();
} }
@ -473,8 +512,10 @@ void SatelliteTrackerGUI::on_useMyPosition_clicked(bool checked)
void SatelliteTrackerGUI::on_displaySettings_clicked() void SatelliteTrackerGUI::on_displaySettings_clicked()
{ {
SatelliteTrackerSettingsDialog dialog(&m_settings); SatelliteTrackerSettingsDialog dialog(&m_settings);
if (dialog.exec() == QDialog::Accepted) if (dialog.exec() == QDialog::Accepted)
{ {
m_settingsKeys.append("deviceSettings");
applySettings(); applySettings();
plotChart(); plotChart();
} }
@ -483,6 +524,7 @@ void SatelliteTrackerGUI::on_displaySettings_clicked()
void SatelliteTrackerGUI::on_dateTimeSelect_currentIndexChanged(int index) void SatelliteTrackerGUI::on_dateTimeSelect_currentIndexChanged(int index)
{ {
m_settings.m_dateTimeSelect = (SatelliteTrackerSettings::DateTimeSelect)index; m_settings.m_dateTimeSelect = (SatelliteTrackerSettings::DateTimeSelect)index;
if (m_settings.m_dateTimeSelect != SatelliteTrackerSettings::CUSTOM) if (m_settings.m_dateTimeSelect != SatelliteTrackerSettings::CUSTOM)
{ {
m_settings.m_dateTime = ""; 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); m_settings.m_dateTime = ui->dateTime->dateTime().toString(Qt::ISODateWithMs);
ui->dateTime->setVisible(true); ui->dateTime->setVisible(true);
} }
ui->deviceFeatureSelect->setVisible(m_settings.m_dateTimeSelect >= SatelliteTrackerSettings::FROM_MAP); ui->deviceFeatureSelect->setVisible(m_settings.m_dateTimeSelect >= SatelliteTrackerSettings::FROM_MAP);
updateDeviceFeatureCombo(); updateDeviceFeatureCombo();
m_settingsKeys.append("dateTimeSelect");
m_settingsKeys.append("dateTime");
applySettings(); applySettings();
plotChart(); plotChart();
} }
@ -503,9 +549,11 @@ void SatelliteTrackerGUI::on_dateTimeSelect_currentIndexChanged(int index)
void SatelliteTrackerGUI::on_dateTime_dateTimeChanged(const QDateTime &datetime) void SatelliteTrackerGUI::on_dateTime_dateTimeChanged(const QDateTime &datetime)
{ {
(void) datetime; (void) datetime;
if (ui->dateTimeSelect->currentIndex() == 1) if (ui->dateTimeSelect->currentIndex() == 1)
{ {
m_settings.m_dateTime = ui->dateTime->dateTime().toString(Qt::ISODateWithMs); m_settings.m_dateTime = ui->dateTime->dateTime().toString(Qt::ISODateWithMs);
m_settingsKeys.append("dateTime");
applySettings(); applySettings();
plotChart(); plotChart();
} }
@ -514,8 +562,9 @@ void SatelliteTrackerGUI::on_dateTime_dateTimeChanged(const QDateTime &datetime)
// Find target on the Map // Find target on the Map
void SatelliteTrackerGUI::on_viewOnMap_clicked() void SatelliteTrackerGUI::on_viewOnMap_clicked()
{ {
if (!m_settings.m_target.isEmpty()) if (!m_settings.m_target.isEmpty()) {
FeatureWebAPIUtils::mapFind(m_settings.m_target); FeatureWebAPIUtils::mapFind(m_settings.m_target);
}
} }
void SatelliteTrackerGUI::on_updateSatData_clicked() void SatelliteTrackerGUI::on_updateSatData_clicked()
@ -526,9 +575,11 @@ void SatelliteTrackerGUI::on_updateSatData_clicked()
void SatelliteTrackerGUI::on_selectSats_clicked() void SatelliteTrackerGUI::on_selectSats_clicked()
{ {
SatelliteSelectionDialog dialog(&m_settings, m_satellites); SatelliteSelectionDialog dialog(&m_settings, m_satellites);
if (dialog.exec() == QDialog::Accepted) if (dialog.exec() == QDialog::Accepted)
{ {
updateSelectedSats(); updateSelectedSats();
m_settingsKeys.append("satellites");
applySettings(); applySettings();
} }
} }
@ -536,13 +587,18 @@ void SatelliteTrackerGUI::on_selectSats_clicked()
void SatelliteTrackerGUI::on_radioControl_clicked() void SatelliteTrackerGUI::on_radioControl_clicked()
{ {
SatelliteRadioControlDialog dialog(&m_settings, m_satellites); SatelliteRadioControlDialog dialog(&m_settings, m_satellites);
if (dialog.exec() == QDialog::Accepted) if (dialog.exec() == QDialog::Accepted)
{
m_settingsKeys.append("deviceSettings");
applySettings(); applySettings();
}
} }
void SatelliteTrackerGUI::on_autoTarget_clicked(bool checked) void SatelliteTrackerGUI::on_autoTarget_clicked(bool checked)
{ {
m_settings.m_autoTarget = checked; m_settings.m_autoTarget = checked;
m_settingsKeys.append("autoTarget");
applySettings(); applySettings();
} }
@ -584,17 +640,19 @@ void SatelliteTrackerGUI::updateStatus()
// Indicate if satellite data is being updated // Indicate if satellite data is being updated
bool updatingSatData = m_satelliteTracker->isUpdatingSatData(); bool updatingSatData = m_satelliteTracker->isUpdatingSatData();
if (updatingSatData != m_lastUpdatingSatData) if (updatingSatData != m_lastUpdatingSatData)
{ {
if (updatingSatData) if (updatingSatData) {
ui->updateSatData->setStyleSheet("QToolButton { background-color : green; }"); ui->updateSatData->setStyleSheet("QToolButton { background-color : green; }");
else } else {
ui->updateSatData->setStyleSheet("QToolButton { background: none; }"); ui->updateSatData->setStyleSheet("QToolButton { background: none; }");
}
m_lastUpdatingSatData = updatingSatData; m_lastUpdatingSatData = updatingSatData;
} }
updateTimeToAOS(); updateTimeToAOS();
updateDeviceFeatureCombo(); updateDeviceFeatureCombo();
} }
@ -602,21 +660,29 @@ void SatelliteTrackerGUI::updateStatus()
void SatelliteTrackerGUI::updateTimeToAOS() void SatelliteTrackerGUI::updateTimeToAOS()
{ {
if (m_geostationarySatVisible) if (m_geostationarySatVisible)
{
ui->aos->setText("Now"); ui->aos->setText("Now");
}
else if (m_nextTargetAOS.isValid()) else if (m_nextTargetAOS.isValid())
{ {
QDateTime currentTime = m_satelliteTracker->currentDateTime(); // FIXME: UTC QDateTime currentTime = m_satelliteTracker->currentDateTime(); // FIXME: UTC
int secondsToAOS = m_nextTargetAOS.toSecsSinceEpoch() - currentTime.toSecsSinceEpoch(); int secondsToAOS = m_nextTargetAOS.toSecsSinceEpoch() - currentTime.toSecsSinceEpoch();
if (secondsToAOS > 0) if (secondsToAOS > 0)
{ {
int seconds = secondsToAOS % 60; int seconds = secondsToAOS % 60;
int minutes = (secondsToAOS / 60) % 60; int minutes = (secondsToAOS / 60) % 60;
int hours = (secondsToAOS / (60 * 60)) % 24; int hours = (secondsToAOS / (60 * 60)) % 24;
int days = secondsToAOS / (60 * 60 * 24); int days = secondsToAOS / (60 * 60 * 24);
if (days == 1) if (days == 1)
{
ui->aos->setText(QString("1 day")); ui->aos->setText(QString("1 day"));
}
else if (days > 0) else if (days > 0)
{
ui->aos->setText(QString("%1 days").arg(days)); ui->aos->setText(QString("%1 days").arg(days));
}
else else
{ {
ui->aos->setText(QString("%1:%2:%3") ui->aos->setText(QString("%1:%2:%3")
@ -626,10 +692,14 @@ void SatelliteTrackerGUI::updateTimeToAOS()
} }
} }
else if (m_nextTargetLOS < currentTime) else if (m_nextTargetLOS < currentTime)
{
ui->aos->setText(""); ui->aos->setText("");
}
else else
{
ui->aos->setText("Now"); ui->aos->setText("Now");
} }
}
else else
ui->aos->setText(""); ui->aos->setText("");
} }
@ -638,9 +708,12 @@ void SatelliteTrackerGUI::applySettings(bool force)
{ {
if (m_doApplySettings) 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_satelliteTracker->getInputMessageQueue()->push(message);
} }
m_settingsKeys.clear();
} }
void SatelliteTrackerGUI::on_nextPass_clicked() void SatelliteTrackerGUI::on_nextPass_clicked()
@ -670,6 +743,7 @@ void SatelliteTrackerGUI::on_darkTheme_clicked(bool checked)
{ {
m_settings.m_chartsDarkTheme = checked; m_settings.m_chartsDarkTheme = checked;
plotChart(); plotChart();
m_settingsKeys.append("chartsDarkTheme");
applySettings(); applySettings();
} }
@ -681,10 +755,11 @@ void SatelliteTrackerGUI::on_chartSelect_currentIndexChanged(int index)
void SatelliteTrackerGUI::plotChart() void SatelliteTrackerGUI::plotChart()
{ {
if (ui->chartSelect->currentIndex() == 0) if (ui->chartSelect->currentIndex() == 0) {
plotPolarChart(); plotPolarChart();
else } else {
plotAzElChart(); plotAzElChart();
}
} }
// Linear interpolation // Linear interpolation
@ -709,6 +784,7 @@ void SatelliteTrackerGUI::plotPolarChart()
m_plotPass = m_targetSatState->m_passes.size() - 1; m_plotPass = m_targetSatState->m_passes.size() - 1;
ui->passLabel->setText(QString("%1").arg(m_plotPass)); 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 // 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()) if (pass.m_aos.isValid() && pass.m_los.isValid())
{ {
QString title; 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(); QLineSeries *polarSeries = new QLineSeries();
getPassAzEl(nullptr, nullptr, polarSeries, getPassAzEl(
sat->m_tle->m_tle0, sat->m_tle->m_tle1, sat->m_tle->m_tle2, nullptr,
m_settings.m_latitude, m_settings.m_longitude, m_settings.m_heightAboveSeaLevel/1000.0, nullptr,
pass.m_aos, pass.m_los); 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 // 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) // 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 prevAz = polarSeries->at(0).x();
qreal prevEl = polarSeries->at(0).y(); qreal prevEl = polarSeries->at(0).y();
for (int i = 1; i < polarSeries->count(); i++) for (int i = 1; i < polarSeries->count(); i++)
{ {
qreal az = polarSeries->at(i).x(); qreal az = polarSeries->at(i).x();
qreal el = polarSeries->at(i).y(); qreal el = polarSeries->at(i).y();
if ((prevAz > 270.0) && (az <= 90.0)) if ((prevAz > 270.0) && (az <= 90.0))
{ {
double elMid = interpolate(prevAz, prevEl, az+360.0, el, 360.0); double elMid = interpolate(prevAz, prevEl, az+360.0, el, 360.0);
@ -789,7 +877,10 @@ void SatelliteTrackerGUI::plotPolarChart()
s->append(az, el); s->append(az, el);
} }
else else
{
s->append(polarSeries->at(i)); s->append(polarSeries->at(i));
}
prevAz = az; prevAz = az;
prevEl = el; prevEl = el;
} }
@ -805,14 +896,19 @@ void SatelliteTrackerGUI::plotPolarChart()
QLineSeries *aosSeries = new QLineSeries(); QLineSeries *aosSeries = new QLineSeries();
aosSeries->append(polarSeries->at(0)); aosSeries->append(polarSeries->at(0));
QTime time; QTime time;
if (m_settings.m_utc)
if (m_settings.m_utc) {
time = pass.m_aos.time(); time = pass.m_aos.time();
else } else {
time = pass.m_aos.toLocalTime().time(); 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"))); aosSeries->setPointLabelsFormat(QString("AOS %1").arg(time.toString("hh:mm")));
else } else {
aosSeries->setPointLabelsFormat(QString("AOS %1").arg(time.toString("hh:mm"))); aosSeries->setPointLabelsFormat(QString("AOS %1").arg(time.toString("hh:mm")));
}
aosSeries->setPointLabelsVisible(true); aosSeries->setPointLabelsVisible(true);
aosSeries->setPointLabelsClipping(false); aosSeries->setPointLabelsClipping(false);
m_polarChart->addSeries(aosSeries); m_polarChart->addSeries(aosSeries);
@ -821,24 +917,29 @@ void SatelliteTrackerGUI::plotPolarChart()
// Create series with single point, so we can plot time of LOS // Create series with single point, so we can plot time of LOS
QLineSeries *losSeries = new QLineSeries(); QLineSeries *losSeries = new QLineSeries();
losSeries->append(polarSeries->at(polarSeries->count()-1)); losSeries->append(polarSeries->at(polarSeries->count()-1));
if (m_settings.m_utc)
if (m_settings.m_utc) {
time = pass.m_los.time(); time = pass.m_los.time();
else } else {
time = pass.m_los.toLocalTime().time(); time = pass.m_los.toLocalTime().time();
}
losSeries->setPointLabelsFormat(QString("LOS %1").arg(time.toString("hh:mm"))); losSeries->setPointLabelsFormat(QString("LOS %1").arg(time.toString("hh:mm")));
losSeries->setPointLabelsVisible(true); losSeries->setPointLabelsVisible(true);
losSeries->setPointLabelsClipping(false); losSeries->setPointLabelsClipping(false);
m_polarChart->addSeries(losSeries); m_polarChart->addSeries(losSeries);
losSeries->attachAxis(angularAxis); losSeries->attachAxis(angularAxis);
losSeries->attachAxis(radialAxis); losSeries->attachAxis(radialAxis);
QDateTime currentTime; QDateTime currentTime;
if (m_settings.m_dateTime == "")
if (m_settings.m_dateTime == "") {
currentTime = m_satelliteTracker->currentDateTimeUtc(); 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); currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs);
else } else {
currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs).toUTC(); currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs).toUTC();
}
if ((currentTime >= pass.m_aos) && (currentTime <= pass.m_los)) if ((currentTime >= pass.m_aos) && (currentTime <= pass.m_los))
{ {
// Create series with single point, so we can plot current time // Create series with single point, so we can plot current time
@ -863,26 +964,39 @@ void SatelliteTrackerGUI::plotPolarChart()
{ {
// Possibly geostationary, just plot current position // Possibly geostationary, just plot current position
QDateTime currentTime; QDateTime currentTime;
if (m_settings.m_dateTime == "")
if (m_settings.m_dateTime == "") {
currentTime = m_satelliteTracker->currentDateTimeUtc(); 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); currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs);
else } else {
currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs).toUTC(); currentTime = QDateTime::fromString(m_settings.m_dateTime, Qt::ISODateWithMs).toUTC();
}
QString title; QString title;
if (m_settings.m_utc)
if (m_settings.m_utc) {
title = currentTime.date().toString(m_settings.m_dateFormat); title = currentTime.date().toString(m_settings.m_dateFormat);
else } else {
title = currentTime.toLocalTime().date().toString(m_settings.m_dateFormat); title = currentTime.toLocalTime().date().toString(m_settings.m_dateFormat);
}
m_polarChart->setTitle(QString("%1").arg(title)); m_polarChart->setTitle(QString("%1").arg(title));
QLineSeries *nowSeries = new QLineSeries(); QLineSeries *nowSeries = new QLineSeries();
QDateTime endTime = currentTime.addSecs(1); QDateTime endTime = currentTime.addSecs(1);
getPassAzEl(nullptr, nullptr, nowSeries,
sat->m_tle->m_tle0, sat->m_tle->m_tle1, sat->m_tle->m_tle2, getPassAzEl(
m_settings.m_latitude, m_settings.m_longitude, m_settings.m_heightAboveSeaLevel/1000.0, nullptr,
currentTime, endTime); 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->setPointLabelsFormat(m_settings.m_target);
nowSeries->setPointLabelsVisible(true); nowSeries->setPointLabelsVisible(true);
@ -893,7 +1007,6 @@ void SatelliteTrackerGUI::plotPolarChart()
} }
ui->passChart->setChart(m_polarChart); ui->passChart->setChart(m_polarChart);
delete oldChart; delete oldChart;
} }
@ -913,20 +1026,22 @@ void SatelliteTrackerGUI::plotAzElChart()
m_plotPass = m_targetSatState->m_passes.size() - 1; m_plotPass = m_targetSatState->m_passes.size() - 1;
ui->passLabel->setText(QString("%1").arg(m_plotPass)); 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 // Always create a new chart, otherwise sometimes they aren't drawn properly
m_lineChart = new QChart(); m_lineChart = new QChart();
m_lineChart->setTheme(m_settings.m_chartsDarkTheme ? QChart::ChartThemeDark : QChart::ChartThemeLight); m_lineChart->setTheme(m_settings.m_chartsDarkTheme ? QChart::ChartThemeDark : QChart::ChartThemeLight);
QDateTimeAxis *xAxis = new QDateTimeAxis(); QDateTimeAxis *xAxis = new QDateTimeAxis();
QValueAxis *yLeftAxis = new QValueAxis(); QValueAxis *yLeftAxis = new QValueAxis();
QValueAxis *yRightAxis = new QValueAxis(); QValueAxis *yRightAxis = new QValueAxis();
QString title; QString title;
if (m_settings.m_utc)
if (m_settings.m_utc) {
title = pass.m_aos.date().toString(m_settings.m_dateFormat); title = pass.m_aos.date().toString(m_settings.m_dateFormat);
else } else {
title = pass.m_aos.toLocalTime().date().toString(m_settings.m_dateFormat); title = pass.m_aos.toLocalTime().date().toString(m_settings.m_dateFormat);
}
m_lineChart->setTitle(QString("%1").arg(title)); m_lineChart->setTitle(QString("%1").arg(title));
m_lineChart->legend()->hide(); m_lineChart->legend()->hide();
m_lineChart->addAxis(xAxis, Qt::AlignBottom); m_lineChart->addAxis(xAxis, Qt::AlignBottom);
@ -934,16 +1049,23 @@ void SatelliteTrackerGUI::plotAzElChart()
m_lineChart->addAxis(yRightAxis, Qt::AlignRight); m_lineChart->addAxis(yRightAxis, Qt::AlignRight);
m_lineChart->layout()->setContentsMargins(0, 0, 0, 0); m_lineChart->layout()->setContentsMargins(0, 0, 0, 0);
m_lineChart->setMargins(QMargins(1, 1, 1, 1)); m_lineChart->setMargins(QMargins(1, 1, 1, 1));
SatNogsSatellite *sat = m_satellites.value(m_settings.m_target); SatNogsSatellite *sat = m_satellites.value(m_settings.m_target);
QLineSeries *azSeries = new QLineSeries(); QLineSeries *azSeries = new QLineSeries();
QLineSeries *elSeries = new QLineSeries(); QLineSeries *elSeries = new QLineSeries();
getPassAzEl(azSeries, elSeries, nullptr, getPassAzEl(
sat->m_tle->m_tle0, sat->m_tle->m_tle1, sat->m_tle->m_tle2, azSeries,
m_settings.m_latitude, m_settings.m_longitude, m_settings.m_heightAboveSeaLevel/1000.0, elSeries,
pass.m_aos, pass.m_los); 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 // Split crossing of 360/0 degrees in to multiple series in the same colour
QList<QLineSeries *> azSeriesList; QList<QLineSeries *> azSeriesList;
@ -952,15 +1074,18 @@ void SatelliteTrackerGUI::plotAzElChart()
azSeriesList.append(s); azSeriesList.append(s);
s->setPen(pen); s->setPen(pen);
qreal prevAz = azSeries->at(0).y(); qreal prevAz = azSeries->at(0).y();
for (int i = 0; i < azSeries->count(); i++) for (int i = 0; i < azSeries->count(); i++)
{ {
qreal az = azSeries->at(i).y(); qreal az = azSeries->at(i).y();
if (((prevAz >= 270) && (az < 90)) || ((prevAz < 90) && (az >= 270))) if (((prevAz >= 270) && (az < 90)) || ((prevAz < 90) && (az >= 270)))
{ {
s = new QLineSeries(); s = new QLineSeries();
azSeriesList.append(s); azSeriesList.append(s);
s->setPen(pen); s->setPen(pen);
} }
s->append(azSeries->at(i).x(), az); s->append(azSeries->at(i).x(), az);
prevAz = az; prevAz = az;
} }
@ -968,12 +1093,14 @@ void SatelliteTrackerGUI::plotAzElChart()
m_lineChart->addSeries(elSeries); m_lineChart->addSeries(elSeries);
elSeries->attachAxis(xAxis); elSeries->attachAxis(xAxis);
elSeries->attachAxis(yLeftAxis); elSeries->attachAxis(yLeftAxis);
for (int i = 0; i < azSeriesList.size(); i++) for (int i = 0; i < azSeriesList.size(); i++)
{ {
m_lineChart->addSeries(azSeriesList[i]); m_lineChart->addSeries(azSeriesList[i]);
azSeriesList[i]->attachAxis(xAxis); azSeriesList[i]->attachAxis(xAxis);
azSeriesList[i]->attachAxis(yRightAxis); azSeriesList[i]->attachAxis(yRightAxis);
} }
xAxis->setRange(pass.m_aos, pass.m_los); xAxis->setRange(pass.m_aos, pass.m_los);
xAxis->setFormat("hh:mm"); xAxis->setFormat("hh:mm");
yLeftAxis->setRange(0.0, 90.0); yLeftAxis->setRange(0.0, 90.0);
@ -1022,32 +1149,39 @@ void SatelliteTrackerGUI::resizeTable()
QString SatelliteTrackerGUI::formatDaysTime(qint64 days, QDateTime dateTime) QString SatelliteTrackerGUI::formatDaysTime(qint64 days, QDateTime dateTime)
{ {
QDateTime dt; QDateTime dt;
if (m_settings.m_utc)
if (m_settings.m_utc) {
dt = dateTime.toUTC(); dt = dateTime.toUTC();
else } else {
dt = dateTime.toLocalTime(); dt = dateTime.toLocalTime();
if (abs(days) > 10) }
if (abs(days) > 10) {
return dt.date().toString(m_settings.m_dateFormat); return dt.date().toString(m_settings.m_dateFormat);
else if (days == 0) } else if (days == 0) {
return dt.time().toString("hh:mm"); return dt.time().toString("hh:mm");
else if (days > 0) } else if (days > 0) {
return dt.time().toString(QString("hh:mm +%1").arg(days)); return dt.time().toString(QString("hh:mm +%1").arg(days));
else } else {
return dt.time().toString(QString("hh:mm %1").arg(days)); return dt.time().toString(QString("hh:mm %1").arg(days));
}
} }
QString SatelliteTrackerGUI::formatSecondsAsHHMMSS(qint64 seconds) QString SatelliteTrackerGUI::formatSecondsAsHHMMSS(qint64 seconds)
{ {
char const* sign = ""; char const* sign = "";
if(seconds < 0)
if (seconds < 0)
{ {
sign = "-"; sign = "-";
seconds = -seconds; seconds = -seconds;
} }
int minutes = seconds / 60; int minutes = seconds / 60;
seconds = seconds % 60; seconds = seconds % 60;
int hours = minutes / 60; int hours = minutes / 60;
minutes = minutes % 60; minutes = minutes % 60;
if (hours > 0) { 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')); return QString("%1%2:%3:%4").arg(sign).arg(hours).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0'));
} else { } else {
@ -1062,11 +1196,13 @@ public:
{ {
QVariant v1 = data(Qt::UserRole); QVariant v1 = data(Qt::UserRole);
QVariant v2 = other.data(Qt::UserRole); QVariant v2 = other.data(Qt::UserRole);
if (v1.isValid() && v2.isValid())
if (v1.isValid() && v2.isValid()) {
return v1.toDateTime() < v2.toDateTime(); return v1.toDateTime() < v2.toDateTime();
else } else {
return false; return false;
} }
}
}; };
// Handle sorting for next column, which can have times as HH:MM:SS or MM:SS // Handle sorting for next column, which can have times as HH:MM:SS or MM:SS
@ -1079,6 +1215,7 @@ public:
QString t2 = other.text(); QString t2 = other.text();
int t1Colons = t1.count(":"); int t1Colons = t1.count(":");
int t2Colons = t2.count(":"); int t2Colons = t2.count(":");
if (t1Colons == t2Colons) if (t1Colons == t2Colons)
{ {
QCollator coll; QCollator coll;
@ -1129,28 +1266,34 @@ void SatelliteTrackerGUI::updateTable(SatelliteState *satState)
// Does the table already contain this satellite? // Does the table already contain this satellite?
QList<QTableWidgetItem *> matches = ui->satTable->findItems(satState->m_name, Qt::MatchExactly); QList<QTableWidgetItem *> matches = ui->satTable->findItems(satState->m_name, Qt::MatchExactly);
QTableWidgetItem *items[SAT_COL_COLUMNS]; QTableWidgetItem *items[SAT_COL_COLUMNS];
if (matches.size() == 0) if (matches.size() == 0)
{ {
// Add a new row // Add a new row
ui->satTable->setSortingEnabled(false); ui->satTable->setSortingEnabled(false);
int row = ui->satTable->rowCount(); int row = ui->satTable->rowCount();
ui->satTable->setRowCount(row + 1); ui->satTable->setRowCount(row + 1);
for (int i = 0; i < SAT_COL_COLUMNS; i++) 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(); 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(); items[i] = new QTableWidgetItem();
else if (i == SAT_COL_TNE) } else if (i == SAT_COL_TNE) {
items[i] = new NextEventTableWidgetItem(); items[i] = new NextEventTableWidgetItem();
else } else {
items[i] = new NaturallySortedTableWidgetItem(); items[i] = new NaturallySortedTableWidgetItem();
}
items[i]->setToolTip(ui->satTable->horizontalHeaderItem(i)->toolTip()); items[i]->setToolTip(ui->satTable->horizontalHeaderItem(i)->toolTip());
ui->satTable->setItem(row, i, items[i]); ui->satTable->setItem(row, i, items[i]);
} }
ui->satTable->setSortingEnabled(true); ui->satTable->setSortingEnabled(true);
// Static columns // Static columns
items[SAT_COL_NAME]->setText(satState->m_name); items[SAT_COL_NAME]->setText(satState->m_name);
if (m_satellites.contains(satState->m_name)) if (m_satellites.contains(satState->m_name))
{ {
SatNogsSatellite *sat = m_satellites.value(satState->m_name); SatNogsSatellite *sat = m_satellites.value(satState->m_name);
@ -1162,39 +1305,49 @@ void SatelliteTrackerGUI::updateTable(SatelliteState *satState)
SAT_COL_LATITUDE, SAT_COL_LONGITUDE, SAT_COL_LATITUDE, SAT_COL_LONGITUDE,
SAT_COL_ALT, SAT_COL_RANGE, SAT_COL_RANGE_RATE, SAT_COL_DOPPLER, SAT_COL_ALT, SAT_COL_RANGE, SAT_COL_RANGE_RATE, SAT_COL_DOPPLER,
SAT_COL_PATH_LOSS, SAT_COL_DELAY}) SAT_COL_PATH_LOSS, SAT_COL_DELAY})
{
items[col]->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); items[col]->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
} }
}
else else
{ {
// Update existing row // Update existing row
int row = ui->satTable->row(matches[0]); 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[i] = ui->satTable->item(row, i);
} }
}
items[SAT_COL_AZ]->setData(Qt::DisplayRole, (int)round(satState->m_azimuth)); items[SAT_COL_AZ]->setData(Qt::DisplayRole, (int)round(satState->m_azimuth));
items[SAT_COL_EL]->setData(Qt::DisplayRole, (int)round(satState->m_elevation)); items[SAT_COL_EL]->setData(Qt::DisplayRole, (int)round(satState->m_elevation));
if (satState->m_passes.size() > 0) if (satState->m_passes.size() > 0)
{ {
// Get number of days to AOS/LOS // Get number of days to AOS/LOS
QDateTime currentDateTime = m_satelliteTracker->currentDateTime(); QDateTime currentDateTime = m_satelliteTracker->currentDateTime();
int daysToAOS = currentDateTime.daysTo(satState->m_passes[0].m_aos); int daysToAOS = currentDateTime.daysTo(satState->m_passes[0].m_aos);
int daysToLOS = currentDateTime.daysTo(satState->m_passes[0].m_los); 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"); 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_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_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]->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_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]->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_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)); 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 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 items[SAT_COL_DIR]->setText(QString("%1").arg(QChar(0x2191))); // Up arrow
} }
}
else else
{ {
items[SAT_COL_TNE]->setText(""); items[SAT_COL_TNE]->setText("");
@ -1204,6 +1357,7 @@ void SatelliteTrackerGUI::updateTable(SatelliteState *satState)
items[SAT_COL_MAX_EL]->setData(Qt::DisplayRole, QVariant()); items[SAT_COL_MAX_EL]->setData(Qt::DisplayRole, QVariant());
items[SAT_COL_DIR]->setText(""); items[SAT_COL_DIR]->setText("");
} }
items[SAT_COL_LATITUDE]->setData(Qt::DisplayRole, satState->m_latitude); items[SAT_COL_LATITUDE]->setData(Qt::DisplayRole, satState->m_latitude);
items[SAT_COL_LONGITUDE]->setData(Qt::DisplayRole, satState->m_longitude); items[SAT_COL_LONGITUDE]->setData(Qt::DisplayRole, satState->m_longitude);
items[SAT_COL_ALT]->setData(Qt::DisplayRole, (int)round(satState->m_altitude)); 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_columnSort = logicalIndex;
m_settings.m_columnSortOrder = order; m_settings.m_columnSortOrder = order;
m_settingsKeys.append("columnSort");
m_settingsKeys.append("columnSortOrder");
applySettings(); applySettings();
} }
@ -1254,6 +1411,7 @@ void SatelliteTrackerGUI::columnSelectMenuChecked(bool checked)
{ {
(void) checked; (void) checked;
QAction* action = qobject_cast<QAction*>(sender()); QAction* action = qobject_cast<QAction*>(sender());
if (action != nullptr) if (action != nullptr)
{ {
int idx = action->data().toInt(nullptr); int idx = action->data().toInt(nullptr);
@ -1297,10 +1455,12 @@ void SatelliteTrackerGUI::updateDeviceFeatureCombo(const QStringList &items, con
for (auto item : items) for (auto item : items)
{ {
int idx = ui->deviceFeatureSelect->findText(item); int idx = ui->deviceFeatureSelect->findText(item);
if (idx == -1) { if (idx == -1) {
ui->deviceFeatureSelect->addItem(item); ui->deviceFeatureSelect->addItem(item);
} }
} }
ui->deviceFeatureSelect->setCurrentIndex(ui->deviceFeatureSelect->findText(selected)); ui->deviceFeatureSelect->setCurrentIndex(ui->deviceFeatureSelect->findText(selected));
} }
@ -1310,12 +1470,14 @@ void SatelliteTrackerGUI::updateFileInputList()
std::vector<DeviceSet*>& deviceSets = MainCore::instance()->getDeviceSets(); std::vector<DeviceSet*>& deviceSets = MainCore::instance()->getDeviceSets();
int deviceIndex = 0; int deviceIndex = 0;
QStringList items; QStringList items;
for (std::vector<DeviceSet*>::const_iterator it = deviceSets.begin(); it != deviceSets.end(); ++it, deviceIndex++) for (std::vector<DeviceSet*>::const_iterator it = deviceSets.begin(); it != deviceSets.end(); ++it, deviceIndex++)
{ {
if ((*it)->m_deviceAPI && (*it)->m_deviceAPI->getHardwareId() == "FileInput") { if ((*it)->m_deviceAPI && (*it)->m_deviceAPI->getHardwareId() == "FileInput") {
items.append(QString("R%1").arg(deviceIndex)); items.append(QString("R%1").arg(deviceIndex));
} }
} }
updateDeviceFeatureCombo(items, m_settings.m_fileInputDevice); updateDeviceFeatureCombo(items, m_settings.m_fileInputDevice);
} }
@ -1325,27 +1487,36 @@ void SatelliteTrackerGUI::updateMapList()
std::vector<FeatureSet*>& featureSets = MainCore::instance()->getFeatureeSets(); std::vector<FeatureSet*>& featureSets = MainCore::instance()->getFeatureeSets();
int featureIndex = 0; int featureIndex = 0;
QStringList items; QStringList items;
for (std::vector<FeatureSet*>::const_iterator it = featureSets.begin(); it != featureSets.end(); ++it, featureIndex++) for (std::vector<FeatureSet*>::const_iterator it = featureSets.begin(); it != featureSets.end(); ++it, featureIndex++)
{ {
for (int fi = 0; fi < (*it)->getNumberOfFeatures(); fi++) for (int fi = 0; fi < (*it)->getNumberOfFeatures(); fi++)
{ {
Feature *feature = (*it)->getFeatureAt(fi); Feature *feature = (*it)->getFeatureAt(fi);
if (feature->getURI() == "sdrangel.feature.map") { if (feature->getURI() == "sdrangel.feature.map") {
items.append(QString("F%1:%2").arg(featureIndex).arg(fi)); items.append(QString("F%1:%2").arg(featureIndex).arg(fi));
} }
} }
} }
updateDeviceFeatureCombo(items, m_settings.m_mapFeature); updateDeviceFeatureCombo(items, m_settings.m_mapFeature);
} }
void SatelliteTrackerGUI::on_deviceFeatureSelect_currentIndexChanged(int index) void SatelliteTrackerGUI::on_deviceFeatureSelect_currentIndexChanged(int index)
{ {
(void) 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(); m_settings.m_mapFeature = ui->deviceFeatureSelect->currentText();
} else { m_settingsKeys.append("mapFeature");
} else
{
m_settings.m_fileInputDevice = ui->deviceFeatureSelect->currentText(); m_settings.m_fileInputDevice = ui->deviceFeatureSelect->currentText();
m_settingsKeys.append("fileInputDevice");
} }
applySettings(); applySettings();
} }

View File

@ -64,6 +64,7 @@ private:
PluginAPI* m_pluginAPI; PluginAPI* m_pluginAPI;
FeatureUISet* m_featureUISet; FeatureUISet* m_featureUISet;
SatelliteTrackerSettings m_settings; SatelliteTrackerSettings m_settings;
QList<QString> m_settingsKeys;
RollupState m_rollupState; RollupState m_rollupState;
bool m_doApplySettings; bool m_doApplySettings;

View File

@ -344,3 +344,346 @@ SatelliteTrackerSettings::SatelliteDeviceSettings::SatelliteDeviceSettings()
m_aosCommand = ""; m_aosCommand = "";
m_losCommand = ""; 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();
}

View File

@ -45,6 +45,8 @@ struct SatelliteTrackerSettings
QString m_aosCommand; //!< Command/script to execute on AOS QString m_aosCommand; //!< Command/script to execute on AOS
QString m_losCommand; //!< Command/script to execute on LOS QString m_losCommand; //!< Command/script to execute on LOS
SatelliteDeviceSettings(); SatelliteDeviceSettings();
void getDebugString(std::ostringstream& ostr);
}; };
double m_latitude; //!< Antenna location, degrees double m_latitude; //!< Antenna location, degrees
@ -108,6 +110,8 @@ struct SatelliteTrackerSettings
void deserializeStringList(const QByteArray& data, QList<QString>& strings); void deserializeStringList(const QByteArray& data, QList<QString>& strings);
QByteArray serializeDeviceSettings(QHash<QString, QList<SatelliteDeviceSettings *> *> deviceSettings) const; QByteArray serializeDeviceSettings(QHash<QString, QList<SatelliteDeviceSettings *> *> deviceSettings) const;
void deserializeDeviceSettings(const QByteArray& data, QHash<QString, QList<SatelliteDeviceSettings *> *>& deviceSettings); void deserializeDeviceSettings(const QByteArray& data, QHash<QString, QList<SatelliteDeviceSettings *> *>& deviceSettings);
void applySettings(const QStringList& settingsKeys, const SatelliteTrackerSettings& settings);
QString getDebugString(const QStringList& settingsKeys, bool force=false) const;
}; };
#endif // INCLUDE_FEATURE_SATELLITETRACKERSETTINGS_H_ #endif // INCLUDE_FEATURE_SATELLITETRACKERSETTINGS_H_

View File

@ -126,7 +126,7 @@ bool SatelliteTrackerWorker::handleMessage(const Message& message)
QMutexLocker mutexLocker(&m_mutex); QMutexLocker mutexLocker(&m_mutex);
MsgConfigureSatelliteTrackerWorker& cfg = (MsgConfigureSatelliteTrackerWorker&) message; MsgConfigureSatelliteTrackerWorker& cfg = (MsgConfigureSatelliteTrackerWorker&) message;
applySettings(cfg.getSettings(), cfg.getForce()); applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true; return true;
} }
else if (SatelliteTracker::MsgSatData::match(message)) 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<QString>& settingsKeys, bool force)
{ {
qDebug() << "SatelliteTrackerWorker::applySettings:" qDebug() << "SatelliteTrackerWorker::applySettings:" << settings.getDebugString(settingsKeys, force) << " force: " << force;
<< " 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;
if ((m_settings.m_target != settings.m_target) if (settingsKeys.contains("target")
|| (m_settings.m_latitude != settings.m_latitude) || settingsKeys.contains("latitude")
|| (m_settings.m_longitude != settings.m_longitude) || settingsKeys.contains("longitude")
|| (m_settings.m_heightAboveSeaLevel != settings.m_heightAboveSeaLevel) || settingsKeys.contains("heightAboveSeaLevel")
|| (m_settings.m_dateTime != settings.m_dateTime) || settingsKeys.contains("dateTime")
|| (m_settings.m_utc != settings.m_utc) || settingsKeys.contains("utc")
|| (m_settings.m_groundTrackPoints != settings.m_groundTrackPoints) || settingsKeys.contains("groundTrackPoints")
|| (m_settings.m_minAOSElevation != settings.m_minAOSElevation) || settingsKeys.contains("minAOSElevation")
|| (m_settings.m_minPassElevation != settings.m_minPassElevation) || settingsKeys.contains("minPassElevation")
|| (m_settings.m_predictionPeriod != settings.m_predictionPeriod) || settingsKeys.contains("predictionPeriod")
|| (m_settings.m_passStartTime != settings.m_passStartTime) || settingsKeys.contains("passStartTime")
|| (m_settings.m_passFinishTime != settings.m_passFinishTime) || settingsKeys.contains("passFinishTime")
|| (!m_settings.m_drawOnMap && settings.m_drawOnMap) || (!m_settings.m_drawOnMap && settings.m_drawOnMap)
|| force) || force)
{ {
@ -172,7 +166,7 @@ void SatelliteTrackerWorker::applySettings(const SatelliteTrackerSettings& setti
QTimer::singleShot(1, this, &SatelliteTrackerWorker::update); QTimer::singleShot(1, this, &SatelliteTrackerWorker::update);
m_pollTimer.start((int)round(settings.m_updatePeriod*1000.0)); 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)); m_pollTimer.start((int)round(settings.m_updatePeriod*1000.0));
} }
@ -213,7 +207,11 @@ void SatelliteTrackerWorker::applySettings(const SatelliteTrackerSettings& setti
} }
} }
if (force) {
m_settings = settings; m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
} }
void SatelliteTrackerWorker::removeFromMap(QString id) void SatelliteTrackerWorker::removeFromMap(QString id)

View File

@ -76,20 +76,22 @@ public:
public: public:
const SatelliteTrackerSettings& getSettings() const { return m_settings; } const SatelliteTrackerSettings& getSettings() const { return m_settings; }
const QList<QString>& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; } bool getForce() const { return m_force; }
static MsgConfigureSatelliteTrackerWorker* create(const SatelliteTrackerSettings& settings, bool force) static MsgConfigureSatelliteTrackerWorker* create(const SatelliteTrackerSettings& settings, const QList<QString>& settingsKeys, bool force) {
{ return new MsgConfigureSatelliteTrackerWorker(settings, settingsKeys, force);
return new MsgConfigureSatelliteTrackerWorker(settings, force);
} }
private: private:
SatelliteTrackerSettings m_settings; SatelliteTrackerSettings m_settings;
QList<QString> m_settingsKeys;
bool m_force; bool m_force;
MsgConfigureSatelliteTrackerWorker(const SatelliteTrackerSettings& settings, bool force) : MsgConfigureSatelliteTrackerWorker(const SatelliteTrackerSettings& settings, const QList<QString>& settingsKeys, bool force) :
Message(), Message(),
m_settings(settings), m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force) m_force(force)
{ } { }
}; };
@ -119,7 +121,7 @@ private:
QDateTime m_lastUpdateDateTime; QDateTime m_lastUpdateDateTime;
bool handleMessage(const Message& cmd); bool handleMessage(const Message& cmd);
void applySettings(const SatelliteTrackerSettings& settings, bool force = false); void applySettings(const SatelliteTrackerSettings& settings, const QList<QString>& settingsKeys, bool force = false);
MessageQueue *getMessageQueueToGUI() { return m_msgQueueToGUI; } MessageQueue *getMessageQueueToGUI() { return m_msgQueueToGUI; }
void removeFromMap(QString id); void removeFromMap(QString id);
void sendToMap( void sendToMap(