swift
simconnectobject.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_SIMCONNECTOBJECT_H
7 #define SWIFT_SIMPLUGIN_FSXCOMMON_SIMCONNECTOBJECT_H
8 
9 #include <QByteArray>
10 #include <QSharedPointer>
11 #include <QStringList>
12 
17 
18 namespace swift::simplugin::fsxcommon
19 {
22  {
23  public:
26  {
27  AircraftNonAtc,
28  AircraftSimulatedObject,
29  TerrainProbe,
30  AllTypes
31  };
32 
35 
37  CSimConnectObject(SimObjectType type);
38 
45 
47  const swift::misc::aviation::CCallsign &getCallsign() const { return m_aircraft.getCallsign(); }
48 
50  const QString &getCallsignAsString() const { return m_aircraft.getCallsign().asString(); }
51 
53  bool hasCallsign() const { return !this->getCallsign().isEmpty(); }
54 
56  const swift::misc::simulation::CSimulatedAircraft &getAircraft() const { return m_aircraft; }
57 
59  const swift::misc::simulation::CAircraftModel &getAircraftModel() const { return m_aircraft.getModel(); }
60 
62  const QString &getAircraftModelString() const { return m_aircraft.getModelString(); }
63 
65  SimObjectType getType() const { return m_type; }
66 
68  const QString &getTypeAsString() const { return typeToString(m_type); }
69 
71  bool isAircraft() const
72  {
73  return this->getType() == AircraftNonAtc || this->getType() == AircraftSimulatedObject;
74  }
75 
77  bool isAircraftSimulatedObject() const { return this->getType() == AircraftSimulatedObject; }
78 
80  bool isAircraftNonAtc() const { return this->getType() == AircraftNonAtc; }
81 
83  bool isTerrainProbe() const { return this->getType() == TerrainProbe; }
84 
86  void setType(SimObjectType type) { m_type = type; }
87 
89  void setAircraft(const swift::misc::simulation::CSimulatedAircraft &aircraft);
90 
92  void setAircraftModelString(const QString &modelString);
93 
95  void setAircraftCG(const swift::misc::physical_quantities::CLength &cg);
96 
99  {
100  return m_currentLightsInSim;
101  }
102 
104  bool hasCurrentLightsInSimulator() const { return !m_currentLightsInSim.isNull(); }
105 
108  {
109  m_currentLightsInSim = lights;
110  }
111 
113  void fakeCurrentLightsInSimulator() { m_currentLightsInSim.setNull(false); }
114 
116  const swift::misc::aviation::CAircraftLights &getLightsAsSent() const { return m_lightsAsSent; }
117 
119  void setLightsAsSent(const swift::misc::aviation::CAircraftLights &lights) { m_lightsAsSent = lights; }
120 
122  SIMCONNECT_PERIOD getSimDataPeriod() const { return m_requestSimDataPeriod; }
123 
125  void setSimDataPeriod(SIMCONNECT_PERIOD period) { m_requestSimDataPeriod = period; }
126 
128  void setRequestId(DWORD id);
129 
131  DWORD getRequestId() const { return m_requestId; }
132 
134  DWORD getRequestId(CSimConnectDefinitions::SimObjectRequest offset) const;
135 
137  void setObjectId(DWORD id);
138 
140  DWORD getObjectId() const { return m_objectId; }
141 
143  QString getObjectIdAsString() const { return QString::number(this->getObjectId()); }
144 
146  bool hasValidRequestId() const { return m_validRequestId; }
147 
149  bool hasValidObjectId() const { return m_validObjectId; }
150 
152  bool isPendingAdded() const;
153 
155  bool isOutdatedPendingAdded(qint64 thresholdMs = 5000, qint64 currentMsSinceEpoch = -1) const;
156 
158  bool isConfirmedAdded() const;
159 
162  void setConfirmedAdded(bool confirm);
163 
166  bool isAddedWhileRemoving() { return m_addedWhileRemoving; }
167  void setAddedWhileRemoving(bool addedWileRemoved);
168  bool isRemovedWhileAdding() const { return m_removedWhileAdding; }
169  void setRemovedWhileAdding(bool removedWhileAdding);
171 
173  bool isPendingRemoved() const { return m_pendingRemoved; }
174 
176  bool isReadyToSend() const;
177 
179  void setPendingRemoved(bool pending);
180 
182  bool isPending() const { return this->isPendingAdded() || this->isPendingRemoved(); }
183 
185  bool hasCamera() const { return m_camera; }
186 
188  void resetCameraPositions();
189 
191  const SIMCONNECT_DATA_XYZ &cameraPosition() const { return m_cameraPosition; }
192 
194  const SIMCONNECT_DATA_PBH &cameraRotation() const { return m_cameraRotation; }
195 
197  void setCameraPositionAndRotation(const SIMCONNECT_DATA_XYZ &position, const SIMCONNECT_DATA_PBH &rotation)
198  {
199  m_cameraPosition = position;
200  m_cameraRotation = rotation;
201  }
202 
204  GUID getCameraGUID() const { return m_cameraGuid; }
205 
207  void setCameraGUID(GUID guid)
208  {
209  m_cameraGuid = guid;
210  m_camera = true;
211  }
212 
214  void removeCamera() { m_camera = false; }
215 
217  void setObserverName(const QString &observer) { m_observerName = observer; }
218 
220  const QString &getObserverName() const { return m_observerName; }
221 
223  void resetState();
224 
226  void resetToAddAgain();
227 
229  void resetTimestampToNow() { m_tsCreated = QDateTime::currentMSecsSinceEpoch(); }
230 
232  bool isVtol() const { return m_aircraft.isVtol(); }
233 
235  bool isValid() const { return !this->isInvalid(); }
236 
238  bool isInvalid() const { return !this->hasValidObjectId() && !this->hasValidRequestId(); }
239 
241  bool hasCreatedTimestamp() const { return m_tsCreated >= 0; }
242 
244  qint64 getCreatedTimestamp() const { return m_tsCreated; }
245 
247  int getEngineCount() const { return m_aircraft.getEnginesCount(); }
248 
250  bool hasValidRequestAndObjectId() const;
251 
253  int getAddingExceptions() const { return m_addingExceptions; }
254 
256  void setAddingExceptions(int number) { m_addingExceptions = number; }
257 
259  void increaseAddingExceptions() { m_addingExceptions++; }
260 
263  {
264  if (m_addingExceptions > 0) { m_addingExceptions--; }
265  }
266 
268  int getAddingDirectlyRemoved() const { return m_addingDirectlyRemoved; }
269 
271  void setAddingDirectlyRemoved(int number) { m_addingDirectlyRemoved = number; }
272 
274  void increaseAddingDirectlyRemoved() { m_addingDirectlyRemoved++; }
275 
277  void copyAddingFailureCounters(const CSimConnectObject &otherObject);
278 
280  const QByteArray &getCallsignByteArray() const { return m_callsignByteArray; }
281 
283  QString
285 
287  void attachInterpolatorLogger(swift::misc::simulation::CInterpolationLogger *logger) const;
288 
291  getInterpolation(qint64 currentTimeSinceEpoch,
293  uint32_t aircraftNumber) const;
294 
296  const swift::misc::aviation::CAircraftSituation &getLastInterpolatedSituation(
298 
300  const swift::misc::CStatusMessageList &getInterpolationMessages(
302 
304  swift::misc::simulation::CInterpolatorMulti *getInterpolator() const { return m_interpolator.data(); }
305 
307  QString toQString() const;
308 
310  static SimObjectType requestIdToType(DWORD requestId);
311 
313  static const QString &typeToString(SimObjectType type);
314 
316  static bool isSameTypeGroup(SimObjectType t1, SimObjectType t2);
317 
319  static bool isAircraft(SimObjectType type);
320 
321  private:
323  SimObjectType m_type = AircraftNonAtc;
324  DWORD m_requestId = 0;
325  DWORD m_objectId = 0;
326  bool m_validRequestId = false;
327  bool m_validObjectId = false;
328  bool m_confirmedAdded = false;
329  bool m_pendingRemoved = false;
330  bool m_camera = false;
331  bool m_removedWhileAdding = false;
332  bool m_addedWhileRemoving = false;
333  int m_addingExceptions = 0;
334  int m_addingDirectlyRemoved = 0;
335  qint64 m_tsCreated = -1;
336  GUID m_cameraGuid;
337  SIMCONNECT_DATA_XYZ m_cameraPosition;
338  SIMCONNECT_DATA_PBH m_cameraRotation;
339  QByteArray m_callsignByteArray;
340  QString m_observerName;
341  swift::misc::aviation::CAircraftLights m_currentLightsInSim {
342  nullptr
343  };
344  swift::misc::aviation::CAircraftLights m_lightsAsSent { nullptr };
345  SIMCONNECT_PERIOD m_requestSimDataPeriod = SIMCONNECT_PERIOD_NEVER;
346  QSharedPointer<swift::misc::simulation::CInterpolatorMulti>
347  m_interpolator;
348  };
349 
351  class CSimConnectObjects : public QHash<swift::misc::aviation::CCallsign, CSimConnectObject>
352  {
353  public:
355  bool insert(const CSimConnectObject &simObject, bool updateTimestamp = false);
356 
358  bool setSimConnectObjectIdForRequestId(DWORD requestId, DWORD objectId);
359 
362 
365 
368 
371 
374 
376  bool isKnownSimObjectId(DWORD objectId) const;
377 
379  bool removeByObjectId(DWORD objectId);
380 
382  bool removeByOtherSimObject(const CSimConnectObject &otherSimObj);
383 
385  int removeAllProbes();
386 
389 
392 
394  bool containsPendingAdded() const;
395 
397  bool containsPendingRemoved() const;
398 
400  int countPendingAdded() const;
401 
403  int countPendingRemoved() const;
404 
406  int countConfirmedAdded();
407 
409  swift::misc::aviation::CCallsignSet getAllCallsigns(bool withoutProbes = true) const;
410 
412  QStringList getAllCallsignStrings(bool sorted = false, bool withoutProbes = true) const;
413 
415  QString getAllCallsignStringsAsString(bool sorted = false, const QString &separator = ", ") const;
416 
419 
422 
424  QList<CSimConnectObject> getByType(CSimConnectObject::SimObjectType type) const;
425 
427  QList<CSimConnectObject> getProbes() const { return this->getByType(CSimConnectObject::TerrainProbe); }
428 
430  QList<CSimConnectObject> getAircraft() const;
431 
434 
437 
440 
442  bool containsProbe() const { return this->containsType(CSimConnectObject::TerrainProbe); }
443 
445  bool containsAircraft() const;
446  };
447 } // namespace swift::simplugin::fsxcommon
448 
449 #endif // SWIFT_SIMPLUGIN_FSXCOMMON_SIMCONNECTOBJECT_H
Status messages, e.g. from Core -> GUI.
Value object encapsulating information about aircraft's lights.
Value object encapsulating information of an aircraft's situation.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object for a set of callsigns.
Definition: callsignset.h:26
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Value object for interpolator and rendering per callsign.
Record internal state of interpolator for debugging.
Multiplexed interpolator which allows switching between modes at runtime.
Comprehensive information of an aircraft.
Direct in memory access to interpolation setup, normally implemented by simulator.
Direct thread safe in memory access to remote aircraft.
SimObjectRequest
SimObject requests used for AI aircraft and probes.
Class representing a SimConnect object.
void setCameraPositionAndRotation(const SIMCONNECT_DATA_XYZ &position, const SIMCONNECT_DATA_PBH &rotation)
Camera position/rotation.
bool hasValidRequestId() const
Valid request id?
const SIMCONNECT_DATA_PBH & cameraRotation() const
Camera rotation;.
DWORD getObjectId() const
Get SimConnect object id.
void setCameraGUID(GUID guid)
Set camera GUID.
void setAddingExceptions(int number)
Set adding failed before.
bool hasCurrentLightsInSimulator() const
Received lights in simulator.
const SIMCONNECT_DATA_XYZ & cameraPosition() const
Camera position.
bool isAircraftSimulatedObject() const
Aircraft simulated object?
bool isPending() const
Pending added or removed?
bool isRemovedWhileAdding() const
Special states.
void setSimDataPeriod(SIMCONNECT_PERIOD period)
How often do we request data from simulator for this remote aircraft.
const swift::misc::aviation::CAircraftLights & getLightsAsSent() const
Lights as sent to simulator.
void decreaseAddingExceptions()
Decrease adding exception.
const swift::misc::simulation::CSimulatedAircraft & getAircraft() const
Simulated aircraft (as added)
void setLightsAsSent(const swift::misc::aviation::CAircraftLights &lights)
Lights as sent to simulator.
const QString & getCallsignAsString() const
Get callsign.
DWORD getRequestId() const
Get SimConnect request id.
bool isAircraftNonAtc() const
Aircraft NON ATC?
swift::misc::simulation::CInterpolatorMulti * getInterpolator() const
Interpolator.
const QByteArray & getCallsignByteArray() const
Callsign as LATIN1.
const swift::misc::aviation::CCallsign & getCallsign() const
Get callsign.
const QString & getAircraftModelString() const
Simulated aircraft model string.
void increaseAddingDirectlyRemoved()
Increase adding and directly removed.
SIMCONNECT_PERIOD getSimDataPeriod() const
How often do we request data from simulator for this remote aircraft.
int getAddingDirectlyRemoved() const
Adding and directly removed.
void setObserverName(const QString &observer)
Set observer.
void setAddingDirectlyRemoved(int number)
Set adding and directly removed.
qint64 getCreatedTimestamp() const
Created timestamp.
int getAddingExceptions() const
Adding has been failed before.
void setType(SimObjectType type)
Set the type.
const QString & getObserverName() const
Observer name.
bool isPendingRemoved() const
Removing is pending.
void setCurrentLightsInSimulator(const swift::misc::aviation::CAircraftLights &lights)
Set current lights when received from simulator.
void fakeCurrentLightsInSimulator()
Pretend to have received lights from simulator.
const QString & getTypeAsString() const
Type as string.
bool hasCreatedTimestamp() const
Created timestamp?
void increaseAddingExceptions()
Increase adding exception.
SimObjectType getType() const
Object type.
const swift::misc::aviation::CAircraftLights & getCurrentLightsInSimulator() const
Get current lights (requested from simulator)
QString getObjectIdAsString() const
Get SimConnect object id.
const swift::misc::simulation::CAircraftModel & getAircraftModel() const
Simulated aircraft model.
Simulator objects (aka AI aircraft)
bool containsPendingRemoved() const
Pending removed condition.
CSimConnectObject getSimObjectForRequestId(DWORD requestId) const
Get object per request id.
bool removeByOtherSimObject(const CSimConnectObject &otherSimObj)
Remove by object id or request id.
int countPendingAdded() const
Number of pending added.
int countPendingRemoved() const
Number of pending removed.
swift::misc::aviation::CCallsignSet getAllCallsigns(bool withoutProbes=true) const
Get all callsigns.
CSimConnectObject getSimObjectForObjectId(DWORD objectId) const
Get object per object id.
bool removeByObjectId(DWORD objectId)
Remove by id.
bool insert(const CSimConnectObject &simObject, bool updateTimestamp=false)
Insert.
swift::misc::aviation::CCallsignSet getPendingRemovedCallsigns() const
Callsigns of pending removed callsigns.
CSimConnectObject getSimObjectForOtherSimObject(const CSimConnectObject &otherSimObj) const
Get by request or object id, just as possible.
bool setSimConnectObjectIdForRequestId(DWORD requestId, DWORD objectId)
Set ID of a SimConnect object, so far we only have an request id in the object.
CSimConnectObject getOldestNotPendingProbe() const
Get a non pending probe.
CSimConnectObject getNotPendingProbe() const
Get a non pending probe.
swift::misc::aviation::CCallsignSet getPendingAddedCallsigns() const
Callsigns of pending added callsigns.
QList< CSimConnectObject > getByType(CSimConnectObject::SimObjectType type) const
Get by type.
CSimConnectObject getOldestObject() const
Get the oldest object.
bool containsType(CSimConnectObject::SimObjectType type) const
Contains object of type.
bool isKnownSimObjectId(DWORD objectId) const
Is the object id one of our AI objects?
QString getAllCallsignStringsAsString(bool sorted=false, const QString &separator=", ") const
Get all callsign strings as string.
bool containsPendingAdded() const
Pending add condition.
int removeCallsigns(const swift::misc::aviation::CCallsignSet &callsigns)
Remove callsigns.
QList< CSimConnectObject > getProbes() const
All probes.
CSimConnectObjects removeOutdatedPendingAdded(CSimConnectObject::SimObjectType type)
Remove all pending added objects.
QList< CSimConnectObject > getAircraft() const
All aircraft.
swift::misc::aviation::CCallsign getCallsignForObjectId(DWORD objectId) const
Find which callsign belongs to the object id.
QStringList getAllCallsignStrings(bool sorted=false, bool withoutProbes=true) const
Get all callsign strings.
#define FSXCOMMON_EXPORT
FSXCommon Export Macro.
unsigned long DWORD
Fake Windows DWORD.
adding struct SIMCONNECT_DATA_PBH not existing in SimConnect FSX