swift
flightplan.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_FLIGHTPLAN_H
7 #define SWIFT_MISC_AVIATION_FLIGHTPLAN_H
8 
9 #include <QDateTime>
10 #include <QMetaType>
11 #include <QString>
12 #include <QTime>
13 #include <QtGlobal>
14 
18 #include "misc/aviation/altitude.h"
19 #include "misc/aviation/callsign.h"
20 #include "misc/aviation/flightplanaircraftinfo.h"
21 #include "misc/aviation/selcal.h"
22 #include "misc/logcategories.h"
23 #include "misc/metaclass.h"
24 #include "misc/network/url.h"
26 #include "misc/pq/speed.h"
27 #include "misc/pq/time.h"
28 #include "misc/pq/units.h"
29 #include "misc/statusmessagelist.h"
30 #include "misc/swiftmiscexport.h"
31 #include "misc/timestampbased.h"
32 #include "misc/valueobject.h"
33 
34 SWIFT_DECLARE_VALUEOBJECT_MIXINS(swift::misc::Aviation, CFlightPlanRemarks)
35 SWIFT_DECLARE_VALUEOBJECT_MIXINS(swift::misc::Aviation, CFlightPlan)
36 
37 namespace swift::misc::aviation
38 {
45  class SWIFT_MISC_EXPORT CFlightPlanRemarks : public CValueObject<CFlightPlanRemarks>
46  {
47  public:
50 
52  CFlightPlanRemarks(const QString &remarks, bool parse = true);
53 
55  CFlightPlanRemarks(const QString &remarks, network::CVoiceCapabilities voiceCapabilities, bool parse = true);
56 
58  const QString &getRemarks() const { return m_remarks; }
59 
61  const QString &getRadioTelephony() const { return m_radioTelephony; }
62 
64  const QString &getFlightOperator() const { return m_flightOperator; }
65 
67  const CAirlineIcaoCode &getAirlineIcao() const { return m_airlineIcao; }
68 
70  const CSelcal &getSelcalCode() const { return m_selcalCode; }
71 
73  bool setSelcalCode(const QString &selcal);
74 
76  const CCallsign &getRegistration() const { return m_registration; }
77 
79  const network::CVoiceCapabilities &getVoiceCapabilities() const { return m_voiceCapabilities; }
80 
82  void setVoiceCapabilitiesByText(const QString &text);
83 
85  void setVoiceCapabilities(const network::CVoiceCapabilities &capabilities);
86 
88  bool hasAnyParsedRemarks() const;
89 
91  bool hasParsedAirlineRemarks() const;
92 
94  void parseFlightPlanRemarks(bool force = false);
95 
98  bool hasValidAirlineIcao() const { return m_airlineIcao.hasValidDesignator(); }
99 
101  bool isEmpty() const { return m_remarks.isEmpty(); }
102 
104  bool isParsed() const { return m_isParsed; }
105 
107  QString convertToQString(bool i18n = false) const;
108 
110  static QString textToVoiceCapabilitiesRemarks(const QString &text);
111 
113  static QString replaceVoiceCapabilities(const QString &newCapRemarks, const QString &oldRemarks);
114 
116  static QString cleanRemarks(const QString &remarksIn);
117 
118  private:
119  QString m_remarks;
120  QString m_radioTelephony;
121  QString m_flightOperator;
122  CCallsign m_registration;
123  CSelcal m_selcalCode;
124  CAirlineIcaoCode m_airlineIcao;
125  network::CVoiceCapabilities m_voiceCapabilities;
126  bool m_isParsed = false;
127 
131  SWIFT_METAMEMBER(radioTelephony),
132  SWIFT_METAMEMBER(flightOperator),
133  SWIFT_METAMEMBER(airlineIcao),
134  SWIFT_METAMEMBER(selcalCode),
135  SWIFT_METAMEMBER(registration),
136  SWIFT_METAMEMBER(isParsed),
137  SWIFT_METAMEMBER(voiceCapabilities));
138 
140  static QString getRemark(const QString &remarks, const QString &marker);
141 
143  static QString replaceRemark(const QString &remarks, const QString &marker, const QString &newRemark);
144  };
145 
147  class SWIFT_MISC_EXPORT CFlightPlan : public CValueObject<CFlightPlan>, public ITimestampBased
148  {
149  public:
151  static const QStringList &getLogCategories();
152 
155  {
156  VFR = 0,
157  IFR,
160  UNKNOWN
161  };
162 
165  {
166  IndexCallsign = CPropertyIndexRef::GlobalIndexCFlightPlan,
167  IndexOriginAirportIcao,
168  IndexDestinationAirportIcao,
169  IndexAlternateAirportIcao,
170  IndexRemarks
171  };
172 
175  // https://forums.vatsim.net/viewtopic.php?f=6&t=63416
176  static constexpr int MaxRemarksLength = 512;
177  static constexpr int MaxRouteLength = 512;
178  static constexpr int MaxRouteAndRemarksLength = 624;
179 
181  CFlightPlan() = default;
182 
184  CFlightPlan(const CCallsign &callsign, const CFlightPlanAircraftInfo &aircraftInfo,
185  const CAirportIcaoCode &originAirportIcao, const CAirportIcaoCode &destinationAirportIcao,
186  const CAirportIcaoCode &alternateAirportIcao, const QDateTime &takeoffTimePlanned,
187  const QDateTime &takeoffTimeActual, const physical_quantities::CTime &enrouteTime,
188  const physical_quantities::CTime &fuelTime, const CAltitude &cruiseAltitude,
189  const physical_quantities::CSpeed &cruiseTrueAirspeed, FlightRules flightRules,
190  const QString &route, const QString &remarks);
191 
193  void setCallsign(const CCallsign &callsign);
194 
196  void setAircraftInfo(const CFlightPlanAircraftInfo &aircraftInfo);
197 
199  void setOriginAirportIcao(const QString &originAirportIcao) { m_originAirportIcao = originAirportIcao; }
200 
202  void setOriginAirportIcao(const CAirportIcaoCode &originAirportIcao)
203  {
204  m_originAirportIcao = originAirportIcao;
205  }
206 
208  void setDestinationAirportIcao(const QString &destinationAirportIcao)
209  {
210  m_destinationAirportIcao = destinationAirportIcao;
211  }
212 
214  void setDestinationAirportIcao(const CAirportIcaoCode &destinationAirportIcao)
215  {
216  m_destinationAirportIcao = destinationAirportIcao;
217  }
218 
220  void setAlternateAirportIcao(const QString &alternateAirportIcao)
221  {
222  m_alternateAirportIcao = alternateAirportIcao;
223  }
224 
226  void setAlternateAirportIcao(const CAirportIcaoCode &alternateAirportIcao)
227  {
228  m_alternateAirportIcao = alternateAirportIcao;
229  }
230 
232  void setTakeoffTimePlanned(const QDateTime &takeoffTimePlanned);
233 
235  void setTakeoffTimePlanned(const QString &time)
236  {
237  m_takeoffTimePlanned = QDateTime::currentDateTimeUtc();
238  m_takeoffTimePlanned.setTime(QTime::fromString(time, "hh:mm"));
239  }
240 
242  void setTakeoffTimeActual(const QDateTime &takeoffTimeActual);
243 
245  void setTakeoffTimeActual(const QString &time)
246  {
247  m_takeoffTimeActual = QDateTime::currentDateTimeUtc();
248  m_takeoffTimeActual.setTime(QTime::fromString(time, "hh:mm"));
249  }
250 
253  {
254  m_enrouteTime = enrouteTime;
256  }
257 
260  {
261  m_fuelTime = fuelTime;
263  }
264 
266  void setFuelTime(const QString &fuelTime) { m_fuelTime = physical_quantities::CTime(fuelTime); }
267 
269  void setCruiseAltitude(const CAltitude &cruiseAltitude)
270  {
271  m_cruiseAltitude = cruiseAltitude;
272  m_cruiseAltitudeString.clear();
273  }
274 
276  void setCruiseAltitudeString(const QString &altitudeString) { m_cruiseAltitudeString = altitudeString; }
277 
279  void setCruiseTrueAirspeed(const physical_quantities::CSpeed &cruiseTrueAirspeed)
280  {
281  m_cruiseTrueAirspeed = cruiseTrueAirspeed;
282  }
283 
285  void setFlightRule(FlightRules flightRule) { m_flightRules = flightRule; }
286 
288  void setFlightRule(const QString &flightRule);
289 
291  void setRoute(const QString &route);
292 
294  void setRemarks(const QString &remarks);
295 
297  void setVoiceCapabilities(const QString &capabilities);
298 
300  void setWhenLastSentOrLoaded(const QDateTime &dateTime) { this->setUtcTimestamp(dateTime); }
301 
303  const CCallsign &getCallsign() const { return m_callsign; }
304 
306  bool hasCallsign() const { return !m_callsign.isEmpty(); }
307 
309  const CAirportIcaoCode &getOriginAirportIcao() const { return m_originAirportIcao; }
310 
312  const CAirportIcaoCode &getDestinationAirportIcao() const { return m_destinationAirportIcao; }
313 
315  const CAirportIcaoCode &getAlternateAirportIcao() const { return m_alternateAirportIcao; }
316 
318  const QDateTime &getTakeoffTimePlanned() const { return m_takeoffTimePlanned; }
319 
321  QString getTakeoffTimePlannedHourMin() const;
322 
324  const QDateTime &getTakeoffTimeActual() const { return m_takeoffTimeActual; }
325 
327  QString getTakeoffTimeActualHourMin() const;
328 
330  const physical_quantities::CTime &getEnrouteTime() const { return m_enrouteTime; }
331 
333  QString getEnrouteTimeHourMin() const
334  {
335  return m_enrouteTime.valueRoundedWithUnit(physical_quantities::CTimeUnit::hrmin());
336  }
337 
339  const physical_quantities::CTime &getFuelTime() const { return m_fuelTime; }
340 
342  QString getFuelTimeHourMin() const
343  {
344  return m_fuelTime.valueRoundedWithUnit(physical_quantities::CTimeUnit::hrmin());
345  }
346 
348  const CAltitude &getCruiseAltitude() const { return m_cruiseAltitude; }
349 
351  const QString &getCruiseAltitudeString() const { return m_cruiseAltitudeString; }
352 
354  const physical_quantities::CSpeed &getCruiseTrueAirspeed() const { return m_cruiseTrueAirspeed; }
355 
357  FlightRules getFlightRules() const { return m_flightRules; }
358 
360  QString getFlightRulesAsString() const { return CFlightPlan::flightRulesToString(this->getFlightRules()); }
361 
363  const QString &getRoute() const { return m_route; }
364 
366  const QDateTime whenLastSentOrLoaded() const { return this->getUtcTimestamp(); }
367 
369  bool wasSentOrLoaded() const { return this->hasValidTimestamp(); }
370 
372  qint64 timeDiffSentOrLoadedMs() const { return this->msecsToNow(); }
373 
375  const QString &getRemarks() const { return m_remarks.getRemarks(); }
376 
378  const CFlightPlanRemarks &getFlightPlanRemarks() const { return m_remarks; }
379 
381  void setFlightPlanRemarks(const CFlightPlanRemarks &remarks) { m_remarks = remarks; }
382 
384  CFlightPlanAircraftInfo getAircraftInfo() const { return m_aircraftInfo; }
385 
387  QVariant propertyByIndex(CPropertyIndexRef index) const;
388 
390  void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant);
391 
393  CIcons::IconIndex toIcon() const;
394 
396  QString convertToQString(bool i18n = false) const;
397 
399  QString asHTML(bool i18n = false) const;
400 
402  static CFlightPlan fromSB4Format(const QString &sbData);
403 
405  static CFlightPlan fromSimBriefFormat(const QString &simBrief);
406 
408  static CFlightPlan fromMultipleFormats(const QString &data, const QString &fileSuffix);
409 
411  static CFlightPlan loadFromMultipleFormats(const QString &fileName, CStatusMessageList *msgs = nullptr);
412 
414  static const QString &flightRulesToString(FlightRules rules);
415 
417  static FlightRules stringToFlightRules(const QString &flightRules);
418 
420  static const QStringList &flightRules();
421 
424  static bool isVFRRules(FlightRules rule);
425  static bool isVFRRules(const QString &rule);
427 
430  static bool isIFRRules(FlightRules rule);
431  static bool isIFRRules(const QString &rule);
433 
434  private:
435  CCallsign m_callsign;
436  CFlightPlanAircraftInfo m_aircraftInfo;
437  CAirportIcaoCode m_originAirportIcao;
438  CAirportIcaoCode m_destinationAirportIcao;
439  CAirportIcaoCode m_alternateAirportIcao;
440  QDateTime m_takeoffTimePlanned;
441  QDateTime m_takeoffTimeActual;
442  physical_quantities::CTime m_enrouteTime;
443  physical_quantities::CTime m_fuelTime;
444  CAltitude m_cruiseAltitude;
445  QString m_cruiseAltitudeString;
446  physical_quantities::CSpeed m_cruiseTrueAirspeed;
447  FlightRules m_flightRules {};
448  QString m_route;
449  CFlightPlanRemarks m_remarks;
450 
452  QString buildString(bool i18n = false, const QString &separator = " ") const;
453 
455  CFlightPlan,
456  // callsign will be current flight
457  SWIFT_METAMEMBER(aircraftInfo),
458  SWIFT_METAMEMBER(originAirportIcao),
459  SWIFT_METAMEMBER(destinationAirportIcao),
460  SWIFT_METAMEMBER(alternateAirportIcao),
461  SWIFT_METAMEMBER(takeoffTimePlanned),
462  SWIFT_METAMEMBER(takeoffTimeActual),
463  SWIFT_METAMEMBER(enrouteTime, 0, LosslessMarshalling),
465  SWIFT_METAMEMBER(cruiseAltitude, 0, LosslessMarshalling),
466  SWIFT_METAMEMBER(cruiseAltitudeString),
467  SWIFT_METAMEMBER(cruiseTrueAirspeed, 0, LosslessMarshalling),
468  SWIFT_METAMEMBER(flightRules),
469  SWIFT_METAMEMBER(route),
470  SWIFT_METAMEMBER(remarks),
471  SWIFT_METAMEMBER(timestampMSecsSinceEpoch));
472  };
473 } // namespace swift::misc::aviation
474 
476 Q_DECLARE_METATYPE(swift::misc::aviation::CFlightPlan)
477 
478 #endif // SWIFT_MISC_AVIATION_FLIGHTPLAN_H
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.
Mix of the most commonly used mixin classes.
Definition: valueobject.h:114
Entity with timestamp.
Value object for ICAO classification.
Value object encapsulating information of airport ICAO data.
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
Flightplan-related information about an aircraft (aircraft ICAO, equipment and WTC)
Value object for a flight plan.
Definition: flightplan.h:148
void setFuelTime(const QString &fuelTime)
Set amount of fuel load in time hh:mm.
Definition: flightplan.h:266
void setFlightPlanRemarks(const CFlightPlanRemarks &remarks)
Set FP remarks.
Definition: flightplan.h:381
bool wasSentOrLoaded() const
Flight plan already sent.
Definition: flightplan.h:369
const CCallsign & getCallsign() const
Aircraft callsign.
Definition: flightplan.h:303
const physical_quantities::CTime & getFuelTime() const
Get amount of fuel load in time.
Definition: flightplan.h:339
QString getFlightRulesAsString() const
Get flight rules as in FlightRules as string.
Definition: flightplan.h:360
CFlightPlan()=default
Default constructor.
void setFlightRule(FlightRules flightRule)
Set flight rules (VFR or IFR)
Definition: flightplan.h:285
QString getFuelTimeHourMin() const
Get amount of fuel load in time.
Definition: flightplan.h:342
void setOriginAirportIcao(const CAirportIcaoCode &originAirportIcao)
Set origin airport ICAO code.
Definition: flightplan.h:202
const CFlightPlanRemarks & getFlightPlanRemarks() const
Get the parsable remarks.
Definition: flightplan.h:378
ColumnIndex
Properties by index.
Definition: flightplan.h:165
const physical_quantities::CSpeed & getCruiseTrueAirspeed() const
Get planned cruise TAS.
Definition: flightplan.h:354
void setOriginAirportIcao(const QString &originAirportIcao)
Set origin airport ICAO code.
Definition: flightplan.h:199
void setCruiseTrueAirspeed(const physical_quantities::CSpeed &cruiseTrueAirspeed)
Set planned cruise TAS.
Definition: flightplan.h:279
void setAlternateAirportIcao(const QString &alternateAirportIcao)
Set alternate destination airport ICAO code.
Definition: flightplan.h:220
void setFuelTime(const physical_quantities::CTime &fuelTime)
Set amount of fuel load in time.
Definition: flightplan.h:259
const QString & getRoute() const
Get route string.
Definition: flightplan.h:363
FlightRules
Flight rules (VFR or IFR)
Definition: flightplan.h:155
@ IFR
Instrument flight rules.
Definition: flightplan.h:157
@ SVFR
Special VFR (reserved for ATC use),.
Definition: flightplan.h:158
void setDestinationAirportIcao(const CAirportIcaoCode &destinationAirportIcao)
Set destination airport ICAO code.
Definition: flightplan.h:214
const QDateTime & getTakeoffTimePlanned() const
Get planned takeoff time (planned)
Definition: flightplan.h:318
static const QString & flightRulesToString(FlightRules rules)
Rules to string.
Definition: flightplan.cpp:600
FlightRules getFlightRules() const
Get flight rules as in FlightRules.
Definition: flightplan.h:357
void setTakeoffTimePlanned(const QString &time)
Set planned takeoff time hh:mm.
Definition: flightplan.h:235
const QString & getRemarks() const
Get remarks string.
Definition: flightplan.h:375
bool hasCallsign() const
Has callsign?
Definition: flightplan.h:306
QString getEnrouteTimeHourMin() const
Get planned enroute flight time.
Definition: flightplan.h:333
void setCruiseAltitudeString(const QString &altitudeString)
Cruising altitude already as string.
Definition: flightplan.h:276
const CAirportIcaoCode & getAlternateAirportIcao() const
Get alternate destination airport ICAO code.
Definition: flightplan.h:315
const CAltitude & getCruiseAltitude() const
Cruising altitudes.
Definition: flightplan.h:348
const physical_quantities::CTime & getEnrouteTime() const
Get planned enroute flight time.
Definition: flightplan.h:330
void setTakeoffTimeActual(const QString &time)
Set actual takeoff time hh:mm.
Definition: flightplan.h:245
qint64 timeDiffSentOrLoadedMs() const
Received before n ms.
Definition: flightplan.h:372
void setEnrouteTime(const physical_quantities::CTime &enrouteTime)
Set planned enroute flight time.
Definition: flightplan.h:252
const CAirportIcaoCode & getOriginAirportIcao() const
Get origin airport ICAO code.
Definition: flightplan.h:309
const QDateTime whenLastSentOrLoaded() const
When last sent.
Definition: flightplan.h:366
void setWhenLastSentOrLoaded(const QDateTime &dateTime)
When last sent.
Definition: flightplan.h:300
const CAirportIcaoCode & getDestinationAirportIcao() const
Get destination airport ICAO code.
Definition: flightplan.h:312
void setDestinationAirportIcao(const QString &destinationAirportIcao)
Set destination airport ICAO code.
Definition: flightplan.h:208
const QDateTime & getTakeoffTimeActual() const
Get actual takeoff time (actual)
Definition: flightplan.h:324
const QString & getCruiseAltitudeString() const
Cruising altitude already as string.
Definition: flightplan.h:351
void setCruiseAltitude(const CAltitude &cruiseAltitude)
Set planned cruise altitude.
Definition: flightplan.h:269
CFlightPlanAircraftInfo getAircraftInfo() const
Get ICAO aircraft NAV/COM equipment.
Definition: flightplan.h:384
void setAlternateAirportIcao(const CAirportIcaoCode &alternateAirportIcao)
Set alternate destination airport ICAO code.
Definition: flightplan.h:226
Flight plan remarks, parsed values.
Definition: flightplan.h:46
bool hasValidAirlineIcao() const
Valid airline ICAO?
Definition: flightplan.h:98
bool isParsed() const
Already parsed?
Definition: flightplan.h:104
void setVoiceCapabilitiesByText(const QString &text)
Set voice capabilities.
const CAirlineIcaoCode & getAirlineIcao() const
Airline ICAO if provided in flight plan.
Definition: flightplan.h:67
const CCallsign & getRegistration() const
Get registration (a callsign, but normally not the flight callsign)
Definition: flightplan.h:76
bool isEmpty() const
Empty remarks?
Definition: flightplan.h:101
const QString & getFlightOperator() const
Operator, i.e. normally the airline name.
Definition: flightplan.h:64
const CSelcal & getSelcalCode() const
SELCAL code.
Definition: flightplan.h:70
const QString & getRadioTelephony() const
Radio telephony designator.
Definition: flightplan.h:61
const network::CVoiceCapabilities & getVoiceCapabilities() const
Voice capabilities.
Definition: flightplan.h:79
const QString & getRemarks() const
The unparsed remarks.
Definition: flightplan.h:58
Value object for SELCAL.
Definition: selcal.h:31
Value object encapsulating information for voice capabilities.
PQ & switchUnit(const MU &newUnit)
Change unit, and convert value to maintain the same quantity.
static CTimeUnit hrmin()
Hours, minutes.
Definition: units.h:1007
#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
@ DisabledForComparison
Element will be ignored by compare() and comparison operators.
Definition: metaclass.h:202
@ LosslessMarshalling
Element marshalling will preserve data at the expense of size.
Definition: metaclass.h:208
#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