diff --git a/src/blackmisc/aviation/callsign.cpp b/src/blackmisc/aviation/callsign.cpp index 7bf2cad67..96af888d3 100644 --- a/src/blackmisc/aviation/callsign.cpp +++ b/src/blackmisc/aviation/callsign.cpp @@ -178,25 +178,49 @@ namespace BlackMisc QString CCallsign::getAirlineSuffix() const { + QString flightNumber; + return this->getAirlineSuffix(flightNumber); + } + + QString CCallsign::getAirlineSuffix(QString &flightNumber) const + { + flightNumber.clear(); if (m_callsign.length() < 3) { return {}; } - if (this->isAtcCallsign()) { return {}; } + if (this->isAtcCallsign()) { return {}; } thread_local const QRegularExpression regExp("^[A-Z]{3,}"); QRegularExpressionMatch match = regExp.match(m_callsign); - if (!match.hasMatch()) { return QString(); } + if (!match.hasMatch()) { return {}; } const QString airline = match.captured(0); + flightNumber = match.captured(1); // hard facts if (airline.length() == 3) { return airline; } // we allow 3 letters if (airline.length() == 4 && airline.startsWith('V')) { return airline; } // we allow virtual 4 letter codes, e.g. VDLD // some people use callsigns like UPSE123 - const QString number = match.captured(1); - if (number.length() >= 3 && airline.length() == 4) { return airline.left(3); } + flightNumber = match.captured(1); + if (flightNumber.length() >= 3 && airline.length() == 4) { return airline.left(3); } return {}; // invalid } + QString CCallsign::getFlightNumber() const + { + if (this->isAtcCallsign()) { return {}; } + QString flightNumber; + const QString airline = this->getAirlineSuffix(flightNumber); + return airline.isEmpty() ? QString() : flightNumber; + } + + int CCallsign::getFlightNumberInt() const + { + if (this->isAtcCallsign()) { return -1; } + bool ok; + const int fn = this->getFlightNumber().toInt(&ok); + return ok ? fn : -1; + } + bool CCallsign::hasSuffix() const { return this->getStringAsSet().contains('_'); diff --git a/src/blackmisc/aviation/callsign.h b/src/blackmisc/aviation/callsign.h index 105383c7b..2144bfff2 100644 --- a/src/blackmisc/aviation/callsign.h +++ b/src/blackmisc/aviation/callsign.h @@ -107,8 +107,16 @@ namespace BlackMisc //! Get the callsign suffix ("TWR", "ATIS" ...) if any ("_" is removed) QString getSuffix() const; - //! Airline suffix (e.g. DLH1234 -> DLH) if applicable + //! Airline suffix (e.g. DLH1234 -> DLH) if applicable @{ QString getAirlineSuffix() const; + QString getAirlineSuffix(QString &flightNumber) const; + // @} + + //! Flight number (e.g. DLH1234 -> 1234) if applicable + QString getFlightNumber() const; + + //! Flight number as integer + int getFlightNumberInt() const; //! Suffix such as "_TWR"? bool hasSuffix() const; diff --git a/src/blackmisc/simulation/matchingscript.cpp b/src/blackmisc/simulation/matchingscript.cpp index 00a0a87b3..22f0bf496 100644 --- a/src/blackmisc/simulation/matchingscript.cpp +++ b/src/blackmisc/simulation/matchingscript.cpp @@ -15,21 +15,19 @@ namespace BlackMisc { namespace Simulation { - MSInOutValues::MSInOutValues( - const QString &cs, - const CAircraftIcaoCode aircraftIcao, - const CAirlineIcaoCode airlineIcao, - const QString &livery, int liveryId) : - MSInOutValues(cs, + MSInOutValues::MSInOutValues(const CCallsign &cs, + const CAircraftIcaoCode aircraftIcao, + const CAirlineIcaoCode airlineIcao, + const QString &livery, int liveryId) : + MSInOutValues(cs.asString(), cs.getStringAsSet(), cs.getFlightNumber(), aircraftIcao.getDesignator(), aircraftIcao.getCombinedType(), aircraftIcao.getDbKey(), airlineIcao.getDesignator(), airlineIcao.getVDesignator(), airlineIcao.getDbKey(), livery, liveryId) { } - MSInOutValues::MSInOutValues( - const QString &cs, - const CAircraftIcaoCode aircraftIcao, - const CLivery livery) : + MSInOutValues::MSInOutValues(const CCallsign &cs, + const CAircraftIcaoCode aircraftIcao, + const CLivery livery) : MSInOutValues(cs, aircraftIcao, livery.getAirlineIcaoCode(), @@ -37,14 +35,14 @@ namespace BlackMisc { } MSInOutValues::MSInOutValues(const CAircraftModel &model) : - MSInOutValues(model.getCallsign().asString(), model.getAircraftIcaoCode(), model.getLivery()) + MSInOutValues(model.getCallsign(), model.getAircraftIcaoCode(), model.getLivery()) { } MSInOutValues::MSInOutValues(const MSInOutValues &sv) : - MSInOutValues(sv.m_callsign, - sv.getAircraftIcao(), sv.getCombinedType(), sv.getDbAircraftIcaoId(), - sv.getAirlineIcao(), sv.getVirtualAirlineIcao(), sv.getDbAirlineIcaoId(), - sv.getLivery(), sv.getDbLiveryId(), + MSInOutValues(sv.m_callsign, sv.m_callsignAsSet, sv.m_flightNumber, + sv.getAircraftIcao(), sv.getCombinedType(), sv.getDbAircraftIcaoId(), + sv.getAirlineIcao(), sv.getVirtualAirlineIcao(), sv.getDbAirlineIcaoId(), + sv.getLivery(), sv.getDbLiveryId(), sv.m_logMessage, sv.isModified(), sv.isRerun()) { } diff --git a/src/blackmisc/simulation/matchingscript.h b/src/blackmisc/simulation/matchingscript.h index 0c54558bf..f426962ed 100644 --- a/src/blackmisc/simulation/matchingscript.h +++ b/src/blackmisc/simulation/matchingscript.h @@ -31,6 +31,8 @@ namespace BlackMisc //! MSNetworkValues properties @{ Q_PROPERTY(QString callsign READ getCallsign WRITE setCallsign NOTIFY callsignChanged) + Q_PROPERTY(QString callsignAsSet READ getCallsignAsSet) + Q_PROPERTY(QString flightNumber READ getFlightNumber) Q_PROPERTY(int dbAircraftIcaoId READ getDbAircraftIcaoId WRITE setDbAircraftIcaoId NOTIFY dbAircraftIcaoIdChanged) Q_PROPERTY(int dbAirlineIcaoId READ getDbAirlineIcaoId WRITE setDbAirlineIcaoId NOTIFY dbAirlineIcaoIdChanged) Q_PROPERTY(int dbLiveryId READ getDbLiveryId WRITE setDbLiveryId NOTIFY dbLiveryIdChanged) @@ -57,13 +59,13 @@ namespace BlackMisc Q_INVOKABLE MSInOutValues() {} //! Ctor - Q_INVOKABLE MSInOutValues(const QString &cs, + Q_INVOKABLE MSInOutValues(const QString &cs, const QString &csAsSet, const QString &flightNumber, const QString &aircraftIcao, const QString &combinedType, int idAircraftIcao, const QString &airlineIcao, const QString &virtualAirlineIcao, int idAirlineIcao, const QString &livery, int liveryId, const QString &logMsg = {}, bool modified = false, bool rerun = false) : - m_callsign(cs.trimmed().toUpper()), + m_callsign(cs.trimmed().toUpper()), m_callsignAsSet(csAsSet), m_flightNumber(flightNumber), m_aircraftIcao(aircraftIcao.trimmed().toUpper()), m_combinedType(combinedType.trimmed().toUpper()), m_airlineIcao(airlineIcao.trimmed().toUpper()), m_vAirlineIcao(virtualAirlineIcao), m_livery(livery.trimmed().toUpper()), @@ -73,13 +75,13 @@ namespace BlackMisc {} //! Ctor - MSInOutValues(const QString &cs, + MSInOutValues(const BlackMisc::Aviation::CCallsign &cs, const BlackMisc::Aviation::CAircraftIcaoCode aircraftIcao, const BlackMisc::Aviation::CAirlineIcaoCode airlineIcao, const QString &livery, int liveryId); //! Ctor - MSInOutValues(const QString &cs, + MSInOutValues(const BlackMisc::Aviation::CCallsign &cs, const BlackMisc::Aviation::CAircraftIcaoCode aircraftIcao, const BlackMisc::Aviation::CLivery livery); @@ -89,11 +91,12 @@ namespace BlackMisc //! Ctor MSInOutValues(const MSInOutValues &sv); - //! Get callsign - const QString &getCallsign() const { return m_callsign; } - - //! Set callsign + //! Callsign values @{ + const QString &getCallsign() const { return m_callsign; } + const QString &getCallsignAsSet() const { return m_callsignAsSet; } + const QString &getFlightNumber() const { return m_flightNumber; } void setCallsign(const QString &callsign); + //! @} //! Values found in DB? @{ bool isFoundDbAircraftIcao() const { return m_dbAircraftIcaoId >= 0; } @@ -149,9 +152,6 @@ namespace BlackMisc bool hasModifiedAircraftIcaoDesignator() const { return m_modifiedAircraftDesignator; } bool hasModifiedAirlineIcaoDesignator() const { return m_modifiedAirlineDesignator; } bool hasUnmodifiedDesignators() const { return !this->hasModifiedAirlineIcaoDesignator() && !this->hasModifiedAircraftIcaoDesignator(); } - //! } - - //! Changed values @{ bool hasChangedAircraftIcao(const BlackMisc::Aviation::CAircraftIcaoCode &aircraftIcao) const; bool hasChangedAircraftIcaoId(const BlackMisc::Aviation::CAircraftIcaoCode &aircraftIcao) const; bool hasChangedAirlineIcao(const BlackMisc::Aviation::CAirlineIcaoCode &airlineIcao) const; @@ -193,6 +193,8 @@ namespace BlackMisc private: QString m_callsign; + QString m_callsignAsSet; + QString m_flightNumber; QString m_aircraftIcao; QString m_combinedType; QString m_airlineIcao;