swift
simulatorfsxcommon.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_SIMPLUGIN_FSXCOMMON_SIMULATORFSXCOMMON_H
7 #define SWIFT_SIMPLUGIN_FSXCOMMON_SIMULATORFSXCOMMON_H
8 
9 #include <QFutureWatcher>
10 #include <QHash>
11 #include <QList>
12 #include <QObject>
13 #include <QtPlugin>
14 
15 #include "config/buildconfig.h"
16 #include "core/simulator.h"
18 #include "misc/aviation/altitude.h"
19 #include "misc/network/client.h"
20 #include "misc/pixmap.h"
21 #include "misc/pq/frequency.h"
27 #include "misc/statusmessage.h"
32 #include "plugins/simulator/fsxcommon/simconnectwindows.h"
33 
34 namespace swift::simplugin::fsxcommon
35 {
37  enum EventIds
38  {
39  SystemEventSimStatus,
40  SystemEventObjectAdded,
41  SystemEventObjectRemoved,
42  SystemEventSlewToggle,
43  SystemEventFrame,
44  SystemEventPause,
45  SystemEventFlightLoaded,
46  EventPauseToggle,
47  EventFreezeLatLng,
48  EventFreezeAlt,
49  EventFreezeAtt,
50  EventSetCom1Active,
51  EventSetCom2Active,
52  EventSetCom1Standby,
53  EventSetCom2Standby,
54  EventSetTransponderCode,
55  EventTextMessage,
56  EventSetTimeZuluYear,
57  EventSetTimeZuluDay,
58  EventSetTimeZuluHours,
59  EventSetTimeZuluMinutes,
60  // ------------ lights -------------
61  EventLandingLightsOff,
62  EventLandinglightsOn,
63  EventLandingLightsSet,
64  EventLandingLightsToggle,
65  EventPanelLightsOff,
66  EventPanelLightsOn,
67  EventPanelLightsSet,
68  EventStrobesOff,
69  EventStrobesOn,
70  EventStrobesSet,
71  EventStrobesToggle,
72  EventToggleBeaconLights,
73  EventToggleCabinLights,
74  EventToggleLogoLights,
75  EventToggleNavLights,
76  EventToggleRecognitionLights,
77  EventToggleTaxiLights,
78  EventToggleWingLights,
79  // ------------- flaps -------------
80  EventFlapsSet,
81  // ---------- end marker -----------
82  EventFSXEndMarker
83  };
84 
87  {
91  {}
92 
93  // DWORD is unsigned
94  DWORD sendId = 0;
96  QString comment;
97 
99  bool isForProbe() const { return simObject.getType() == CSimConnectObject::TerrainProbe; }
100 
102  bool isForAircraft() const { return simObject.getType() == CSimConnectObject::AircraftNonAtc; }
103 
105  bool isInvalid() const { return sendId == 0 && simObject.isInvalid() == 0 && comment.isEmpty(); }
106 
108  bool isValid() const { return !this->isInvalid(); }
109 
111  static const TraceFsxSendId &invalid()
112  {
113  static const TraceFsxSendId i(0, CSimConnectObject(), "");
114  return i;
115  }
116  };
117 
120  {
121  Q_OBJECT
122  Q_INTERFACES(swift::core::ISimulator)
125 
126  public:
130  swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
131  swift::misc::network::IClientProvider *clientProvider, QObject *parent = nullptr);
132 
134  virtual ~CSimulatorFsxCommon() override;
135 
138  virtual bool connectTo() override;
139  virtual bool disconnectFrom() override;
140  virtual bool
141  physicallyAddRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &newRemoteAircraft) override;
142  virtual bool physicallyRemoveRemoteAircraft(const swift::misc::aviation::CCallsign &callsign) override;
143  virtual int physicallyRemoveAllRemoteAircraft() override;
144  virtual bool updateOwnSimulatorCockpit(const swift::misc::simulation::CSimulatedAircraft &ownAircraft,
145  const swift::misc::CIdentifier &originator) override;
146  virtual bool updateOwnSimulatorSelcal(const swift::misc::aviation::CSelcal &selcal,
147  const swift::misc::CIdentifier &originator) override;
148  virtual void displayStatusMessage(const swift::misc::CStatusMessage &message) const override;
149  virtual void displayTextMessage(const swift::misc::network::CTextMessage &message) const override;
150  virtual bool isPhysicallyRenderedAircraft(const swift::misc::aviation::CCallsign &callsign) const override;
151  virtual swift::misc::aviation::CCallsignSet physicallyRenderedAircraft() const override;
152  virtual swift::misc::CStatusMessageList debugVerifyStateAfterAllAircraftRemoved() const override;
153  virtual QString getStatisticsSimulatorSpecific() const override;
154  virtual void resetAircraftStatistics() override;
155  virtual void setFlightNetworkConnected(bool connected) override;
157  getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const override;
158  virtual bool testSendSituationAndParts(const swift::misc::aviation::CCallsign &callsign,
160  const swift::misc::aviation::CAircraftParts &parts) override;
162 
166  virtual bool requestElevation(const swift::misc::geo::ICoordinateGeodetic &reference,
167  const swift::misc::aviation::CCallsign &aircraftCallsign) override;
168 
170  bool isTracingSendId() const;
171 
173  bool isTraceSendId() const { return m_traceSendId; }
174 
176  void setTractingSendId(bool trace);
177 
180  bool isUsingFsxTerrainProbe() const { return m_useFsxTerrainProbe; }
181 
183  void setUsingFsxTerrainProbe(bool use) { m_useFsxTerrainProbe = use; }
184 
186  bool isUsingSbOffsetValues() const { return m_useSbOffsets; }
187 
189  void setUsingSbOffsetValues(bool use);
190 
193  int receivedSBPackets() const { return m_sbDataReceived; }
194 
196  bool isAddingAsSimulatedObjectEnabled() const { return m_useAddSimulatedObj; }
197 
199  void setAddingAsSimulatedObjectEnabled(bool enabled);
200 
202  static bool isRequestForSimObjAircraft(DWORD requestId)
203  {
204  return requestId >= RequestSimObjAircraftStart && requestId <= RequestSimObjAircraftRangeEnd;
205  }
206 
208  static bool isRequestForSimObjTerrainProbe(DWORD requestId)
209  {
210  return requestId >= RequestSimObjTerrainProbeStart && requestId <= RequestSimObjTerrainProbeRangeEnd;
211  }
212 
214  static bool isRequestForSimConnectObject(DWORD requestId)
215  {
216  return isRequestForSimObjAircraft(requestId) || isRequestForSimObjTerrainProbe(requestId);
217  }
218 
220  static CSimConnectDefinitions::SimObjectRequest requestToSimObjectRequest(DWORD requestId);
221 
224  static DWORD unitTestRequestId(CSimConnectObject::SimObjectType type);
225 
227  static QString fsxCharToQString(const char *fsxChar, int size = -1);
228 
229  protected:
233  static void CALLBACK SimConnectProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext);
234 
237  virtual bool isConnected() const override;
238  virtual bool isSimulating() const override;
240 
243  virtual void reset() override;
244  virtual void initSimulatorInternals() override;
245  virtual void clearAllRemoteAircraftData() override;
246  virtual void onOwnModelChanged(const swift::misc::simulation::CAircraftModel &newModel) override;
248 
252  virtual void timerEvent(QTimerEvent *event) override;
253 
255  virtual HRESULT initEventsP3D();
256 
261  virtual bool parseDetails(const swift::misc::CSimpleCommandParser &parser) override;
262 
265  bool triggerAutoTraceSendId(qint64 traceTimeMs = AutoTraceOffsetMs);
266 
268  swift::misc::aviation::CCallsign getCallsignForPendingProbeRequests(DWORD requestId, bool remove);
269 
271  SIMCONNECT_DATA_REQUEST_ID obtainRequestIdForSimObjAircraft();
272 
274  SIMCONNECT_DATA_REQUEST_ID obtainRequestIdForSimObjTerrainProbe();
275 
278  virtual bool releaseAIControl(const CSimConnectObject &simObject, SIMCONNECT_DATA_REQUEST_ID requestId);
279 
281  bool isValidSimObjectNotPendingRemoved(const CSimConnectObject &simObject) const;
282 
284  CSimConnectObject getSimObjectForTrace(const TraceFsxSendId &trace) const;
285 
287  bool removeSimObjectForTrace(const TraceFsxSendId &trace);
288 
290  virtual void removeCamera(CSimConnectObject &simObject);
291 
293  virtual void removeObserver(CSimConnectObject &simObject);
294 
296  HRESULT logAndTraceSendId(HRESULT hr, const QString &warningMsg, const QString &functionName,
297  const QString &functionDetails = {});
298 
300  HRESULT logAndTraceSendId(HRESULT hr, const CSimConnectObject &simObject, const QString &warningMsg,
301  const QString &functionName, const QString &functionDetails = {});
302 
304  HRESULT logAndTraceSendId(HRESULT hr, bool traceSendId, const CSimConnectObject &simObject,
305  const QString &warningMsg, const QString &functionName,
306  const QString &functionDetails = {});
307 
309  static QByteArray toFsxChar(const QString &string);
310 
312  static void registerHelp();
313 
316  static bool is32bit() { return (swift::config::CBuildConfig::buildWordSize() == 32); }
317  static bool is64bit() { return (swift::config::CBuildConfig::buildWordSize() == 64); }
319 
322  static SIMCONNECT_DATA_INITPOSITION
323  aircraftSituationToFsxPosition(const swift::misc::aviation::CAircraftSituation &situation, bool sendGnd = true,
324  bool forceUnderflowDetection = false,
325  swift::misc::CStatusMessage *details = nullptr);
326 
329  static SIMCONNECT_DATA_PBH
330  aircraftSituationToFsxPBH(const swift::misc::aviation::CAircraftSituation &situation);
331 
333  static SIMCONNECT_DATA_INITPOSITION
334  coordinateToFsxPosition(const swift::misc::geo::ICoordinateGeodetic &coordinate);
335 
337  static SIMCONNECT_DATA_LATLONALT
338  coordinateToFsxLatLonAlt(const swift::misc::geo::ICoordinateGeodetic &coordinate);
339 
341  static bool isValidFsxPosition(const SIMCONNECT_DATA_INITPOSITION &fsxPos);
342 
344  static bool isValid180Deg(double deg) { return deg > -180.0 && deg <= 180.0; }
345 
346  static constexpr qint64 AutoTraceOffsetMs = 10 * 1000;
347  HANDLE m_hSimConnect = nullptr;
348  DispatchProc m_dispatchProc = &CSimulatorFsxCommon::SimConnectProc;
351 
352  // probes
353  bool m_useFsxTerrainProbe = is32bit();
354  bool m_initFsxTerrainProbes = false;
355  int m_addedProbes = 0;
358 
360 
361  private:
363  enum AircraftAddMode
364  {
365  ExternalCall,
366  AddByTimer,
367  AddAfterAdded,
368  AddedAfterRemoved
369  };
370 
372  static const QString &modeToString(AircraftAddMode mode);
373 
376  void dispatch();
377 
381  bool physicallyAddRemoteAircraftImpl(const swift::misc::simulation::CSimulatedAircraft &newRemoteAircraft,
382  AircraftAddMode addMode,
383  const CSimConnectObject &correspondingSimObject = {});
384 
387  bool physicallyAddAITerrainProbe(const swift::misc::geo::ICoordinateGeodetic &coordinate, int number);
388 
391  int physicallyInitAITerrainProbes(const swift::misc::geo::ICoordinateGeodetic &coordinate, int number);
392 
395  swift::misc::aviation::CCallsignSet physicallyRemoveAircraftNotInProvider();
396 
398  void physicallyRemoveAircraftNotInProviderAsync();
399 
403  void verifyAddedRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &remoteAircraftIn);
404 
406  void addingAircraftFailed(const CSimConnectObject &simObject);
407 
409  bool verifyFailedAircraftInfo(const CSimConnectObject &simObject, swift::misc::CStatusMessage &details) const;
410 
412  bool logVerifyFailedAircraftInfo(const CSimConnectObject &simObject) const;
413 
415  void verifyAddedTerrainProbe(const swift::misc::simulation::CSimulatedAircraft &remoteAircraftIn);
416 
418  void timerBasedObjectAddOrRemove();
419 
421  void addPendingAircraftAfterAdded();
422 
424  void addPendingAircraft(AircraftAddMode mode);
425 
427  CSimConnectObject removeFromAddPendingAndAddAgainAircraft(const swift::misc::aviation::CCallsign &callsign);
428 
430  void setSimConnected();
431 
433  void onSimRunning();
434 
436  void onSimRunningDeferred(qint64 referenceTs);
437 
439  void onSimFrame();
440 
442  void onSimStopped();
443 
445  void onSimExit();
446 
448  HRESULT initWhenConnected();
449 
451  HRESULT initEvents();
452 
454  HRESULT initDataDefinitionsWhenConnected();
455 
458  void updateRemoteAircraft();
459 
461  bool updateRemoteAircraftParts(const CSimConnectObject &simObject,
462  const swift::misc::simulation::CInterpolationResult &result, bool forcedUpdate);
463 
466  bool sendRemoteAircraftPartsToSimulator(const CSimConnectObject &simObject,
468 
470  bool sendRemoteAircraftAtcDataToSimulator(const CSimConnectObject &simObject);
471 
475  void sendToggledLightsToSimulator(const CSimConnectObject &simObject,
476  const swift::misc::aviation::CAircraftLights &lightsWanted,
477  bool force = false);
478 
481  void triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject,
482  const DataDefinitionPosData &remoteAircraftData);
483 
486  void triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject,
487  const DataDefinitionRemoteAircraftModel &remoteAircraftModel);
488 
490  void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject,
491  const DataDefinitionPosData &remoteAircraftData);
492 
494  void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject,
495  const DataDefinitionRemoteAircraftModel &remoteAircraftModel);
496 
498  void updateProbeFromSimulator(const swift::misc::aviation::CCallsign &callsign,
499  const DataDefinitionPosData &remoteAircraftData);
500 
502  virtual void
503  setTrueAltitude(swift::misc::aviation::CAircraftSituation &aircraftSituation,
504  const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft);
505 
507  void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft);
508 
511  void updateOwnAircraftFromSimulator(const DataDefinitionClientAreaSb &sbDataArea);
512 
515  void updateTransponderMode(const misc::aviation::CTransponder::TransponderMode xpdrMode);
516 
518  void updateMSFSTransponderMode(const DataDefinitionMSFSTransponderMode transponderMode);
519 
521  bool simulatorReportedObjectAdded(DWORD objectId);
522 
524  bool simulatorReportedObjectRemoved(DWORD objectID);
525 
527  bool setSimConnectObjectId(DWORD requestId, DWORD objectId);
528 
530  bool setCurrentLights(const swift::misc::aviation::CCallsign &callsign,
532 
534  bool setLightsAsSent(const swift::misc::aviation::CCallsign &callsign,
536 
538  bool stillDisplayReceiveExceptions();
539 
541  const CSimConnectObjects &getSimConnectObjects() const { return m_simConnectObjects; }
542 
544  CSimConnectObject getSimObjectForObjectId(DWORD objectId) const;
545 
547  bool requestPositionDataForSimObject(const CSimConnectObject &simObject,
548  SIMCONNECT_PERIOD period = SIMCONNECT_PERIOD_SECOND);
549 
551  bool requestTerrainProbeData(const CSimConnectObject &simObject,
552  const swift::misc::aviation::CCallsign &aircraftCallsign);
553 
555  bool requestLightsForSimObject(const CSimConnectObject &simObject);
556 
558  bool requestModelInfoForSimObject(const CSimConnectObject &simObject);
559 
561  bool stopRequestingDataForSimObject(const CSimConnectObject &simObject);
562 
564  static QString fsxPositionToString(const SIMCONNECT_DATA_INITPOSITION &position);
565 
567  swift::misc::aviation::CCallsignSet getCallsignsMissingInProvider() const;
568 
570  void setTraceSendId(bool traceSendId) { m_traceSendId = traceSendId; }
571 
573  void traceSendId(const CSimConnectObject &simObject, const QString &functionName, const QString &details = {},
574  bool forceTrace = false);
575 
577  TraceFsxSendId getSendIdTrace(DWORD sendId) const;
578 
580  QString getSendIdTraceDetails(const TraceFsxSendId &trace) const;
581 
583  QString getSendIdTraceDetails(DWORD sendId) const;
584 
586  int removeAllProbes();
587 
589  CSimConnectObject insertNewSimConnectObject(const swift::misc::simulation::CSimulatedAircraft &aircraft,
590  DWORD requestId, CSimConnectObject::SimObjectType type,
591  const CSimConnectObject &removedPendingObject = {});
592 
594  bool updateCOMFromSwiftToSimulator(const swift::misc::physical_quantities::CFrequency &newFreq,
596  swift::misc::physical_quantities::CFrequency &last25kHzSimFreq, EventIds id);
597 
599  static const swift::misc::aviation::CAltitude &terrainProbeAltitude();
600 
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;
607 
608  // -- second chance tresholds --
609  static constexpr int ThresholdAddException = 1;
610  static constexpr int ThresholdAddedAndDirectlyRemoved = 2;
611 
612  // -- range for sim data, each sim object will get its own request id and use the offset ranges
613  static constexpr int RequestSimObjAircraftStart = static_cast<int>(CSimConnectDefinitions::RequestEndMarker);
614  static constexpr int RequestSimObjAircraftEnd = RequestSimObjAircraftStart - 1 + MaxSimObjAircraft;
615  static constexpr int RequestSimObjAircraftRangeEnd =
616  RequestSimObjAircraftStart - 1 +
617  static_cast<int>(CSimConnectDefinitions::SimObjectEndMarker) * MaxSimObjAircraft;
618 
619  // -- range for probe data, each probe object will get its own request id and use the offset ranges
620  static constexpr int RequestSimObjTerrainProbeStart = RequestSimObjAircraftRangeEnd + 1;
621  static constexpr int RequestSimObjTerrainProbeEnd = RequestSimObjTerrainProbeStart - 1 + MaxSimObjProbes;
622  static constexpr int RequestSimObjTerrainProbeRangeEnd =
623  RequestSimObjTerrainProbeStart - 1 +
624  static_cast<int>(CSimConnectDefinitions::SimObjectEndMarker) * MaxSimObjProbes;
625 
626  // times
627  static constexpr int AddPendingAircraftIntervalMs = 20 * 1000;
628  static constexpr int DispatchIntervalMs = 10;
629  static constexpr int DeferSimulatingFlagMs =
630  1500;
632  static constexpr int DeferResendingLights =
633  2500;
634 
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;
645 
646  // tracing dispatch performance
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;
654 
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 =
662 
663  // sending via SimConnect
664  QList<TraceFsxSendId> m_sendIdTraces;
665  int m_receiveExceptionCount = 0;
666  int m_requestSimObjectDataCount = 0;
667 
668  // settings
670 
671  // objects
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;
680 
681  // Last selected frequencies in simulator before setting 8.33 kHz spacing frequency
684  };
687  };
690  };
693  };
694 
696  static QString requestIdToString(DWORD requestId);
697 
698  public:
702  {
703  return MaxSimObjAircraft * static_cast<DWORD>(req);
704  }
706  {
707  return MaxSimObjProbes * static_cast<DWORD>(req);
708  }
710  };
711 
714  {
715  Q_OBJECT
716 
717  public:
720 
722  virtual QString backendInfo() const override;
723 
724  protected:
726  virtual void startImpl() override;
727 
729  virtual void stopImpl() override;
730 
732  virtual void checkImpl() override;
733 
734  private:
736  void checkConnection();
737 
739  bool checkVersionAndSimulator() const;
740 
742  bool checkSimConnectDll() const;
743 
745  bool connectToSimulator();
746 
748  bool disconnectFromSimulator();
749 
751  void adjustTimerInterval(qint64 checkTimeMs);
752 
753  static constexpr int MinQueryIntervalMs = 5 * 1000; // 5 seconds
754 
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;
762  swift::misc::CStatusMessage m_lastMessage;
763 
766  static void CALLBACK SimConnectProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext);
767  };
768 } // namespace swift::simplugin::fsxcommon
769 
770 #endif // SWIFT_SIMPLUGIN_FSXCOMMON_SIMULATORFSXCOMMON_H
static int buildWordSize()
Whether this swift application is build as 32 or 64bit application.
Interface to a simulator.
Definition: simulator.h:59
Interface to a simulator listener.
Definition: simulator.h:630
Value object encapsulating information identifying a component of a modular distributed swift process...
Definition: identifier.h:29
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.
Definition: aircraftparts.h:26
Value object encapsulating information of an aircraft's situation.
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object for a set of callsigns.
Definition: callsignset.h:26
Value object for SELCAL.
Definition: selcal.h:31
Geodetic coordinate, a position in 3D space relative to the reference geoid.
Value object encapsulating information of a text message.
Definition: textmessage.h:31
Direct in memory access to client (network client) data.
static CFrequencyUnit nullUnit()
Null unit.
Definition: units.h:364
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Comprehensive information of an aircraft.
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.
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
Class representing a SimConnect object.
SimObjectType getType() const
Object type.
Simulator objects (aka AI aircraft)
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 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
static const TraceFsxSendId & invalid()
Invalid object.
TraceFsxSendId(DWORD sendId, const CSimConnectObject &simObject, const QString &comment)
Ctor.
CSimConnectObject simObject
CSimConnectObject at the time of the trace.