4 #include "flightplanaircraftinfo.h"
8 namespace swift::misc::aviation
14 : m_aircraftIcao(aircraftIcao), m_comNavEquipment(comNavEquipment), m_ssrEquipment(ssrEquipment), m_wtc(wtc)
17 CFlightPlanAircraftInfo::CFlightPlanAircraftInfo(QString equipmentCodeAndAircraft)
19 equipmentCodeAndAircraft = equipmentCodeAndAircraft.trimmed().toUpper().replace(
" ",
"");
20 const int numberSlash = equipmentCodeAndAircraft.count(
"/");
21 const int numberHypen = equipmentCodeAndAircraft.count(
"-");
22 if (numberHypen == 1 && numberSlash == 2) { parseIcaoEquipmentCode(equipmentCodeAndAircraft); }
23 else if (numberSlash >= 1 && numberSlash <= 2 && numberHypen == 0)
25 parseFaaEquipmentCode(equipmentCodeAndAircraft);
27 else { parseUnknownEquipmentCode(equipmentCodeAndAircraft); }
63 void CFlightPlanAircraftInfo::parseIcaoEquipmentCode(
const QString &equipment)
66 QStringList firstSplit = equipment.split(
"/");
67 Q_ASSERT_X(firstSplit.size() == 3, Q_FUNC_INFO,
"Cannot split string as required for the ICAO format");
73 m_aircraftIcao = CAircraftIcaoCode(firstSplit[0]);
77 m_ssrEquipment = CSsrEquipment(firstSplit[2]);
79 catch (
const std::invalid_argument &)
81 m_ssrEquipment = CSsrEquipment();
84 QStringList secondSplit = firstSplit[1].split(
"-");
85 if (secondSplit.size() != 2)
90 if (!secondSplit[0].isEmpty())
96 m_wtc = CWakeTurbulenceCategory(secondSplit[0].at(0));
98 catch (std::invalid_argument &)
100 m_wtc = CWakeTurbulenceCategory();
103 else { m_wtc = CWakeTurbulenceCategory(); }
107 m_comNavEquipment = CComNavEquipment(secondSplit[1]);
109 catch (std::runtime_error &)
111 m_comNavEquipment = CComNavEquipment();
115 void CFlightPlanAircraftInfo::parseFaaEquipmentCode(
const QString &equipment)
118 QStringList
split = equipment.split(
'/');
119 Q_ASSERT_X(
split.size() == 2 ||
split.size() == 3, Q_FUNC_INFO,
120 "Cannot split string as required for the FAA format");
121 bool missingEquipmentCode =
false;
125 m_aircraftIcao = CAircraftIcaoCode(
split.at(
split.size() - 2));
130 m_aircraftIcao = CAircraftIcaoCode(
split.at(
split.size() - 1));
131 missingEquipmentCode =
true;
133 else { m_aircraftIcao = CAircraftIcaoCode(); }
136 if (
split.length() == 3)
138 const QString &prefix =
split.at(0);
139 if (prefix ==
"H" || prefix ==
"J") { m_wtc = CWakeTurbulenceCategory(prefix.at(0)); }
141 else if (
split.length() == 2 &&
split.at(0).size() == 1)
144 m_wtc = CWakeTurbulenceCategory(
split.at(0).at(0));
145 missingEquipmentCode =
true;
147 else { m_wtc = CWakeTurbulenceCategory(); }
150 if (missingEquipmentCode ||
split.at(
split.size() - 1).isEmpty())
157 QChar equipmentCode =
split.at(
split.size() - 1).at(0);
159 m_comNavEquipment = comNavEquipment;
160 m_ssrEquipment = ssrEquipment;
163 void CFlightPlanAircraftInfo::parseUnknownEquipmentCode(
const QString &equipment)
166 QStringList
split = equipment.split(
"/");
170 m_aircraftIcao =
split[0];
184 if (equipmentCode ==
'H' || equipmentCode ==
'O' || equipmentCode ==
'W')
188 else if (equipmentCode ==
'Z')
191 equip =
CComNavEquipment({ CComNavEquipment::Rvsm | CComNavEquipment::Pbn }, {});
193 else if (equipmentCode ==
'L')
195 equip =
CComNavEquipment({ CComNavEquipment::Rvsm | CComNavEquipment::Gnss }, {});
197 else if (equipmentCode ==
'X' || equipmentCode ==
'T' || equipmentCode ==
'U')
201 else if (equipmentCode ==
'D' || equipmentCode ==
'B' || equipmentCode ==
'A')
205 else if (equipmentCode ==
'M' || equipmentCode ==
'N' || equipmentCode ==
'P')
209 else if (equipmentCode ==
'Y' || equipmentCode ==
'C' || equipmentCode ==
'I')
214 else if (equipmentCode ==
'V' || equipmentCode ==
'S' || equipmentCode ==
'G')
220 if (equipmentCode ==
'W' || equipmentCode ==
'Z' || equipmentCode ==
'L' || equipmentCode ==
'U' ||
221 equipmentCode ==
'A' || equipmentCode ==
'P' || equipmentCode ==
'I' || equipmentCode ==
'G')
223 ssr = CSsrEquipment::SSrEquipment { CSsrEquipment::ModeAC };
225 else if (equipmentCode ==
'H' || equipmentCode ==
'O' || equipmentCode ==
'X' || equipmentCode ==
'D' ||
226 equipmentCode ==
'M' || equipmentCode ==
'Y' || equipmentCode ==
'V')
230 ssr = CSsrEquipment::SSrEquipment { CSsrEquipment::None };
232 else if (equipmentCode ==
'T' || equipmentCode ==
'B' || equipmentCode ==
'N' || equipmentCode ==
'C' ||
233 equipmentCode ==
'S')
237 ssr = CSsrEquipment::SSrEquipment { CSsrEquipment::ModeA };
240 return { equip, ssr };
256 if (equip.
hasEquipment(CComNavEquipment::Gnss)) {
return 'L'; }
268 if (ssr.
hasEquipment(CSsrEquipment::None)) {
return 'V'; }
269 if (ssr.
hasEquipment(CSsrEquipment::ModeAC)) {
return 'G'; }
274 if (ssr.
hasEquipment(CSsrEquipment::None)) {
return 'M'; }
275 if (ssr.
hasEquipment(CSsrEquipment::ModeAC)) {
return 'P'; }
281 if (ssr.
hasEquipment(CSsrEquipment::None)) {
return 'Y'; }
282 if (ssr.
hasEquipment(CSsrEquipment::ModeAC)) {
return 'I'; }
287 if (ssr.
hasEquipment(CSsrEquipment::None)) {
return 'D'; }
288 if (ssr.
hasEquipment(CSsrEquipment::ModeAC)) {
return 'A'; }
293 if (ssr.
hasEquipment(CSsrEquipment::None)) {
return 'X'; }
294 if (ssr.
hasEquipment(CSsrEquipment::ModeAC)) {
return 'U'; }
Value object for ICAO classification.
const QString & getDesignator() const
Get ICAO designator, e.g. "B737".
static bool isValidDesignator(const QString &designator)
Valid designator?
ICAO flightplan field 10a.
bool hasEquipment(ComNavEquipmentOption equip) const
Does this object contains equip?
static QChar equipmentToFaaCode(const CComNavEquipment &equip, const CSsrEquipment &ssr)
Transform ICAO-based COM/NAV and SSR equipment to a single character FAA equipment code.
CWakeTurbulenceCategory getWtc() const
Get Wake Turbulence Category.
QString asIcaoString() const
Full string in ICAO format: "AIRCRAFT_ICAO/WTC-EQUIPMENT/SSR".
CSsrEquipment getSsrEquipment() const
Get SSR equipment.
static std::tuple< CComNavEquipment, CSsrEquipment > faaCodeToEquipment(QChar equipmentCode)
Transform single character FAA equipment code to ICAO-based COM/NAV and SSR equipment.
QString convertToQString(bool i18n=false) const
Cast as QString.
QString asFaaString() const
Full string in FAA format: "H/J (if heavy/super)/AIRCRAFT_ICAO/EQUIPMENT-CODE".
CAircraftIcaoCode getAircraftIcao() const
Get Aircraft ICAO.
CComNavEquipment getComNavEquipment() const
Get COM/NAV equipment.
ICAO flightplan field 10b.
bool hasEquipment(SsrEquipmentOption equip) const
Does this object contains equip?
ICAO wake turbulence category.
bool isUnknown() const
Is the wake turbulence category unknown?
bool isCategory(WakeTurbulenceCategory category) const
Is the wake turbulence category of this object the same as category?
QString toQString(bool i18n=false) const
Cast as QString.
std::vector< std::string > split(const std::string &str, size_t maxSplitCount=0, const std::string &delimiter=" ")
Split string by delimiter and maxSplitCount times.
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.