6 #ifndef SWIFT_SIMPLUGIN_FSXCOMMON_SIMULATORFSXCOMMON_H
7 #define SWIFT_SIMPLUGIN_FSXCOMMON_SIMULATORFSXCOMMON_H
9 #include <QFutureWatcher>
32 #include "plugins/simulator/fsxcommon/simconnectwindows.h"
34 namespace swift::simplugin::fsxcommon
40 SystemEventObjectAdded,
41 SystemEventObjectRemoved,
42 SystemEventSlewToggle,
45 SystemEventFlightLoaded,
54 EventSetTransponderCode,
58 EventSetTimeZuluHours,
59 EventSetTimeZuluMinutes,
61 EventLandingLightsOff,
63 EventLandingLightsSet,
64 EventLandingLightsToggle,
72 EventToggleBeaconLights,
73 EventToggleCabinLights,
74 EventToggleLogoLights,
76 EventToggleRecognitionLights,
77 EventToggleTaxiLights,
78 EventToggleWingLights,
138 virtual bool connectTo()
override;
139 virtual bool disconnectFrom()
override;
143 virtual int physicallyRemoveAllRemoteAircraft()
override;
153 virtual QString getStatisticsSimulatorSpecific()
const override;
154 virtual void resetAircraftStatistics()
override;
155 virtual void setFlightNetworkConnected(
bool connected)
override;
170 bool isTracingSendId()
const;
176 void setTractingSendId(
bool trace);
189 void setUsingSbOffsetValues(
bool use);
199 void setAddingAsSimulatedObjectEnabled(
bool enabled);
204 return requestId >= RequestSimObjAircraftStart && requestId <= RequestSimObjAircraftRangeEnd;
210 return requestId >= RequestSimObjTerrainProbeStart && requestId <= RequestSimObjTerrainProbeRangeEnd;
216 return isRequestForSimObjAircraft(requestId) || isRequestForSimObjTerrainProbe(requestId);
227 static QString fsxCharToQString(
const char *fsxChar,
int size = -1);
233 static void CALLBACK SimConnectProc(SIMCONNECT_RECV *pData,
DWORD cbData,
void *pContext);
237 virtual bool isConnected()
const override;
238 virtual bool isSimulating()
const override;
243 virtual void reset()
override;
244 virtual void initSimulatorInternals()
override;
245 virtual void clearAllRemoteAircraftData()
override;
252 virtual void timerEvent(QTimerEvent *event)
override;
255 virtual HRESULT initEventsP3D();
265 bool triggerAutoTraceSendId(qint64 traceTimeMs = AutoTraceOffsetMs);
271 SIMCONNECT_DATA_REQUEST_ID obtainRequestIdForSimObjAircraft();
274 SIMCONNECT_DATA_REQUEST_ID obtainRequestIdForSimObjTerrainProbe();
278 virtual bool releaseAIControl(
const CSimConnectObject &simObject, SIMCONNECT_DATA_REQUEST_ID requestId);
281 bool isValidSimObjectNotPendingRemoved(
const CSimConnectObject &simObject)
const;
296 HRESULT logAndTraceSendId(HRESULT hr,
const QString &warningMsg,
const QString &functionName,
297 const QString &functionDetails = {});
300 HRESULT logAndTraceSendId(HRESULT hr,
const CSimConnectObject &simObject,
const QString &warningMsg,
301 const QString &functionName,
const QString &functionDetails = {});
304 HRESULT logAndTraceSendId(HRESULT hr,
bool traceSendId,
const CSimConnectObject &simObject,
305 const QString &warningMsg,
const QString &functionName,
306 const QString &functionDetails = {});
309 static QByteArray toFsxChar(
const QString &
string);
312 static void registerHelp();
322 static SIMCONNECT_DATA_INITPOSITION
324 bool forceUnderflowDetection =
false,
333 static SIMCONNECT_DATA_INITPOSITION
337 static SIMCONNECT_DATA_LATLONALT
341 static bool isValidFsxPosition(
const SIMCONNECT_DATA_INITPOSITION &fsxPos);
344 static bool isValid180Deg(
double deg) {
return deg > -180.0 && deg <= 180.0; }
346 static constexpr qint64 AutoTraceOffsetMs = 10 * 1000;
347 HANDLE m_hSimConnect =
nullptr;
353 bool m_useFsxTerrainProbe = is32bit();
354 bool m_initFsxTerrainProbes =
false;
355 int m_addedProbes = 0;
372 static const QString &modeToString(AircraftAddMode mode);
382 AircraftAddMode addMode,
398 void physicallyRemoveAircraftNotInProviderAsync();
406 void addingAircraftFailed(
const CSimConnectObject &simObject);
412 bool logVerifyFailedAircraftInfo(
const CSimConnectObject &simObject)
const;
418 void timerBasedObjectAddOrRemove();
421 void addPendingAircraftAfterAdded();
424 void addPendingAircraft(AircraftAddMode mode);
430 void setSimConnected();
436 void onSimRunningDeferred(qint64 referenceTs);
448 HRESULT initWhenConnected();
451 HRESULT initEvents();
454 HRESULT initDataDefinitionsWhenConnected();
458 void updateRemoteAircraft();
461 bool updateRemoteAircraftParts(
const CSimConnectObject &simObject,
466 bool sendRemoteAircraftPartsToSimulator(
const CSimConnectObject &simObject,
470 bool sendRemoteAircraftAtcDataToSimulator(
const CSimConnectObject &simObject);
475 void sendToggledLightsToSimulator(
const CSimConnectObject &simObject,
481 void triggerUpdateRemoteAircraftFromSimulator(
const CSimConnectObject &simObject,
482 const DataDefinitionPosData &remoteAircraftData);
486 void triggerUpdateRemoteAircraftFromSimulator(
const CSimConnectObject &simObject,
487 const DataDefinitionRemoteAircraftModel &remoteAircraftModel);
490 void updateRemoteAircraftFromSimulator(
const CSimConnectObject &simObject,
491 const DataDefinitionPosData &remoteAircraftData);
494 void updateRemoteAircraftFromSimulator(
const CSimConnectObject &simObject,
495 const DataDefinitionRemoteAircraftModel &remoteAircraftModel);
499 const DataDefinitionPosData &remoteAircraftData);
507 void updateOwnAircraftFromSimulator(
const DataDefinitionOwnAircraft &simulatorOwnAircraft);
511 void updateOwnAircraftFromSimulator(
const DataDefinitionClientAreaSb &sbDataArea);
518 void updateMSFSTransponderMode(
const DataDefinitionMSFSTransponderMode transponderMode);
521 bool simulatorReportedObjectAdded(
DWORD objectId);
524 bool simulatorReportedObjectRemoved(
DWORD objectID);
527 bool setSimConnectObjectId(
DWORD requestId,
DWORD objectId);
538 bool stillDisplayReceiveExceptions();
541 const CSimConnectObjects &getSimConnectObjects()
const {
return m_simConnectObjects; }
544 CSimConnectObject getSimObjectForObjectId(
DWORD objectId)
const;
547 bool requestPositionDataForSimObject(
const CSimConnectObject &simObject,
548 SIMCONNECT_PERIOD period = SIMCONNECT_PERIOD_SECOND);
551 bool requestTerrainProbeData(
const CSimConnectObject &simObject,
555 bool requestLightsForSimObject(
const CSimConnectObject &simObject);
558 bool requestModelInfoForSimObject(
const CSimConnectObject &simObject);
561 bool stopRequestingDataForSimObject(
const CSimConnectObject &simObject);
564 static QString fsxPositionToString(
const SIMCONNECT_DATA_INITPOSITION &position);
570 void setTraceSendId(
bool traceSendId) { m_traceSendId = traceSendId; }
573 void traceSendId(
const CSimConnectObject &simObject,
const QString &functionName,
const QString &details = {},
574 bool forceTrace =
false);
577 TraceFsxSendId getSendIdTrace(
DWORD sendId)
const;
580 QString getSendIdTraceDetails(
const TraceFsxSendId &trace)
const;
583 QString getSendIdTraceDetails(
DWORD sendId)
const;
586 int removeAllProbes();
591 const CSimConnectObject &removedPendingObject = {});
601 static constexpr
int GuessRemoteAircraftPartsCycle = 20;
602 static constexpr
int SkipUpdateCyclesForCockpit = 10;
603 static constexpr
int IgnoreReceiveExceptions = 10;
604 static constexpr
int MaxSendIdTraces = 10000;
605 static constexpr
DWORD MaxSimObjAircraft = 10000;
606 static constexpr
DWORD MaxSimObjProbes = 100;
609 static constexpr
int ThresholdAddException = 1;
610 static constexpr
int ThresholdAddedAndDirectlyRemoved = 2;
614 static constexpr
int RequestSimObjAircraftEnd = RequestSimObjAircraftStart - 1 + MaxSimObjAircraft;
615 static constexpr
int RequestSimObjAircraftRangeEnd =
616 RequestSimObjAircraftStart - 1 +
620 static constexpr
int RequestSimObjTerrainProbeStart = RequestSimObjAircraftRangeEnd + 1;
621 static constexpr
int RequestSimObjTerrainProbeEnd = RequestSimObjTerrainProbeStart - 1 + MaxSimObjProbes;
622 static constexpr
int RequestSimObjTerrainProbeRangeEnd =
623 RequestSimObjTerrainProbeStart - 1 +
627 static constexpr
int AddPendingAircraftIntervalMs = 20 * 1000;
628 static constexpr
int DispatchIntervalMs = 10;
629 static constexpr
int DeferSimulatingFlagMs =
632 static constexpr
int DeferResendingLights =
635 QString m_simConnectVersion;
636 bool m_simConnected =
false;
637 bool m_simSimulating =
false;
638 bool m_useSbOffsets =
true;
639 bool m_logSbOffsets =
false;
640 bool m_traceSendId =
false;
641 bool m_useAddSimulatedObj =
false;
642 qint64 m_traceAutoUntilTs = -1;
643 qint64 m_simulatingChangedTs = -1;
644 int m_sbDataReceived = 0;
647 int m_dispatchErrors = 0;
648 int m_dispatchProcCount = 0;
649 int m_dispatchProcEmptyCount = 0;
650 qint64 m_dispatchTimeMs = -1;
651 qint64 m_dispatchMaxTimeMs = -1;
652 qint64 m_dispatchProcTimeMs = -1;
653 qint64 m_dispatchProcMaxTimeMs = -1;
655 SIMCONNECT_RECV_ID m_dispatchReceiveIdLast = SIMCONNECT_RECV_ID_NULL;
656 SIMCONNECT_RECV_ID m_dispatchReceiveIdMaxTime =
657 SIMCONNECT_RECV_ID_NULL;
658 DWORD m_dispatchRequestIdLast =
660 DWORD m_dispatchRequestIdMaxTime =
664 QList<TraceFsxSendId> m_sendIdTraces;
665 int m_receiveExceptionCount = 0;
666 int m_requestSimObjectDataCount = 0;
672 CSimConnectObjects m_simConnectObjectsPositionAndPartsTraces;
674 CSimConnectObjects m_addPendingAircraft;
675 SIMCONNECT_DATA_REQUEST_ID m_requestIdSimObjAircraft =
static_cast<SIMCONNECT_DATA_REQUEST_ID
>(
676 RequestSimObjAircraftStart);
677 SIMCONNECT_DATA_REQUEST_ID m_requestIdSimObjTerrainProbe =
static_cast<SIMCONNECT_DATA_REQUEST_ID
>(
678 RequestSimObjTerrainProbeStart);
679 QTimer m_simObjectTimer;
696 static QString requestIdToString(
DWORD requestId);
703 return MaxSimObjAircraft *
static_cast<DWORD>(req);
707 return MaxSimObjProbes *
static_cast<DWORD>(req);
722 virtual QString backendInfo()
const override;
726 virtual void startImpl()
override;
729 virtual void stopImpl()
override;
732 virtual void checkImpl()
override;
736 void checkConnection();
739 bool checkVersionAndSimulator()
const;
742 bool checkSimConnectDll()
const;
745 bool connectToSimulator();
748 bool disconnectFromSimulator();
751 void adjustTimerInterval(qint64 checkTimeMs);
753 static constexpr
int MinQueryIntervalMs = 5 * 1000;
755 QTimer m_timer {
this };
756 QString m_simulatorVersion;
757 QString m_simConnectVersion;
758 QString m_simulatorName;
759 QString m_simulatorDetails;
760 HANDLE m_hSimConnect;
761 bool m_simConnected =
false;
766 static void CALLBACK SimConnectProc(SIMCONNECT_RECV *pData,
DWORD cbData,
void *pContext);
static int buildWordSize()
Whether this swift application is build as 32 or 64bit application.
Interface to a simulator.
Interface to a simulator listener.
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 about aircraft's lights.
Value object encapsulating information of aircraft's parts.
Value object encapsulating information of an aircraft's situation.
Altitude as used in aviation, can be AGL or MSL altitude.
Value object encapsulating information of a callsign.
Value object for a set of callsigns.
TransponderMode
Transponder codes.
Geodetic coordinate, a position in 3D space relative to the reference geoid.
Value object encapsulating information of a text message.
Direct in memory access to client (network client) data.
static CFrequencyUnit nullUnit()
Null unit.
Physical unit length (length)
Aircraft model (used by another pilot, my models on disk)
Comprehensive information of an aircraft.
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 detail settings.
Common base class for MS flight simulators.
SimObjectRequest
SimObject requests used for AI aircraft and probes.
@ SimObjectEndMarker
end marker, do NOT remove, also means invalid
@ RequestEndMarker
free request ids can start here
Class representing a SimConnect object.
bool isInvalid() const
Invalid?
SimObjectType getType() const
Object type.
Simulator objects (aka AI aircraft)
FSX Simulator Implementation.
bool isUsingFsxTerrainProbe() const
FSX Terrain probe.
static DWORD offsetSimObjAircraft(CSimConnectDefinitions::SimObjectRequest req)
Offsets.
static bool isValid180Deg(double deg)
Valid 180degrees value.
CSimConnectObjects m_simConnectObjects
AI objects and their object and request ids.
swift::misc::physical_quantities::CLength m_altitudeDelta
FS2020 effect of temperature on altitude.
QMap< DWORD, swift::misc::aviation::CCallsign > m_pendingProbeRequests
pending elevation requests: requestId/aircraft callsign
int receivedSBPackets() const
Number of received SB4 packets.
static bool isRequestForSimObjTerrainProbe(DWORD requestId)
Request for probe (elevation)?
static bool isRequestForSimConnectObject(DWORD requestId)
Request for any CSimConnectObject?
bool isAddingAsSimulatedObjectEnabled() const
Allow adding as simulated object instead of non ATC.
void setUsingFsxTerrainProbe(bool use)
FSX terrain probe.
bool isTraceSendId() const
Trace enable (can be auto enable also)
static bool is64bit()
Word size.
static bool is32bit()
Word size.
static bool isRequestForSimObjAircraft(DWORD requestId)
Request for sim data (request in range of sim data)?
static void CALLBACK SimConnectProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext)
SimConnect callback.
static DWORD offsetSimObjTerrainProbe(CSimConnectDefinitions::SimObjectRequest req)
Offsets.
bool isUsingSbOffsetValues() const
Using the SB offsets?
#define FSXCOMMON_EXPORT
FSXCommon Export Macro.
unsigned long DWORD
Fake Windows DWORD.
EventIds
SimConnect Event IDs.
adding struct SIMCONNECT_DATA_PBH not existing in SimConnect FSX
Data struct of our own aircraft.
Struct to trace send ids.
QString comment
where sent
static const TraceFsxSendId & invalid()
Invalid object.
bool isInvalid() const
Invalid trace?
bool isValid() const
Valid trace?
TraceFsxSendId(DWORD sendId, const CSimConnectObject &simObject, const QString &comment)
Ctor.
bool isForAircraft() const
For aircraft.
CSimConnectObject simObject
CSimConnectObject at the time of the trace.
bool isForProbe() const
For probe.