From 9c5726dc138743c8aea40364333885fffe39552b Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 31 May 2014 01:31:16 +0200 Subject: [PATCH] refs #23, anticipating aircraft ICAO code from VATSIM data file * helper methods * renamed methods --- src/blackcore/context_network_aircraft.cpp | 8 ++++ src/blackcore/context_network_atc.cpp | 1 + src/blackcore/vatsimdatafilereader.cpp | 27 ++++++++++++++ src/blackcore/vatsimdatafilereader.h | 3 ++ src/blackmisc/avaircraft.h | 3 ++ src/blackmisc/avaircrafticao.cpp | 16 +++++++- src/blackmisc/avaircrafticao.h | 8 +++- src/blackmisc/avaircraftlist.cpp | 43 +++++++++++++--------- src/blackmisc/avaircraftlist.h | 5 ++- 9 files changed, 93 insertions(+), 21 deletions(-) diff --git a/src/blackcore/context_network_aircraft.cpp b/src/blackcore/context_network_aircraft.cpp index c1d8fc5c7..f8a58cc0a 100644 --- a/src/blackcore/context_network_aircraft.cpp +++ b/src/blackcore/context_network_aircraft.cpp @@ -26,6 +26,14 @@ namespace BlackCore { // update CIndexVariantMap vm(CAircraft::IndexIcao, icaoData.toQVariant()); + if (!icaoData.hasAircraftDesignator()) + { + // empty so far, try to fetch from data file + qDebug() << "Empty ICAO info for " << callsign << icaoData; + CAircraftIcao icaoDataDataFile = this->m_vatsimDataFileReader->getIcaoInfo(callsign); + if (!icaoDataDataFile.hasAircraftDesignator()) return; // give up! + vm = CIndexVariantMap(CAircraft::IndexIcao, icaoData.toQVariant()); + } this->m_aircraftsInRange.applyIf(BlackMisc::Predicates::MemberEqual(&CAircraft::getCallsign, callsign), vm); emit this->changedAircraftsInRange(); } diff --git a/src/blackcore/context_network_atc.cpp b/src/blackcore/context_network_atc.cpp index 9f4d20a96..1d4ec657f 100644 --- a/src/blackcore/context_network_atc.cpp +++ b/src/blackcore/context_network_atc.cpp @@ -70,6 +70,7 @@ namespace BlackCore foreach(CAircraft aircraft, this->m_aircraftsInRange) { this->m_network->sendFrequencyQuery(aircraft.getCallsign()); + this->m_network->sendIcaoCodesQuery(aircraft.getCallsign()); } } diff --git a/src/blackcore/vatsimdatafilereader.cpp b/src/blackcore/vatsimdatafilereader.cpp index 3195b36f9..290ed9bad 100644 --- a/src/blackcore/vatsimdatafilereader.cpp +++ b/src/blackcore/vatsimdatafilereader.cpp @@ -4,6 +4,8 @@ #include "blackmisc/nwserver.h" #include "vatsimdatafilereader.h" +#include + using namespace BlackMisc; using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; @@ -62,6 +64,12 @@ namespace BlackCore return this->getPilotsForCallsigns(callsigns); } + CAircraftIcao CVatsimDataFileReader::getIcaoInfo(const CCallsign &callsign) + { + CAircraft aircraft = this->m_aircrafts.findFirstByCallsign(callsign); + return aircraft.getIcaoInfo(); + } + CUserList CVatsimDataFileReader::getControllersForCallsign(const CCallsign &callsign) { CCallsignList callsigns; @@ -176,6 +184,25 @@ namespace BlackCore CAircraftSituation situation(position, altitude); situation.setGroundspeed(CSpeed(groundspeed, CSpeedUnit::kts())); CAircraft aircraft(user.getCallsign().getStringAsSet(), user, situation); + + QString icaoCode = clientPartsMap["planned_aircraft"]; + if (!icaoCode.isEmpty()) + { + // http://uk.flightaware.com/about/faq_aircraft_flight_plan_suffix.rvt + // we expect something like H/B772/F B773 B773/F + static const QRegularExpression reg("/."); + icaoCode = icaoCode.replace(reg, "").trimmed().toUpper(); + if (CAircraftIcao::isValidDesignator(icaoCode)) + { + aircraft.setIcaoInfo(CAircraftIcao(icaoCode)); + } + else + { + const QString w = QString("Illegal ICAO code in VATSIM data file: %1").arg(icaoCode); + qWarning(w.toLatin1()); + } + } + this->m_aircrafts.push_back(aircraft); } else if (clientType.startsWith('a')) diff --git a/src/blackcore/vatsimdatafilereader.h b/src/blackcore/vatsimdatafilereader.h index 478ad0a53..0d8031932 100644 --- a/src/blackcore/vatsimdatafilereader.h +++ b/src/blackcore/vatsimdatafilereader.h @@ -71,6 +71,9 @@ namespace BlackCore //! Users for callsign BlackMisc::Network::CUserList getPilotsForCallsign(const BlackMisc::Aviation::CCallsign &callsign); + //! ICAO info for callsign + BlackMisc::Aviation::CAircraftIcao getIcaoInfo(const BlackMisc::Aviation::CCallsign &callsign); + private slots: //! Data have been read void loadFinished(QNetworkReply *nwReply); diff --git a/src/blackmisc/avaircraft.h b/src/blackmisc/avaircraft.h index d53c46106..4648b6423 100644 --- a/src/blackmisc/avaircraft.h +++ b/src/blackmisc/avaircraft.h @@ -87,6 +87,9 @@ namespace BlackMisc //! Has valid id? bool hasValidId() const { return this->m_pilot.hasValidId(); } + //! Valid designators? + bool hasValidAircraftAndAirlineDesignator() const { return this->m_icao.hasAircraftAndAirlineDesignator(); } + /*! * Calculcate distance to plane, set it, and also return it * \param position calculated from this postion to my own aircraft diff --git a/src/blackmisc/avaircrafticao.cpp b/src/blackmisc/avaircrafticao.cpp index b35cb6c54..40a356fb6 100644 --- a/src/blackmisc/avaircrafticao.cpp +++ b/src/blackmisc/avaircrafticao.cpp @@ -1,6 +1,8 @@ #include "avaircrafticao.h" #include "blackmisc/blackmiscfreefunctions.h" + #include +#include namespace BlackMisc { @@ -12,7 +14,7 @@ namespace BlackMisc QString CAircraftIcao::convertToQString(bool /** i18n **/) const { QString s(this->m_aircraftDesignator); - s.append(" ").append(this->m_aircraftCombinedType); + if (this->hasAircraftCombinedType()) s.append(" ").append(this->m_aircraftCombinedType); if (this->hasAirlineDesignator()) s.append(" ").append(this->m_airlineDesignator); if (this->hasLivery()) s.append(" ").append(this->m_livery); if (this->hasAircraftColor()) s.append(" ").append(this->m_aircraftColor); @@ -62,7 +64,7 @@ namespace BlackMisc } /* - * As string? + * As string */ QString CAircraftIcao::asString() const { @@ -163,6 +165,16 @@ namespace BlackMisc } } + /* + * Valid designator? + */ + bool CAircraftIcao::isValidDesignator(const QString &designator) + { + static QRegularExpression regexp("^[A-Z]+[A-Z0-9]*$"); + if (designator.length() < 2 || designator.length() > 5) return false; + return (regexp.match(designator).hasMatch()); + } + /* * Register metadata */ diff --git a/src/blackmisc/avaircrafticao.h b/src/blackmisc/avaircrafticao.h index fb59a24b4..1cd390cf2 100644 --- a/src/blackmisc/avaircrafticao.h +++ b/src/blackmisc/avaircrafticao.h @@ -25,6 +25,9 @@ namespace BlackMisc //! Default constructor. CAircraftIcao() {} + //! Default constructor. + explicit CAircraftIcao(const QString &icao) : m_aircraftDesignator(icao.trimmed().toUpper()) {} + /*! * Constructor. * \param icao "B737" @@ -62,7 +65,7 @@ namespace BlackMisc bool hasAirlineDesignator() const { return !this->m_airlineDesignator.isEmpty(); } //! Airline and Aircraft designator? - bool hasAircraftAndAirlineDsignator() const { return this->hasAirlineDesignator() && this->hasAircraftDesignator(); } + bool hasAircraftAndAirlineDesignator() const { return this->hasAirlineDesignator() && this->hasAircraftDesignator(); } //! Get livery const QString &getLivery() const { return this->m_livery; } @@ -149,6 +152,9 @@ namespace BlackMisc //! \copydoc CValueObject::setPropertyByIndex(variant, index) virtual void setPropertyByIndex(const QVariant &variant, int index) override; + //! Valid designator? + static bool isValidDesignator(const QString &designator); + protected: //! \copydoc CValueObject::convertToQString virtual QString convertToQString(bool i18n = false) const override; diff --git a/src/blackmisc/avaircraftlist.cpp b/src/blackmisc/avaircraftlist.cpp index 21b14ef9a..722d70fc6 100644 --- a/src/blackmisc/avaircraftlist.cpp +++ b/src/blackmisc/avaircraftlist.cpp @@ -47,6 +47,16 @@ namespace BlackMisc return this->findBy(&CAircraft::getCallsign, callsign); } + /* + * Find by callsign + */ + CAircraft CAircraftList::findFirstByCallsign(const CCallsign &callsign, const CAircraft &ifNotFound) const + { + CAircraftList aircrafts = this->findByCallsign(callsign); + if (aircrafts.isEmpty()) return ifNotFound; + return aircrafts.front(); + } + /* * All pilots */ @@ -75,27 +85,26 @@ namespace BlackMisc /* * Merge with aircraft */ - int CAircraftList::updateFromVatsimDataFileAircraft(CAircraft &aircraftToBeUpdated) const + bool CAircraftList::updateFromVatsimDataFileAircraft(CAircraft &aircraftToBeUpdated) const { - if (this->isEmpty()) return 0; - if (aircraftToBeUpdated.hasValidRealName() && aircraftToBeUpdated.hasValidId()) return 0; + if (this->isEmpty()) return false; + if (aircraftToBeUpdated.hasValidRealName() && aircraftToBeUpdated.hasValidId() && aircraftToBeUpdated.hasValidAircraftAndAirlineDesignator()) return false; - int c = 0; - for (auto i = this->begin(); i != this->end(); ++i) - { - CAircraft currentDataFileAircraft = *i; - if (currentDataFileAircraft.getCallsign() != aircraftToBeUpdated.getCallsign()) continue; + CAircraft currentDataFileAircraft = this->findFirstByCallsign(aircraftToBeUpdated.getCallsign()); + if (currentDataFileAircraft.getCallsign().isEmpty()) return false; - CUser user = aircraftToBeUpdated.getPilot(); - if (!aircraftToBeUpdated.hasValidRealName()) user.setRealName(currentDataFileAircraft.getPilotRealname()); - if (!aircraftToBeUpdated.hasValidId()) user.setId(currentDataFileAircraft.getPilotId()); - aircraftToBeUpdated.setPilot(user); - c++; - } + CUser user = aircraftToBeUpdated.getPilot(); + if (!aircraftToBeUpdated.hasValidRealName()) user.setRealName(currentDataFileAircraft.getPilotRealname()); + if (!aircraftToBeUpdated.hasValidId()) user.setId(currentDataFileAircraft.getPilotId()); + aircraftToBeUpdated.setPilot(user); - // normally 1 expected, as I should find - // only one online station for this booking - return c; + CAircraftIcao icao = aircraftToBeUpdated.getIcaoInfo(); + CAircraftIcao dataFileIcao = currentDataFileAircraft.getIcaoInfo(); + if (!icao.hasAircraftDesignator()) icao.setAircraftDesignator(dataFileIcao.getAircraftDesignator()); + if (!icao.hasAirlineDesignator()) icao.setAirlineDesignator(dataFileIcao.getAirlineDesignator()); + if (!icao.hasAircraftCombinedType()) icao.setAircraftCombinedType(dataFileIcao.getAircraftCombinedType()); + aircraftToBeUpdated.setIcaoInfo(icao); + return true; } } // namespace } // namespace diff --git a/src/blackmisc/avaircraftlist.h b/src/blackmisc/avaircraftlist.h index 424279ea6..0cc40469b 100644 --- a/src/blackmisc/avaircraftlist.h +++ b/src/blackmisc/avaircraftlist.h @@ -43,6 +43,9 @@ namespace BlackMisc //! Find 0..n stations by callsign CAircraftList findByCallsign(const CCallsign &callsign) const; + //! Find the first aircraft by callsign, if none return given one + CAircraft findFirstByCallsign(const CCallsign &callsign, const CAircraft &ifNotFound = CAircraft()) const; + //! All pilots (with valid data) BlackMisc::Network::CUserList getPilots() const; @@ -59,7 +62,7 @@ namespace BlackMisc //! \brief Update aircraft with data from VATSIM data file //! \remarks The list used needs to contain the VATSIM data file objects - int updateFromVatsimDataFileAircraft(CAircraft &aircraftToBeUpdated) const; + bool updateFromVatsimDataFileAircraft(CAircraft &aircraftToBeUpdated) const; }; } //namespace