From fbad0977fdd228664108e708acafb546a231e9c2 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Fri, 17 Jun 2016 10:17:00 +0200 Subject: [PATCH] Make fast position update settings persistent Instead of enabling fast position updates via context methods, the settings API will be used instead. This also allowed to move the timer into CNetworkVatlib instead of CAirspaceMonitor. The only necessary thing was to regularly update the receiver callsign set. refs #677 --- src/blackcore/airspacemonitor.cpp | 32 +--------- src/blackcore/airspacemonitor.h | 10 +--- src/blackcore/contextnetwork.h | 6 -- src/blackcore/contextnetworkempty.h | 14 ----- src/blackcore/contextnetworkimpl.cpp | 14 ----- src/blackcore/contextnetworkimpl.h | 6 -- src/blackcore/contextnetworkproxy.cpp | 10 ---- src/blackcore/contextnetworkproxy.h | 6 -- src/blackcore/network.h | 5 +- src/blackcore/networkvatlib.cpp | 58 +++++++++++++------ src/blackcore/networkvatlib.h | 7 ++- .../components/settingsnetworkcomponent.cpp | 5 +- .../components/settingsnetworkcomponent.h | 2 + 13 files changed, 54 insertions(+), 121 deletions(-) diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 83ab09e4e..984e5e39f 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -69,8 +69,6 @@ namespace BlackCore m_analyzer(new CAirspaceAnalyzer(ownAircraftProvider, this, network, this)) { this->setObjectName("CAirspaceMonitor"); - m_interimPositionUpdateTimer.setObjectName(this->objectName().append(":m_interimPositionUpdateTimer")); - m_interimPositionUpdateTimer.setInterval(1000); this->connect(this->m_network, &INetwork::atcPositionUpdate, this, &CAirspaceMonitor::ps_atcPositionUpdate); this->connect(this->m_network, &INetwork::atisReplyReceived, this, &CAirspaceMonitor::ps_atisReceived); @@ -89,7 +87,6 @@ namespace BlackCore this->connect(this->m_network, &INetwork::customFSinnPacketReceived, this, &CAirspaceMonitor::ps_customFSinnPacketReceived); this->connect(this->m_network, &INetwork::serverReplyReceived, this, &CAirspaceMonitor::ps_serverReplyReceived); this->connect(this->m_network, &INetwork::aircraftConfigPacketReceived, this, &CAirspaceMonitor::ps_aircraftConfigReceived); - this->connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CAirspaceMonitor::ps_sendInterimPositions); // AutoConnection: this should also avoid race conditions by updating the bookings Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing data reader"); @@ -225,6 +222,8 @@ namespace BlackCore CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexFastPositionUpdates, CVariant::fromValue(enableFastPositonUpdates)); QWriteLocker l(&m_lockAircraft); int c = m_aircraftInRange.applyIfCallsign(callsign, vm); + CSimulatedAircraftList enabledAircrafts = m_aircraftInRange.findBy(&CSimulatedAircraft::fastPositionUpdates, true); + m_network->setInterimPositionReceivers(enabledAircrafts.getCallsigns()); return c > 0; } @@ -429,29 +428,10 @@ namespace BlackCore } } - void CAirspaceMonitor::enableFastPositionSending(bool enable) - { - if (enable) - { - m_interimPositionUpdateTimer.start(); - } - else - { - m_interimPositionUpdateTimer.stop(); - } - m_sendInterimPositions = enable; - } - void CAirspaceMonitor::gracefulShutdown() { if (this->m_analyzer) { this->m_analyzer->gracefulShutdown(); } QObject::disconnect(this); - this->enableFastPositionSending(false); - } - - bool CAirspaceMonitor::isFastPositionSendingEnabled() const - { - return m_sendInterimPositions; } void CAirspaceMonitor::ps_realNameReplyReceived(const CCallsign &callsign, const QString &realname) @@ -1093,14 +1073,6 @@ namespace BlackCore this->m_aircraftInRange.setAircraftParts(callsign, parts); } - void CAirspaceMonitor::ps_sendInterimPositions() - { - Q_ASSERT(CThreadUtils::isCurrentThreadObjectThread(this)); - if (!this->m_connected || !m_sendInterimPositions) { return; } - CSimulatedAircraftList aircrafts = m_aircraftInRange.findBy(&CSimulatedAircraft::fastPositionUpdates, true); - m_network->sendInterimPositions(aircrafts.getCallsigns()); - } - void CAirspaceMonitor::storeAircraftSituation(const CAircraftSituation &situation) { const CCallsign callsign(situation.getCallsign()); diff --git a/src/blackcore/airspacemonitor.h b/src/blackcore/airspacemonitor.h index 1c538d4f8..8c1182883 100644 --- a/src/blackcore/airspacemonitor.h +++ b/src/blackcore/airspacemonitor.h @@ -190,12 +190,6 @@ namespace BlackCore std::function aircraftSnapshotSlot ) override; - //! Is interim position sending enabled? - bool isFastPositionSendingEnabled() const; - - //! Enable interim position sending - void enableFastPositionSending(bool enable); - //! Analyzer CAirspaceAnalyzer *analyzer() const { return m_analyzer; } @@ -254,9 +248,7 @@ namespace BlackCore CAirspaceAnalyzer *m_analyzer = nullptr; //!< owned analyzer bool m_serverSupportsNameQuery = false; //!< not all servers support name query bool m_connected = false; //!< retrieve data - bool m_sendInterimPositions = false; //!< send interim positions to other clients bool m_logMatchingProcess = false; //!< shall we log. information about the matching process - QTimer m_interimPositionUpdateTimer; // locks mutable QReadWriteLock m_lockSituations; //!< lock for situations @@ -320,7 +312,7 @@ namespace BlackCore void ps_receivedDataFile(); void ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &jsonObject, bool isFull); void ps_aircraftInterimUpdateReceived(const BlackMisc::Aviation::CAircraftSituation &situation); - void ps_sendInterimPositions(); + }; } // namespace diff --git a/src/blackcore/contextnetwork.h b/src/blackcore/contextnetwork.h index 2fe39715a..7a7f0bb08 100644 --- a/src/blackcore/contextnetwork.h +++ b/src/blackcore/contextnetwork.h @@ -206,12 +206,6 @@ namespace BlackCore //! Known FSD servers, available when data file was first read virtual BlackMisc::Network::CServerList getVatsimFsdServers() const = 0; - //! Is interim position sending enabled? - virtual bool isFastPositionSendingEnabled() const = 0; - - //! Enable interim position sending - virtual void enableFastPositionSending(bool enable) = 0; - //! Callsigns enabled for fast position updates virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) = 0; diff --git a/src/blackcore/contextnetworkempty.h b/src/blackcore/contextnetworkempty.h index a3236853b..cdd5a5598 100644 --- a/src/blackcore/contextnetworkempty.h +++ b/src/blackcore/contextnetworkempty.h @@ -274,20 +274,6 @@ namespace BlackCore return false; } - //! \copydoc IContextNetwork::isFastPositionSendingEnabled - virtual bool isFastPositionSendingEnabled() const override - { - logEmptyContextWarning(Q_FUNC_INFO); - return false; - } - - //! \copydoc IContextNetwork::enableFastPositionSending - virtual void enableFastPositionSending(bool enable) override - { - Q_UNUSED(enable); - logEmptyContextWarning(Q_FUNC_INFO); - } - //! \copydoc IContextNetwork::setFastPositionEnabledCallsigns virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) override { diff --git a/src/blackcore/contextnetworkimpl.cpp b/src/blackcore/contextnetworkimpl.cpp index e328e77fe..f6c63f701 100644 --- a/src/blackcore/contextnetworkimpl.cpp +++ b/src/blackcore/contextnetworkimpl.cpp @@ -587,20 +587,6 @@ namespace BlackCore return this->m_airspace->getLatestAirspaceAircraftSnapshot(); } - bool CContextNetwork::isFastPositionSendingEnabled() const - { - if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } - Q_ASSERT(this->m_airspace); - return m_airspace->isFastPositionSendingEnabled(); - } - - void CContextNetwork::enableFastPositionSending(bool enable) - { - if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << enable; } - Q_ASSERT(this->m_airspace); - m_airspace->enableFastPositionSending(enable); - } - void CContextNetwork::setFastPositionEnabledCallsigns(CCallsignSet &callsigns) { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsigns; } diff --git a/src/blackcore/contextnetworkimpl.h b/src/blackcore/contextnetworkimpl.h index 2afd19a97..6c4f61004 100644 --- a/src/blackcore/contextnetworkimpl.h +++ b/src/blackcore/contextnetworkimpl.h @@ -240,12 +240,6 @@ namespace BlackCore //! \copydoc IContextNetwork::requestAtisUpdates virtual void requestAtisUpdates() override; - //! \copydoc IContextNetwork::isFastPositionSendingEnabled - virtual bool isFastPositionSendingEnabled() const override; - - //! \copydoc IContextNetwork::enableFastPositionSending - virtual void enableFastPositionSending(bool enable) override; - //! \copydoc IContextNetwork::setFastPositionEnabledCallsigns virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) override; diff --git a/src/blackcore/contextnetworkproxy.cpp b/src/blackcore/contextnetworkproxy.cpp index 74ecf55c8..22f05fd9e 100644 --- a/src/blackcore/contextnetworkproxy.cpp +++ b/src/blackcore/contextnetworkproxy.cpp @@ -199,16 +199,6 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateFastPositionEnabled"), callsign, enableFastPositionSending, originator); } - bool CContextNetworkProxy::isFastPositionSendingEnabled() const - { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("isFastPositionSendingEnabled")); - } - - void CContextNetworkProxy::enableFastPositionSending(bool enable) - { - this->m_dBusInterface->callDBus(QLatin1Literal("enableFastPositionSending"), enable); - } - void CContextNetworkProxy::setFastPositionEnabledCallsigns(CCallsignSet &callsigns) { this->m_dBusInterface->callDBus(QLatin1Literal("setFastPositionEnabledCallsigns"), callsigns); diff --git a/src/blackcore/contextnetworkproxy.h b/src/blackcore/contextnetworkproxy.h index 416bd7682..f8e137398 100644 --- a/src/blackcore/contextnetworkproxy.h +++ b/src/blackcore/contextnetworkproxy.h @@ -173,12 +173,6 @@ namespace BlackCore //! \copydoc IContextNetwork::updateFastPositionEnabled virtual bool updateFastPositionEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enableFastPositionSending, const BlackMisc::CIdentifier &originator) override; - //! \copydoc IContextNetwork::isFastPositionSendingEnabled - virtual bool isFastPositionSendingEnabled() const override; - - //! \copydoc IContextNetwork::enableFastPositionSending - virtual void enableFastPositionSending(bool enable) override; - //! \copydoc IContextNetwork::setFastPositionEnabledCallsigns virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) override; diff --git a/src/blackcore/network.h b/src/blackcore/network.h index 9a9116a7a..a3e4a1f5c 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -347,10 +347,9 @@ namespace BlackCore virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; /*! - * Send interim position directly to a set of receivers. - * \pre Network must be connected when calling this function. + * Set the group of callsigns receiving regular interim position updates. */ - virtual void sendInterimPositions(const BlackMisc::Aviation::CCallsignSet &receiver) = 0; + virtual void setInterimPositionReceivers(const BlackMisc::Aviation::CCallsignSet &receiver) = 0; //! @} //////////////////////////////////////////////////////////////// diff --git a/src/blackcore/networkvatlib.cpp b/src/blackcore/networkvatlib.cpp index 063875122..d73771fcb 100644 --- a/src/blackcore/networkvatlib.cpp +++ b/src/blackcore/networkvatlib.cpp @@ -90,8 +90,14 @@ namespace BlackCore connect(&m_positionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendPositionUpdate); m_processingTimer.start(c_processingIntervalMsec); + m_interimPositionUpdateTimer.setObjectName(this->objectName().append(":m_interimPositionUpdateTimer")); + m_interimPositionUpdateTimer.setInterval(1000); + this->connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendInterimPositions); + this->connect(&this->m_scheduledConfigUpdate, &QTimer::timeout, this, &CNetworkVatlib::sendIncrementalAircraftConfig); m_scheduledConfigUpdate.setSingleShot(true); + + reloadSettings(); } void CNetworkVatlib::initializeSession() @@ -192,6 +198,31 @@ namespace BlackCore } } + void CNetworkVatlib::sendInterimPositions() + { + if (!m_net) { return; } + + if (isConnected()) + { + CSimulatedAircraft myAircraft(getOwnAircraft()); + if (this->m_loginMode == LoginNormal) + { + VatInterimPilotPosition pos; + pos.altitudeTrue = myAircraft.getAltitude().value(CLengthUnit::ft()); + pos.heading = myAircraft.getHeading().value(CAngleUnit::deg()); + pos.pitch = myAircraft.getPitch().value(CAngleUnit::deg()); + pos.bank = myAircraft.getBank().value(CAngleUnit::deg()); + pos.latitude = myAircraft.latitude().value(CAngleUnit::deg()); + pos.longitude = myAircraft.longitude().value(CAngleUnit::deg()); + + for (const auto &receiver : as_const(m_interimPositionReceivers)) + { + Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos); + } + } + } + } + //! Convert vatlib status code to INetwork::ConnectionStatus INetwork::ConnectionStatus convertConnectionStatus(VatConnectionStatus status) { @@ -222,6 +253,12 @@ namespace BlackCore } } + void CNetworkVatlib::reloadSettings() + { + if (m_interimPositionsEnabled.get()) { m_interimPositionUpdateTimer.start(); } + else { m_interimPositionUpdateTimer.stop(); } + } + QByteArray CNetworkVatlib::toFSD(QString qstr) const { return m_fsdTextCodec->fromUnicode(qstr); @@ -446,26 +483,9 @@ namespace BlackCore Vat_SendClientQuery(m_net.data(), vatClientQueryInfo, toFSD(callsign)); } - void CNetworkVatlib::sendInterimPositions(const CCallsignSet &receivers) + void CNetworkVatlib::setInterimPositionReceivers(const CCallsignSet &receivers) { - Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - if (receivers.isEmpty()) { return; } - CSimulatedAircraft myAircraft(getOwnAircraft()); - if (this->m_loginMode == LoginNormal) - { - VatInterimPilotPosition pos; - pos.altitudeTrue = myAircraft.getAltitude().value(CLengthUnit::ft()); - pos.heading = myAircraft.getHeading().value(CAngleUnit::deg()); - pos.pitch = myAircraft.getPitch().value(CAngleUnit::deg()); - pos.bank = myAircraft.getBank().value(CAngleUnit::deg()); - pos.latitude = myAircraft.latitude().value(CAngleUnit::deg()); - pos.longitude = myAircraft.longitude().value(CAngleUnit::deg()); - - for (const auto &receiver : receivers) - { - Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos); - } - } + m_interimPositionReceivers = receivers; } void CNetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) diff --git a/src/blackcore/networkvatlib.h b/src/blackcore/networkvatlib.h index 05b15a87c..3a3300866 100644 --- a/src/blackcore/networkvatlib.h +++ b/src/blackcore/networkvatlib.h @@ -108,7 +108,7 @@ namespace BlackCore virtual void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign) override; virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) override; virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) override; - virtual void sendInterimPositions(const BlackMisc::Aviation::CCallsignSet &receiver) override; + virtual void setInterimPositionReceivers(const BlackMisc::Aviation::CCallsignSet &receivers) override; //! @} //! \name Weather functions @@ -165,6 +165,7 @@ namespace BlackCore void initializeSession(); void changeConnectionStatus(VatConnectionStatus newStatus); bool isDisconnected() const { return m_status != vatStatusConnecting && m_status != vatStatusConnected; } + void reloadSettings(); static QString convertToUnicodeEscaped(const QString &str); static VatSimType convertToSimType(BlackMisc::Simulation::CSimulatorPluginInfo &simInfo); static void networkLogHandler(SeverityLevel severity, const char *message); @@ -182,6 +183,7 @@ namespace BlackCore private slots: void process(); void sendPositionUpdate(); + void sendInterimPositions(); void customPacketDispatcher(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data); signals: @@ -205,14 +207,17 @@ namespace BlackCore BlackMisc::Aviation::CAircraftIcaoCode m_ownAircraftIcaoCode; //!< "buffered icao", as this must not change when connected BlackMisc::Aviation::CAirlineIcaoCode m_ownAirlineIcaoCode; //!< "buffered icao", as this must not change when connected QString m_ownLiveryDescription; //!< "buffered livery", as this must not change when connected + BlackMisc::Aviation::CCallsignSet m_interimPositionReceivers; QTimer m_processingTimer; QTimer m_positionUpdateTimer; + QTimer m_interimPositionUpdateTimer; static int const c_processingIntervalMsec = 100; static int const c_updateIntervalMsec = 5000; static int const c_logoffTimeoutSec = 5; BlackMisc::CSetting m_fsdTextCodecSetting { this }; + BlackMisc::CSetting m_interimPositionsEnabled { this, &CNetworkVatlib::reloadSettings }; QTextCodec *m_fsdTextCodec = nullptr; BlackMisc::Aviation::CAircraftParts m_sentAircraftConfig; diff --git a/src/blackgui/components/settingsnetworkcomponent.cpp b/src/blackgui/components/settingsnetworkcomponent.cpp index 405045919..2717ae460 100644 --- a/src/blackgui/components/settingsnetworkcomponent.cpp +++ b/src/blackgui/components/settingsnetworkcomponent.cpp @@ -26,8 +26,7 @@ namespace BlackGui { ui->setupUi(this); connect(this->ui->cb_FastPositionUpdates, &QCheckBox::released, this, &CSettingsNetworkComponent::ps_guiValuesChanged); - bool enabled = sGui->getIContextNetwork()->isFastPositionSendingEnabled(); - this->ui->cb_FastPositionUpdates->setChecked(enabled); + this->ui->cb_FastPositionUpdates->setChecked(m_interimPositionsEnabled.get()); } CSettingsNetworkComponent::~CSettingsNetworkComponent() { } @@ -38,7 +37,7 @@ namespace BlackGui if (sender == ui->cb_FastPositionUpdates) { bool enabled = this->ui->cb_FastPositionUpdates->isChecked(); - sGui->getIContextNetwork()->enableFastPositionSending(enabled); + m_interimPositionsEnabled.set(enabled); } } } // ns diff --git a/src/blackgui/components/settingsnetworkcomponent.h b/src/blackgui/components/settingsnetworkcomponent.h index bc7715ece..6f61f096f 100644 --- a/src/blackgui/components/settingsnetworkcomponent.h +++ b/src/blackgui/components/settingsnetworkcomponent.h @@ -13,6 +13,7 @@ #define BLACKGUI_COMPONENTS_SETTINGSNETWORKCOMPONENT_H #include "blackgui/blackguiexport.h" +#include "blackcore/settings/network.h" #include #include @@ -46,6 +47,7 @@ namespace BlackGui private: QScopedPointer ui; + BlackMisc::CSetting m_interimPositionsEnabled { this }; }; } // ns