// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 //! \file #ifndef SWIFT_CORE_CONTEXT_CONTEXTNETWORK_IMPL_H #define SWIFT_CORE_CONTEXT_CONTEXTNETWORK_IMPL_H #include #include #include #include #include #include #include #include "core/context/contextnetwork.h" #include "core/corefacadeconfig.h" #include "core/swiftcoreexport.h" #include "misc/aviation/aircraftpartslist.h" #include "misc/aviation/aircraftsituationlist.h" #include "misc/aviation/airporticaocode.h" #include "misc/aviation/atcstation.h" #include "misc/aviation/atcstationlist.h" #include "misc/aviation/callsignset.h" #include "misc/aviation/flightplan.h" #include "misc/digestsignal.h" #include "misc/identifier.h" #include "misc/network/clientlist.h" #include "misc/network/clientprovider.h" #include "misc/network/server.h" #include "misc/network/serverlist.h" #include "misc/network/textmessagelist.h" #include "misc/network/user.h" #include "misc/network/userlist.h" #include "misc/pq/length.h" #include "misc/simplecommandparser.h" #include "misc/simulation/aircraftmodel.h" #include "misc/simulation/airspaceaircraftsnapshot.h" #include "misc/simulation/remoteaircraftprovider.h" #include "misc/simulation/simulatedaircraft.h" #include "misc/simulation/simulatedaircraftlist.h" #include "misc/simulation/simulationenvironmentprovider.h" #include "misc/statusmessage.h" #include "misc/weather/metar.h" #include "misc/weather/metarlist.h" // clazy:excludeall=const-signal-or-slot class QTimer; namespace swift::misc { class CDBusServer; namespace aviation { class CAircraftParts; class CAircraftSituation; class CCallsign; } // namespace aviation } // namespace swift::misc namespace swift::core { class CAirspaceMonitor; class CCoreFacade; namespace fsd { class CFSDClient; } namespace context { //! Network context implementation class SWIFT_CORE_EXPORT CContextNetwork : public IContextNetwork, public swift::misc::simulation::IRemoteAircraftProvider, public swift::misc::network::IClientProvider { Q_OBJECT Q_INTERFACES(swift::misc::simulation::IRemoteAircraftProvider) Q_INTERFACES(swift::misc::network::IClientProvider) Q_CLASSINFO("D-Bus Interface", SWIFT_CORE_CONTEXTNETWORK_INTERFACENAME) friend class IContextNetwork; friend class swift::core::CCoreFacade; public: //! Destructor virtual ~CContextNetwork() override; // remoteaircraftprovider virtual swift::misc::aviation::CAircraftSituationList remoteAircraftSituations(const swift::misc::aviation::CCallsign &callsign) const override; virtual swift::misc::aviation::CAircraftSituation remoteAircraftSituation(const swift::misc::aviation::CCallsign &callsign, int index) const override; virtual swift::misc::MillisecondsMinMaxMean remoteAircraftSituationsTimestampDifferenceMinMaxMean( const swift::misc::aviation::CCallsign &callsign) const override; virtual swift::misc::aviation::CAircraftSituationList latestRemoteAircraftSituations() const override; virtual swift::misc::aviation::CAircraftSituationList latestOnGroundProviderElevations() const override; virtual int remoteAircraftSituationsCount(const swift::misc::aviation::CCallsign &callsign) const override; virtual swift::misc::aviation::CAircraftPartsList remoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const override; virtual int remoteAircraftPartsCount(const swift::misc::aviation::CCallsign &callsign) const override; virtual swift::misc::aviation::CCallsignSet remoteAircraftSupportingParts() const override; virtual swift::misc::aviation::CAircraftSituationChangeList remoteAircraftSituationChanges(const swift::misc::aviation::CCallsign &callsign) const override; virtual int remoteAircraftSituationChangesCount(const swift::misc::aviation::CCallsign &callsign) const override; virtual bool updateAircraftRendered(const swift::misc::aviation::CCallsign &callsign, bool rendered) override; virtual int updateMultipleAircraftRendered(const swift::misc::aviation::CCallsignSet &callsigns, bool rendered) override; virtual int updateMultipleAircraftEnabled(const swift::misc::aviation::CCallsignSet &callsigns, bool enabled) override; virtual int updateAircraftGroundElevation(const swift::misc::aviation::CCallsign &callsign, const swift::misc::geo::CElevationPlane &elevation, swift::misc::aviation::CAircraftSituation::GndElevationInfo info, bool *setForOnGroundPosition) override; virtual void updateMarkAllAsNotRendered() override; virtual swift::misc::physical_quantities::CLength getCGFromDB(const swift::misc::aviation::CCallsign &callsign) const override; virtual swift::misc::physical_quantities::CLength getCGFromDB(const QString &modelString) const override; virtual void rememberCGFromDB(const swift::misc::physical_quantities::CLength &cgFromDB, const swift::misc::aviation::CCallsign &callsign) override; virtual void rememberCGFromDB(const swift::misc::physical_quantities::CLength &cgFromDB, const QString &modelString) override; virtual swift::misc::simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const override; virtual swift::misc::geo::CElevationPlane averageElevationOfNonMovingAircraft(const swift::misc::aviation::CAircraftSituation &reference, const swift::misc::physical_quantities::CLength &range, int minValues = 1, int sufficientValues = 2) const override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::connectRemoteAircraftProviderSignals virtual QList connectRemoteAircraftProviderSignals( QObject *receiver, std::function addedSituationSlot, std::function addedPartsSlot, std::function removedAircraftSlot, std::function aircraftSnapshotSlot) override; // clientprovider virtual void setClients(const swift::misc::network::CClientList &clients) override; virtual void clearClients() override; virtual swift::misc::network::CClient getClientOrDefaultForCallsign(const swift::misc::aviation::CCallsign &callsign) const override; virtual bool hasClientInfo(const swift::misc::aviation::CCallsign &callsign) const override; virtual bool addNewClient(const swift::misc::network::CClient &client) override; virtual int updateOrAddClient(const swift::misc::aviation::CCallsign &callsign, const swift::misc::CPropertyIndexVariantMap &vm, bool skipEqualValues = true) override; virtual int removeClient(const swift::misc::aviation::CCallsign &callsign) override; virtual bool autoAdjustCientGndCapability(const swift::misc::aviation::CAircraftSituation &situation) override; virtual bool addClientGndCapability(const swift::misc::aviation::CCallsign &callsign) override; virtual bool setClientGndCapability(const swift::misc::aviation::CCallsign &callsign, bool supportGndFlag) override; virtual void markAsSwiftClient(const swift::misc::aviation::CCallsign &callsign) override; //! \copydoc IContextNetwork::connectRawFsdMessageSignal virtual QMetaObject::Connection connectRawFsdMessageSignal(QObject *receiver, RawFsdMessageReceivedSlot rawFsdMessageReceivedSlot) override; //! Gracefully shut down, e.g. for thread safety void gracefulShutdown(); //! Network library //! \protected //! \remarks normally only for core facade internal usage //! \remarks public so values can be logged/monitored fsd::CFSDClient *fsdClient() const { return m_fsdClient; } //! Airspace //! \protected //! \remarks normally only for core facade internal usage //! \remarks public so values can be logged/monitored CAirspaceMonitor *airspace() const { return m_airspace; } public slots: // remoteaircraftprovider // emit signal when changed //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::updateAircraftEnabled virtual bool updateAircraftEnabled(const swift::misc::aviation::CCallsign &callsign, bool enabledForRendering) override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::updateAircraftModel virtual bool updateAircraftModel(const swift::misc::aviation::CCallsign &callsign, const swift::misc::simulation::CAircraftModel &model, const swift::misc::CIdentifier &originator) override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::updateAircraftNetworkModel virtual bool updateAircraftNetworkModel(const swift::misc::aviation::CCallsign &callsign, const swift::misc::simulation::CAircraftModel &model, const swift::misc::CIdentifier &originator) override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::updateFastPositionEnabled virtual bool updateFastPositionEnabled(const swift::misc::aviation::CCallsign &callsign, bool enableFastPositonUpdates) override; //! \copydoc swift::core::context::IContextNetwork::updateAircraftSupportingGndFLag virtual bool updateAircraftSupportingGndFLag(const swift::misc::aviation::CCallsign &callsign, bool supportGndFlag) override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::enableReverseLookupMessages virtual void enableReverseLookupMessages(swift::misc::simulation::ReverseLookupLogging enable) override; // plain vanilla passing to airspace monitor //! \copydoc swift::core::context::IContextNetwork::setAircraftEnabledFlag virtual bool setAircraftEnabledFlag(const swift::misc::aviation::CCallsign &callsign, bool enabledForRendering) override; //! \copydoc swift::core::context::IContextNetwork::reInitializeAllAircraft virtual int reInitializeAllAircraft() override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::updateCG virtual bool updateCG(const swift::misc::aviation::CCallsign &callsign, const swift::misc::physical_quantities::CLength &cg) override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::updateCGForModel virtual swift::misc::aviation::CCallsignSet updateCGForModel(const QString &modelString, const swift::misc::physical_quantities::CLength &cg) override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::updateCGAndModelString virtual bool updateCGAndModelString(const swift::misc::aviation::CCallsign &callsign, const swift::misc::physical_quantities::CLength &cg, const QString &modelString) override; //! \copydoc swift::core::context::IContextNetwork::getAircraftInRange virtual swift::misc::simulation::CSimulatedAircraftList getAircraftInRange() const override; //! \copydoc swift::core::context::IContextNetwork::getAircraftInRangeCallsigns virtual swift::misc::aviation::CCallsignSet getAircraftInRangeCallsigns() const override; //! \copydoc swift::core::context::IContextNetwork::getAircraftInRangeCount virtual int getAircraftInRangeCount() const override; //! \copydoc swift::core::context::IContextNetwork::isAircraftInRange virtual bool isAircraftInRange(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::isVtolAircraft virtual bool isVtolAircraft(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::getAircraftInRangeForCallsign virtual swift::misc::simulation::CSimulatedAircraft getAircraftInRangeForCallsign(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::getAircraftInRangeModelForCallsign virtual swift::misc::simulation::CAircraftModel getAircraftInRangeModelForCallsign(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::getReverseLookupMessages virtual swift::misc::CStatusMessageList getReverseLookupMessages(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::isReverseLookupMessagesEnabled virtual swift::misc::simulation::ReverseLookupLogging isReverseLookupMessagesEnabled() const override; //! \copydoc swift::core::context::IContextNetwork::getAircraftPartsHistory virtual swift::misc::CStatusMessageList getAircraftPartsHistory(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::getRemoteAircraftParts virtual swift::misc::aviation::CAircraftPartsList getRemoteAircraftParts(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::getRemoteAircraftSupportingPartsCount virtual int getRemoteAircraftSupportingPartsCount() const override; //! \copydoc swift::core::context::IContextNetwork::isAircraftPartsHistoryEnabled virtual bool isAircraftPartsHistoryEnabled() const override; //! \copydoc swift::core::context::IContextNetwork::isRemoteAircraftSupportingParts virtual bool isRemoteAircraftSupportingParts(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::enableAircraftPartsHistory virtual void enableAircraftPartsHistory(bool enabled) override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::aircraftSituationsAdded virtual int aircraftSituationsAdded() const override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::aircraftPartsAdded virtual int aircraftPartsAdded() const override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::situationsLastModified virtual qint64 situationsLastModified(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::misc::simulation::IRemoteAircraftProvider::partsLastModified virtual qint64 partsLastModified(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::getNetworkStatistics virtual QString getNetworkStatistics(bool reset, const QString &separator) override; //! \copydoc swift::core::context::IContextNetwork::setNetworkStatisticsEnable virtual bool setNetworkStatisticsEnable(bool enabled) override; //! \copydoc swift::core::context::IContextNetwork::testAddAltitudeOffset virtual bool testAddAltitudeOffset(const swift::misc::aviation::CCallsign &callsign, const swift::misc::physical_quantities::CLength &offset = swift::misc::physical_quantities::CLength::null()) override; //! \copydoc swift::core::context::IContextNetwork::getNetworkPresetValues virtual QStringList getNetworkPresetValues() const override; //! \copydoc swift::core::context::IContextNetwork::getPartnerCallsign virtual swift::misc::aviation::CCallsign getPartnerCallsign() const override; //! \copydoc swift::misc::network::IClientProvider::getClients virtual swift::misc::network::CClientList getClients() const override; //! \copydoc swift::misc::network::IClientProvider::getClientsForCallsigns virtual swift::misc::network::CClientList getClientsForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const override; //! \copydoc swift::misc::network::IClientProvider::setOtherClient virtual bool setOtherClient(const swift::misc::network::CClient &client) override; //! In transition state, e.g. connecting, disconnecting. //! \details In such a state it is advisable to wait until an end state (connected/disconnected) is reached //! \remarks Intentionally only running locally, not in interface bool isPendingConnection() const; // --------------------- IContextNetwork implementations --------------------- //! \ingroup swiftdotcommands //!
            //! .m .msg .chat callsign|freq. message   message text
            //! .altos .altoffset                      altitude offset for testing
            //! .addtimeos .addtimeoffset              additional offset time for testing
            //! .reinit .reinitialize                  re-initialize all aircraft
            //! .watchdog on|off                       watchdog on/off
            //! .wallop message                        send wallop message
            //! 
//! \copydoc IContextNetwork::parseCommandLine virtual bool parseCommandLine(const QString &commandLine, const swift::misc::CIdentifier &originator) override; //! Register help static void registerHelp() { if (swift::misc::CSimpleCommandParser::registered("swift::core::CContextNetwork")) { return; } swift::misc::CSimpleCommandParser::registerCommand({ ".m", "alias: .msg, .chat" }); swift::misc::CSimpleCommandParser::registerCommand({ ".m message text", "send text message" }); swift::misc::CSimpleCommandParser::registerCommand({ ".m callsign message text", "send text message" }); swift::misc::CSimpleCommandParser::registerCommand( { ".altos callsign|? offsetvalue", "set altitude offset value (testing), ?=all" }); swift::misc::CSimpleCommandParser::registerCommand( { ".addtimeos offsetvalue", "add (delta) time offset (testing), e.g. 50ms" }); swift::misc::CSimpleCommandParser::registerCommand( { ".watchdog on|off", "enable/disable network watchdog (testing)" }); swift::misc::CSimpleCommandParser::registerCommand({ ".wallop message", "send a wallop message" }); swift::misc::CSimpleCommandParser::registerCommand({ ".reinit", "re-initialize all aircraft" }); swift::misc::CSimpleCommandParser::registerCommand({ ".enable", "alias: .unignore" }); swift::misc::CSimpleCommandParser::registerCommand({ ".enable callsign", "enable/unignore callsign" }); swift::misc::CSimpleCommandParser::registerCommand({ ".disable", "alias: .ignore" }); swift::misc::CSimpleCommandParser::registerCommand({ ".disable callsign", "disable/ignore callsign" }); } //! \copydoc swift::core::context::IContextNetwork::getAtcStationsOnline virtual swift::misc::aviation::CAtcStationList getAtcStationsOnline(bool recalculateDistance) const override; //! \copydoc swift::core::context::IContextNetwork::getClosestAtcStationsOnline virtual swift::misc::aviation::CAtcStationList getClosestAtcStationsOnline(int number) const override; //! \copydoc swift::core::context::IContextNetwork::getOnlineStationForCallsign virtual swift::misc::aviation::CAtcStation getOnlineStationForCallsign(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::getOnlineStationsForFrequency virtual swift::misc::aviation::CAtcStationList getOnlineStationsForFrequency(const swift::misc::physical_quantities::CFrequency &frequency) const override; //! \copydoc swift::core::context::IContextNetwork::isOnlineStation virtual bool isOnlineStation(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::connectToNetwork virtual swift::misc::CStatusMessage connectToNetwork(const swift::misc::network::CServer &server, const QString &extraLiveryString, bool sendLivery, const QString &extraModelString, bool sendModelString, const swift::misc::aviation::CCallsign &partnerCallsign, swift::misc::network::CLoginMode mode) override; //! \copydoc swift::core::context::IContextNetwork::getConnectedServer virtual swift::misc::network::CServer getConnectedServer() const override; //! \copydoc swift::core::context::IContextNetwork::getLoginMode virtual swift::misc::network::CLoginMode getLoginMode() const override; //! \copydoc swift::core::context::IContextNetwork::disconnectFromNetwork virtual swift::misc::CStatusMessage disconnectFromNetwork() override; //! \copydoc swift::core::context::IContextNetwork::isConnected virtual bool isConnected() const override; //! \copydoc swift::core::context::IContextNetwork::sendTextMessages virtual void sendTextMessages(const swift::misc::network::CTextMessageList &textMessages) override; //! \copydoc swift::core::context::IContextNetwork::sendFlightPlan virtual void sendFlightPlan(const swift::misc::aviation::CFlightPlan &flightPlan) override; //! \copydoc swift::core::context::IContextNetwork::loadFlightPlanFromNetwork virtual swift::misc::aviation::CFlightPlan loadFlightPlanFromNetwork(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::getMetarForAirport swift::misc::weather::CMetar getMetarForAirport(const swift::misc::aviation::CAirportIcaoCode &airportIcaoCode) const override; //! \copydoc swift::core::context::IContextNetwork::getUsers virtual swift::misc::network::CUserList getUsers() const override; //! \copydoc swift::core::context::IContextNetwork::getUsersForCallsigns virtual swift::misc::network::CUserList getUsersForCallsigns(const swift::misc::aviation::CCallsignSet &callsigns) const override; //! \copydoc swift::core::context::IContextNetwork::getUserForCallsign virtual swift::misc::network::CUser getUserForCallsign(const swift::misc::aviation::CCallsign &callsign) const override; //! \copydoc swift::core::context::IContextNetwork::getVatsimFsdServers virtual swift::misc::network::CServerList getVatsimFsdServers() const override; //! \copydoc swift::core::context::IContextNetwork::requestAircraftDataUpdates virtual void requestAircraftDataUpdates() override; //! \copydoc swift::core::context::IContextNetwork::requestAtisUpdates virtual void requestAtisUpdates() override; //! \copydoc swift::core::context::IContextNetwork::setFastPositionEnabledCallsigns virtual void setFastPositionEnabledCallsigns(swift::misc::aviation::CCallsignSet &callsigns) override; //! \copydoc swift::core::context::IContextNetwork::getFastPositionEnabledCallsigns virtual swift::misc::aviation::CCallsignSet getFastPositionEnabledCallsigns() const override; //! \copydoc swift::core::context::IContextNetwork::testCreateDummyOnlineAtcStations virtual void testCreateDummyOnlineAtcStations(int number) override; //! \copydoc swift::core::context::IContextNetwork::testAddAircraftParts virtual void testAddAircraftParts(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CAircraftParts &parts, bool incremental) override; //! \copydoc swift::core::context::IContextNetwork::testReceivedAtisMessage virtual void testReceivedAtisMessage(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CInformationMessage &msg) override; //! \copydoc swift::core::context::IContextNetwork::testReceivedTextMessages virtual void testReceivedTextMessages(const swift::misc::network::CTextMessageList &textMessages) override; //! \copydoc swift::core::context::IContextNetwork::testRequestAircraftConfig virtual void testRequestAircraftConfig(const swift::misc::aviation::CCallsign &callsign) override; protected: //! Constructor, with link to runtime CContextNetwork(CCoreFacadeConfig::ContextMode, CCoreFacade *runtime); //! Register myself in DBus void registerWithDBus(swift::misc::CDBusServer *server); //! Set the provider void setSimulationEnvironmentProvider(swift::misc::simulation::ISimulationEnvironmentProvider *provider); private: swift::misc::network::CLoginMode m_currentMode = swift::misc::network::CLoginMode::Pilot; //!< current modeM CAirspaceMonitor *m_airspace = nullptr; fsd::CFSDClient *m_fsdClient = nullptr; QTimer *m_requestAircraftDataTimer = nullptr; //!< general updates such as frequencies, see requestAircraftDataUpdates() QTimer *m_requestAtisTimer = nullptr; //!< general updates such as ATIS QTimer *m_staggeredMatchingTimer = nullptr; //!< staggered update int m_simulatorConnected = 0; //!< how often a simulator has been connected swift::misc::simulation::CSimulatorInfo m_lastConnectedSim; //!< last connected sim. // Digest signals, only sending after some time misc::CDigestSignal m_dsAtcStationsOnlineChanged { this, &IContextNetwork::changedAtcStationsOnline, &IContextNetwork::changedAtcStationsOnlineDigest, std::chrono::milliseconds(1000), 4 }; misc::CDigestSignal m_dsAircraftsInRangeChanged { this, &IContextNetwork::changedAircraftInRange, &IContextNetwork::changedAircraftInRangeDigest, std::chrono::milliseconds(1000), 4 }; QQueue m_readyForModelMatching; //!< ready for matching //! Own aircraft from \sa CContextOwnAircraft swift::misc::simulation::CSimulatedAircraft ownAircraft() const; //! Check if a callsign is a valid partner callsign bool isValidPartnerCallsign(const swift::misc::aviation::CCallsign &ownCallsign, const swift::misc::aviation::CCallsign &partnerCallsign); //! Update METAR collection void updateMetars(const swift::misc::weather::CMetarList &metars); //! Check when a message was received, if the message has to be relayed, is a supervisor message ... void onTextMessagesReceived(const swift::misc::network::CTextMessageList &messages); //! Text message has been sent void onTextMessageSent(const swift::misc::network::CTextMessage &message); //! An ATIS has been received void onChangedAtisReceived(const swift::misc::aviation::CCallsign &callsign); //! Connection status changed void onFsdConnectionStatusChanged(const swift::misc::network::CConnectionStatus &from, const swift::misc::network::CConnectionStatus &to); //! Ready for matching void onReadyForModelMatching(const swift::misc::simulation::CSimulatedAircraft &aircraft); //! Emit ready for matching void emitReadyForMatching(); //! Relay to partner callsign void createRelayMessageToPartnerCallsign(const swift::misc::network::CTextMessage &textMessage, const swift::misc::aviation::CCallsign &partnerCallsign, swift::misc::network::CTextMessageList &relayedMessages); //! Render restrictions have been changed, used with analyzer //! \sa CAirspaceAnalyzer //! \ingroup crosscontextfunction void xCtxSimulatorRenderRestrictionsChanged( bool restricted, bool enabled, int maxAircraft, const swift::misc::physical_quantities::CLength &maxRenderedDistance); //! Status of simulator changed //! \ingroup crosscontextfunction void xCtxSimulatorStatusChanged(int status); //! Can FSD be used? bool canUseFsd() const; //! Can the airspace monitor be used be used? bool canUseAirspaceMonitor() const; }; } // namespace context } // namespace swift::core #endif // SWIFT_CORE_CONTEXT_CONTEXTNETWORK_IMPL_H