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)
84 virtual SimulatorStatus getSimulatorStatus()
const;
89 return m_simulatorInternals;
96 virtual bool disconnectFrom();
148 virtual void recalculateAllAircraft();
153 virtual void setFlightNetworkConnected(
bool connected);
164 return m_multiSettings.getSpecializedSettings(this->getSimulatorInfo());
168 virtual void unload();
222 return (this->isShuttingDownOrDisconnected() || this->getAircraftInRangeCount() < 1);
228 return isProbe ? this->isShuttingDownOrDisconnected() :
229 (this->isShuttingDownOrDisconnected() || this->getAircraftInRangeCount() < 1);
241 return this->requestElevation(situation, situation.
getCallsign());
253 virtual void resetAircraftStatistics();
259 bool isEmulatedDriver()
const;
288 bool setInterpolationSetupGlobal(
329 return m_interpolationLogger;
337 QString updateAircraftLimitationInfo()
const;
340 void resetLastSentValues();
346 static void registerHelp();
349 static QString statusToString(SimulatorStatus status);
352 static bool isAnyConnectedStatus(SimulatorStatus status);
360 swift::core::ISimulator::SimulatorStatus status);
377 bool disabled,
bool requestFailover,
408 virtual void onSwiftDbAllDataRead();
409 virtual void onSwiftDbModelMatchingEntitiesRead();
413 virtual void initSimulatorInternals();
432 virtual void clearAllRemoteAircraftData();
437 virtual int physicallyRemoveAllRemoteAircraft();
443 bool likelyOnGroundElevation,
450 void emitSimulatorCombinedStatus(SimulatorStatus oldStatus = Unspecified);
453 void emitInterpolationSetupChanged()
override;
457 void debugLogMessage(
const QString &msg);
461 void debugLogMessage(
const QString &funcInfo,
const QString &msg);
464 bool showDebugLogMessage()
const;
483 virtual void reset();
486 bool isUpdateAllRemoteAircraft(qint64 currentTimestamp = -1)
const;
489 void setUpdateAllRemoteAircraft(qint64 currentTimestamp = -1, qint64 forMs = -1);
492 void resetUpdateAllRemoteAircraft();
495 void safeKillTimer();
515 bool isUpdateAircraftLimited(qint64 timestamp = -1);
518 bool isUpdateAircraftLimitedWithStats(qint64 startTime = -1);
521 bool limitToUpdatesPerSecond(
int numberPerSecond);
527 void reverseLookupAndUpdateOwnAircraftModel(
const QString &modelString);
532 const QString &details = {})
const;
535 void finishUpdateRemoteAircraftAndSetStatistics(qint64 startTime,
bool limited =
false);
559 bool m_updateRemoteAircraftInProgress =
false;
560 bool m_enablePseudoElevation =
false;
562 int m_statsUpdateAircraftRuns = 0;
563 int m_statsUpdateAircraftLimited = 0;
564 double m_statsUpdateAircraftTimeAvgMs = 0;
565 double m_averageFps = -1.0;
566 double m_simTimeRatio = 1.0;
567 double m_trackMilesShort = 0.0;
568 double m_minutesLate = 0.0;
569 qint64 m_updateAllRemoteAircraftUntil = 0;
571 qint64 m_statsUpdateAircraftTimeTotalMs = 0;
572 qint64 m_statsCurrentUpdateTimeMs = 0;
573 qint64 m_statsMaxUpdateTimeMs = 0;
574 qint64 m_lastRecordedGndElevationMs = 0;
575 qint64 m_statsLastUpdateAircraftRequestedMs = 0;
576 qint64 m_statsUpdateAircraftRequestedDeltaMs = 0;
597 bool m_limitUpdateAircraft =
false;
618 int m_statsPhysicallyAddedAircraft = 0;
619 int m_statsPhysicallyRemovedAircraft = 0;
622 bool m_networkConnected =
false;
644 virtual QString backendInfo()
const;
672 virtual bool isShuttingDown()
const;
685 void onAboutToShutdown();
688 std::atomic_bool m_isRunning {
false };
689 std::atomic_bool m_aboutToShutdown {
false };
726 Q_DECLARE_METATYPE(swift::core::ISimulator::SimulatorStatus)
728 Q_DECLARE_INTERFACE(swift::core::ISimulatorFactory, "org.swift-project.swift_core.simulatorfactory")
729 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.