From a3692309c072197435efd3560d07edf3e85fb789 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Sun, 19 Jan 2025 13:09:16 +0000 Subject: [PATCH] Radiosonde: Rate limit position updates to SondeHub. Fixes #2378. --- plugins/feature/radiosonde/radiosondegui.cpp | 47 ++++++++++++++------ plugins/feature/radiosonde/radiosondegui.h | 4 ++ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/plugins/feature/radiosonde/radiosondegui.cpp b/plugins/feature/radiosonde/radiosondegui.cpp index 066448855..ecf023eb5 100644 --- a/plugins/feature/radiosonde/radiosondegui.cpp +++ b/plugins/feature/radiosonde/radiosondegui.cpp @@ -190,6 +190,8 @@ RadiosondeGUI::RadiosondeGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, F // Get updated when position changes connect(&MainCore::instance()->getSettings(), &MainSettings::preferenceChanged, this, &RadiosondeGUI::preferenceChanged); + connect(&m_positionUpdateTimer, &QTimer::timeout, this, &RadiosondeGUI::updatePosition); + m_positionUpdateTimer.setSingleShot(true); ui->radiosondes->setItemDelegateForColumn(RADIOSONDE_COL_LATITUDE, new DecimalDelegate(5, ui->radiosondes)); ui->radiosondes->setItemDelegateForColumn(RADIOSONDE_COL_LONGITUDE, new DecimalDelegate(5, ui->radiosondes)); @@ -979,22 +981,41 @@ QStringList RadiosondeGUI::getRadios() void RadiosondeGUI::updatePosition() { + // Limit number of position updates sent to SondeHub + const int updateTime = m_settings.m_mobile ? m_minMobilePositionUpdateTime : m_minFixedPositionUpdateTime; + if (m_sondeHub && m_settings.m_displayPosition) { - float stationLatitude = MainCore::instance()->getSettings().getLatitude(); - float stationLongitude = MainCore::instance()->getSettings().getLongitude(); - float stationAltitude = MainCore::instance()->getSettings().getAltitude(); + if (!m_lastPositionUpdate.isValid() || (m_lastPositionUpdate.secsTo(QDateTime::currentDateTime()) >= updateTime)) + { + float stationLatitude = MainCore::instance()->getSettings().getLatitude(); + float stationLongitude = MainCore::instance()->getSettings().getLongitude(); + float stationAltitude = MainCore::instance()->getSettings().getAltitude(); - m_sondeHub->updatePosition( - m_settings.m_callsign, - stationLatitude, - stationLongitude, - stationAltitude, - getRadios().join(" "), - m_settings.m_antenna, - m_settings.m_email, - m_settings.m_mobile - ); + m_sondeHub->updatePosition( + m_settings.m_callsign, + stationLatitude, + stationLongitude, + stationAltitude, + getRadios().join(" "), + m_settings.m_antenna, + m_settings.m_email, + m_settings.m_mobile + ); + + m_positionUpdateTimer.stop(); + m_lastPositionUpdate = QDateTime::currentDateTime(); + } + else + { + qint64 msecs = (updateTime * 1000) - m_lastPositionUpdate.msecsTo(QDateTime::currentDateTime()); + + if (msecs < 0) { + msecs = 0; + } + m_positionUpdateTimer.setInterval(msecs); + m_positionUpdateTimer.start(); + } } } diff --git a/plugins/feature/radiosonde/radiosondegui.h b/plugins/feature/radiosonde/radiosondegui.h index 124a189ea..9afb619cd 100644 --- a/plugins/feature/radiosonde/radiosondegui.h +++ b/plugins/feature/radiosonde/radiosondegui.h @@ -103,6 +103,10 @@ private: QMenu *radiosondesMenu; // Column select context menu SondeHub *m_sondeHub; + QDateTime m_lastPositionUpdate; + QTimer m_positionUpdateTimer; + static const int m_minMobilePositionUpdateTime = 30; // In seconds + static const int m_minFixedPositionUpdateTime = 5 * 60; explicit RadiosondeGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent = nullptr); virtual ~RadiosondeGUI();