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;