From 14701da1f5c62da764fcb6e5cb90a62774d0e740 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Tue, 3 May 2022 13:44:09 +0100 Subject: [PATCH 01/12] VOR Localizer: Use shared OpenAIP code to get latest URL --- plugins/feature/vorlocalizer/CMakeLists.txt | 1 - plugins/feature/vorlocalizer/navaid.h | 368 ---------- .../feature/vorlocalizer/vorlocalizergui.cpp | 627 ++++-------------- .../feature/vorlocalizer/vorlocalizergui.h | 18 +- sdrbase/util/openaip.h | 11 +- 5 files changed, 127 insertions(+), 898 deletions(-) delete mode 100644 plugins/feature/vorlocalizer/navaid.h diff --git a/plugins/feature/vorlocalizer/CMakeLists.txt b/plugins/feature/vorlocalizer/CMakeLists.txt index ddf07bb7a..aaf5267bd 100644 --- a/plugins/feature/vorlocalizer/CMakeLists.txt +++ b/plugins/feature/vorlocalizer/CMakeLists.txt @@ -34,7 +34,6 @@ if(NOT SERVER_MODE) set(vor_HEADERS ${vor_HEADERS} vorlocalizergui.h - navaid.h ) set(TARGET_NAME vorlocalizer) diff --git a/plugins/feature/vorlocalizer/navaid.h b/plugins/feature/vorlocalizer/navaid.h deleted file mode 100644 index 1ac7419f6..000000000 --- a/plugins/feature/vorlocalizer/navaid.h +++ /dev/null @@ -1,368 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2020 Jon Beniston, M7RCE // -// // -// This program is free software; you can redistribute it and/or modify // -// it under the terms of the GNU General Public License as published by // -// the Free Software Foundation as version 3 of the License, or // -// (at your option) any later version. // -// // -// This program is distributed in the hope that it will be useful, // -// but WITHOUT ANY WARRANTY; without even the implied warranty of // -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // -// GNU General Public License V3 for more details. // -// // -// You should have received a copy of the GNU General Public License // -// along with this program. If not, see . // -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef INCLUDE_NAVAID_H -#define INCLUDE_NAVAID_H - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "util/units.h" -#include "util/csv.h" - -#define OURAIRPORTS_NAVAIDS_URL "https://ourairports.com/data/navaids.csv" -#define OPENAIP_NAVAIDS_URL "https://www.openaip.net/customer_export_akfshb9237tgwiuvb4tgiwbf/%1_nav.aip" - -struct NavAid { - - int m_id; - QString m_ident; // 2 or 3 character ident - QString m_type; // VOR, VOR-DME or VORTAC - QString m_name; - float m_latitude; - float m_longitude; - float m_elevation; - int m_frequencykHz; - QString m_channel; - int m_range; // Nautical miles - float m_magneticDeclination; - bool m_alignedTrueNorth; // Is the VOR aligned to true North, rather than magnetic (may be the case at high latitudes) - - static QString trimQuotes(const QString s) - { - if (s.startsWith('\"') && s.endsWith('\"')) - return s.mid(1, s.size() - 2); - else - return s; - } - - int getRangeMetres() - { - return Units::nauticalMilesToIntegerMetres((float)m_range); - } - - // OpenAIP XML file - static void readNavAidsXML(QHash *navAidInfo, const QString &filename) - { - QFile file(filename); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - QXmlStreamReader xmlReader(&file); - - while(!xmlReader.atEnd() && !xmlReader.hasError()) - { - if (xmlReader.readNextStartElement()) - { - if (xmlReader.name() == "NAVAID") - { - QStringRef typeRef = xmlReader.attributes().value("TYPE"); - if ((typeRef == QLatin1String("VOR")) - || (typeRef== QLatin1String("VOR-DME")) - || (typeRef == QLatin1String("VORTAC"))) - { - QString type = typeRef.toString(); - int identifier = 0; - QString name; - QString id; - float lat = 0.0f; - float lon = 0.0f; - float elevation = 0.0f; - int frequency = 0; - QString channel; - int range = 25; - float declination = 0.0f; - bool alignedTrueNorth = false; - while(xmlReader.readNextStartElement()) - { - if (xmlReader.name() == QLatin1String("IDENTIFIER")) - identifier = xmlReader.readElementText().toInt(); - else if (xmlReader.name() == QLatin1String("NAME")) - name = xmlReader.readElementText(); - else if (xmlReader.name() == QLatin1String("ID")) - id = xmlReader.readElementText(); - else if (xmlReader.name() == QLatin1String("GEOLOCATION")) - { - while(xmlReader.readNextStartElement()) - { - if (xmlReader.name() == QLatin1String("LAT")) - lat = xmlReader.readElementText().toFloat(); - else if (xmlReader.name() == QLatin1String("LON")) - lon = xmlReader.readElementText().toFloat(); - else if (xmlReader.name() == QLatin1String("ELEV")) - elevation = xmlReader.readElementText().toFloat(); - else - xmlReader.skipCurrentElement(); - } - } - else if (xmlReader.name() == QLatin1String("RADIO")) - { - while(xmlReader.readNextStartElement()) - { - if (xmlReader.name() == QLatin1String("FREQUENCY")) - frequency = (int)(xmlReader.readElementText().toFloat() * 1000); - else if (xmlReader.name() == QLatin1String("CHANNEL")) - channel = xmlReader.readElementText(); - else - xmlReader.skipCurrentElement(); - } - } - else if (xmlReader.name() == QLatin1String("PARAMS")) - { - while(xmlReader.readNextStartElement()) - { - if (xmlReader.name() == QLatin1String("RANGE")) - range = xmlReader.readElementText().toInt(); - else if (xmlReader.name() == QLatin1String("DECLINATION")) - declination = xmlReader.readElementText().toFloat(); - else if (xmlReader.name() == QLatin1String("ALIGNEDTOTRUENORTH")) - alignedTrueNorth = xmlReader.readElementText() == "TRUE"; - else - xmlReader.skipCurrentElement(); - } - } - else - xmlReader.skipCurrentElement(); - } - NavAid *vor = new NavAid(); - vor->m_id = identifier; - vor->m_ident = id; - // Check idents conform to our filtering rules - if (vor->m_ident.size() < 2) - qDebug() << "Warning: VOR Ident less than 2 characters: " << vor->m_ident; - else if (vor->m_ident.size() > 3) - qDebug() << "Warning: VOR Ident greater than 3 characters: " << vor->m_ident; - vor->m_type = type; - vor->m_name = name; - vor->m_frequencykHz = frequency; - vor->m_channel = channel; - vor->m_latitude = lat; - vor->m_longitude = lon; - vor->m_elevation = elevation; - vor->m_range = range; - vor->m_magneticDeclination = declination; - vor->m_alignedTrueNorth = alignedTrueNorth; - navAidInfo->insert(identifier, vor); - } - } - } - } - - file.close(); - } - else - qDebug() << "NavAid::readNavAidsXML: Could not open " << filename << " for reading."; - } - - // Read OurAirport's NavAids CSV file - // See comments for readOSNDB - static QHash *readNavAidsDB(const QString &filename) - { - int cnt = 0; - QHash *navAidInfo = nullptr; - - // Column numbers used for the data as of 2020/10/28 - int idCol = 0; - int identCol = 2; - int typeCol = 4; - int nameCol = 3; - int frequencyCol = 5; - int latitudeCol = 6; - int longitudeCol = 7; - int elevationCol = 8; - int powerCol = 18; - - qDebug() << "NavAid::readNavAidsDB: " << filename; - - FILE *file; - QByteArray utfFilename = filename.toUtf8(); - QLocale cLocale(QLocale::C); - if ((file = fopen(utfFilename.constData(), "r")) != NULL) - { - char row[2048]; - - if (fgets(row, sizeof(row), file)) - { - navAidInfo = new QHash(); - navAidInfo->reserve(15000); - - // Read header - int idx = 0; - char *p = strtok(row, ","); - while (p != NULL) - { - if (!strcmp(p, "id")) - idCol = idx; - else if (!strcmp(p, "ident")) - identCol = idx; - else if (!strcmp(p, "type")) - typeCol = idx; - else if (!strcmp(p, "name")) - nameCol = idx; - else if (!strcmp(p, "frequency_khz")) - frequencyCol = idx; - else if (!strcmp(p, "latitude_deg")) - latitudeCol = idx; - else if (!strcmp(p, "longitude_deg")) - longitudeCol = idx; - else if (!strcmp(p, "elevation_ft")) - elevationCol = idx; - else if (!strcmp(p, "power")) - powerCol = idx; - p = strtok(NULL, ","); - idx++; - } - // Read data - while (fgets(row, sizeof(row), file)) - { - int id = 0; - char *idString = NULL; - char *ident = NULL; - size_t identLen = 0; - char *type = NULL; - size_t typeLen = 0; - char *name = NULL; - size_t nameLen = 0; - char *frequencyString = NULL; - int frequency; - float latitude = 0.0f; - char *latitudeString = NULL; - size_t latitudeLen = 0; - float longitude = 0.0f; - char *longitudeString = NULL; - size_t longitudeLen = 0; - float elevation = 0.0f; - char *elevationString = NULL; - size_t elevationLen = 0; - char *power = NULL; - size_t powerLen = 0; - - char *q = row; - idx = 0; - while ((p = csvNext(&q)) != nullptr) - { - // Read strings, stripping quotes - if (idx == idCol) - { - idString = p; - idString[strlen(idString)] = '\0'; - id = strtol(idString, NULL, 10); - } - else if ((idx == identCol) && (p[0] == '\"')) - { - ident = p+1; - identLen = strlen(ident)-1; - ident[identLen] = '\0'; - } - else if ((idx == typeCol) && (p[0] == '\"')) - { - type = p+1; - typeLen = strlen(type)-1; - type[typeLen] = '\0'; - } - else if ((idx == nameCol) && (p[0] == '\"')) - { - name = p+1; - nameLen = strlen(name)-1; - name[nameLen] = '\0'; - } - if (idx == frequencyCol) - { - frequencyString = p; - frequencyString[strlen(frequencyString)] = '\0'; - frequency = strtol(frequencyString, NULL, 10); - } - else if (idx == latitudeCol) - { - latitudeString = p; - latitudeLen = strlen(latitudeString)-1; - latitudeString[latitudeLen] = '\0'; - latitude = cLocale.toFloat(latitudeString); - } - else if (idx == longitudeCol) - { - longitudeString = p; - longitudeLen = strlen(longitudeString)-1; - longitudeString[longitudeLen] = '\0'; - longitude = cLocale.toFloat(longitudeString); - } - else if (idx == elevationCol) - { - elevationString = p; - elevationLen = strlen(elevationString)-1; - elevationString[elevationLen] = '\0'; - elevation = cLocale.toFloat(elevationString); - } - else if ((idx == powerCol) && (p[0] == '\"')) - { - power = p+1; - powerLen = strlen(power)-1; - power[powerLen] = '\0'; - } - idx++; - } - - // For now, we only want VORs - if (type && !strncmp(type, "VOR", 3)) - { - NavAid *vor = new NavAid(); - vor->m_id = id; - vor->m_ident = QString(ident); - // Check idents conform to our filtering rules - if (vor->m_ident.size() < 2) - qDebug() << "Warning: VOR Ident less than 2 characters: " << vor->m_ident; - else if (vor->m_ident.size() > 3) - qDebug() << "Warning: VOR Ident greater than 3 characters: " << vor->m_ident; - vor->m_type = QString(type); - vor->m_name = QString(name); - vor->m_frequencykHz = frequency; - vor->m_latitude = latitude; - vor->m_longitude = longitude; - vor->m_elevation = elevation; - if (power && !strcmp(power, "HIGH")) - vor->m_range = 100; - else if (power && !strcmp(power, "MEDIUM")) - vor->m_range = 40; - else - vor->m_range = 25; - vor->m_magneticDeclination = 0.0f; - vor->m_alignedTrueNorth = false; - navAidInfo->insert(id, vor); - cnt++; - } - } - } - fclose(file); - } - else - qDebug() << "NavAid::readNavAidsDB: Failed to open " << filename; - - qDebug() << "NavAid::readNavAidsDB: Read " << cnt << " VORs"; - - return navAidInfo; - } - -}; - -#endif // INCLUDE_NAVAID_H diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.cpp b/plugins/feature/vorlocalizer/vorlocalizergui.cpp index 2e4c0b965..a00085a19 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.cpp +++ b/plugins/feature/vorlocalizer/vorlocalizergui.cpp @@ -47,258 +47,6 @@ #include "vorlocalizersettings.h" #include "vorlocalizergui.h" -static const char *countryCodes[] = { - "ad", - "ae", - "af", - "ag", - "ai", - "al", - "am", - "an", - "ao", - "aq", - "ar", - "as", - "at", - "au", - "aw", - "ax", - "az", - "ba", - "bb", - "bd", - "be", - "bf", - "bg", - "bh", - "bi", - "bj", - "bl", - "bm", - "bn", - "bo", - "bq", - "br", - "bs", - "bt", - "bv", - "bw", - "by", - "bz", - "ca", - "cc", - "cd", - "cf", - "cg", - "ch", - "ci", - "ck", - "cl", - "cm", - "cn", - "co", - "cr", - "cu", - "cv", - "cw", - "cx", - "cy", - "cz", - "de", - "dj", - "dk", - "dm", - "do", - "dz", - "ec", - "ee", - "eg", - "eh", - "er", - "es", - "et", - "fi", - "fj", - "fk", - "fm", - "fo", - "fr", - "ga", - "gb", - "ge", - "gf", - "gg", - "gh", - "gi", - "gl", - "gm", - "gn", - "gp", - "gq", - "gr", - "gs", - "gt", - "gu", - "gw", - "gy", - "hk", - "hm", - "hn", - "hr", - "hu", - "id", - "ie", - "il", - "im", - "in", - "io", - "iq", - "ir", - "is", - "it", - "je", - "jm", - "jo", - "jp", - "ke", - "kg", - "kh", - "ki", - "km", - "kn", - "kp", - "kr", - "kw", - "ky", - "kz", - "la", - "lb", - "lc", - "li", - "lk", - "lr", - "ls", - "lt", - "lu", - "lv", - "ly", - "ma", - "mc", - "md", - "me", - "mf", - "mg", - "mh", - "mk", - "ml", - "mm", - "mn", - "mo", - "mp", - "mq", - "mr", - "ms", - "mt", - "mu", - "mv", - "mw", - "mx", - "my", - "mz", - "na", - "nc", - "ne", - "nf", - "ng", - "ni", - "nl", - "no", - "np", - "nr", - "nu", - "nz", - "om", - "pa", - "pe", - "pf", - "pg", - "ph", - "pk", - "pl", - "pm", - "pn", - "pr", - "ps", - "pt", - "pw", - "py", - "qa", - "re", - "ro", - "rs", - "ru", - "rw", - "sa", - "sb", - "sc", - "sd", - "se", - "sg", - "sh", - "si", - "sj", - "sk", - "sl", - "sm", - "sn", - "so", - "sr", - "ss", - "st", - "sv", - "sx", - "sy", - "sz", - "tc", - "td", - "tf", - "tg", - "th", - "tj", - "tk", - "tl", - "tm", - "tn", - "to", - "tr", - "tt", - "tv", - "tw", - "tz", - "ua", - "ug", - "um", - "us", - "uy", - "uz", - "va", - "vc", - "ve", - "vg", - "vi", - "vn", - "vu", - "wf", - "ws", - "ye", - "yt", - "za", - "zm", - "zw", - nullptr -}; - // Lats and longs in decimal degrees. Distance in metres. Bearing in degrees. // https://www.movable-type.co.uk/scripts/latlong.html static void calcRadialEndPoint(float startLatitude, float startLongitude, float distance, float bearing, float &endLatitude, float &endLongitude) @@ -702,7 +450,7 @@ void VORLocalizerGUI::selectVOR(VORGUI *vorGUI, bool selected) // Add to settings to create corresponding demodulator m_settings.m_subChannelSettings.insert(navId, VORLocalizerSubChannelSettings{ navId, - vorGUI->m_navAid->m_frequencykHz * 1000, + (int)(vorGUI->m_navAid->m_frequencykHz * 1000), false }); @@ -725,23 +473,21 @@ void VORLocalizerGUI::selectVOR(VORGUI *vorGUI, bool selected) void VORLocalizerGUI::updateVORs() { m_vorModel.removeAllVORs(); - QHash::iterator i = m_vors->begin(); AzEl azEl = m_azEl; - while (i != m_vors->end()) + for (auto vor : m_vors) { - NavAid *vor = i.value(); + if (vor->m_type.contains("VOR")) // Exclude DMEs + { + // Calculate distance to VOR from My Position + azEl.setTarget(vor->m_latitude, vor->m_longitude, Units::feetToMetres(vor->m_elevation)); + azEl.calculate(); - // Calculate distance to VOR from My Position - azEl.setTarget(vor->m_latitude, vor->m_longitude, Units::feetToMetres(vor->m_elevation)); - azEl.calculate(); - - // Only display VOR if in range - if (azEl.getDistance() <= 200000) { - m_vorModel.addVOR(vor); + // Only display VOR if in range + if (azEl.getDistance() <= 200000) { + m_vorModel.addVOR(vor); + } } - - ++i; } } @@ -807,41 +553,47 @@ bool VORLocalizerGUI::handleMessage(const Message& message) int subChannelId = report.getSubChannelId(); VORGUI *vorGUI = m_selectedVORs.value(subChannelId); + if (vorGUI) + { + // Display radial and signal magnitudes in table - // Display radial and signal magnitudes in table + Real varMagDB = std::round(20.0*std::log10(report.getVarMag())); + Real refMagDB = std::round(20.0*std::log10(report.getRefMag())); - Real varMagDB = std::round(20.0*std::log10(report.getVarMag())); - Real refMagDB = std::round(20.0*std::log10(report.getRefMag())); + bool validRadial = report.getValidRadial(); + vorGUI->m_radialItem->setData(Qt::DisplayRole, std::round(report.getRadial())); + vorGUI->m_navIdItem->setData(Qt::DisplayRole, subChannelId); - bool validRadial = report.getValidRadial(); - vorGUI->m_radialItem->setData(Qt::DisplayRole, std::round(report.getRadial())); - vorGUI->m_navIdItem->setData(Qt::DisplayRole, subChannelId); + if (validRadial) { + vorGUI->m_radialItem->setForeground(QBrush(Qt::white)); + } else { + vorGUI->m_radialItem->setForeground(QBrush(Qt::red)); + } - if (validRadial) { - vorGUI->m_radialItem->setForeground(QBrush(Qt::white)); - } else { - vorGUI->m_radialItem->setForeground(QBrush(Qt::red)); + vorGUI->m_refMagItem->setData(Qt::DisplayRole, refMagDB); + + if (report.getValidRefMag()) { + vorGUI->m_refMagItem->setForeground(QBrush(Qt::white)); + } else { + vorGUI->m_refMagItem->setForeground(QBrush(Qt::red)); + } + + vorGUI->m_varMagItem->setData(Qt::DisplayRole, varMagDB); + + if (report.getValidVarMag()) { + vorGUI->m_varMagItem->setForeground(QBrush(Qt::white)); + } else { + vorGUI->m_varMagItem->setForeground(QBrush(Qt::red)); + } + + // Update radial on map + m_vorModel.setRadial(subChannelId, validRadial, report.getRadial()); } - - vorGUI->m_refMagItem->setData(Qt::DisplayRole, refMagDB); - - if (report.getValidRefMag()) { - vorGUI->m_refMagItem->setForeground(QBrush(Qt::white)); - } else { - vorGUI->m_refMagItem->setForeground(QBrush(Qt::red)); + else + { + qDebug() << "VORLocalizerGUI::handleMessage: Got MsgReportRadial for non-existant subChannelId " << subChannelId; } - vorGUI->m_varMagItem->setData(Qt::DisplayRole, varMagDB); - - if (report.getValidVarMag()) { - vorGUI->m_varMagItem->setForeground(QBrush(Qt::white)); - } else { - vorGUI->m_varMagItem->setForeground(QBrush(Qt::red)); - } - - // Update radial on map - m_vorModel.setRadial(subChannelId, validRadial, report.getRadial()); - return true; } else if (VORLocalizerReport::MsgReportIdent::match(message)) @@ -850,38 +602,45 @@ bool VORLocalizerGUI::handleMessage(const Message& message) int subChannelId = report.getSubChannelId(); VORGUI *vorGUI = m_selectedVORs.value(subChannelId); - - QString ident = report.getIdent(); - // Convert Morse to a string - QString identString = Morse::toString(ident); - // Idents should only be two or three characters, so filter anything else - // other than TEST which indicates a VOR is under maintainance (may also be TST) - if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST")) + if (vorGUI) { - vorGUI->m_rxIdentItem->setText(identString); - vorGUI->m_rxMorseItem->setText(Morse::toSpacedUnicode(ident)); - if (vorGUI->m_navAid->m_ident == identString) + QString ident = report.getIdent(); + // Convert Morse to a string + QString identString = Morse::toString(ident); + // Idents should only be two or three characters, so filter anything else + // other than TEST which indicates a VOR is under maintainance (may also be TST) + if (((identString.size() >= 2) && (identString.size() <= 3)) || (identString == "TEST")) { - // Set colour to green if matching expected ident - vorGUI->m_rxIdentItem->setForeground(QBrush(Qt::green)); - vorGUI->m_rxMorseItem->setForeground(QBrush(Qt::green)); + vorGUI->m_rxIdentItem->setText(identString); + vorGUI->m_rxMorseItem->setText(Morse::toSpacedUnicode(ident)); + + if (vorGUI->m_navAid->m_ident == identString) + { + // Set colour to green if matching expected ident + vorGUI->m_rxIdentItem->setForeground(QBrush(Qt::green)); + vorGUI->m_rxMorseItem->setForeground(QBrush(Qt::green)); + } + else + { + // Set colour to green if not matching expected ident + vorGUI->m_rxIdentItem->setForeground(QBrush(Qt::red)); + vorGUI->m_rxMorseItem->setForeground(QBrush(Qt::red)); + } } else { - // Set colour to green if not matching expected ident - vorGUI->m_rxIdentItem->setForeground(QBrush(Qt::red)); - vorGUI->m_rxMorseItem->setForeground(QBrush(Qt::red)); + // Set yellow to indicate we've filtered something (unless red) + if (vorGUI->m_rxIdentItem->foreground().color() != Qt::red) + { + vorGUI->m_rxIdentItem->setForeground(QBrush(Qt::yellow)); + vorGUI->m_rxMorseItem->setForeground(QBrush(Qt::yellow)); + } } } else { - // Set yellow to indicate we've filtered something (unless red) - if (vorGUI->m_rxIdentItem->foreground().color() != Qt::red) - { - vorGUI->m_rxIdentItem->setForeground(QBrush(Qt::yellow)); - vorGUI->m_rxMorseItem->setForeground(QBrush(Qt::yellow)); - } + qDebug() << "VORLocalizerGUI::handleMessage: Got MsgReportIdent for non-existant subChannelId " << subChannelId; } return true; @@ -938,142 +697,6 @@ void VORLocalizerGUI::handleInputMessages() } } -qint64 VORLocalizerGUI::fileAgeInDays(QString filename) -{ - QFile file(filename); - - if (file.exists()) - { - QDateTime modified = file.fileTime(QFileDevice::FileModificationTime); - - if (modified.isValid()) { - return modified.daysTo(QDateTime::currentDateTime()); - } else { - return -1; - } - } - - return -1; -} - -bool VORLocalizerGUI::confirmDownload(QString filename) -{ - qint64 age = fileAgeInDays(filename); - - if ((age == -1) || (age > 100)) - { - return true; - } - else - { - QMessageBox::StandardButton reply; - - if (age == 0) { - reply = QMessageBox::question(this, "Confirm download", "This file was last downloaded today. Are you sure you wish to redownload it?", QMessageBox::Yes|QMessageBox::No); - } else if (age == 1) { - reply = QMessageBox::question(this, "Confirm download", "This file was last downloaded yesterday. Are you sure you wish to redownload it?", QMessageBox::Yes|QMessageBox::No); - } else { - reply = QMessageBox::question(this, "Confirm download", QString("This file was last downloaded %1 days ago. Are you sure you wish to redownload this file?").arg(age), QMessageBox::Yes|QMessageBox::No); - } - - return reply == QMessageBox::Yes; - } -} - -QString VORLocalizerGUI::getDataDir() -{ - // Get directory to store app data in - QStringList locations = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); - // First dir is writable - return locations[0]; -} - -QString VORLocalizerGUI::getOpenAIPVORDBFilename(int i) -{ - if (countryCodes[i] != nullptr) { - return getDataDir() + "/" + countryCodes[i] + "_nav.aip"; - } else { - return ""; - } -} - -QString VORLocalizerGUI::getOpenAIPVORDBURL(int i) -{ - if (countryCodes[i] != nullptr) { - return QString(OPENAIP_NAVAIDS_URL).arg(countryCodes[i]); - } else { - return ""; - } -} - -QString VORLocalizerGUI::getVORDBFilename() -{ - return getDataDir() + "/vorDatabase.csv"; -} - -void VORLocalizerGUI::updateDownloadProgress(qint64 bytesRead, qint64 totalBytes) -{ - if (m_progressDialog) - { - m_progressDialog->setMaximum(totalBytes); - m_progressDialog->setValue(bytesRead); - } -} - -void VORLocalizerGUI::downloadFinished(const QString& filename, bool success) -{ - bool closeDialog = true; - if (success) - { - if (filename == getVORDBFilename()) - { - m_vors = NavAid::readNavAidsDB(filename); - - if (m_vors != nullptr) { - updateVORs(); - } - } - else if (filename == getOpenAIPVORDBFilename(m_countryIndex)) - { - m_countryIndex++; - - if (countryCodes[m_countryIndex] != nullptr) - { - QString vorDBFile = getOpenAIPVORDBFilename(m_countryIndex); - QString urlString = getOpenAIPVORDBURL(m_countryIndex); - QUrl dbURL(urlString); - m_progressDialog->setLabelText(QString("Downloading %1.").arg(urlString)); - m_progressDialog->setValue(m_countryIndex); - m_dlm.download(dbURL, vorDBFile); - closeDialog = false; - } - else - { - readNavAids(); - - if (m_vors) { - updateVORs(); - } - } - } - else - { - qDebug() << "VORLocalizerGUI::downloadFinished: Unexpected filename: " << filename; - } - } - else - { - qDebug() << "VORLocalizerGUI::downloadFinished: Failed: " << filename; - QMessageBox::warning(this, "Download failed", QString("Failed to download %1").arg(filename)); - } - if (closeDialog && m_progressDialog) - { - m_progressDialog->close(); - delete m_progressDialog; - m_progressDialog = nullptr; - } -} - void VORLocalizerGUI::on_startStop_toggled(bool checked) { if (m_doApplySettings) @@ -1083,59 +706,56 @@ void VORLocalizerGUI::on_startStop_toggled(bool checked) } } -void VORLocalizerGUI::on_getOurAirportsVORDB_clicked() -{ - // Don't try to download while already in progress - if (m_progressDialog == nullptr) - { - QString vorDBFile = getVORDBFilename(); - - if (confirmDownload(vorDBFile)) - { - // Download OurAirports navaid database to disk - QUrl dbURL(QString(OURAIRPORTS_NAVAIDS_URL)); - m_progressDialog = new QProgressDialog(this); - m_progressDialog->setCancelButton(nullptr); - m_progressDialog->setMinimumDuration(500); - m_progressDialog->setLabelText(QString("Downloading %1.").arg(OURAIRPORTS_NAVAIDS_URL)); - QNetworkReply *reply = m_dlm.download(dbURL, vorDBFile); - connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(updateDownloadProgress(qint64,qint64))); - } - } -} - void VORLocalizerGUI::on_getOpenAIPVORDB_clicked() { // Don't try to download while already in progress if (!m_progressDialog) { - m_countryIndex = 0; - QString vorDBFile = getOpenAIPVORDBFilename(m_countryIndex); + m_progressDialog = new QProgressDialog(this); + m_progressDialog->setMaximum(OpenAIP::m_countryCodes.size()); + m_progressDialog->setCancelButton(nullptr); - if (confirmDownload(vorDBFile)) - { - // Download OpenAIP XML to disk - QString urlString = getOpenAIPVORDBURL(m_countryIndex); - QUrl dbURL(urlString); - m_progressDialog = new QProgressDialog(this); - m_progressDialog->setCancelButton(nullptr); - m_progressDialog->setMinimumDuration(500); - m_progressDialog->setMaximum(sizeof(countryCodes)/sizeof(countryCodes[0])); - m_progressDialog->setValue(0); - m_progressDialog->setLabelText(QString("Downloading %1.").arg(urlString)); - m_dlm.download(dbURL, vorDBFile); - } + m_openAIP.downloadNavAids(); } } void VORLocalizerGUI::readNavAids() { - m_vors = new QHash(); + m_vors = OpenAIP::readNavAids(); + updateVORs(); +} - for (int countryIndex = 0; countryCodes[countryIndex] != nullptr; countryIndex++) +void VORLocalizerGUI::downloadingURL(const QString& url) +{ + if (m_progressDialog) { - QString vorDBFile = getOpenAIPVORDBFilename(countryIndex); - NavAid::readNavAidsXML(m_vors, vorDBFile); + m_progressDialog->setLabelText(QString("Downloading %1.").arg(url)); + m_progressDialog->setValue(m_progressDialog->value() + 1); + } +} + +void VORLocalizerGUI::downloadError(const QString& error) +{ + QMessageBox::critical(this, "VOR Localizer", error); + if (m_progressDialog) + { + m_progressDialog->close(); + delete m_progressDialog; + m_progressDialog = nullptr; + } +} + +void VORLocalizerGUI::downloadNavAidsFinished() +{ + if (m_progressDialog) { + m_progressDialog->setLabelText("Reading NAVAIDs."); + } + readNavAids(); + if (m_progressDialog) + { + m_progressDialog->close(); + delete m_progressDialog; + m_progressDialog = nullptr; } } @@ -1231,7 +851,6 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe m_tickCount(0), m_progressDialog(nullptr), m_vorModel(this), - m_vors(nullptr), m_lastFeatureState(0), m_rrSecondsCount(0) { @@ -1250,7 +869,9 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe m_muteIcon.addPixmap(QPixmap("://sound_on.png"), QIcon::Normal, QIcon::Off); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); - connect(&m_dlm, &HttpDownloadManager::downloadComplete, this, &VORLocalizerGUI::downloadFinished); + connect(&m_openAIP, &OpenAIP::downloadingURL, this, &VORLocalizerGUI::downloadingURL); + connect(&m_openAIP, &OpenAIP::downloadError, this, &VORLocalizerGUI::downloadError); + connect(&m_openAIP, &OpenAIP::downloadNavAidsFinished, this, &VORLocalizerGUI::downloadNavAidsFinished); m_vorLocalizer = reinterpret_cast(feature); m_vorLocalizer->setMessageQueueToGUI(getInputMessageQueue()); @@ -1293,22 +914,8 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe } // Read in VOR information if it exists - bool useOurAirports = false; - - if (useOurAirports) - { - m_vors = NavAid::readNavAidsDB(getVORDBFilename()); - ui->getOpenAIPVORDB->setVisible(false); - } - else - { - readNavAids(); - ui->getOurAirportsVORDB->setVisible(false); - } - - if (m_vors) { - updateVORs(); - } + readNavAids(); + ui->getOurAirportsVORDB->setVisible(false); // Resize the table using dummy data resizeTable(); @@ -1346,6 +953,7 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe VORLocalizerGUI::~VORLocalizerGUI() { delete ui; + qDeleteAll(m_vors); } void VORLocalizerGUI::blockApplySettings(bool block) @@ -1459,7 +1067,6 @@ void VORLocalizerGUI::tick() void VORLocalizerGUI::makeUIConnections() { QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &VORLocalizerGUI::on_startStop_toggled); - QObject::connect(ui->getOurAirportsVORDB, &QPushButton::clicked, this, &VORLocalizerGUI::on_getOurAirportsVORDB_clicked); QObject::connect(ui->getOpenAIPVORDB, &QPushButton::clicked, this, &VORLocalizerGUI::on_getOpenAIPVORDB_clicked); QObject::connect(ui->magDecAdjust, &ButtonSwitch::toggled, this, &VORLocalizerGUI::on_magDecAdjust_toggled); QObject::connect(ui->rrTime, &QDial::valueChanged, this, &VORLocalizerGUI::on_rrTime_valueChanged); diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.h b/plugins/feature/vorlocalizer/vorlocalizergui.h index 0f741c952..51639ad92 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.h +++ b/plugins/feature/vorlocalizer/vorlocalizergui.h @@ -37,10 +37,10 @@ #include "util/messagequeue.h" #include "util/httpdownloadmanager.h" #include "util/azel.h" +#include "util/openaip.h" #include "settings/rollupstate.h" #include "vorlocalizersettings.h" -#include "navaid.h" class PluginAPI; class FeatureUISet; @@ -239,9 +239,10 @@ private: QMenu *menu; // Column select context menu HttpDownloadManager m_dlm; QProgressDialog *m_progressDialog; + OpenAIP m_openAIP; int m_countryIndex; VORModel m_vorModel; - QHash *m_vors; + QList m_vors; QHash m_selectedVORs; AzEl m_azEl; // Position of station QIcon m_muteIcon; @@ -264,19 +265,11 @@ private: void calculateFreqOffset(VORGUI *vorGUI); void calculateFreqOffsets(); void updateVORs(); - QString getOpenAIPVORDBURL(int i); - QString getOpenAIPVORDBFilename(int i); - QString getVORDBFilename(); void readNavAids(); - // Move to util - QString getDataDir(); - qint64 fileAgeInDays(QString filename); - bool confirmDownload(QString filename); void updateChannelList(); private slots: void on_startStop_toggled(bool checked); - void on_getOurAirportsVORDB_clicked(); void on_getOpenAIPVORDB_clicked(); void on_magDecAdjust_toggled(bool checked); void on_rrTime_valueChanged(int value); @@ -288,11 +281,12 @@ private slots: void columnSelectMenuChecked(bool checked = false); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); - void updateDownloadProgress(qint64 bytesRead, qint64 totalBytes); - void downloadFinished(const QString& filename, bool success); void handleInputMessages(); void updateStatus(); void tick(); + void downloadingURL(const QString& url); + void downloadError(const QString& error); + void downloadNavAidsFinished(); }; #endif // INCLUDE_VORLOCALIZERGUI_H diff --git a/sdrbase/util/openaip.h b/sdrbase/util/openaip.h index 12434ba82..2c358a22c 100644 --- a/sdrbase/util/openaip.h +++ b/sdrbase/util/openaip.h @@ -50,7 +50,6 @@ struct SDRBASE_API Airspace { }; QString m_category; // A-G, GLIDING, DANGER, PROHIBITED, TMZ - int m_id; QString m_country; // GB QString m_name; // BIGGIN HILL ATZ 129.405 - TODO: Extract frequency so we can tune to it AltLimit m_top; // Top of airspace @@ -139,11 +138,7 @@ struct SDRBASE_API Airspace { while(xmlReader.readNextStartElement()) { - if (xmlReader.name() == QLatin1String("ID")) - { - airspace->m_id = xmlReader.readElementText().toInt(); - } - else if (xmlReader.name() == QLatin1String("COUNTRY")) + if (xmlReader.name() == QLatin1String("COUNTRY")) { airspace->m_country = xmlReader.readElementText(); } @@ -237,7 +232,7 @@ struct SDRBASE_API Airspace { }; struct SDRBASE_API NavAid { - + int m_id; // Unique ID needed by VOR feature - Don't use value from database as that's 96-bit QString m_ident; // 2 or 3 character ident QString m_type; // NDB, VOR, VOR-DME or VORTAC QString m_name; @@ -258,6 +253,7 @@ struct SDRBASE_API NavAid { // OpenAIP XML file static QList readXML(const QString &filename) { + int uniqueId = 1; QList navAidInfo; QFile file(filename); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) @@ -352,6 +348,7 @@ struct SDRBASE_API NavAid { } } NavAid *navAid = new NavAid(); + navAid->m_id = uniqueId++; navAid->m_ident = id; // Check idents conform to our filtering rules if (navAid->m_ident.size() < 2) { From 44f0746cbe0c345f202217f29569c261cddcab82 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Tue, 3 May 2022 13:51:39 +0100 Subject: [PATCH 02/12] VOR Localizer: Update station icon on map when My Position preference is changed --- .../feature/vorlocalizer/vorlocalizergui.cpp | 53 +++++++++++++++++++ .../feature/vorlocalizer/vorlocalizergui.h | 1 + 2 files changed, 54 insertions(+) diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.cpp b/plugins/feature/vorlocalizer/vorlocalizergui.cpp index a00085a19..7ea8815b9 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.cpp +++ b/plugins/feature/vorlocalizer/vorlocalizergui.cpp @@ -945,6 +945,9 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe ui->rrTurnTimeProgress->setValue(0); ui->rrTurnTimeProgress->setToolTip(tr("Round robin turn time %1s").arg(0)); + // Get updated when position changes + connect(&MainCore::instance()->getSettings(), &MainSettings::preferenceChanged, this, &VORLocalizerGUI::preferenceChanged); + displaySettings(); applySettings(true); makeUIConnections(); @@ -1064,6 +1067,56 @@ void VORLocalizerGUI::tick() } } +void VORLocalizerGUI::preferenceChanged(int elementType) +{ + Preferences::ElementType pref = (Preferences::ElementType)elementType; + if ((pref == Preferences::Latitude) || (pref == Preferences::Longitude) || (pref == Preferences::Altitude)) + { + Real stationLatitude = MainCore::instance()->getSettings().getLatitude(); + Real stationLongitude = MainCore::instance()->getSettings().getLongitude(); + Real stationAltitude = MainCore::instance()->getSettings().getAltitude(); + + if ( (stationLatitude != m_azEl.getLocationSpherical().m_latitude) + || (stationLongitude != m_azEl.getLocationSpherical().m_longitude) + || (stationAltitude != m_azEl.getLocationSpherical().m_altitude)) + { + m_azEl.setLocation(stationLatitude, stationLongitude, stationAltitude); + + // Update distances and what is visible + updateVORs(); + + // Update icon position on Map + QQuickItem *item = ui->map->rootObject(); + QObject *map = item->findChild("map"); + if (map != nullptr) + { + QObject *stationObject = map->findChild("station"); + if(stationObject != NULL) + { + QGeoCoordinate coords = stationObject->property("coordinate").value(); + coords.setLatitude(stationLatitude); + coords.setLongitude(stationLongitude); + coords.setAltitude(stationAltitude); + stationObject->setProperty("coordinate", QVariant::fromValue(coords)); + } + } + } + } + if (pref == Preferences::StationName) + { + // Update icon label on Map + QQuickItem *item = ui->map->rootObject(); + QObject *map = item->findChild("map"); + if (map != nullptr) + { + QObject *stationObject = map->findChild("station"); + if(stationObject != NULL) { + stationObject->setProperty("stationName", QVariant::fromValue(MainCore::instance()->getSettings().getStationName())); + } + } + } +} + void VORLocalizerGUI::makeUIConnections() { QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &VORLocalizerGUI::on_startStop_toggled); diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.h b/plugins/feature/vorlocalizer/vorlocalizergui.h index 51639ad92..a6169e53b 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.h +++ b/plugins/feature/vorlocalizer/vorlocalizergui.h @@ -287,6 +287,7 @@ private slots: void downloadingURL(const QString& url); void downloadError(const QString& error); void downloadNavAidsFinished(); + void preferenceChanged(int elementType); }; #endif // INCLUDE_VORLOCALIZERGUI_H From ebca05a8a12665be514cb10416dab64842b47018 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Tue, 3 May 2022 14:53:56 +0100 Subject: [PATCH 03/12] localizer GUI updates. Add QSplitter to allow area for table & map to be adjusted. Remove obsolete OurAirports button. Add workaround for QT Map redraw bug. Automatically update VOR channels when channels are added or removed. Remove Nav Id from table as it doesn't mean anything from a user's perspective. --- plugins/feature/vorlocalizer/readme.md | 5 - .../feature/vorlocalizer/vorlocalizergui.cpp | 68 +++- .../feature/vorlocalizer/vorlocalizergui.h | 7 +- .../feature/vorlocalizer/vorlocalizergui.ui | 365 +++++++----------- .../vorlocalizer/vorlocalizersettings.h | 19 +- 5 files changed, 223 insertions(+), 241 deletions(-) diff --git a/plugins/feature/vorlocalizer/readme.md b/plugins/feature/vorlocalizer/readme.md index 057424524..d26641daa 100644 --- a/plugins/feature/vorlocalizer/readme.md +++ b/plugins/feature/vorlocalizer/readme.md @@ -55,10 +55,6 @@ Channels may be used in round robin turns if their number is not enough to cover When there is more than one turn for a device valid radial directions are averaged and the resulting average is used during the round robin loop. Averaging also takes place for reference and variable signal levels. -

9: Refresh VOR demodulators list and allocation

- -Use this button to (re)scan the available VOR demodulators in the SDRangel instance and (re)run the round robin allocation. -

B: VOR Table

The VOR table displays information about selected VORs. To select or deselect a VOR, double click it on the map. The information displayed includes: @@ -67,7 +63,6 @@ The VOR table displays information about selected VORs. To select or deselect a * Name - The name of the VOR. For example: 'LONDON'. * Freq (MHz) - The center frequency the VOR transmits on in MHz. The frequency is highlighted in green when the VOR is serviced by a demodulator. -* Nav Id - This is the VOR unique identifier from the VOR database. * Ident - A 2 or 3 character identifier for the VOR. For example: 'LON'. * Morse - The Morse code identifier for the VOR. For example: '.-.. --- -.' * RX Ident - This contains the demodulated ident. If it matches the expected ident, it will be displayed in green, if not, it will be displayed in red. If an ident is received that is not 2 or 3 characters, it will not be displayed, but the last received ident will be displayed in yellow. diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.cpp b/plugins/feature/vorlocalizer/vorlocalizergui.cpp index 7ea8815b9..fb8d1356a 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.cpp +++ b/plugins/feature/vorlocalizer/vorlocalizergui.cpp @@ -137,7 +137,6 @@ VORGUI::VORGUI(NavAid *navAid, VORLocalizerGUI *gui) : // These are deleted by QTableWidget m_nameItem = new QTableWidgetItem(); m_frequencyItem = new QTableWidgetItem(); - m_navIdItem = new QTableWidgetItem(); m_radialItem = new QTableWidgetItem(); m_identItem = new QTableWidgetItem(); m_morseItem = new QTableWidgetItem(); @@ -358,7 +357,6 @@ void VORLocalizerGUI::resizeTable() ui->vorData->setRowCount(row + 1); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_NAME, new QTableWidgetItem("White Sulphur Springs")); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_FREQUENCY, new QTableWidgetItem("Freq (MHz) ")); - ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_NAVID, new QTableWidgetItem("99999999")); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_IDENT, new QTableWidgetItem("Ident ")); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_MORSE, new QTableWidgetItem(Morse::toSpacedUnicode(morse))); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_RADIAL, new QTableWidgetItem("Radial (o) ")); @@ -432,8 +430,6 @@ void VORLocalizerGUI::selectVOR(VORGUI *vorGUI, bool selected) ui->vorData->setRowCount(row + 1); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_NAME, vorGUI->m_nameItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_FREQUENCY, vorGUI->m_frequencyItem); - ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_NAVID, vorGUI->m_navIdItem); - ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_IDENT, vorGUI->m_identItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_MORSE, vorGUI->m_morseItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_RADIAL, vorGUI->m_radialItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_RX_IDENT, vorGUI->m_rxIdentItem); @@ -562,7 +558,6 @@ bool VORLocalizerGUI::handleMessage(const Message& message) bool validRadial = report.getValidRadial(); vorGUI->m_radialItem->setData(Qt::DisplayRole, std::round(report.getRadial())); - vorGUI->m_navIdItem->setData(Qt::DisplayRole, subChannelId); if (validRadial) { vorGUI->m_radialItem->setForeground(QBrush(Qt::white)); @@ -780,7 +775,7 @@ void VORLocalizerGUI::on_centerShift_valueChanged(int value) applySettings(); } -void VORLocalizerGUI::on_channelsRefresh_clicked() +void VORLocalizerGUI::channelsRefresh() { if (m_doApplySettings) { @@ -915,7 +910,6 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe // Read in VOR information if it exists readNavAids(); - ui->getOurAirportsVORDB->setVisible(false); // Resize the table using dummy data resizeTable(); @@ -950,11 +944,24 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe displaySettings(); applySettings(true); + + connect(&m_redrawMapTimer, &QTimer::timeout, this, &VORLocalizerGUI::redrawMap); + m_redrawMapTimer.setSingleShot(true); + ui->map->installEventFilter(this); + makeUIConnections(); + + // Update channel list when added/removed + connect(MainCore::instance(), &MainCore::channelAdded, this, &VORLocalizerGUI::channelsRefresh); + connect(MainCore::instance(), &MainCore::channelRemoved, this, &VORLocalizerGUI::channelsRefresh); + // List already opened channels + channelsRefresh(); } VORLocalizerGUI::~VORLocalizerGUI() { + disconnect(&m_redrawMapTimer, &QTimer::timeout, this, &VORLocalizerGUI::redrawMap); + m_redrawMapTimer.stop(); delete ui; qDeleteAll(m_vors); } @@ -1117,6 +1124,52 @@ void VORLocalizerGUI::preferenceChanged(int elementType) } } +void VORLocalizerGUI::redrawMap() +{ + // An awful workaround for https://bugreports.qt.io/browse/QTBUG-100333 + // Also used in ADS-B demod + QQuickItem *item = ui->map->rootObject(); + if (item) + { + QObject *object = item->findChild("map"); + if (object) + { + double zoom = object->property("zoomLevel").value(); + object->setProperty("zoomLevel", QVariant::fromValue(zoom+1)); + object->setProperty("zoomLevel", QVariant::fromValue(zoom)); + } + } +} + +void VORLocalizerGUI::showEvent(QShowEvent *event) +{ + if (!event->spontaneous()) + { + // Workaround for https://bugreports.qt.io/browse/QTBUG-100333 + // MapQuickItems can be in wrong position when window is first displayed + m_redrawMapTimer.start(500); + } +} + +bool VORLocalizerGUI::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == ui->map) + { + if (event->type() == QEvent::Resize) + { + // Workaround for https://bugreports.qt.io/browse/QTBUG-100333 + // MapQuickItems can be in wrong position after vertical resize + QResizeEvent *resizeEvent = static_cast(event); + QSize oldSize = resizeEvent->oldSize(); + QSize size = resizeEvent->size(); + if (oldSize.height() != size.height()) { + redrawMap(); + } + } + } + return false; +} + void VORLocalizerGUI::makeUIConnections() { QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &VORLocalizerGUI::on_startStop_toggled); @@ -1124,5 +1177,4 @@ void VORLocalizerGUI::makeUIConnections() QObject::connect(ui->magDecAdjust, &ButtonSwitch::toggled, this, &VORLocalizerGUI::on_magDecAdjust_toggled); QObject::connect(ui->rrTime, &QDial::valueChanged, this, &VORLocalizerGUI::on_rrTime_valueChanged); QObject::connect(ui->centerShift, &QDial::valueChanged, this, &VORLocalizerGUI::on_centerShift_valueChanged); - QObject::connect(ui->channelsRefresh, &QPushButton::clicked, this, &VORLocalizerGUI::on_channelsRefresh_clicked); } diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.h b/plugins/feature/vorlocalizer/vorlocalizergui.h index a6169e53b..20c953f31 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.h +++ b/plugins/feature/vorlocalizer/vorlocalizergui.h @@ -64,7 +64,6 @@ public: QTableWidgetItem *m_nameItem; QTableWidgetItem *m_frequencyItem; - QTableWidgetItem *m_navIdItem; QTableWidgetItem *m_identItem; QTableWidgetItem *m_morseItem; QTableWidgetItem *m_radialItem; @@ -249,6 +248,7 @@ private: QTimer m_statusTimer; int m_lastFeatureState; int m_rrSecondsCount; + QTimer m_redrawMapTimer; explicit VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent = nullptr); virtual ~VORLocalizerGUI(); @@ -257,6 +257,7 @@ private: void applySettings(bool force = false); void displaySettings(); bool handleMessage(const Message& message); + void redrawMap(); void makeUIConnections(); void resizeTable(); @@ -274,7 +275,7 @@ private slots: void on_magDecAdjust_toggled(bool checked); void on_rrTime_valueChanged(int value); void on_centerShift_valueChanged(int value); - void on_channelsRefresh_clicked(); + void channelsRefresh(); void vorData_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); void vorData_sectionResized(int logicalIndex, int oldSize, int newSize); void columnSelectMenu(QPoint pos); @@ -288,6 +289,8 @@ private slots: void downloadError(const QString& error); void downloadNavAidsFinished(); void preferenceChanged(int elementType); + virtual void showEvent(QShowEvent *event); + virtual bool eventFilter(QObject *obj, QEvent *event); }; #endif // INCLUDE_VORLOCALIZERGUI_H diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.ui b/plugins/feature/vorlocalizer/vorlocalizergui.ui index 4efe999be..62180fc6b 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.ui +++ b/plugins/feature/vorlocalizer/vorlocalizergui.ui @@ -6,7 +6,7 @@ 0 0 - 462 + 470 850 @@ -40,7 +40,7 @@ 0 0 461 - 61 + 31 @@ -85,23 +85,6 @@ - - - - true - - - Download OurAirports VOR database - - - - - - - :/demodvor/icons/vor.png:/demodvor/icons/vor.png - - - @@ -136,6 +119,13 @@ + + + + Qt::Vertical + + + @@ -223,6 +213,13 @@ QToolTip{background-color: white; color: black;} + + + + Qt::Vertical + + + @@ -275,22 +272,12 @@ QToolTip{background-color: white; color: black;} - + - Qt::Horizontal + Qt::Vertical - - - 40 - 20 - - - + - - - - @@ -306,27 +293,7 @@ QToolTip{background-color: white; color: black;} - - - - 24 - 16777215 - - - - Refresh VOR channels available - - - - - - - :/recycle.png:/recycle.png - - - - - + Qt::Horizontal @@ -345,14 +312,14 @@ QToolTip{background-color: white; color: black;} - 0 - 110 - 461 - 145 + 10 + 50 + 441 + 710 - + 0 0 @@ -366,178 +333,146 @@ QToolTip{background-color: white; color: black;} VORs - - - 2 - + - 3 + 0 - 3 + 0 - 3 + 0 - 3 + 0 - - - QAbstractItemView::NoEditTriggers - - - - Name - - - Name of the VOR - - - - - Freq (MHz) - - - Frequency of the VOR in MHz - - - - - Nav Id - - - Offset of the VOR's frequency from the current center frequency. Red indicates out of range. - - - - - Ident - - - Ident for the VOR - - - - - Morse - - - Morse code ident for the VOR - - - - - RX Ident - - - Received ident - - - - - RX Morse - - - Received Morse code ident - - - - - Radial (°) - - - Calculated radial from the VOR - - - - - Ref (dB) - - - Magnitude of received reference signal in dB - - - - - Var (dB) - - - Magnitude of received variable signal in dB - - - - - Mute - - - Mute/unmute audio from selected VORs - - - - - - - - - - 0 - 258 - 461 - 581 - - - - - 0 - 0 - - - - Map - - - - 2 - - - 3 - - - 3 - - - 3 - - - 3 - - - + 0 0 - - - 100 - 500 - - - - VOR map - - - QQuickWidget::SizeRootObjectToView - - - - - + + Qt::Vertical + + + + 0 + 1 + + + + QAbstractItemView::NoEditTriggers + + + + Name + + + Name of the VOR + + + + + Freq (MHz) + + + Frequency of the VOR in MHz + + + + + Ident + + + Ident for the VOR + + + + + Morse + + + Morse code ident for the VOR + + + + + RX Ident + + + Received ident + + + + + RX Morse + + + Received Morse code ident + + + + + Radial (°) + + + Calculated radial from the VOR + + + + + Ref (dB) + + + Magnitude of received reference signal in dB + + + + + Var (dB) + + + Magnitude of received variable signal in dB + + + + + Mute + + + Mute/unmute audio from selected VORs + + + + + + + 0 + 4 + + + + + 100 + 500 + + + + VOR map + + + QQuickWidget::SizeRootObjectToView + + + + + + + @@ -562,9 +497,7 @@ QToolTip{background-color: white; color: black;} - getOurAirportsVORDB vorData - map diff --git a/plugins/feature/vorlocalizer/vorlocalizersettings.h b/plugins/feature/vorlocalizer/vorlocalizersettings.h index c34a0f790..0c50e3beb 100644 --- a/plugins/feature/vorlocalizer/vorlocalizersettings.h +++ b/plugins/feature/vorlocalizer/vorlocalizersettings.h @@ -77,18 +77,17 @@ struct VORLocalizerSettings int m_workspaceIndex; QByteArray m_geometryBytes; - static const int VORDEMOD_COLUMNS = 11; + static const int VORDEMOD_COLUMNS = 10; static const int VOR_COL_NAME = 0; static const int VOR_COL_FREQUENCY = 1; - static const int VOR_COL_NAVID = 2; - static const int VOR_COL_IDENT = 3; - static const int VOR_COL_MORSE = 4; - static const int VOR_COL_RX_IDENT = 5; - static const int VOR_COL_RX_MORSE = 6; - static const int VOR_COL_RADIAL = 7; - static const int VOR_COL_REF_MAG = 8; - static const int VOR_COL_VAR_MAG = 9; - static const int VOR_COL_MUTE = 10; + static const int VOR_COL_IDENT = 2; + static const int VOR_COL_MORSE = 3; + static const int VOR_COL_RX_IDENT = 4; + static const int VOR_COL_RX_MORSE = 5; + static const int VOR_COL_RADIAL = 6; + static const int VOR_COL_REF_MAG = 7; + static const int VOR_COL_VAR_MAG = 8; + static const int VOR_COL_MUTE = 9; int m_columnIndexes[VORDEMOD_COLUMNS];//!< How the columns are ordered in the table int m_columnSizes[VORDEMOD_COLUMNS]; //!< Size of the coumns in the table From 6a6ccbeecd9adc28b35fff8ac6cf3a7c4145ad0b Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 08:20:51 +0100 Subject: [PATCH 04/12] VOR Localizer: Fix tooltop --- plugins/feature/vorlocalizer/vorlocalizergui.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.ui b/plugins/feature/vorlocalizer/vorlocalizergui.ui index 62180fc6b..95611c090 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.ui +++ b/plugins/feature/vorlocalizer/vorlocalizergui.ui @@ -170,7 +170,7 @@ - Sound volume (%) + Round robin turn time (s) 20s From 2f1fe7ecb3573584d08ee29129f1fa15f4c8112a Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 08:21:50 +0100 Subject: [PATCH 05/12] VOR Localizer: Update channels when device updated or when feature started, as device b/w or whether fixed center freq may have changed --- plugins/feature/vorlocalizer/vorlocalizergui.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.cpp b/plugins/feature/vorlocalizer/vorlocalizergui.cpp index fb8d1356a..dfb398814 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.cpp +++ b/plugins/feature/vorlocalizer/vorlocalizergui.cpp @@ -698,6 +698,12 @@ void VORLocalizerGUI::on_startStop_toggled(bool checked) { VORLocalizer::MsgStartStop *message = VORLocalizer::MsgStartStop::create(checked); m_vorLocalizer->getInputMessageQueue()->push(message); + + if (checked) + { + // Refresh channels in case device b/w has changed + channelsRefresh(); + } } } @@ -954,6 +960,8 @@ VORLocalizerGUI::VORLocalizerGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISe // Update channel list when added/removed connect(MainCore::instance(), &MainCore::channelAdded, this, &VORLocalizerGUI::channelsRefresh); connect(MainCore::instance(), &MainCore::channelRemoved, this, &VORLocalizerGUI::channelsRefresh); + // Also replan when device changed (as bandwidth may change or may becomed fixed center freq) + connect(MainCore::instance(), &MainCore::deviceChanged, this, &VORLocalizerGUI::channelsRefresh); // List already opened channels channelsRefresh(); } From cfa50510e8fbafda5599bbc51eaaad8a8b638423 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 08:27:25 +0100 Subject: [PATCH 06/12] VOR Localizer: Add support for devices such as File Input for which the center frequency can't be changed. Use device b/w instead of channel b/w, as the latter may be decimated. --- .../vorlocalizer/vorlocalizerworker.cpp | 153 +++++++++--------- .../feature/vorlocalizer/vorlocalizerworker.h | 6 +- 2 files changed, 85 insertions(+), 74 deletions(-) diff --git a/plugins/feature/vorlocalizer/vorlocalizerworker.cpp b/plugins/feature/vorlocalizer/vorlocalizerworker.cpp index 5b64def9a..0dc5f5621 100644 --- a/plugins/feature/vorlocalizer/vorlocalizerworker.cpp +++ b/plugins/feature/vorlocalizer/vorlocalizerworker.cpp @@ -24,7 +24,11 @@ #include "SWGErrorResponse.h" #include "device/deviceset.h" +#include "device/deviceapi.h" +#include "dsp/devicesamplesource.h" +#include "dsp/devicesamplesink.h" #include "channel/channelapi.h" +#include "channel/channelwebapiutils.h" #include "webapi/webapiadapterinterface.h" #include "webapi/webapiutils.h" #include "maincore.h" @@ -78,6 +82,7 @@ void VorLocalizerWorker::started() m_rrTimer.start(m_settings.m_rrTime * 1000); disconnect(thread(), SIGNAL(started()), this, SLOT(started())); } + void VorLocalizerWorker::stopWork() { QMutexLocker mutexLocker(&m_mutex); @@ -205,6 +210,53 @@ void VorLocalizerWorker::updateHardware() m_mutex.unlock(); } +quint64 VorLocalizerWorker::getDeviceCenterFrequency(int deviceIndex) +{ + std::vector deviceSets = MainCore::instance()->getDeviceSets(); + if (deviceIndex < deviceSets.size()) + { + DeviceSet *deviceSet = deviceSets[deviceIndex]; + if (deviceSet->m_deviceSourceEngine) + { + DeviceSampleSource *source = deviceSet->m_deviceAPI->getSampleSource(); + return source->getCenterFrequency(); + } + else if (deviceSet->m_deviceSinkEngine) + { + DeviceSampleSink *sink = deviceSet->m_deviceAPI->getSampleSink(); + return sink->getCenterFrequency(); + } + } + return 0; +} + +int VorLocalizerWorker::getDeviceSampleRate(int deviceIndex) +{ + std::vector deviceSets = MainCore::instance()->getDeviceSets(); + if (deviceIndex < deviceSets.size()) + { + DeviceSet *deviceSet = deviceSets[deviceIndex]; + if (deviceSet->m_deviceSourceEngine) + { + DeviceSampleSource *source = deviceSet->m_deviceAPI->getSampleSource(); + return source->getSampleRate(); + } + else if (deviceSet->m_deviceSinkEngine) + { + DeviceSampleSink *sink = deviceSet->m_deviceAPI->getSampleSink(); + return sink->getSampleRate(); + } + } + return 0; +} + +// Does this device have a center frequency setting (FileInput doesn't) +bool VorLocalizerWorker::hasCenterFrequencySetting(int deviceIndex) +{ + double deviceFrequency; + return !ChannelWebAPIUtils::getCenterFrequency(deviceIndex, deviceFrequency); +} + void VorLocalizerWorker::removeVORChannel(int navId) { qDebug("VorLocalizerWorker::removeVORChannel: %d", navId); @@ -294,7 +346,12 @@ void VorLocalizerWorker::updateChannels() RRTurnPlan turnPlan(deviceChannel); int fMin = vorList.front().m_frequency; int fMax = vorList.back().m_frequency; - int devFreq = (fMin + fMax) / 2; + int devFreq; + if (turnPlan.m_fixedCenterFrequency) { + devFreq = getDeviceCenterFrequency(turnPlan.m_device.m_deviceIndex); + } else { + devFreq = (fMin + fMax) / 2; + } turnPlan.m_device.m_frequency = devFreq; int iCh = 0; @@ -321,7 +378,6 @@ void VorLocalizerWorker::updateChannels() ++it; } } - iCh++; } @@ -359,7 +415,12 @@ void VorLocalizerWorker::updateChannels() RRTurnPlan turnPlan(deviceChannel); int fMin = vorList.front().m_frequency; int fMax = vorList.back().m_frequency; - int devFreq = (fMin + fMax) / 2; + int devFreq; + if (turnPlan.m_fixedCenterFrequency) { + devFreq = getDeviceCenterFrequency(turnPlan.m_device.m_deviceIndex); + } else { + devFreq = (fMin + fMax) / 2; + } turnPlan.m_device.m_frequency = devFreq; int iCh = 0; @@ -406,69 +467,6 @@ void VorLocalizerWorker::updateChannels() rrNextTurn(); } -void VorLocalizerWorker::allocateChannel(ChannelAPI *channel, int vorFrequency, int vorNavId, int channelShift) -{ - VORLocalizerSettings::AvailableChannel& availableChannel = m_availableChannels->operator[](channel); - qDebug() << "VorLocalizerWorker::allocateChannel:" - << " vorNavId:" << vorNavId - << " vorFrequency:" << vorFrequency - << " channelShift:" << channelShift - << " deviceIndex:" << availableChannel.m_deviceSetIndex - << " channelIndex:" << availableChannel.m_channelIndex; - double deviceFrequency = vorFrequency - channelShift; - setDeviceFrequency(availableChannel.m_deviceSetIndex, deviceFrequency); - setChannelShift(availableChannel.m_deviceSetIndex, availableChannel.m_channelIndex, channelShift, vorNavId); - availableChannel.m_navId = vorNavId; -} - -void VorLocalizerWorker::setDeviceFrequency(int deviceIndex, double targetFrequency) -{ - SWGSDRangel::SWGDeviceSettings deviceSettingsResponse; - SWGSDRangel::SWGErrorResponse errorResponse; - int httpRC; - - // Get current device center frequency - httpRC = m_webAPIAdapterInterface->devicesetDeviceSettingsGet( - deviceIndex, - deviceSettingsResponse, - errorResponse - ); - - if (httpRC/100 != 2) - { - qWarning("VorLocalizerWorker::setDeviceFrequency: get device frequency error %d: %s", - httpRC, qPrintable(*errorResponse.getMessage())); - } - - QJsonObject *jsonObj = deviceSettingsResponse.asJsonObject(); - - // Update centerFrequency - WebAPIUtils::setSubObjectDouble(*jsonObj, "centerFrequency", targetFrequency); - QStringList deviceSettingsKeys; - deviceSettingsKeys.append("centerFrequency"); - deviceSettingsResponse.init(); - deviceSettingsResponse.fromJsonObject(*jsonObj); - SWGSDRangel::SWGErrorResponse errorResponse2; - - httpRC = m_webAPIAdapterInterface->devicesetDeviceSettingsPutPatch( - deviceIndex, - false, // PATCH - deviceSettingsKeys, - deviceSettingsResponse, - errorResponse2 - ); - - if (httpRC/100 == 2) - { - qDebug("VorLocalizerWorker::setDeviceFrequency: set device frequency %f OK", targetFrequency); - } - else - { - qWarning("VorLocalizerWorker::setDeviceFrequency: set device frequency error %d: %s", - httpRC, qPrintable(*errorResponse2.getMessage())); - } -} - void VorLocalizerWorker::setChannelShift(int deviceIndex, int channelIndex, double targetOffset, int vorNavId) { SWGSDRangel::SWGChannelSettings channelSettingsResponse; @@ -674,14 +672,16 @@ void VorLocalizerWorker::getChannelsByDevice( for (; itr != availableChannels->end(); ++itr) { devicesChannelsMap[itr->m_deviceSetIndex].m_device.m_deviceIndex = itr->m_deviceSetIndex; - devicesChannelsMap[itr->m_deviceSetIndex].m_bandwidth = itr->m_basebandSampleRate; + devicesChannelsMap[itr->m_deviceSetIndex].m_bandwidth = getDeviceSampleRate(itr->m_deviceSetIndex); // Get b/w of device, not channel, as the latter may be decimated devicesChannelsMap[itr->m_deviceSetIndex].m_channels.push_back(RRChannel{itr->m_channelAPI, itr->m_channelIndex, 0, -1}); } - QMap::const_iterator itm = devicesChannelsMap.begin(); + QMap::iterator itm = devicesChannelsMap.begin(); devicesChannels.clear(); - for (; itm != devicesChannelsMap.end(); ++itm) { + for (; itm != devicesChannelsMap.end(); ++itm) + { + itm->m_fixedCenterFrequency = hasCenterFrequencySetting(itm->m_device.m_deviceIndex); devicesChannels.push_back(*itm); } @@ -700,23 +700,32 @@ void VorLocalizerWorker::rrNextTurn() unsigned int turnCount = m_rrTurnCounters[iDevPlan]; int deviceIndex = rrPlan[turnCount].m_device.m_deviceIndex; int deviceFrequency = rrPlan[turnCount].m_device.m_frequency - m_settings.m_centerShift; + qDebug() << "VorLocalizerWorker::rrNextTurn: " << "turn:" << turnCount << "device:" << deviceIndex << "frequency:" << deviceFrequency - m_settings.m_centerShift; - setDeviceFrequency(deviceIndex, deviceFrequency); + + if (!rrPlan[turnCount].m_fixedCenterFrequency) { + ChannelWebAPIUtils::setCenterFrequency(deviceIndex, deviceFrequency); + } for (auto channel : rrPlan[turnCount].m_channels) { + int shift = channel.m_frequencyShift; + if (!rrPlan[turnCount].m_fixedCenterFrequency) { + shift += m_settings.m_centerShift; + } + qDebug() << "VorLocalizerWorker::rrNextTurn: " << "device:" << deviceIndex << "channel:" << channel.m_channelIndex - << "shift:" << channel.m_frequencyShift + m_settings.m_centerShift + << "shift:" << shift << "navId:" << channel.m_navId; setChannelShift( deviceIndex, channel.m_channelIndex, - channel.m_frequencyShift + m_settings.m_centerShift, + shift, channel.m_navId ); m_channelAllocations[channel.m_navId] = ChannelAllocation{ diff --git a/plugins/feature/vorlocalizer/vorlocalizerworker.h b/plugins/feature/vorlocalizer/vorlocalizerworker.h index c6d3c724a..daf693c44 100644 --- a/plugins/feature/vorlocalizer/vorlocalizerworker.h +++ b/plugins/feature/vorlocalizer/vorlocalizerworker.h @@ -121,6 +121,7 @@ private: RRDevice m_device; int m_bandwidth; std::vector m_channels; + bool m_fixedCenterFrequency; // Devices such as FileInput that can't have center freq changed RRTurnPlan() = default; RRTurnPlan(const RRTurnPlan&) = default; @@ -157,10 +158,11 @@ private: void removeVORChannel(int navId); void addVORChannel(const VORLocalizerSubChannelSettings& subChannelSettings); void updateChannels(); //!< (re)allocate channels to service VORs - void allocateChannel(ChannelAPI *channel, int vorFrequency, int vorNavId, int channelShift); - void setDeviceFrequency(int deviceIndex, double targetFrequency); void setChannelShift(int deviceIndex, int channelIndex, double targetOffset, int vorNavId); void setAudioMute(int vorNavId, bool audioMute); + static quint64 getDeviceCenterFrequency(int deviceIndex); + static int getDeviceSampleRate(int deviceIndex); + static bool hasCenterFrequencySetting(int deviceIndex); static void generateIndexCombinations(int length, int subLength, std::vector>& indexCombinations); static void getVORRanges(const QList& vors, int subLength, std::vector& vorRanges); static void filterVORRanges(std::vector& vorRanges, int thresholdBW); From 59f1f6099825490e49ad40efec711f85be079cdf Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 08:30:40 +0100 Subject: [PATCH 07/12] VOR Localizer: Fix link to demod plugin --- plugins/feature/vorlocalizer/readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/feature/vorlocalizer/readme.md b/plugins/feature/vorlocalizer/readme.md index d26641daa..2f4050fb9 100644 --- a/plugins/feature/vorlocalizer/readme.md +++ b/plugins/feature/vorlocalizer/readme.md @@ -2,7 +2,7 @@

Introduction

-This plugin can control and receive information from single channel VOR demodulators (see [VOR single channel demodulator](../../channelrx/demodvorsc/readme.md) for details) and collate information from multiple VOR demodulators in order to show your position on a map. +This plugin can control and receive information from VOR demodulators (see [VOR demodulator](../../channelrx/demodvor/readme.md) for details) and collate information from multiple VOR demodulators in order to show your position on a map.

Interface

@@ -19,7 +19,7 @@ There are 3 sections in this interface:

1: Start/Stop plugin

-This button starts or stops the plugin +This button starts or stops the plugin.

2: Download VOR Database

@@ -35,7 +35,7 @@ Available VOR demodulator channels are allocated to service the selected VORs on

5: Round robin turn time progress

-Shows the round robin turn time progress +Shows the round robin turn time progress.

6: Force averaging over round robin turn time

From 52564bee36943f2127e8479b0db31719e7eaf8b0 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 08:39:10 +0100 Subject: [PATCH 08/12] VOR Localizer: Change GUI label from Sh to delta cf --- plugins/feature/vorlocalizer/vorlocalizergui.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.ui b/plugins/feature/vorlocalizer/vorlocalizergui.ui index 95611c090..1653842f4 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.ui +++ b/plugins/feature/vorlocalizer/vorlocalizergui.ui @@ -223,7 +223,7 @@ QToolTip{background-color: white; color: black;} - Sh + Δcf From 099e111d53a3bb2d466cd6ade627ea34aa5b429f Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 09:08:31 +0100 Subject: [PATCH 09/12] VOR Localizer: Add Ident column data to table --- plugins/feature/vorlocalizer/vorlocalizergui.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/feature/vorlocalizer/vorlocalizergui.cpp b/plugins/feature/vorlocalizer/vorlocalizergui.cpp index dfb398814..79a2895e0 100644 --- a/plugins/feature/vorlocalizer/vorlocalizergui.cpp +++ b/plugins/feature/vorlocalizer/vorlocalizergui.cpp @@ -430,6 +430,7 @@ void VORLocalizerGUI::selectVOR(VORGUI *vorGUI, bool selected) ui->vorData->setRowCount(row + 1); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_NAME, vorGUI->m_nameItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_FREQUENCY, vorGUI->m_frequencyItem); + ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_IDENT, vorGUI->m_identItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_MORSE, vorGUI->m_morseItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_RADIAL, vorGUI->m_radialItem); ui->vorData->setItem(row, VORLocalizerSettings::VOR_COL_RX_IDENT, vorGUI->m_rxIdentItem); From 2fafb2afe744529ed70df1514a2c0d6595bad166 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 09:08:46 +0100 Subject: [PATCH 10/12] VOR Localizer: Update doc images --- doc/img/VORLocalizer_plugin.png | Bin 47300 -> 27788 bytes doc/img/VORLocalizer_plugin.xcf | Bin 140185 -> 98125 bytes doc/img/VORLocalizer_settings.png | Bin 12613 -> 10290 bytes doc/img/VORLocalizer_settings.xcf | Bin 44049 -> 40263 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/img/VORLocalizer_plugin.png b/doc/img/VORLocalizer_plugin.png index 319c42aab191c837d128b146f5815c13d39230f6..e80750b7dda235c0c4f8d7e5a4168608092aa2a1 100644 GIT binary patch literal 27788 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 diff --git a/doc/img/VORLocalizer_plugin.xcf b/doc/img/VORLocalizer_plugin.xcf index 930e0cdc90abc0d3c0d2d028d91bbdc5799e90ac..a0927b554299980b47ad8fae0bec45467a7e3683 100644 GIT binary patch literal 98125 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 Rfp&U`jD+I*GBJa|{{!7DwPpYS diff --git a/doc/img/VORLocalizer_settings.xcf b/doc/img/VORLocalizer_settings.xcf index b62d8525def4bcf22a1572f923d7ec8714b10703..ce1bd733f507176ab46530730a021b17ee64149f 100644 GIT binary patch literal 40263 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 OijwI#IHlA}ivAzE#MSfw From 7d2fc09a65d3e50577e1c17216bdcce1541afa31 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 09:51:28 +0100 Subject: [PATCH 11/12] VOR Demod: Reset state when navId changes, so we don't report old ident for new navId --- plugins/channelrx/demodvor/vordemod.cpp | 7 ++++++- plugins/channelrx/demodvor/vordemodsink.cpp | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/plugins/channelrx/demodvor/vordemod.cpp b/plugins/channelrx/demodvor/vordemod.cpp index 6ada23dbc..ed3d12f94 100644 --- a/plugins/channelrx/demodvor/vordemod.cpp +++ b/plugins/channelrx/demodvor/vordemod.cpp @@ -257,6 +257,12 @@ void VORDemod::applySettings(const VORDemodSettings& settings, bool force) } if ((m_settings.m_navId != settings.m_navId) || force) { reverseAPIKeys.append("navId"); + + // Reset state so we don't report old data for new NavId + m_radial = 0.0f; + m_refMag = 0.0f; + m_varMag = 0.0f; + m_morseIdent = ""; } if ((m_settings.m_squelch != settings.m_squelch) || force) { reverseAPIKeys.append("squelch"); @@ -509,7 +515,6 @@ void VORDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response double magsqAvg, magsqPeak; int nbMagsqSamples; getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples); - response.getVorDemodReport()->setChannelPowerDb(CalcDb::dbPower(magsqAvg)); response.getVorDemodReport()->setSquelch(m_basebandSink->getSquelchOpen() ? 1 : 0); response.getVorDemodReport()->setAudioSampleRate(m_basebandSink->getAudioSampleRate()); diff --git a/plugins/channelrx/demodvor/vordemodsink.cpp b/plugins/channelrx/demodvor/vordemodsink.cpp index 2fc56080b..89567f524 100644 --- a/plugins/channelrx/demodvor/vordemodsink.cpp +++ b/plugins/channelrx/demodvor/vordemodsink.cpp @@ -401,6 +401,19 @@ void VORDemodSCSink::applySettings(const VORDemodSettings& settings, bool force) m_squelchLevel = CalcDb::powerFromdB(settings.m_squelch); } + if (m_settings.m_navId != settings.m_navId) + { + // Reset state when navId changes, so we don't report old ident for new navId + m_binSampleCnt = 0; + m_binCnt = 0; + m_identNoise = 0.0001f; + for (int i = 0; i < m_identBins; i++) + { + m_identMaxs[i] = 0.0f; + } + m_ident = ""; + } + m_settings = settings; } From 600699a1a8d07e0f6ef3b3f1d5b6023e5ac7cca0 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Wed, 4 May 2022 10:05:03 +0100 Subject: [PATCH 12/12] VOR Demodulator: Reset filters when navId changes, to avoid glitches in calculated radial --- plugins/channelrx/demodvor/vordemod.cpp | 4 ++-- plugins/channelrx/demodvor/vordemodsink.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/channelrx/demodvor/vordemod.cpp b/plugins/channelrx/demodvor/vordemod.cpp index ed3d12f94..2397ac790 100644 --- a/plugins/channelrx/demodvor/vordemod.cpp +++ b/plugins/channelrx/demodvor/vordemod.cpp @@ -260,8 +260,8 @@ void VORDemod::applySettings(const VORDemodSettings& settings, bool force) // Reset state so we don't report old data for new NavId m_radial = 0.0f; - m_refMag = 0.0f; - m_varMag = 0.0f; + m_refMag = -200.0f; + m_varMag = -200.0f; m_morseIdent = ""; } if ((m_settings.m_squelch != settings.m_squelch) || force) { diff --git a/plugins/channelrx/demodvor/vordemodsink.cpp b/plugins/channelrx/demodvor/vordemodsink.cpp index 89567f524..5c05b51a8 100644 --- a/plugins/channelrx/demodvor/vordemodsink.cpp +++ b/plugins/channelrx/demodvor/vordemodsink.cpp @@ -412,6 +412,8 @@ void VORDemodSCSink::applySettings(const VORDemodSettings& settings, bool force) m_identMaxs[i] = 0.0f; } m_ident = ""; + m_refGoertzel.reset(); + m_varGoertzel.reset(); } m_settings = settings;