swift
aircraftsituation.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_MISC_AVIATION_AIRCRAFTSITUATION_H
7 #define SWIFT_MISC_AVIATION_AIRCRAFTSITUATION_H
8 
9 #include <array>
10 
11 #include <QMetaType>
12 #include <QString>
13 #include <QVector3D>
14 
16 #include "misc/aviation/altitude.h"
17 #include "misc/aviation/callsign.h"
18 #include "misc/aviation/heading.h"
22 #include "misc/geo/latitude.h"
23 #include "misc/geo/longitude.h"
24 #include "misc/math/mathutils.h"
25 #include "misc/metaclass.h"
26 #include "misc/pq/angle.h"
27 #include "misc/pq/length.h"
28 #include "misc/pq/speed.h"
29 #include "misc/pq/time.h"
30 #include "misc/propertyindexref.h"
31 #include "misc/swiftmiscexport.h"
32 #include "misc/timestampbased.h"
33 #include "misc/valueobject.h"
34 
35 SWIFT_DECLARE_VALUEOBJECT_MIXINS(swift::misc::aviation, CAircraftSituation)
36 
37 namespace swift::misc
38 {
39  namespace geo
40  {
41  class CElevationPlane;
42  }
43  namespace aviation
44  {
45  class CAircraftParts;
46  class CAircraftPartsList;
47  class CAircraftLights;
48 
51  public CValueObject<CAircraftSituation>,
54  {
55  public:
58  {
59  IndexPosition = CPropertyIndexRef::GlobalIndexCAircraftSituation,
60  IndexLatitude,
61  IndexLongitude,
62  IndexAltitude,
63  IndexHeading,
64  IndexBank,
65  IndexIsOnGroundInfo,
66  IndexPitch,
67  IndexPBHInfo,
68  IndexVelocity,
69  IndexGroundSpeed,
70  IndexGroundElevationPlane,
71  IndexGroundElevationInfo,
72  IndexGroundElevationInfoTransferred,
73  IndexGroundElevationInfoString,
74  IndexGroundElevationPlusInfo,
75  IndexCallsign,
76  IndexCG,
77  IndexCanLikelySkipNearGroundInterpolation
78  };
79 
82  {
83  NoCorrection,
86  AGL,
88  UnknownCorrection
89  };
90 
93  {
94  // best info (most accurate) last
95  NoElevationInfo,
96  Test,
99  Average,
103  FromProvider
104  };
105 
108 
110  CAircraftSituation(const CCallsign &correspondingCallsign);
111 
113  CAircraftSituation(const geo::CCoordinateGeodetic &position, const CHeading &heading = {},
114  const physical_quantities::CAngle &pitch = {},
115  const physical_quantities::CAngle &bank = {}, const physical_quantities::CSpeed &gs = {},
116  const geo::CElevationPlane &groundElevation = {});
117 
119  CAircraftSituation(const CCallsign &correspondingCallsign, const geo::CCoordinateGeodetic &position,
120  const CHeading &heading = {}, const physical_quantities::CAngle &pitch = {},
121  const physical_quantities::CAngle &bank = {}, const physical_quantities::CSpeed &gs = {},
122  const geo::CElevationPlane &groundElevation = {});
123 
125  QString convertToQString(bool i18n = false) const;
126 
128  QVariant propertyByIndex(CPropertyIndexRef index) const;
129 
131  void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant);
132 
134  int comparePropertyByIndex(CPropertyIndexRef index, const CAircraftSituation &compareValue) const;
135 
137  const geo::CCoordinateGeodetic &getPosition() const { return m_position; }
138 
140  bool isPositionNull() const { return m_position.isNull(); }
141 
143  bool isPositionOrAltitudeNull() const { return this->isPositionNull() || this->getAltitude().isNull(); }
144 
146  virtual bool isNull() const override;
147 
149  bool isOtherElevationInfoBetter(GndElevationInfo otherInfo, bool transferred) const;
150 
153  bool equalPbh(const CAircraftSituation &other) const;
154 
157  bool equalPbhAndVector(const CAircraftSituation &other) const;
158 
161  bool equalPbhVectorAltitude(const CAircraftSituation &other) const;
162 
165  bool equalPbhVectorAltitudeElevation(const CAircraftSituation &other) const;
166 
168  void setNull();
169 
171  void setPosition(const geo::CCoordinateGeodetic &position) { m_position = position; }
172 
174  virtual geo::CLatitude latitude() const override { return m_position.latitude(); }
175 
177  virtual geo::CLongitude longitude() const override { return m_position.longitude(); }
178 
180  bool isOnGround() const { return m_onGroundInfo.getOnGround() == COnGroundInfo::OnGround; }
181 
183  bool isOnGroundFromParts() const;
184 
186  bool isOnGroundFromNetwork() const;
187 
189  bool isOnGroundInfoAvailable() const;
190 
192  bool shouldGuessOnGround() const;
193 
195  physical_quantities::CLength getGroundDistance(const physical_quantities::CLength &centerOfGravity) const;
196 
198  bool hasGroundDetailsForGndInterpolation() const;
199 
201  void setOnGroundDetails(COnGroundInfo::OnGroundDetails details);
202 
204  aviation::COnGroundInfo getOnGroundInfo() const;
205 
207  void setOnGroundInfo(const aviation::COnGroundInfo &info);
208 
210  const CAltitude &geodeticHeight() const override { return m_position.geodeticHeight(); }
211 
213  virtual QVector3D normalVector() const override { return m_position.normalVector(); }
214 
216  virtual std::array<double, 3> normalVectorDouble() const override
217  {
218  return m_position.normalVectorDouble();
219  }
220 
222  const CAltitude &getGroundElevation() const { return m_groundElevationPlane.getAltitude(); }
223 
225  const geo::CElevationPlane &getGroundElevationPlane() const { return m_groundElevationPlane; }
226 
228  GndElevationInfo getGroundElevationInfo() const;
229 
231  QString getGroundElevationInfoAsString() const;
232 
234  QString getGroundElevationAndInfo() const;
235 
237  bool isGroundElevationInfoTransferred() const { return m_isElvInfoTransferred; }
238 
240  void setGroundElevationInfo(GndElevationInfo details) { m_elvInfo = static_cast<int>(details); }
241 
243  bool canTransferGroundElevation(
244  const CAircraftSituation &transferToSituation,
246 
251  bool transferGroundElevationFromMe(
252  CAircraftSituation &transferToSituation,
254 
256  bool transferGroundElevationToMe(const CAircraftSituation &fromSituation,
257  const physical_quantities::CLength &radius, bool transferred);
258 
260  bool transferGroundElevationToMe(const CAircraftSituation &fromSituation, bool transferred);
261 
266  bool interpolateElevation(const aviation::CAircraftSituation &oldSituation,
267  const aviation::CAircraftSituation &newSituation);
268 
270  bool hasGroundElevation() const;
271 
273  bool hasInboundGroundDetails() const;
274 
276  bool setGroundElevation(const aviation::CAltitude &altitude, GndElevationInfo info,
277  bool transferred = false);
278 
280  bool setGroundElevation(const geo::CElevationPlane &elevationPlane, GndElevationInfo info,
281  bool transferred = false);
282 
285  bool setGroundElevationChecked(const geo::CElevationPlane &elevationPlane, GndElevationInfo info,
286  bool transferred = false);
287 
289  void resetGroundElevation();
290 
292  physical_quantities::CLength getHeightAboveGround() const;
293 
295  const CHeading &getHeading() const { return m_heading; }
296 
298  void setHeading(const CHeading &heading);
299 
301  const CAltitude &getAltitude() const { return m_position.geodeticHeight(); }
302 
304  physical_quantities::CLengthUnit getAltitudeUnit() const { return m_position.geodeticHeight().getUnit(); }
305 
307  physical_quantities::CLengthUnit getAltitudeOrDefaultUnit() const;
308 
312  CAltitude getCorrectedAltitude(bool enableDragToGround = true,
313  AltitudeCorrection *correction = nullptr) const;
314  CAltitude getCorrectedAltitude(const physical_quantities::CLength &centerOfGravity,
315  bool enableDragToGround = true,
316  AltitudeCorrection *correction = nullptr) const;
318 
321  AltitudeCorrection correctAltitude(bool enableDragToGround = true);
322  AltitudeCorrection
323  correctAltitude(const physical_quantities::CLength &centerOfGravity = physical_quantities::CLength::null(),
324  bool enableDragToGround = true);
326 
328  void setAltitude(const CAltitude &altitude);
329 
331  CAltitude addAltitudeOffset(const physical_quantities::CLength &offset);
332 
334  CAircraftSituation withAltitudeOffset(const physical_quantities::CLength &offset) const;
335 
337  const CAltitude &getPressureAltitude() const { return m_pressureAltitude; }
338 
340  void setPressureAltitude(const CAltitude &altitude);
341 
343  const physical_quantities::CAngle &getPitch() const { return m_pitch; }
344 
346  void setPitch(const physical_quantities::CAngle &pitch);
347 
349  const physical_quantities::CAngle &getBank() const { return m_bank; }
350 
352  void setBank(const physical_quantities::CAngle &bank);
353 
355  void setZeroPBH();
356 
358  void setZeroPBHandGs();
359 
361  QString getPBHInfo() const;
362 
364  void setVelocity(const CAircraftVelocity &velocity)
365  {
366  m_velocity = velocity;
367  m_hasVelocity = true;
368  }
369 
371  const CAircraftVelocity &getVelocity() const { return m_velocity; }
372 
374  bool hasVelocity() const { return m_hasVelocity; }
375 
377  const physical_quantities::CSpeed &getGroundSpeed() const { return m_groundSpeed; }
378 
380  void setGroundSpeed(const physical_quantities::CSpeed &groundspeed) { m_groundSpeed = groundspeed; }
381 
383  bool isMoving() const;
384 
386  bool canLikelySkipNearGroundInterpolation() const;
387 
390  getDistancePerTime(std::chrono::milliseconds,
392 
394  physical_quantities::CLength getDistancePerTime250ms(
396 
398  const CCallsign &getCallsign() const { return m_correspondingCallsign; }
399 
401  bool hasCallsign() const { return !this->getCallsign().isEmpty(); }
402 
404  void setCallsign(const CCallsign &callsign);
405 
407  const physical_quantities::CLength &getCG() const { return m_cg; }
408 
410  void setCG(const physical_quantities::CLength &cg);
411 
413  bool hasCG() const { return !m_cg.isNull(); }
414 
416  void setInterimFlag(bool flag) { m_isInterim = flag; }
417 
423  bool adjustGroundFlag(const CAircraftParts &parts, bool alwaysSetDetails, double timeDeviationFactor = 0.1,
424  qint64 *differenceMs = nullptr);
425 
431  bool adjustGroundFlag(const CAircraftPartsList &partsList, bool alwaysSetDetails,
432  double timeDeviationFactor = 0.1, qint64 *differenceMs = nullptr);
433 
435  bool isInterim() const { return m_isInterim; }
436 
438  static const QString &altitudeCorrectionToString(AltitudeCorrection correction);
439 
441  static bool isCorrectedAltitude(AltitudeCorrection correction);
442 
444  static const QString &gndElevationInfoToString(GndElevationInfo details);
445 
447  static const physical_quantities::CLength &deltaNearGround();
448 
450  static const CAircraftSituation &null();
451 
453  static const physical_quantities::CLength &defaultCG();
454 
457 
459  static bool isGfEqualOnGround(double oldGroundFactor, double newGroundFactor)
460  {
461  using namespace swift::misc::math;
462  return CMathUtils::epsilonEqualLimits(1.0, oldGroundFactor) &&
463  CMathUtils::epsilonEqualLimits(1.0, newGroundFactor);
464  }
465 
467  static bool isGfEqualAirborne(double oldGroundFactor, double newGroundFactor)
468  {
469  using namespace swift::misc::math;
470  return CMathUtils::epsilonEqualLimits(0.0, oldGroundFactor) &&
471  CMathUtils::epsilonEqualLimits(0.0, newGroundFactor);
472  }
473 
475  static bool isGfStarting(double oldGroundFactor, double newGroundFactor)
476  {
477  using namespace swift::misc::math;
478  return CMathUtils::epsilonEqualLimits(0.0, oldGroundFactor) &&
479  CMathUtils::epsilonEqualLimits(1.0, newGroundFactor);
480  }
481 
483  static bool isGfLanding(double oldGroundFactor, double newGroundFactor)
484  {
485  using namespace swift::misc::math;
486  return CMathUtils::epsilonEqualLimits(1.0, oldGroundFactor) &&
487  CMathUtils::epsilonEqualLimits(0.0, newGroundFactor);
488  }
490 
493  static geo::CElevationPlane
494  interpolatedElevation(const CAircraftSituation &situation, const CAircraftSituation &oldSituation,
495  const CAircraftSituation &newSituation,
497 
499  static constexpr double MaxDeltaElevationFt = 25.0;
500 
502  static const physical_quantities::CLength &allowedAltitudeDeviation();
503 
505  CAircraftLights guessLights() const;
506 
508  static void registerMetadata();
509 
510  private:
511  CCallsign m_correspondingCallsign;
512  geo::CCoordinateGeodetic m_position;
513  geo::CElevationPlane m_groundElevationPlane;
514  aviation::CAltitude m_pressureAltitude { 0, nullptr };
515  CHeading m_heading { 0, nullptr };
516  physical_quantities::CAngle m_pitch { 0, nullptr };
517  physical_quantities::CAngle m_bank { 0, nullptr };
518  physical_quantities::CSpeed m_groundSpeed { 0, nullptr };
519  physical_quantities::CLength m_cg { 0, nullptr };
520  bool m_hasVelocity = false;
521  CAircraftVelocity m_velocity;
522  bool m_isInterim = false;
523  bool m_isElvInfoTransferred = false;
524  int m_elvInfo = static_cast<int>(CAircraftSituation::NoElevationInfo);
525  aviation::COnGroundInfo m_onGroundInfo;
526 
528  CAircraftSituation,
529  SWIFT_METAMEMBER(correspondingCallsign),
530  SWIFT_METAMEMBER(position),
531  SWIFT_METAMEMBER(pressureAltitude),
532  SWIFT_METAMEMBER(heading),
533  SWIFT_METAMEMBER(pitch),
534  SWIFT_METAMEMBER(bank),
535  SWIFT_METAMEMBER(groundSpeed),
536  SWIFT_METAMEMBER(cg),
537  SWIFT_METAMEMBER(hasVelocity),
538  SWIFT_METAMEMBER(velocity),
539  SWIFT_METAMEMBER(groundElevationPlane),
540  SWIFT_METAMEMBER(onGroundInfo),
541  SWIFT_METAMEMBER(elvInfo),
542  SWIFT_METAMEMBER(isElvInfoTransferred),
543  SWIFT_METAMEMBER(timestampMSecsSinceEpoch),
544  SWIFT_METAMEMBER(timeOffsetMs),
545  SWIFT_METAMEMBER(isInterim));
546  };
547  } // namespace aviation
548 } // namespace swift::misc
549 
553 
554 #endif // SWIFT_MISC_AVIATION_AIRCRAFTSITUATION_H
Mix of the most commonly used mixin classes.
Definition: valueobject.h:114
Value object encapsulating information about aircraft's lights.
Value object encapsulating information of aircraft's parts.
Definition: aircraftparts.h:26
Value object encapsulating a list of aircraft parts.
Value object encapsulating information of an aircraft's situation.
const CAltitude & getGroundElevation() const
Elevation of the ground directly beneath.
static bool isGfLanding(double oldGroundFactor, double newGroundFactor)
Aircraft is landing.
void setGroundSpeed(const physical_quantities::CSpeed &groundspeed)
Set ground speed.
bool hasCallsign() const
Has corresponding callsign.
const CHeading & getHeading() const
Get heading.
static bool isGfStarting(double oldGroundFactor, double newGroundFactor)
Aircraft is starting.
bool isPositionOrAltitudeNull() const
Position or altitude null?
virtual QVector3D normalVector() const
Normal vector.
const CAltitude & geodeticHeight() const
Height, ellipsoidal or geodetic height (used in GPS)
static bool isGfEqualAirborne(double oldGroundFactor, double newGroundFactor)
Both not on ground.
AltitudeCorrection
How was altitude corrected?
@ NoElevation
no correction as there is no elevation
@ DraggedToGround
other scenery too high, but on ground
physical_quantities::CLengthUnit getAltitudeUnit() const
Get altitude unit.
GndElevationInfo
Where did we get elevation from?
@ SituationChange
from swift::misc::aviation::CAircraftSituationChange
@ Interpolated
interpolated between 2 elevations
void setInterimFlag(bool flag)
Set flag indicating this is an interim position update.
bool hasVelocity() const
Is velocity non-zero?
void setGroundElevationInfo(GndElevationInfo details)
How we did get gnd.elevation.
const CCallsign & getCallsign() const
Corresponding callsign.
virtual geo::CLatitude latitude() const
Latitude.
const physical_quantities::CSpeed & getGroundSpeed() const
Get ground speed.
virtual std::array< double, 3 > normalVectorDouble() const
Normal vector with double precision.
const CAltitude & getAltitude() const
Get altitude.
const CAircraftVelocity & getVelocity() const
Get 6DOF velocity.
const CAltitude & getPressureAltitude() const
Get pressure altitude.
const physical_quantities::CAngle & getBank() const
Get bank (angle)
bool isGroundElevationInfoTransferred() const
Is the elv.info transferred?
const physical_quantities::CAngle & getPitch() const
Get pitch.
void setVelocity(const CAircraftVelocity &velocity)
Set 6DOF velocity.
const physical_quantities::CLength & getCG() const
Get CG if any.
const geo::CCoordinateGeodetic & getPosition() const
Get position.
const geo::CElevationPlane & getGroundElevationPlane() const
Elevation of the ground directly beneath.
bool isInterim() const
Get flag indicating this is an interim position update.
virtual geo::CLongitude longitude() const
Longitude.
static bool isGfEqualOnGround(double oldGroundFactor, double newGroundFactor)
Both on ground.
void setPosition(const geo::CCoordinateGeodetic &position)
Set position.
Velocity and angular velocity for 6DOF bodies.
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
Heading as used in aviation, can be true or magnetic heading.
Definition: heading.h:41
Information about the ground status.
Definition: ongroundinfo.h:19
OnGroundDetails
Reliability of on ground information.
Definition: ongroundinfo.h:31
Plane of same elevation, can be a single point or larger area (e.g. airport)
static const physical_quantities::CLength & singlePointRadius()
Radius for single point.
Geodetic coordinate, a position in 3D space relative to the reference geoid.
Physical unit angle (radians, degrees)
Definition: angle.h:23
Physical unit length (length)
Definition: length.h:18
Specialized class for distance units (meter, foot, nautical miles).
Definition: units.h:95
#define SWIFT_METAMEMBER(MEMBER,...)
Macro to define an element within a metaclass.
Definition: metaclass.h:73
#define SWIFT_METACLASS(CLASS,...)
Macro to define a nested metaclass that describes the attributes of its enclosing class.
Definition: metaclass.h:53
Free functions in swift::misc.
void registerMetadata()
Register all relevant metadata in Misc.
#define SWIFT_MISC_EXPORT
Export a class or function from the library.
#define SWIFT_DECLARE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template declaration of mixins for a CValueObject subclass to be placed near the top of the ...
Definition: valueobject.h:65