6 #ifndef SWIFT_CORE_SIMULATOR_H
7 #define SWIFT_CORE_SIMULATOR_H
41 #include "misc/tokenbucket.h"
43 namespace swift::misc::network
69 Disconnected = 1 << 0,
74 Q_DECLARE_FLAGS(SimulatorStatus, SimulatorStatusFlag)
75 Q_FLAG(SimulatorStatus)
78 static const QStringList &getLogCategories();
84 virtual SimulatorStatus getSimulatorStatus()
const;
89 return m_simulatorInternals;
96 virtual bool disconnectFrom();
148 virtual void recalculateAllAircraft();
153 virtual void setFlightNetworkConnected(
bool connected);
161 return m_multiSettings.getSpecializedSettings(this->getSimulatorInfo());
165 virtual void unload();
219 return (this->isShuttingDownOrDisconnected() || this->getAircraftInRangeCount() < 1);
225 return isProbe ? this->isShuttingDownOrDisconnected() :
226 (this->isShuttingDownOrDisconnected() || this->getAircraftInRangeCount() < 1);
238 return this->requestElevation(situation, situation.
getCallsign());
250 virtual void resetAircraftStatistics();
256 bool isEmulatedDriver()
const;
285 bool setInterpolationSetupGlobal(
326 return m_interpolationLogger;
334 QString updateAircraftLimitationInfo()
const;
337 void resetLastSentValues();
343 static void registerHelp();
346 static QString statusToString(SimulatorStatus status);
349 static bool isAnyConnectedStatus(SimulatorStatus status);
357 swift::core::ISimulator::SimulatorStatus status);
374 bool disabled,
bool requestFailover,
405 virtual void onSwiftDbAllDataRead();
406 virtual void onSwiftDbModelMatchingEntitiesRead();
410 virtual void initSimulatorInternals();
429 virtual void clearAllRemoteAircraftData();
434 virtual int physicallyRemoveAllRemoteAircraft();
440 bool likelyOnGroundElevation,
447 void emitSimulatorCombinedStatus(SimulatorStatus oldStatus = Unspecified);
450 void emitInterpolationSetupChanged()
override;
454 void debugLogMessage(
const QString &msg);
458 void debugLogMessage(
const QString &funcInfo,
const QString &msg);
461 bool showDebugLogMessage()
const;
480 virtual void reset();
483 bool isUpdateAllRemoteAircraft(qint64 currentTimestamp = -1)
const;
486 void setUpdateAllRemoteAircraft(qint64 currentTimestamp = -1, qint64 forMs = -1);
489 void resetUpdateAllRemoteAircraft();
492 void safeKillTimer();
512 bool isUpdateAircraftLimited(qint64 timestamp = -1);
515 bool isUpdateAircraftLimitedWithStats(qint64 startTime = -1);
518 bool limitToUpdatesPerSecond(
int numberPerSecond);
524 void reverseLookupAndUpdateOwnAircraftModel(
const QString &modelString);
529 const QString &details = {})
const;
532 void finishUpdateRemoteAircraftAndSetStatistics(qint64 startTime,
bool limited =
false);
556 bool m_updateRemoteAircraftInProgress =
false;
557 bool m_enablePseudoElevation =
false;
559 int m_statsUpdateAircraftRuns = 0;
560 int m_statsUpdateAircraftLimited = 0;
561 double m_statsUpdateAircraftTimeAvgMs = 0;
562 double m_averageFps = -1.0;
563 double m_simTimeRatio = 1.0;
564 double m_trackMilesShort = 0.0;
565 double m_minutesLate = 0.0;
566 qint64 m_updateAllRemoteAircraftUntil = 0;
568 qint64 m_statsUpdateAircraftTimeTotalMs = 0;
569 qint64 m_statsCurrentUpdateTimeMs = 0;
570 qint64 m_statsMaxUpdateTimeMs = 0;
571 qint64 m_lastRecordedGndElevationMs = 0;
572 qint64 m_statsLastUpdateAircraftRequestedMs = 0;
573 qint64 m_statsUpdateAircraftRequestedDeltaMs = 0;
594 bool m_limitUpdateAircraft =
false;
615 int m_statsPhysicallyAddedAircraft = 0;
616 int m_statsPhysicallyRemovedAircraft = 0;
619 bool m_networkConnected =
false;
641 virtual QString backendInfo()
const;
669 virtual bool isShuttingDown()
const;
682 void onAboutToShutdown();
685 std::atomic_bool m_isRunning {
false };
686 std::atomic_bool m_aboutToShutdown {
false };
723 Q_DECLARE_METATYPE(swift::core::ISimulator::SimulatorStatus)
725 Q_DECLARE_INTERFACE(swift::core::ISimulatorFactory, "org.swift-project.swift_core.simulatorfactory")
726 Q_DECLARE_OPERATORS_FOR_FLAGS(swift::core::ISimulator::SimulatorStatus)
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
bool isShuttingDown() const
Is application shutting down?
Factory pattern class to create instances of ISimulator.
ISimulatorFactory & operator=(const ISimulatorFactory &)=delete
Not copyable.
virtual ISimulator * create(const swift::misc::simulation::CSimulatorPluginInfo &info, swift::misc::simulation::IOwnAircraftProvider *ownAircraftProvider, swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider, swift::misc::network::IClientProvider *clientProvider)=0
Create a new instance of a driver.
ISimulatorFactory()
Default ctor.
virtual ISimulatorListener * createListener(const swift::misc::simulation::CSimulatorPluginInfo &info)=0
Simulator listener instance.
virtual ~ISimulatorFactory()=default
ISimulatorVirtual destructor.
ISimulatorFactory(const ISimulatorFactory &)=delete
Not copyable.
Interface to a simulator.
QObject * asQObject()
Return as QObject.
double getStatisticsAverageUpdateTimeMs() const
Average update time in ms.
virtual bool isPhysicallyRenderedAircraft(const swift::misc::aviation::CCallsign &callsign) const =0
Is the aircraft rendered (displayed in simulator)? This shall only return true if the aircraft is rea...
double getTrackMilesShort() const
Number of track miles over-reported, due to low FPS.
virtual bool connectTo()=0
Connect to simulator.
virtual bool updateOwnSimulatorCockpit(const swift::misc::simulation::CSimulatedAircraft &aircraft, const swift::misc::CIdentifier &originator)=0
Update own aircraft cockpit (usually from context)
void renderRestrictionsChanged(bool restricted, bool enabled, int maxAircraft, const swift::misc::physical_quantities::CLength &maxRenderedDistance)
Render restrictions have been changed.
virtual bool updateOwnSimulatorSelcal(const swift::misc::aviation::CSelcal &selcal, const swift::misc::CIdentifier &originator)=0
Update own aircraft cockpit (usually from context)
bool requestElevation(const swift::misc::aviation::CAircraftSituation &situation)
Request elevation, there is no guarantee the requested elevation will be available in the provider.
double getSimTimeRatio() const
Ratio of simulation time to real time, due to low FPS.
virtual bool isShuttingDown() const
Is overall (swift) application shutting down.
int getStatisticsPhysicallyAddedAircraft() const
Counter added aircraft.
void setTestMode(bool test)
Set test mode (driver can skip code parts etc., driver dependent)
virtual swift::misc::CStatusMessageList getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const =0
Interpolation messages for callsign.
virtual bool isPaused() const =0
Simulator paused?
void requestedElevation(const swift::misc::aviation::CCallsign &callsign)
Requested elevation, call pending.
virtual swift::misc::aviation::CCallsignSet physicallyRenderedAircraft() const =0
Physically rendered (displayed in simulator) This shall only return aircraft handled in the simulator...
virtual bool isShuttingDownDisconnectedOrNoAircraft() const
Shutting down, disconnected, or no remote aircraft.
void physicallyAddingRemoteModelFailed(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft, bool disabled, bool requestFailover, const swift::misc::CStatusMessage &message)
Adding the remote model failed.
virtual void displayTextMessage(const swift::misc::network::CTextMessage &message) const =0
Display a text message.
virtual QString getStatisticsSimulatorSpecific() const
Allows to print out simulator specific statistics.
void ownAircraftModelChanged(const swift::misc::simulation::CAircraftModel &model)
Emitted when own aircraft model has changed.
void simulatorStatusChanged(swift::core::ISimulator::SimulatorStatus status)
Simulator combined status.
void insufficientFrameRateDetected(bool fatal)
Frame rate has fallen too far below the threshold to maintain consistent sim rate.
virtual bool physicallyAddRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &remoteAircraft)=0
Add new remote aircraft physically to the simulator.
swift::misc::aviation::CAircraftPartsPerCallsign m_lastSentParts
last parts sent to simulator
int getStatisticsUpdateRuns() const
Number of update runs.
swift::misc::simulation::CAutoPublishData m_autoPublishing
for the DB
qint64 getStatisticsTotalUpdateTimeMs() const
Total update time in ms.
double getAverageFPS() const
Average FPS (frames per second)
virtual void displayStatusMessage(const swift::misc::CStatusMessage &message) const =0
Display a status message in the simulator.
bool isTestMode() const
Test mode? (driver can skip code parts etc., driver dependent)
void receivedRequestedElevation(const swift::misc::geo::CElevationPlane &plane, const swift::misc::aviation::CCallsign &callsign)
A requested elevation has been received.
swift::misc::simulation::CSimulatedAircraftList m_addAgainAircraftWhenRemoved
add this model again when removed, normally used to change model
void setTestEnablePseudoElevation(bool enable)
Enable pseudo elevations (testing)
swift::misc::simulation::CSimulatorInternals m_simulatorInternals
setup read from the sim
void autoPublishDataWritten(const swift::misc::simulation::CSimulatorInfo &simulator)
Auto publish data written for simulator.
int removeAllRemoteAircraft()
Public version to remove all aircraft.
void airspaceSnapshotHandled()
An airspace snapshot was handled.
SimulatorStatusFlag
ISimulator status.
qint64 getStatisticsAircraftUpdatedRequestedDeltaMs() const
Time between two update requests.
swift::misc::simulation::settings::CSpecializedSimulatorSettings getSimulatorSettings() const
Settings for current simulator.
swift::misc::simulation::CInterpolationLogger m_interpolationLogger
log.interpolation
void aircraftRenderingChanged(const swift::misc::simulation::CSimulatedAircraft &aircraft)
Aircraft rendering changed.
swift::misc::aviation::CAircraftSituationListPerCallsign m_loopbackSituations
traced loopback situations
bool isFlightNetworkConnected() const
Is the flight network connected.
virtual bool isShuttingDownOrDisconnected() const
Shutting down or disconnected?
void setTestElevation(const swift::misc::aviation::CAltitude &altitude)
Set an elevation for testing.
void driverMessages(const swift::misc::CStatusMessageList &messages)
Relevant simulator messages to be explicitly displayed.
const swift::misc::simulation::CAutoPublishData & getPublishData() const
Get the data for auto publishing.
qint64 getStatisticsMaxUpdateTimeMs() const
Max.update time in ms.
qint64 getStatisticsCurrentUpdateTimeMs() const
Current update time in ms.
const swift::misc::simulation::CInterpolationLogger & interpolationLogger() const
Access to logger.
virtual bool isSimulating() const
Simulator running?
virtual bool isConnected() const =0
Are we connected to the simulator?
virtual bool parseDetails(const swift::misc::CSimpleCommandParser &parser)=0
Parsed in derived classes.
virtual bool testSendSituationAndParts(const swift::misc::aviation::CCallsign &callsign, const swift::misc::aviation::CAircraftSituation &situation, const swift::misc::aviation::CAircraftParts &parts)=0
Send situation/parts for testing.
int getStatisticsPhysicallyRemovedAircraft() const
Counter removed aircraft.
swift::misc::aviation::CAircraftSituationPerCallsign m_lastSentSituations
last situations sent to simulator
void interpolationAndRenderingSetupChanged()
Interpolation or rendering setup changed.
virtual const swift::misc::simulation::CSimulatorInternals & getSimulatorInternals() const
Get the simulator current internal state.
virtual bool isShuttingDownDisconnectedOrNoAircraft(bool isProbe) const
Shutting down, disconnected, or no remote aircraft.
double getMinutesLate() const
Number of minutes behind schedule, due to low FPS.
Interface to a simulator listener.
virtual void startImpl()=0
Plugin specific implementation to start listener.
const swift::misc::simulation::CSimulatorPluginInfo & getPluginInfo() const
Corresponding info.
void simulatorStarted(const swift::misc::simulation::CSimulatorPluginInfo &info)
Emitted when the listener discovers the simulator running.
~ISimulatorListener()=default
Destructor.
virtual void checkImpl()=0
Plugin specific implementation to check.
virtual void stopImpl()=0
Plugin specific implementation to stop listener.
bool isRunning() const
Running?
List of QMetaObject::Connection.
Base class with a member CIdentifier to be inherited by a class which has an identity in the environm...
Value object encapsulating information identifying a component of a modular distributed swift process...
Utility methods for simple line parsing used with the command line.
Streamable status message, e.g.
Status messages, e.g. from Core -> GUI.
Value object encapsulating information of aircraft's parts.
Value object encapsulating information of an aircraft's situation.
const CCallsign & getCallsign() const
Corresponding callsign.
List of aircraft situations.
Altitude as used in aviation, can be AGL or MSL altitude.
static const CAltitude & null()
Null altitude (MSL)
Value object encapsulating information of a callsign.
Value object for a set of callsigns.
Plane of same elevation, can be a single point or larger area (e.g. airport)
Geodetic coordinate, a position in 3D space relative to the reference geoid.
Class which can be directly used to access an.
Value object encapsulating information of a text message.
Direct in memory access to client (network client) data.
Physical unit length (length)
Aircraft model (used by another pilot, my models on disk)
Value object encapsulating a list of aircraft models.
Current situation in the skies analyzed.
Objects that can be use for auto-publishing. Auto publishing means we sent those data to the DB.
Value object for interpolator and rendering.
Value object for interpolator and rendering per callsign.
Record internal state of interpolator for debugging.
Delegating class which can be directly used to access an.
Class which can be directly used to access an.
Comprehensive information of an aircraft.
Value object encapsulating a list of aircraft.
Simple hardcoded info about the corresponding simulator.
Simulator internals for flight simulators. Those are obtained from a running simulator and represent ...
Describing a simulator plugin.
Direct in memory access to interpolation setup, normally implemented by simulator.
Direct threadsafe in memory access to own aircraft.
Direct thread safe in memory access to remote aircraft.
Direct in memory access to elevation data.
Bundle of settings for all simulators.
Allows to have specific utility functions for each simulator.
Backend services of the swift project, like dealing with the network or the simulators.
#define SWIFT_CORE_EXPORT
Export a class or function from the library.