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