diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 60e5d2dbf..17f870337 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -605,7 +605,7 @@ namespace BlackCore { QWriteLocker l(&m_lockParts); m_partsByCallsign.clear(); m_aircraftSupportingParts.clear(); } { QWriteLocker l(&m_lockSituations); m_situationsByCallsign.clear(); } { QWriteLocker l(&m_lockMessages); m_reverseLookupMessages.clear(); } - { QWriteLocker l(&m_lockAircraft); m_aircraftInRange.clear(); } + { QWriteLocker l(&m_lockAircraft); m_aircraftInRange.clear(); } // non thread safe parts m_flightPlanCache.clear(); @@ -915,12 +915,30 @@ namespace BlackCore this->addReverseLookupMessage(callsign, m); } - CAircraftModel CAirspaceMonitor::reverseLookupModelWithFlightplanData(const CCallsign &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery, const QString &modelString, CAircraftModel::ModelType type, CStatusMessageList *log) const + CAircraftModel CAirspaceMonitor::reverseLookupModelWithFlightplanData(const CCallsign &callsign, const QString &aircraftIcaoString, const QString &airlineIcaoString, const QString &livery, const QString &modelString, CAircraftModel::ModelType type, CStatusMessageList *log) { const QString fpRemarks = this->tryToGetFlightPlanRemarks(callsign); + CAircraftIcaoCode aircraftIcao(aircraftIcaoString); + CAirlineIcaoCode airlineIcao(airlineIcaoString); if (!fpRemarks.isEmpty()) { - CFlightPlanUtils::parseFlightPlanRemarks(fpRemarks); + const CFlightPlanUtils::AirlineRemarks ar = CFlightPlanUtils::parseFlightPlanAirlineRemarks(fpRemarks); + if (ar.hasAnyRemarks()) + { + const QString airlineName = CAircraftMatcher::reverseLookupAirlineName(ar.flightOperator, callsign, log); + if (!airlineName.isEmpty()) + { + airlineIcao.setName(airlineName); + this->addReverseLookupMessage(callsign, QString("Setting airline name '%1'").arg(airlineName)); + } + + const QString telephony = CAircraftMatcher::reverseLookupTelephonyDesignator(ar.radioTelephony, callsign, log); + if (!telephony.isEmpty()) + { + airlineIcao.setTelephonyDesignator(telephony); + this->addReverseLookupMessage(callsign, QString("Setting telephoy designator '%1'").arg(telephony)); + } + } } return CAircraftMatcher::reverselLookupModel(callsign, aircraftIcao, airlineIcao, livery, modelString, type, log); } diff --git a/src/blackcore/airspacemonitor.h b/src/blackcore/airspacemonitor.h index 0e9b58b6e..ccd387d82 100644 --- a/src/blackcore/airspacemonitor.h +++ b/src/blackcore/airspacemonitor.h @@ -364,7 +364,7 @@ namespace BlackCore BlackMisc::Simulation::CAircraftModel reverseLookupModelWithFlightplanData( const BlackMisc::Aviation::CCallsign &callsign, const QString &aircraftIcao, const QString &airlineIcao, const QString &livery, const QString &modelString, - BlackMisc::Simulation::CAircraftModel::ModelType type, BlackMisc::CStatusMessageList *log) const; + BlackMisc::Simulation::CAircraftModel::ModelType type, BlackMisc::CStatusMessageList *log); //! Create aircraft in range, this is the only place where a new aircraft should be added void onAircraftUpdateReceived(const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder); diff --git a/src/blackmisc/aviation/flightplanutils.cpp b/src/blackmisc/aviation/flightplanutils.cpp index b85ad82f4..c3112efc0 100644 --- a/src/blackmisc/aviation/flightplanutils.cpp +++ b/src/blackmisc/aviation/flightplanutils.cpp @@ -14,9 +14,45 @@ namespace BlackMisc { namespace Aviation { - void CFlightPlanUtils::parseFlightPlanRemarks(const QString &remarks) + CFlightPlanUtils::AirlineRemarks CFlightPlanUtils::parseFlightPlanAirlineRemarks(const QString &remarks) { - if (remarks.isEmpty()) { return; } + AirlineRemarks ar; + if (remarks.isEmpty()) { return ar; } + const QString r = remarks.toUpper(); + if (r.contains("/CALLSIGN")) + { + // used similar to radio telephony + ar.radioTelephony = cut(r, "/CALLSIGN"); + } + else if (r.contains("/RT")) + { + // radio telephony designator + ar.radioTelephony = cut(r, "/RT"); + } + if (r.contains("/OPR")) + { + // operator, e.g. British airways + ar.flightOperator = cut(r, "/OPR"); + } + return ar; + } + + QString CFlightPlanUtils::cut(const QString &remarks, const QString &marker) + { + const int maxIndex = remarks.size() - 1; + int f = remarks.indexOf(marker); + if (f < 0) { return ""; } + f += marker.length(); + if (maxIndex <= f) { return ""; } + int to = remarks.indexOf(' ', f + 1); + if (to < 0) { to = maxIndex; } // no more spaces + const QString cut = remarks.mid(f, to - f).replace('/', ' '); // variations like /OPR/EASYJET/ + // problem is that this cuts something like "Uzbekistan airways" + return cut; } } // namespace } // namespace + +// RT/KESTREL OPR/MYTRAVEL REG/G-DAJC SEL/FP-ES PER/C NAV/RNP10 +// VFPS = VATSIM Flightplan Prefile System +// OPR/UAL CALLSIGN/UNITED diff --git a/src/blackmisc/aviation/flightplanutils.h b/src/blackmisc/aviation/flightplanutils.h index ac7f3acb3..0a2b6eff2 100644 --- a/src/blackmisc/aviation/flightplanutils.h +++ b/src/blackmisc/aviation/flightplanutils.h @@ -13,6 +13,7 @@ #define BLACKMISC_AVIATION_FLIGHTPLANUTILS_H #include "blackmisc/blackmiscexport.h" +#include namespace BlackMisc { @@ -22,11 +23,28 @@ namespace BlackMisc class BLACKMISC_EXPORT CFlightPlanUtils { public: + //! Useful value in flight plan remarks + struct AirlineRemarks + { + QString radioTelephony; //!< radio telephony designator + QString flightOperator; //!< operator, i.e. normally the airline name + + //! Any remarks available + bool hasAnyRemarks() const + { + return !radioTelephony.isEmpty() || !flightOperator.isEmpty(); + } + }; + //! Constructor CFlightPlanUtils() = delete; //! Parse remarks from a flight plan - static void parseFlightPlanRemarks(const QString &remarks); + static AirlineRemarks parseFlightPlanAirlineRemarks(const QString &remarks); + + private: + //! Cut the remarks part + static QString cut(const QString &remarks, const QString &marker); }; } // namespace } // namespace