From 1051cc5751c2ea3a01e7b929003442285c5ea9ae Mon Sep 17 00:00:00 2001 From: Roland Rossgotterer Date: Wed, 16 Oct 2019 16:24:30 +0200 Subject: [PATCH] [AFV] Add fuzzy callsign matching before aliasing a HF station # Conflicts: # src/blackcore/afv/clients/afvclient.h --- src/blackcore/afv/clients/afvclient.cpp | 40 +++++++++++++++++++++++-- src/blackcore/afv/clients/afvclient.h | 3 ++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/blackcore/afv/clients/afvclient.cpp b/src/blackcore/afv/clients/afvclient.cpp index 5d22ebb3f..197917ef1 100644 --- a/src/blackcore/afv/clients/afvclient.cpp +++ b/src/blackcore/afv/clients/afvclient.cpp @@ -943,13 +943,49 @@ namespace BlackCore if (it != m_aliasedStations.end()) { - CLogMessage(this).debug(u"Aliasing %1Hz [VHF] to %2Hz [HF]") << frequencyHz << it->frequencyHz; - roundedFrequencyHz = it->frequencyHz; + if (sApp->getIContextNetwork()) + { + // Get the callsign for this frequency and fuzzy compare with our alias station + const CComSystem::ChannelSpacing spacing = CComSystem::ChannelSpacing25KHz; + CFrequency f(static_cast(roundedFrequencyHz), CFrequencyUnit::Hz()); + CAtcStationList matchingAtcStations = sApp->getIContextNetwork()->getOnlineStationsForFrequency(f, spacing); + CAtcStation closest = matchingAtcStations.findClosest(1, sApp->getIContextOwnAircraft()->getOwnAircraftSituation().getPosition()).frontOrDefault(); + + if (fuzzyMatchCallSign(it->name, closest.getCallsign().asString())) + { + CLogMessage(this).debug(u"Aliasing %1Hz [VHF] to %2Hz [HF]") << frequencyHz << it->frequencyHz; + roundedFrequencyHz = it->frequencyHz; + } + } + else + { + CLogMessage(this).debug(u"Aliasing %1Hz [VHF] to %2Hz [HF]") << frequencyHz << it->frequencyHz; + roundedFrequencyHz = it->frequencyHz; + } } } return roundedFrequencyHz; } + bool CAfvClient::fuzzyMatchCallSign(const QString &callsign, const QString &compareTo) const + { + QString prefixA; + QString suffixA; + QString prefixB; + QString suffixB; + getPrefixSuffix(callsign, prefixA, suffixA); + getPrefixSuffix(compareTo, prefixB, suffixB); + return (prefixA == prefixB) && (suffixA == suffixB); + } + + void CAfvClient::getPrefixSuffix(const QString &callsign, QString &prefix, QString &suffix) const + { + QRegularExpression separator("[(-|_)]"); + QStringList parts = callsign.split(separator); + prefix = parts.first(); + suffix = parts.last(); + } + quint16 CAfvClient::comUnitToTransceiverId(CComSystem::ComUnit comUnit) { switch (comUnit) diff --git a/src/blackcore/afv/clients/afvclient.h b/src/blackcore/afv/clients/afvclient.h index d41889f4a..339c141a7 100644 --- a/src/blackcore/afv/clients/afvclient.h +++ b/src/blackcore/afv/clients/afvclient.h @@ -292,6 +292,9 @@ namespace BlackCore //! \threadsafe quint32 getAliasFrequencyHz(quint32 frequencyHz) const; + bool fuzzyMatchCallSign(const QString &callsign, const QString &compareTo) const; + void getPrefixSuffix(const QString &callsign, QString &prefix, QString &suffix) const; + static constexpr int PositionUpdatesMs = 20000; //!< position timer static constexpr int SampleRate = 48000; static constexpr int FrameSize = static_cast(SampleRate * 0.02); //!< 20ms