swift
altitude.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_ALTITUDE_H
7 #define SWIFT_MISC_AVIATION_ALTITUDE_H
8 
9 #include <tuple>
10 
11 #include <QMetaType>
12 #include <QPair>
13 #include <QRegularExpression>
14 #include <QString>
15 #include <QVector>
16 
17 #include "misc/metaclass.h"
20 #include "misc/mixin/mixindbus.h"
21 #include "misc/mixin/mixinhash.h"
22 #include "misc/mixin/mixinicon.h"
23 #include "misc/mixin/mixinindex.h"
25 #include "misc/mixin/mixinstring.h"
26 #include "misc/pq/length.h"
27 #include "misc/pq/pqstring.h"
28 #include "misc/pq/pressure.h"
29 #include "misc/pq/units.h"
30 #include "misc/statusmessagelist.h"
31 #include "misc/swiftmiscexport.h"
32 
33 namespace swift::misc::aviation
34 {
41  public mixin::MetaType<CAltitude>,
42  public mixin::EqualsByMetaClass<CAltitude>,
43  // public mixin::CompareByMetaClass<CAltitude>,
44  public mixin::HashByMetaClass<CAltitude>,
45  public mixin::DBusByMetaClass<CAltitude>,
46  public mixin::DBusByMetaClass<CAltitude, LosslessTag>,
47  public mixin::DataStreamByMetaClass<CAltitude>,
48  public mixin::JsonByMetaClass<CAltitude>,
49  public mixin::String<CAltitude>,
50  public mixin::Icon<CAltitude>,
51  public mixin::Index<CAltitude>
52  {
53  public:
56 
58  using MetricTuple = std::tuple<int, int>;
59 
68 
69 
73  {
74  MeanSeaLevel = 0,
76  FlightLevel
77  };
78 
81  {
83  TrueAltitude
84  };
85 
87  CAltitude() : CLength(0, physical_quantities::CLengthUnit::m()), m_datum(MeanSeaLevel) {}
88 
90  CAltitude(double value, ReferenceDatum datum, const physical_quantities::CLengthUnit &unit)
91  : CLength(value, unit), m_datum(datum)
92  {}
93 
96  : CLength(value, unit), m_datum(datum), m_altitudeType(type)
97  {}
98 
100  CAltitude(double value, const physical_quantities::CLengthUnit &unit)
101  : CLength(value, unit), m_datum(MeanSeaLevel)
102  {}
103 
105  CAltitude(double value, const physical_quantities::CLengthUnit &unit,
106  const physical_quantities::CLengthUnit &switchUnit)
107  : CLength(value, unit), m_datum(MeanSeaLevel)
108  {
109  this->switchUnit(switchUnit);
110  }
111 
113  CAltitude(const QString &altitudeAsString, physical_quantities::CPqString::SeparatorMode mode =
115 
118  : CLength(altitude), m_datum(datum)
119  {}
120 
124  CAltitude withOffset(const CLength &offset) const;
125 
127  void addOffset(const CLength &offset);
128 
130  CAltitude &switchUnit(const physical_quantities::CLengthUnit &newUnit);
131 
133  CAltitude switchedUnit(const physical_quantities::CLengthUnit &newUnit) const;
134 
136  bool isAboveGroundLevel() const { return AboveGround == m_datum; }
137 
139  bool isMeanSeaLevel() const { return MeanSeaLevel == m_datum; }
140 
142  bool isFlightLevel() const { return FlightLevel == m_datum; }
143 
145  ReferenceDatum getReferenceDatum() const { return m_datum; }
146 
148  bool toFlightLevel();
149 
151  bool toMeanSeaLevel();
152 
154  bool hasMeanSeaLevelValue() const { return this->isMeanSeaLevel() && !this->isNull(); }
155 
157  AltitudeType getAltitudeType() const { return m_altitudeType; }
158 
160  void convertToPressureAltitude(const physical_quantities::CPressure &seaLevelPressure);
161 
163  CAltitude toPressureAltitude(const physical_quantities::CPressure &seaLevelPressure) const;
164 
166  void parseFromString(const QString &value);
167 
169  void parseFromString(const QString &value, physical_quantities::CPqString::SeparatorMode mode);
170 
173  bool parseFromFpAltitudeString(const QString &value, CStatusMessageList *msgs = nullptr);
174 
177  bool isValidFpAltitude(CStatusMessageList *msgs = nullptr) const;
178 
187  QString asFpICAOAltitudeString() const;
188 
190  QString asFpVatsimAltitudeString() const;
191 
194  static const QRegularExpression &fpAltitudeRegExp();
195 
198  static QString fpAltitudeInfo(const QString &separator = ", ");
199 
201  static QString fpAltitudeExamples();
202 
204  swift::misc::CIcons::IconIndex toIcon() const;
205 
207  int compare(const CAltitude &otherAltitude) const;
208 
210  QString convertToQString(bool i18n = false) const;
211 
213  int comparePropertyByIndex(CPropertyIndexRef index, const CAltitude &compareValue) const;
214 
217  CAltitude roundedToNearest100ft(bool roundDown) const;
218 
221  static int findMetricAltitude(int feet);
222  static int findAltitudeForMetricAltitude(int metric);
224 
226  static const CAltitude &null();
227 
230  static physical_quantities::CLengthUnit defaultUnit();
231 
233  static const physical_quantities::CPressure &standardISASeaLevelPressure();
234 
236  static void registerMetadata();
237 
238  private:
239  ReferenceDatum m_datum;
240  AltitudeType m_altitudeType = TrueAltitude;
241 
243  static const QVector<MetricTuple> &metricTuples();
244 
246  CAltitude,
247  SWIFT_METAMEMBER(datum),
248  SWIFT_METAMEMBER(altitudeType));
249  };
250 
251  using CAltitudePair = QPair<CAltitude, CAltitude>;
252 } // namespace swift::misc::aviation
253 
254 Q_DECLARE_METATYPE(swift::misc::aviation::CAltitude)
257 Q_DECLARE_METATYPE(swift::misc::aviation::CAltitudePair)
258 
259 #endif // SWIFT_MISC_AVIATION_ALTITUDE_H
QPair< CAltitude, CAltitude > CAltitudePair
Pair of altitude.
Definition: altitude.h:251
IconIndex
Index for each icon, allows to send them via DBus, efficiently store them, etc.
Definition: icons.h:32
Non-owning reference to a CPropertyIndex with a subset of its features.
Status messages, e.g. from Core -> GUI.
Tag type signifying overloaded marshalling methods that preserve data at the expense of size.
Definition: mixindbus.h:26
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
CAltitude(double value, ReferenceDatum datum, AltitudeType type, const physical_quantities::CLengthUnit &unit)
Constructor.
Definition: altitude.h:95
CAltitude(const physical_quantities::CLength &altitude, ReferenceDatum datum)
Constructor by CLength.
Definition: altitude.h:117
bool hasMeanSeaLevelValue() const
Non-NULL MSL value?
Definition: altitude.h:154
bool isAboveGroundLevel() const
AGL Above ground level?
Definition: altitude.h:136
bool isMeanSeaLevel() const
MSL Mean sea level?
Definition: altitude.h:139
bool isFlightLevel() const
Flight level?
Definition: altitude.h:142
CAltitude(double value, const physical_quantities::CLengthUnit &unit, const physical_quantities::CLengthUnit &switchUnit)
Constructor, value as CAltitude::MeanSeaLevel.
Definition: altitude.h:105
CAltitude()
Default constructor: 0m Altitude MSL.
Definition: altitude.h:87
@ PressureAltitude
Altitude above the standard datum plane.
Definition: altitude.h:82
AltitudeType getAltitudeType() const
Current altitude type.
Definition: altitude.h:157
ReferenceDatum
Enum type to distinguish between MSL and AGL.
Definition: altitude.h:73
std::tuple< int, int > MetricTuple
Metric tuple.
Definition: altitude.h:58
CAltitude(double value, ReferenceDatum datum, const physical_quantities::CLengthUnit &unit)
Constructor.
Definition: altitude.h:90
ReferenceDatum getReferenceDatum() const
Get reference datum (MSL or AGL)
Definition: altitude.h:145
CAltitude(double value, const physical_quantities::CLengthUnit &unit)
Constructor, value as CAltitude::MeanSeaLevel.
Definition: altitude.h:100
CRTP class template from which a derived class can inherit common methods dealing with marshalling in...
Definition: mixindbus.h:71
CRTP class template to generate QDataStream marshalling methods using CMetaClass.
CRTP class template from which a derived class can inherit operator== implemented by metaclass.
Definition: mixincompare.h:46
CRTP class template from which a derived class can inherit common methods dealing with hashing instan...
Definition: mixinhash.h:48
CRTP class template from which a derived class can inherit icon-related functions.
Definition: mixinicon.h:28
CRTP class template from which a derived class can inherit property indexing functions.
Definition: mixinindex.h:40
CRTP class template from which a derived class can inherit common methods dealing with JSON by metatu...
Definition: mixinjson.h:90
CRTP class template from which a derived class can inherit common methods dealing with the metatype o...
Definition: mixinmetatype.h:29
CRTP class template from which a derived class can inherit string streaming operations.
Definition: mixinstring.h:31
Physical unit length (length)
Definition: length.h:18
Specialized class for distance units (meter, foot, nautical miles).
Definition: units.h:95
SeparatorMode
Number separators / group separators.
Definition: pqstring.h:34
#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
#define SWIFT_MISC_DECLARE_USING_MIXIN_DATASTREAM(DERIVED)
When a derived class and a base class both inherit from mixin::DataStreamByMetaClass,...
#define SWIFT_MISC_DECLARE_USING_MIXIN_DBUS(DERIVED,...)
When a derived class and a base class both inherit from mixin::DBusByTuple, the derived class uses th...
Definition: mixindbus.h:182
#define SWIFT_MISC_DECLARE_USING_MIXIN_ICON(DERIVED)
When a derived class and a base class both inherit from mixin::Icon, the derived class uses this macr...
Definition: mixinicon.h:60
#define SWIFT_MISC_DECLARE_USING_MIXIN_INDEX(DERIVED)
When a derived class and a base class both inherit from mixin::Index, the derived class uses this mac...
Definition: mixinindex.h:151
#define SWIFT_MISC_DECLARE_USING_MIXIN_JSON(DERIVED)
When a derived class and a base class both inherit from mixin::JsonByTuple, the derived class uses th...
Definition: mixinjson.h:281
#define SWIFT_MISC_DECLARE_USING_MIXIN_METATYPE(DERIVED)
When a derived class and a base class both inherit from mixin::MetaType, the derived class uses this ...
#define SWIFT_MISC_DECLARE_USING_MIXIN_STRING(DERIVED)
When a derived class and a base class both inherit from mixin::String, the derived class uses this ma...
Definition: mixinstring.h:110
void registerMetadata()
Register all relevant metadata in Misc.
#define SWIFT_MISC_EXPORT
Export a class or function from the library.