From 881ec390439989ebfaf8a516ca0b1d50f581870e Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 8 Nov 2019 01:23:27 +0100 Subject: [PATCH] [AFV] Fix aliased frequency handling * ONLY use HF frequency if stations match and is closest station * better log messages --- src/blackcore/afv/clients/afvclient.cpp | 28 +++++++++++++++---------- src/blackcore/afv/clients/afvclient.h | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/blackcore/afv/clients/afvclient.cpp b/src/blackcore/afv/clients/afvclient.cpp index 8cd29797a..52d0e5624 100644 --- a/src/blackcore/afv/clients/afvclient.cpp +++ b/src/blackcore/afv/clients/afvclient.cpp @@ -14,6 +14,7 @@ #include "blacksound/audioutilities.h" #include "blackmisc/audio/audiodeviceinfolist.h" #include "blackmisc/threadutils.h" +#include "blackmisc/stringutils.h" #include "blackmisc/verify.h" #ifdef Q_OS_WIN @@ -1039,7 +1040,6 @@ namespace BlackCore if (it != m_aliasedStations.end()) { - roundedFrequencyHz = it->frequencyHz; // we use this frequency if (sApp->getIContextNetwork()) { // Get the callsign for this frequency and fuzzy compare with our alias station @@ -1049,29 +1049,33 @@ namespace BlackCore const CAtcStationList matchingAtcStations = sApp->getIContextNetwork()->getOnlineStationsForFrequency(f, spacing); const CAtcStation closest = matchingAtcStations.findClosest(1, sApp->getIContextOwnAircraft()->getOwnAircraftSituation().getPosition()).frontOrDefault(); - if (fuzzyMatchCallSign(it->name, closest.getCallsign().asString())) + if (fuzzyMatchCallsign(it->name, closest.getCallsign().asString())) { // this is how it should be - CLogMessage(this).debug(u"%1 Aliasing %2Hz [VHF] to %3Hz [HF]") << closest.getCallsign() << frequencyHz << it->frequencyHz; + roundedFrequencyHz = it->frequencyHz; + CLogMessage(this).debug(u"Aliasing '%1' %2Hz [VHF] to %3Hz [HF]") << closest.getCallsign() << frequencyHz << it->frequencyHz; } else { // Ups! - CLogMessage(this).debug(u"Aliasing %1Hz [VHF] to %2Hz [HF], BUT station NOT found!") << frequencyHz << it->frequencyHz; + CLogMessage(this).debug(u"Station '%1' NOT found! Using original frequency %2Hz") << it->name << roundedFrequencyHz; } } else { - // without contexts - CLogMessage(this).debug(u"Aliasing %1Hz [VHF] to %2Hz [HF]") << frequencyHz << it->frequencyHz; + // without contexts always use HF frequency if found + roundedFrequencyHz = it->frequencyHz; // we use this frequency + CLogMessage(this).debug(u"Aliasing %1Hz [VHF] to %2Hz [HF] (no context)") << frequencyHz << it->frequencyHz; } } } return roundedFrequencyHz; } - bool CAfvClient::fuzzyMatchCallSign(const QString &callsign, const QString &compareTo) const + bool CAfvClient::fuzzyMatchCallsign(const QString &callsign, const QString &compareTo) const { + if (callsign.isEmpty() || compareTo.isEmpty()) { return false; } // empty callsigns should NOT match + QString prefixA; QString suffixA; QString prefixB; @@ -1083,10 +1087,12 @@ namespace BlackCore void CAfvClient::getPrefixSuffix(const QString &callsign, QString &prefix, QString &suffix) const { - QRegularExpression separator("[(-|_)]"); - QStringList parts = callsign.split(separator); - prefix = parts.first(); - suffix = parts.last(); + thread_local const QRegularExpression separator("[(\\-|_)]"); + const QStringList parts = callsign.split(separator); + + // avoid issues if there are no parts, or only one + prefix = parts.size() > 0 ? parts.first() : QString(); + suffix = parts.size() > 1 ? parts.last() : QString(); } quint16 CAfvClient::comUnitToTransceiverId(CComSystem::ComUnit comUnit) diff --git a/src/blackcore/afv/clients/afvclient.h b/src/blackcore/afv/clients/afvclient.h index 352ab88c4..b02b49b63 100644 --- a/src/blackcore/afv/clients/afvclient.h +++ b/src/blackcore/afv/clients/afvclient.h @@ -312,7 +312,7 @@ namespace BlackCore //! \threadsafe quint32 getAliasFrequencyHz(quint32 frequencyHz) const; - bool fuzzyMatchCallSign(const QString &callsign, const QString &compareTo) 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