From c77c0e484fe3882d50f90a6a5e33b01486b90676 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Sun, 12 Apr 2015 15:30:30 +0200 Subject: [PATCH] refs #375 finish sending of interim positions Airspace monitor knows all remote aircrafts and which have interim positions enabled. It passes the list of receivers to INetwork and INetwork sends it to FSD. --- src/blackcore/airspace_monitor.cpp | 22 ++++++++++++++++++ src/blackcore/airspace_monitor.h | 11 +++++++++ src/blackcore/context_network_impl.cpp | 8 +++---- src/blackcore/network.h | 13 ++++++----- src/blackcore/network_vatlib.cpp | 32 ++++++++++++++++++-------- src/blackcore/network_vatlib.h | 4 +--- 6 files changed, 67 insertions(+), 23 deletions(-) diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index c64157080..83711d895 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -59,6 +59,8 @@ namespace BlackCore this->m_atcWatchdog.setTimeout(CTime(50, CTimeUnit::s())); this->connect(&this->m_aircraftWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_pilotDisconnected); this->connect(&this->m_atcWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_atcControllerDisconnected); + + this->connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CAirspaceMonitor::ps_sendInterimPosition); } const CSimulatedAircraftList &CAirspaceMonitor::remoteAircraft() const @@ -378,6 +380,18 @@ namespace BlackCore } } + void CAirspaceMonitor::enableFastPositionSending(bool enable) + { + if (enable) m_interimPositionUpdateTimer.start(); + else m_interimPositionUpdateTimer.stop(); + m_sendInterimPositions = enable; + } + + bool CAirspaceMonitor::isFastPositionSendingEnabled() const + { + return m_sendInterimPositions; + } + void CAirspaceMonitor::ps_realNameReplyReceived(const CCallsign &callsign, const QString &realname) { Q_ASSERT(this->m_vatsimDataFileReader); @@ -948,4 +962,12 @@ namespace BlackCore this->m_aircraftWatchdog.resetCallsign(callsign); } + void CAirspaceMonitor::ps_sendInterimPosition() + { + Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + if (!this->m_connected || !m_sendInterimPositions) { return; } + CSimulatedAircraftList aircrafts = m_aircraftInRange.findBy(&CSimulatedAircraft::fastPositionUpdates, true); + m_network->sendInterimPosition(aircrafts.getCallsigns()); + } + } // namespace diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index 3e239cfbb..ac8ff296f 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -131,6 +131,12 @@ namespace BlackCore std::function removedAircraftSlot ) override; + //! Is interim position sending enabled? + bool isFastPositionSendingEnabled() const; + + //! Enable interim position sending + void enableFastPositionSending(bool enable); + static const qint64 AircraftSituationsRemovedOffsetMs = 30 * 1000; //!< situations older than now - offset will be removed static const qint64 AircraftPartsRemoveOffsetMs = 30* 1000; //!< parts older than now - offset will be removed @@ -184,6 +190,9 @@ namespace BlackCore CAirspaceWatchdog m_aircraftWatchdog; bool m_serverSupportsNameQuery = false; //!< not all servers support name query bool m_connected = false; //!< retrieve data + bool m_sendInterimPositions = false; + + QTimer m_interimPositionUpdateTimer; //! Remove ATC online stations void removeAllOnlineAtcStations(); @@ -224,6 +233,8 @@ namespace BlackCore //! Send the information if aircraft and(!) client are vailable void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial); + + void ps_sendInterimPosition(); }; } // namespace diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index cdf1d0ac4..ff15dae0e 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -554,15 +554,15 @@ namespace BlackCore bool CContextNetwork::isFastPositionSendingEnabled() const { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } - Q_ASSERT(this->m_network); - return m_network->isFastPositionSendingEnabled(); + 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_network); - m_network->enableFastPositionSending(enable); + Q_ASSERT(this->m_airspace); + m_airspace->enableFastPositionSending(enable); } void CContextNetwork::setFastPositionEnabledCallsigns(CCallsignSet &callsigns) diff --git a/src/blackcore/network.h b/src/blackcore/network.h index 5ca7c306c..520c53458 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -22,6 +22,7 @@ #include "blackmisc/network/textmessagelist.h" #include "blackmisc/aviation/informationmessage.h" #include "blackmisc/aviation/flightplan.h" +#include "blackmisc/aviation/callsignset.h" #include #include #include @@ -198,12 +199,6 @@ namespace BlackCore */ virtual void terminateConnection() = 0; - //! Is interim position sending enabled? - virtual bool isFastPositionSendingEnabled() const = 0; - - //! Enable interim position sending - virtual void enableFastPositionSending(bool enable) = 0; - /*! * Send a ping message to a user with a specific callsign. * \pre Network must be connected when calling this function. @@ -346,6 +341,12 @@ 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. + */ + virtual void sendInterimPosition(const BlackMisc::Aviation::CCallsignSet &receiver) = 0; + //! @} //////////////////////////////////////////////////////////////// //! \name Weather slots diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index 16d54d575..9cf46ee58 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -417,6 +417,28 @@ namespace BlackCore Vat_SendClientQuery(m_net.data(), vatClientQueryInfo, toFSD(callsign)); } + void CNetworkVatlib::sendInterimPosition(const CCallsignSet &receivers) + { + Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); + + if (this->m_loginMode == LoginNormal) + { + VatInterimPilotPosition pos; + // TODO: we need to distinguish true and pressure altitude + pos.altitudeTrue = ownAircraft().getAltitude().value(CLengthUnit::ft()); + pos.heading = ownAircraft().getHeading().value(CAngleUnit::deg()); + pos.pitch = ownAircraft().getPitch().value(CAngleUnit::deg()); + pos.bank = ownAircraft().getBank().value(CAngleUnit::deg()); + pos.latitude = ownAircraft().latitude().value(CAngleUnit::deg()); + pos.longitude = ownAircraft().longitude().value(CAngleUnit::deg()); + + for (const auto &receiver : receivers) + { + Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos); + } + } + } + void CNetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); @@ -604,16 +626,6 @@ namespace BlackCore sendCustomPacket(callsign, "FSIPI", data); } - void CNetworkVatlib::enableFastPositionSending(bool enable) - { - m_sendInterimPositions = enable; - } - - bool CNetworkVatlib::isFastPositionSendingEnabled() const - { - return m_sendInterimPositions; - } - void CNetworkVatlib::broadcastAircraftConfig(const QJsonObject &config) { // Fixme: Use QJsonObject with std::initializer_list once 5.4 is baseline diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index 5d0ae3b29..ac9c82eeb 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -62,8 +62,6 @@ namespace BlackCore virtual void sendCustomFsinnQuery(const BlackMisc::Aviation::CCallsign &callsign) override; virtual void sendCustomFsinnReponse(const BlackMisc::Aviation::CCallsign &callsign) override; - virtual bool isFastPositionSendingEnabled() const override; - virtual void enableFastPositionSending(bool enable) override; virtual void broadcastAircraftConfig(const QJsonObject &config) override; virtual void sendAircraftConfigQuery(const BlackMisc::Aviation::CCallsign &callsign) override; @@ -81,6 +79,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 sendInterimPosition(const BlackMisc::Aviation::CCallsignSet &receiver) override; // Weather slots virtual void sendMetarQuery(const BlackMisc::Aviation::CAirportIcao &airportIcao) override; @@ -167,7 +166,6 @@ namespace BlackCore BlackMisc::Simulation::CSimulatorPluginInfo m_simulatorInfo; BlackMisc::Aviation::CCallsign m_callsign; //!< "buffered callsign", as this must not change when connected BlackMisc::Aviation::CAircraftIcao m_icaoCode; //!< "buffered icao", as this must not change when connected - bool m_sendInterimPositions = false; //!< send interim positions QTimer m_processingTimer; QTimer m_positionUpdateTimer;