From f5276e8c3ed5763dc8b1a363e1e6835ca956231a Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 7 Nov 2021 19:38:46 +0100 Subject: [PATCH] ADSB demod: added auto target checkbox for matching aircraft in notifications table. API: more settings and report data --- CHANGELOG | 2 +- debian/changelog | 2 +- plugins/channelrx/demodadsb/adsbdemod.cpp | 58 ++++++++- plugins/channelrx/demodadsb/adsbdemod.h | 4 +- plugins/channelrx/demodadsb/adsbdemodgui.cpp | 20 ++- plugins/channelrx/demodadsb/adsbdemodgui.h | 6 +- plugins/channelrx/demodadsb/adsbdemodgui.ui | 33 +++-- .../demodadsb/adsbdemodnotificationdialog.cpp | 5 + .../demodadsb/adsbdemodnotificationdialog.h | 3 +- .../demodadsb/adsbdemodnotificationdialog.ui | 5 + .../channelrx/demodadsb/adsbdemodsettings.cpp | 2 + .../channelrx/demodadsb/adsbdemodsettings.h | 1 + plugins/channelrx/demodadsb/readme.md | 6 +- sdrbase/resources/webapi/doc/html2/index.html | 33 ++++- .../webapi/doc/swagger/include/ADSBDemod.yaml | 34 ++++++ .../api/swagger/include/ADSBDemod.yaml | 34 ++++++ swagger/sdrangel/code/html2/index.html | 33 ++++- .../code/qt5/client/SWGADSBDemodReport.cpp | 48 ++++++++ .../code/qt5/client/SWGADSBDemodReport.h | 13 ++ .../code/qt5/client/SWGADSBDemodSettings.cpp | 115 ++++++++++++++++++ .../code/qt5/client/SWGADSBDemodSettings.h | 30 +++++ 21 files changed, 461 insertions(+), 26 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 633d0509b..9c8467a50 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,7 +12,7 @@ sdrangel (6.17.3-1) unstable; urgency=medium * Add Logging to .csv file for some plugins. Issue #1035. PR #1038 * Remote sink: fixed socket deletion. Issue #1034 - -- Edouard Griffiths, F4EXB Sat, 05 Nov 2021 18:05:33 +0100 + -- Edouard Griffiths, F4EXB Sat, 06 Nov 2021 20:15:07 +0100 sdrangel (6.17.2-1) unstable; urgency=medium diff --git a/debian/changelog b/debian/changelog index bee653465..5b97bb0d3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,7 +12,7 @@ sdrangel (6.17.3-1) unstable; urgency=medium * Add Logging to .csv file for some plugins. Issue #1035. PR #1038 * Remote sink: fixed socket deletion. Issue #1034 - -- Edouard Griffiths, F4EXB Sat, 05 Nov 2021 18:05:33 +0100 + -- Edouard Griffiths, F4EXB Sat, 06 Nov 2021 20:15:07 +0100 sdrangel (6.17.2-1) unstable; urgency=medium diff --git a/plugins/channelrx/demodadsb/adsbdemod.cpp b/plugins/channelrx/demodadsb/adsbdemod.cpp index 11166fbe3..72393dff2 100644 --- a/plugins/channelrx/demodadsb/adsbdemod.cpp +++ b/plugins/channelrx/demodadsb/adsbdemod.cpp @@ -185,6 +185,18 @@ void ADSBDemod::applySettings(const ADSBDemodSettings& settings, bool force) if ((settings.m_samplesPerBit != m_settings.m_samplesPerBit) || force) { reverseAPIKeys.append("samplesPerBit"); } + if ((settings.m_correlateFullPreamble != m_settings.m_correlateFullPreamble) || force) { + reverseAPIKeys.append("correlateFullPreamble"); + } + if ((settings.m_demodModeS != m_settings.m_demodModeS) || force) { + reverseAPIKeys.append("demodModeS"); + } + if ((settings.m_interpolatorPhaseSteps != m_settings.m_interpolatorPhaseSteps) || force) { + reverseAPIKeys.append("interpolatorPhaseSteps"); + } + if ((settings.m_interpolatorTapsPerPhase != m_settings.m_interpolatorTapsPerPhase) || force) { + reverseAPIKeys.append("interpolatorTapsPerPhase"); + } if ((settings.m_removeTimeout != m_settings.m_removeTimeout) || force) { reverseAPIKeys.append("removeTimeout"); } @@ -197,6 +209,9 @@ void ADSBDemod::applySettings(const ADSBDemodSettings& settings, bool force) if ((settings.m_feedPort != m_settings.m_feedPort) || force) { reverseAPIKeys.append("beastPort"); } + if ((settings.m_feedFormat != m_settings.m_feedFormat) || force) { + reverseAPIKeys.append("feedFormat"); + } if ((settings.m_logFilename != m_settings.m_logFilename) || force) { reverseAPIKeys.append("logFilename"); } @@ -315,6 +330,18 @@ void ADSBDemod::webapiUpdateChannelSettings( if (channelSettingsKeys.contains("samplesPerBit")) { settings.m_samplesPerBit = response.getAdsbDemodSettings()->getSamplesPerBit(); } + if (channelSettingsKeys.contains("correlateFullPreamble")) { + settings.m_correlateFullPreamble = response.getAdsbDemodSettings()->getCorrelateFullPreamble() != 0; + } + if (channelSettingsKeys.contains("demodModeS")) { + settings.m_demodModeS = response.getAdsbDemodSettings()->getDemodModeS() != 0; + } + if (channelSettingsKeys.contains("interpolatorPhaseSteps")) { + settings.m_interpolatorPhaseSteps = response.getAdsbDemodSettings()->getInterpolatorPhaseSteps(); + } + if (channelSettingsKeys.contains("interpolatorTapsPerPhase")) { + settings.m_interpolatorTapsPerPhase = response.getAdsbDemodSettings()->getInterpolatorTapsPerPhase(); + } if (channelSettingsKeys.contains("removeTimeout")) { settings.m_removeTimeout = response.getAdsbDemodSettings()->getRemoveTimeout(); } @@ -327,6 +354,9 @@ void ADSBDemod::webapiUpdateChannelSettings( if (channelSettingsKeys.contains("beastPort")) { settings.m_feedPort = response.getAdsbDemodSettings()->getBeastPort(); } + if (channelSettingsKeys.contains("feedFormat")) { + settings.m_feedFormat = (ADSBDemodSettings::FeedFormat) response.getAdsbDemodSettings()->getFeedFormat(); + } if (channelSettingsKeys.contains("logFilename")) { settings.m_logFilename = *response.getAdsbDemodSettings()->getLogFilename(); } @@ -376,10 +406,15 @@ void ADSBDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& res response.getAdsbDemodSettings()->setRfBandwidth(settings.m_rfBandwidth); response.getAdsbDemodSettings()->setCorrelationThreshold(settings.m_correlationThreshold); response.getAdsbDemodSettings()->setSamplesPerBit(settings.m_samplesPerBit); + response.getAdsbDemodSettings()->setCorrelateFullPreamble(settings.m_correlateFullPreamble ? 1 : 0); + response.getAdsbDemodSettings()->setDemodModeS(settings.m_demodModeS ? 1 : 0); + response.getAdsbDemodSettings()->setInterpolatorPhaseSteps(settings.m_interpolatorPhaseSteps); + response.getAdsbDemodSettings()->setInterpolatorTapsPerPhase(settings.m_interpolatorTapsPerPhase); response.getAdsbDemodSettings()->setRemoveTimeout(settings.m_removeTimeout); response.getAdsbDemodSettings()->setBeastEnabled(settings.m_feedEnabled ? 1 : 0); response.getAdsbDemodSettings()->setBeastHost(new QString(settings.m_feedHost)); response.getAdsbDemodSettings()->setBeastPort(settings.m_feedPort); + response.getAdsbDemodSettings()->setFeedFormat((int) settings.m_feedFormat); response.getAdsbDemodSettings()->setRgbColor(settings.m_rgbColor); response.getAdsbDemodSettings()->setLogFilename(new QString(settings.m_logFilename)); response.getAdsbDemodSettings()->setLogEnabled(settings.m_logEnabled); @@ -412,10 +447,13 @@ void ADSBDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons response.getAdsbDemodReport()->setChannelPowerDb(CalcDb::dbPower(magsqAvg)); response.getAdsbDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate()); + if (m_targetAzElValid) { + response.getAdsbDemodReport()->setTargetName(new QString(m_targetName)); response.getAdsbDemodReport()->setTargetAzimuth(m_targetAzimuth); response.getAdsbDemodReport()->setTargetElevation(m_targetElevation); + response.getAdsbDemodReport()->setTargetRange(m_targetRange); } } @@ -443,6 +481,18 @@ void ADSBDemod::webapiReverseSendSettings(QList& channelSettingsKeys, c if (channelSettingsKeys.contains("samplesPerBit") || force) { swgADSBDemodSettings->setSamplesPerBit(settings.m_samplesPerBit); } + if (channelSettingsKeys.contains("correlateFullPreamble") || force) { + swgADSBDemodSettings->setCorrelateFullPreamble(settings.m_correlateFullPreamble ? 1 : 0); + } + if (channelSettingsKeys.contains("demodModeS") || force) { + swgADSBDemodSettings->setDemodModeS(settings.m_demodModeS ? 1 : 0); + } + if (channelSettingsKeys.contains("interpolatorPhaseSteps") || force) { + swgADSBDemodSettings->setInterpolatorPhaseSteps(settings.m_interpolatorPhaseSteps); + } + if (channelSettingsKeys.contains("interpolatorTapsPerPhase") || force) { + swgADSBDemodSettings->setInterpolatorTapsPerPhase(settings.m_interpolatorTapsPerPhase); + } if (channelSettingsKeys.contains("removeTimeout") || force) { swgADSBDemodSettings->setRemoveTimeout(settings.m_removeTimeout); } @@ -455,6 +505,9 @@ void ADSBDemod::webapiReverseSendSettings(QList& channelSettingsKeys, c if (channelSettingsKeys.contains("beastPort") || force) { swgADSBDemodSettings->setBeastPort(settings.m_feedPort); } + if (channelSettingsKeys.contains("feedFormat") || force) { + swgADSBDemodSettings->setFeedFormat((int) settings.m_feedFormat); + } if (channelSettingsKeys.contains("logFilename") || force) { swgADSBDemodSettings->setLogFilename(new QString(settings.m_logFilename)); } @@ -512,15 +565,18 @@ void ADSBDemod::networkManagerFinished(QNetworkReply *reply) reply->deleteLater(); } -void ADSBDemod::setTarget(const QString& name, float targetAzimuth, float targetElevation) +void ADSBDemod::setTarget(const QString& name, float targetAzimuth, float targetElevation, float targetRange) { m_targetAzimuth = targetAzimuth; m_targetElevation = targetElevation; + m_targetRange = targetRange; + m_targetName = name; m_targetAzElValid = true; // Send to Rotator Controllers MessagePipes& messagePipes = MainCore::instance()->getMessagePipes(); QList *mapMessageQueues = messagePipes.getMessageQueues(this, "target"); + if (mapMessageQueues) { QList::iterator it = mapMessageQueues->begin(); diff --git a/plugins/channelrx/demodadsb/adsbdemod.h b/plugins/channelrx/demodadsb/adsbdemod.h index d0fa33348..80bd639d5 100644 --- a/plugins/channelrx/demodadsb/adsbdemod.h +++ b/plugins/channelrx/demodadsb/adsbdemod.h @@ -119,7 +119,7 @@ public: m_basebandSink->setMessageQueueToGUI(queue); } - void setTarget(const QString& name, float targetAzimuth, float targetElevation); + void setTarget(const QString& name, float targetAzimuth, float targetElevation, float targetRange); void clearTarget() { m_targetAzElValid = false; } uint32_t getNumberOfDeviceStreams() const; @@ -138,6 +138,8 @@ private: bool m_targetAzElValid; float m_targetAzimuth; float m_targetElevation; + float m_targetRange; + QString m_targetName; QNetworkAccessManager *m_networkManager; QNetworkRequest m_networkRequest; diff --git a/plugins/channelrx/demodadsb/adsbdemodgui.cpp b/plugins/channelrx/demodadsb/adsbdemodgui.cpp index 956b68b56..d6674ee4f 100644 --- a/plugins/channelrx/demodadsb/adsbdemodgui.cpp +++ b/plugins/channelrx/demodadsb/adsbdemodgui.cpp @@ -438,7 +438,7 @@ bool AirportModel::setData(const QModelIndex &index, const QVariant& value, int else if (idx == m_airports[row]->m_frequencies.size()) { // Set airport as target - m_gui->target(m_airports[row]->m_name, m_azimuth[row], m_elevation[row]); + m_gui->target(m_airports[row]->m_name, m_azimuth[row], m_elevation[row], m_range[row]); emit dataChanged(index, index); } return true; @@ -473,7 +473,7 @@ void ADSBDemodGUI::updatePosition(Aircraft *aircraft) aircraft->m_rangeItem->setText(QString::number(aircraft->m_range/1000.0, 'f', 1)); aircraft->m_azElItem->setText(QString("%1/%2").arg(std::round(aircraft->m_azimuth)).arg(std::round(aircraft->m_elevation))); if (aircraft == m_trackAircraft) - m_adsbDemod->setTarget(aircraft->targetName(), aircraft->m_azimuth, aircraft->m_elevation); + m_adsbDemod->setTarget(aircraft->targetName(), aircraft->m_azimuth, aircraft->m_elevation, aircraft->m_range); // Send to Map feature MessagePipes& messagePipes = MainCore::instance()->getMessagePipes(); @@ -1230,12 +1230,17 @@ void ADSBDemodGUI::checkStaticNotification(Aircraft *aircraft) if (m_settings.m_notificationSettings[i]->m_regularExpression.match(match).hasMatch()) { highlightAircraft(aircraft); + if (!m_settings.m_notificationSettings[i]->m_speech.isEmpty()) { speechNotification(aircraft, m_settings.m_notificationSettings[i]->m_speech); } if (!m_settings.m_notificationSettings[i]->m_command.isEmpty()) { commandNotification(aircraft, m_settings.m_notificationSettings[i]->m_command); } + if (m_settings.m_notificationSettings[i]->m_autoTarget) { + targetAircraft(aircraft); + } + aircraft->m_notified = true; } } @@ -1292,12 +1297,17 @@ void ADSBDemodGUI::checkDynamicNotification(Aircraft *aircraft) if (m_settings.m_notificationSettings[i]->m_regularExpression.match(match).hasMatch()) { highlightAircraft(aircraft); + if (!m_settings.m_notificationSettings[i]->m_speech.isEmpty()) { speechNotification(aircraft, m_settings.m_notificationSettings[i]->m_speech); } if (!m_settings.m_notificationSettings[i]->m_command.isEmpty()) { commandNotification(aircraft, m_settings.m_notificationSettings[i]->m_command); } + if (m_settings.m_notificationSettings[i]->m_autoTarget) { + targetAircraft(aircraft); + } + aircraft->m_notified = true; } } @@ -1951,7 +1961,7 @@ void ADSBDemodGUI::updateAirports() } // Set a static target, such as an airport -void ADSBDemodGUI::target(const QString& name, float az, float el) +void ADSBDemodGUI::target(const QString& name, float az, float el, float range) { if (m_trackAircraft) { @@ -1960,7 +1970,7 @@ void ADSBDemodGUI::target(const QString& name, float az, float el) m_aircraftModel.aircraftUpdated(m_trackAircraft); m_trackAircraft = nullptr; } - m_adsbDemod->setTarget(name, az, el); + m_adsbDemod->setTarget(name, az, el, range); } void ADSBDemodGUI::targetAircraft(Aircraft *aircraft) @@ -1976,7 +1986,7 @@ void ADSBDemodGUI::targetAircraft(Aircraft *aircraft) // Track this aircraft m_trackAircraft = aircraft; if (aircraft->m_positionValid) - m_adsbDemod->setTarget(aircraft->targetName(), aircraft->m_azimuth, aircraft->m_elevation); + m_adsbDemod->setTarget(aircraft->targetName(), aircraft->m_azimuth, aircraft->m_elevation, aircraft->m_range); // Change colour of new target aircraft->m_isTarget = true; m_aircraftModel.aircraftUpdated(aircraft); diff --git a/plugins/channelrx/demodadsb/adsbdemodgui.h b/plugins/channelrx/demodadsb/adsbdemodgui.h index 89d867e40..0e9a9be75 100644 --- a/plugins/channelrx/demodadsb/adsbdemodgui.h +++ b/plugins/channelrx/demodadsb/adsbdemodgui.h @@ -383,6 +383,7 @@ public: m_showFreq.append(false); m_azimuth.append(az); m_elevation.append(el); + m_range.append(distance); endInsertRows(); } @@ -397,6 +398,7 @@ public: m_showFreq.removeAt(row); m_azimuth.removeAt(row); m_elevation.removeAt(row); + m_range.removeAt(row); endRemoveRows(); } } @@ -411,6 +413,7 @@ public: m_showFreq.clear(); m_azimuth.clear(); m_elevation.clear(); + m_range.clear(); endRemoveRows(); } } @@ -478,6 +481,7 @@ private: QList m_showFreq; QList m_azimuth; QList m_elevation; + QList m_range; }; class ADSBDemodGUI : public ChannelGUI { @@ -493,7 +497,7 @@ public: virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } void highlightAircraft(Aircraft *aircraft); void targetAircraft(Aircraft *aircraft); - void target(const QString& name, float az, float el); + void target(const QString& name, float az, float el, float range); bool setFrequency(float frequency); bool useSIUints() { return m_settings.m_siUnits; } diff --git a/plugins/channelrx/demodadsb/adsbdemodgui.ui b/plugins/channelrx/demodadsb/adsbdemodgui.ui index e657a92ef..dc0a394cd 100644 --- a/plugins/channelrx/demodadsb/adsbdemodgui.ui +++ b/plugins/channelrx/demodadsb/adsbdemodgui.ui @@ -6,7 +6,7 @@ 0 0 - 435 + 604 1046 @@ -36,13 +36,13 @@ 0 0 - 431 + 600 141 - 300 + 600 0 @@ -225,7 +225,7 @@ 100000 - 1000000 + 100000 2300000 @@ -283,7 +283,7 @@ 1 - 16 + 4 @@ -296,7 +296,10 @@ - 12 + 4 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -332,7 +335,7 @@ - 16 + 20 0 @@ -734,7 +737,7 @@ 0 140 - 431 + 600 291 @@ -744,6 +747,12 @@ 0 + + + 600 + 0 + + ADS-B Data @@ -1046,7 +1055,7 @@ 10 450 - 421 + 600 581 @@ -1056,6 +1065,12 @@ 0 + + + 600 + 0 + + Map diff --git a/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.cpp b/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.cpp index cab727736..a6affa5a9 100644 --- a/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.cpp +++ b/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.cpp @@ -63,6 +63,7 @@ void ADSBDemodNotificationDialog::accept() notificationSettings->m_regExp = ui->table->item(i, NOTIFICATION_COL_REG_EXP)->data(Qt::DisplayRole).toString().trimmed(); notificationSettings->m_speech = ui->table->item(i, NOTIFICATION_COL_SPEECH)->data(Qt::DisplayRole).toString().trimmed(); notificationSettings->m_command = ui->table->item(i, NOTIFICATION_COL_COMMAND)->data(Qt::DisplayRole).toString().trimmed(); + notificationSettings->m_autoTarget = ((QCheckBox *) ui->table->cellWidget(i, NOTIFICATION_COL_AUTOTARGET))->isChecked(); notificationSettings->updateRegularExpression(); m_settings->m_notificationSettings.append(notificationSettings); } @@ -76,6 +77,7 @@ void ADSBDemodNotificationDialog::resizeTable() dummy.m_regExp = "No emergency and some"; dummy.m_speech = "${aircraft} ${reg} has entered your airspace"; dummy.m_command = "/usr/home/sdrangel/myscript ${aircraft} ${reg}"; + dummy.m_autoTarget = false; addRow(&dummy); ui->table->resizeColumnsToContents(); ui->table->selectRow(0); @@ -103,6 +105,8 @@ void ADSBDemodNotificationDialog::on_remove_clicked() void ADSBDemodNotificationDialog::addRow(ADSBDemodSettings::NotificationSettings *settings) { QComboBox *match = new QComboBox(); + QCheckBox *autoTarget = new QCheckBox(); + autoTarget->setChecked(false); QWidget *matchWidget = new QWidget(); QHBoxLayout *pLayout = new QHBoxLayout(matchWidget); pLayout->addWidget(match); @@ -156,6 +160,7 @@ void ADSBDemodNotificationDialog::addRow(ADSBDemodSettings::NotificationSettings ui->table->setItem(row, NOTIFICATION_COL_REG_EXP, regExpItem); ui->table->setItem(row, NOTIFICATION_COL_SPEECH, speechItem); ui->table->setItem(row, NOTIFICATION_COL_COMMAND, commandItem); + ui->table->setCellWidget(row, NOTIFICATION_COL_AUTOTARGET, autoTarget); ui->table->setSortingEnabled(true); } diff --git a/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.h b/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.h index 94cd5e972..ec54094f4 100644 --- a/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.h +++ b/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.h @@ -47,7 +47,8 @@ private: NOTIFICATION_COL_MATCH, NOTIFICATION_COL_REG_EXP, NOTIFICATION_COL_SPEECH, - NOTIFICATION_COL_COMMAND + NOTIFICATION_COL_COMMAND, + NOTIFICATION_COL_AUTOTARGET }; static std::vector m_columnMap; diff --git a/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.ui b/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.ui index f8771d3ee..850915a16 100644 --- a/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.ui +++ b/plugins/channelrx/demodadsb/adsbdemodnotificationdialog.ui @@ -66,6 +66,11 @@ Command/script to execute when a match is made + + + Auto target + + diff --git a/plugins/channelrx/demodadsb/adsbdemodsettings.cpp b/plugins/channelrx/demodadsb/adsbdemodsettings.cpp index 52cd99883..581f54ac5 100644 --- a/plugins/channelrx/demodadsb/adsbdemodsettings.cpp +++ b/plugins/channelrx/demodadsb/adsbdemodsettings.cpp @@ -231,6 +231,7 @@ QDataStream& operator<<(QDataStream& out, const ADSBDemodSettings::NotificationS out << settings->m_regExp; out << settings->m_speech; out << settings->m_command; + out << settings->m_autoTarget; return out; } @@ -241,6 +242,7 @@ QDataStream& operator>>(QDataStream& in, ADSBDemodSettings::NotificationSettings in >> settings->m_regExp; in >> settings->m_speech; in >> settings->m_command; + in >> settings->m_autoTarget; settings->updateRegularExpression(); return in; } diff --git a/plugins/channelrx/demodadsb/adsbdemodsettings.h b/plugins/channelrx/demodadsb/adsbdemodsettings.h index cfbfca1de..0ef95065a 100644 --- a/plugins/channelrx/demodadsb/adsbdemodsettings.h +++ b/plugins/channelrx/demodadsb/adsbdemodsettings.h @@ -75,6 +75,7 @@ struct ADSBDemodSettings QString m_speech; QString m_command; QRegularExpression m_regularExpression; + bool m_autoTarget; NotificationSettings(); void updateRegularExpression(); diff --git a/plugins/channelrx/demodadsb/readme.md b/plugins/channelrx/demodadsb/readme.md index 1f3b0024c..baf5c494a 100644 --- a/plugins/channelrx/demodadsb/readme.md +++ b/plugins/channelrx/demodadsb/readme.md @@ -92,6 +92,8 @@ When clicked, opens the Notifications Dialog, which allows speech notifications For example, you might want an audible notification when a particularly interesting aircraft is nearby or when an aircraft declares an emergency. By running a program such as [cmail](https://www.inveigle.net/cmail/download), e-mail notifications can be sent. +Also you can set the target aircraft to the matching aircraft automatically by checking the box in the "Auto target" column. + Here are a few examples: ![Notifications Dialog](../../../doc/img/ADSBDemod_plugin_notifications.png) @@ -138,7 +140,7 @@ In the Speech and Command strings, variables can be used to substitute in data f * ${speed} * ${heading} * ${range} -- ${azel} +* ${azel} * ${category} * ${status} * ${squawk} @@ -146,7 +148,7 @@ In the Speech and Command strings, variables can be used to substitute in data f * ${manufacturer} * ${owner} * ${operator} -- ${rssi} +* ${rssi} * ${flightstatus} * ${departure} * ${arrival} diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 1c1acfbca..bc0abbfd7 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -706,6 +706,9 @@ margin-bottom: 20px; "channelSampleRate" : { "type" : "integer" }, + "targetName" : { + "type" : "string" + }, "targetAzimuth" : { "type" : "number", "format" : "float" @@ -713,6 +716,10 @@ margin-bottom: 20px; "targetElevation" : { "type" : "number", "format" : "float" + }, + "targetRange" : { + "type" : "number", + "format" : "float" } }, "description" : "ADSBDemod" @@ -736,11 +743,29 @@ margin-bottom: 20px; "samplesPerBit" : { "type" : "integer" }, + "correlateFullPreamble" : { + "type" : "integer", + "description" : "Correlate on part or full preamble\n * 0 - part\n * 1 - full\n" + }, + "demodModeS" : { + "type" : "integer", + "description" : "Demodulate all mode S frames or just ADS-B\n * 0 - just ADS-B\n * 1 - All mode S\n" + }, + "interpolatorPhaseSteps" : { + "type" : "integer", + "description" : "Number of phase steps in channel interpolator" + }, + "interpolatorTapsPerPhase" : { + "type" : "number", + "format" : "float", + "description" : "Number of taps per phase in channel interpolator" + }, "removeTimeout" : { "type" : "integer" }, "beastEnabled" : { - "type" : "integer" + "type" : "integer", + "description" : "Send data to beast server\n * 0 - Do not send data\n * 1 - Send data\n" }, "beastHost" : { "type" : "string" @@ -748,6 +773,10 @@ margin-bottom: 20px; "beastPort" : { "type" : "integer" }, + "feedFormat" : { + "type" : "integer", + "description" : "Format of sent data\n * 0 - Beast binary\n * 1 - Beast index\n" + }, "logFilename" : { "type" : "string" }, @@ -51248,7 +51277,7 @@ except ApiException as e:
- Generated 2021-11-04T19:20:44.212+01:00 + Generated 2021-11-07T12:25:19.263+01:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/ADSBDemod.yaml b/sdrbase/resources/webapi/doc/swagger/include/ADSBDemod.yaml index 66ef1a121..70a53f15a 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/ADSBDemod.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/ADSBDemod.yaml @@ -14,14 +14,43 @@ ADSBDemodSettings: format: float samplesPerBit: type: integer + correlateFullPreamble: + type: integer + description: > + Correlate on part or full preamble + * 0 - part + * 1 - full + demodModeS: + type: integer + description: > + Demodulate all mode S frames or just ADS-B + * 0 - just ADS-B + * 1 - All mode S + interpolatorPhaseSteps: + type: integer + description: Number of phase steps in channel interpolator + interpolatorTapsPerPhase: + type: number + format: float + description: Number of taps per phase in channel interpolator removeTimeout: type: integer beastEnabled: type: integer + description: > + Send data to beast server + * 0 - Do not send data + * 1 - Send data beastHost: type: string beastPort: type: integer + feedFormat: + type: integer + description: > + Format of sent data + * 0 - Beast binary + * 1 - Beast index logFilename: type: string logEnabled: @@ -54,9 +83,14 @@ ADSBDemodReport: format: float channelSampleRate: type: integer + targetName: + type: string targetAzimuth: type: number format: float targetElevation: type: number format: float + targetRange: + type: number + format: float diff --git a/swagger/sdrangel/api/swagger/include/ADSBDemod.yaml b/swagger/sdrangel/api/swagger/include/ADSBDemod.yaml index 66ef1a121..70a53f15a 100644 --- a/swagger/sdrangel/api/swagger/include/ADSBDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/ADSBDemod.yaml @@ -14,14 +14,43 @@ ADSBDemodSettings: format: float samplesPerBit: type: integer + correlateFullPreamble: + type: integer + description: > + Correlate on part or full preamble + * 0 - part + * 1 - full + demodModeS: + type: integer + description: > + Demodulate all mode S frames or just ADS-B + * 0 - just ADS-B + * 1 - All mode S + interpolatorPhaseSteps: + type: integer + description: Number of phase steps in channel interpolator + interpolatorTapsPerPhase: + type: number + format: float + description: Number of taps per phase in channel interpolator removeTimeout: type: integer beastEnabled: type: integer + description: > + Send data to beast server + * 0 - Do not send data + * 1 - Send data beastHost: type: string beastPort: type: integer + feedFormat: + type: integer + description: > + Format of sent data + * 0 - Beast binary + * 1 - Beast index logFilename: type: string logEnabled: @@ -54,9 +83,14 @@ ADSBDemodReport: format: float channelSampleRate: type: integer + targetName: + type: string targetAzimuth: type: number format: float targetElevation: type: number format: float + targetRange: + type: number + format: float diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 1c1acfbca..bc0abbfd7 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -706,6 +706,9 @@ margin-bottom: 20px; "channelSampleRate" : { "type" : "integer" }, + "targetName" : { + "type" : "string" + }, "targetAzimuth" : { "type" : "number", "format" : "float" @@ -713,6 +716,10 @@ margin-bottom: 20px; "targetElevation" : { "type" : "number", "format" : "float" + }, + "targetRange" : { + "type" : "number", + "format" : "float" } }, "description" : "ADSBDemod" @@ -736,11 +743,29 @@ margin-bottom: 20px; "samplesPerBit" : { "type" : "integer" }, + "correlateFullPreamble" : { + "type" : "integer", + "description" : "Correlate on part or full preamble\n * 0 - part\n * 1 - full\n" + }, + "demodModeS" : { + "type" : "integer", + "description" : "Demodulate all mode S frames or just ADS-B\n * 0 - just ADS-B\n * 1 - All mode S\n" + }, + "interpolatorPhaseSteps" : { + "type" : "integer", + "description" : "Number of phase steps in channel interpolator" + }, + "interpolatorTapsPerPhase" : { + "type" : "number", + "format" : "float", + "description" : "Number of taps per phase in channel interpolator" + }, "removeTimeout" : { "type" : "integer" }, "beastEnabled" : { - "type" : "integer" + "type" : "integer", + "description" : "Send data to beast server\n * 0 - Do not send data\n * 1 - Send data\n" }, "beastHost" : { "type" : "string" @@ -748,6 +773,10 @@ margin-bottom: 20px; "beastPort" : { "type" : "integer" }, + "feedFormat" : { + "type" : "integer", + "description" : "Format of sent data\n * 0 - Beast binary\n * 1 - Beast index\n" + }, "logFilename" : { "type" : "string" }, @@ -51248,7 +51277,7 @@ except ApiException as e:
- Generated 2021-11-04T19:20:44.212+01:00 + Generated 2021-11-07T12:25:19.263+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.cpp b/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.cpp index 7d2ad41ed..9dbdea9a5 100644 --- a/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.cpp @@ -32,10 +32,14 @@ SWGADSBDemodReport::SWGADSBDemodReport() { m_channel_power_db_isSet = false; channel_sample_rate = 0; m_channel_sample_rate_isSet = false; + target_name = nullptr; + m_target_name_isSet = false; target_azimuth = 0.0f; m_target_azimuth_isSet = false; target_elevation = 0.0f; m_target_elevation_isSet = false; + target_range = 0.0f; + m_target_range_isSet = false; } SWGADSBDemodReport::~SWGADSBDemodReport() { @@ -48,16 +52,24 @@ SWGADSBDemodReport::init() { m_channel_power_db_isSet = false; channel_sample_rate = 0; m_channel_sample_rate_isSet = false; + target_name = new QString(""); + m_target_name_isSet = false; target_azimuth = 0.0f; m_target_azimuth_isSet = false; target_elevation = 0.0f; m_target_elevation_isSet = false; + target_range = 0.0f; + m_target_range_isSet = false; } void SWGADSBDemodReport::cleanup() { + if(target_name != nullptr) { + delete target_name; + } + } @@ -77,10 +89,14 @@ SWGADSBDemodReport::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&channel_sample_rate, pJson["channelSampleRate"], "qint32", ""); + ::SWGSDRangel::setValue(&target_name, pJson["targetName"], "QString", "QString"); + ::SWGSDRangel::setValue(&target_azimuth, pJson["targetAzimuth"], "float", ""); ::SWGSDRangel::setValue(&target_elevation, pJson["targetElevation"], "float", ""); + ::SWGSDRangel::setValue(&target_range, pJson["targetRange"], "float", ""); + } QString @@ -103,12 +119,18 @@ SWGADSBDemodReport::asJsonObject() { if(m_channel_sample_rate_isSet){ obj->insert("channelSampleRate", QJsonValue(channel_sample_rate)); } + if(target_name != nullptr && *target_name != QString("")){ + toJsonValue(QString("targetName"), target_name, obj, QString("QString")); + } if(m_target_azimuth_isSet){ obj->insert("targetAzimuth", QJsonValue(target_azimuth)); } if(m_target_elevation_isSet){ obj->insert("targetElevation", QJsonValue(target_elevation)); } + if(m_target_range_isSet){ + obj->insert("targetRange", QJsonValue(target_range)); + } return obj; } @@ -133,6 +155,16 @@ SWGADSBDemodReport::setChannelSampleRate(qint32 channel_sample_rate) { this->m_channel_sample_rate_isSet = true; } +QString* +SWGADSBDemodReport::getTargetName() { + return target_name; +} +void +SWGADSBDemodReport::setTargetName(QString* target_name) { + this->target_name = target_name; + this->m_target_name_isSet = true; +} + float SWGADSBDemodReport::getTargetAzimuth() { return target_azimuth; @@ -153,6 +185,16 @@ SWGADSBDemodReport::setTargetElevation(float target_elevation) { this->m_target_elevation_isSet = true; } +float +SWGADSBDemodReport::getTargetRange() { + return target_range; +} +void +SWGADSBDemodReport::setTargetRange(float target_range) { + this->target_range = target_range; + this->m_target_range_isSet = true; +} + bool SWGADSBDemodReport::isSet(){ @@ -164,12 +206,18 @@ SWGADSBDemodReport::isSet(){ if(m_channel_sample_rate_isSet){ isObjectUpdated = true; break; } + if(target_name && *target_name != QString("")){ + isObjectUpdated = true; break; + } if(m_target_azimuth_isSet){ isObjectUpdated = true; break; } if(m_target_elevation_isSet){ isObjectUpdated = true; break; } + if(m_target_range_isSet){ + isObjectUpdated = true; break; + } }while(false); return isObjectUpdated; } diff --git a/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.h b/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.h index 2bcdb1097..feb481a2c 100644 --- a/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.h +++ b/swagger/sdrangel/code/qt5/client/SWGADSBDemodReport.h @@ -22,6 +22,7 @@ #include +#include #include "SWGObject.h" #include "export.h" @@ -47,12 +48,18 @@ public: qint32 getChannelSampleRate(); void setChannelSampleRate(qint32 channel_sample_rate); + QString* getTargetName(); + void setTargetName(QString* target_name); + float getTargetAzimuth(); void setTargetAzimuth(float target_azimuth); float getTargetElevation(); void setTargetElevation(float target_elevation); + float getTargetRange(); + void setTargetRange(float target_range); + virtual bool isSet() override; @@ -63,12 +70,18 @@ private: qint32 channel_sample_rate; bool m_channel_sample_rate_isSet; + QString* target_name; + bool m_target_name_isSet; + float target_azimuth; bool m_target_azimuth_isSet; float target_elevation; bool m_target_elevation_isSet; + float target_range; + bool m_target_range_isSet; + }; } diff --git a/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.cpp index 3586196b7..652532a2d 100644 --- a/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.cpp @@ -36,6 +36,14 @@ SWGADSBDemodSettings::SWGADSBDemodSettings() { m_correlation_threshold_isSet = false; samples_per_bit = 0; m_samples_per_bit_isSet = false; + correlate_full_preamble = 0; + m_correlate_full_preamble_isSet = false; + demod_mode_s = 0; + m_demod_mode_s_isSet = false; + interpolator_phase_steps = 0; + m_interpolator_phase_steps_isSet = false; + interpolator_taps_per_phase = 0.0f; + m_interpolator_taps_per_phase_isSet = false; remove_timeout = 0; m_remove_timeout_isSet = false; beast_enabled = 0; @@ -44,6 +52,8 @@ SWGADSBDemodSettings::SWGADSBDemodSettings() { m_beast_host_isSet = false; beast_port = 0; m_beast_port_isSet = false; + feed_format = 0; + m_feed_format_isSet = false; log_filename = nullptr; m_log_filename_isSet = false; log_enabled = 0; @@ -80,6 +90,14 @@ SWGADSBDemodSettings::init() { m_correlation_threshold_isSet = false; samples_per_bit = 0; m_samples_per_bit_isSet = false; + correlate_full_preamble = 0; + m_correlate_full_preamble_isSet = false; + demod_mode_s = 0; + m_demod_mode_s_isSet = false; + interpolator_phase_steps = 0; + m_interpolator_phase_steps_isSet = false; + interpolator_taps_per_phase = 0.0f; + m_interpolator_taps_per_phase_isSet = false; remove_timeout = 0; m_remove_timeout_isSet = false; beast_enabled = 0; @@ -88,6 +106,8 @@ SWGADSBDemodSettings::init() { m_beast_host_isSet = false; beast_port = 0; m_beast_port_isSet = false; + feed_format = 0; + m_feed_format_isSet = false; log_filename = new QString(""); m_log_filename_isSet = false; log_enabled = 0; @@ -118,10 +138,15 @@ SWGADSBDemodSettings::cleanup() { + + + + if(beast_host != nullptr) { delete beast_host; } + if(log_filename != nullptr) { delete log_filename; } @@ -159,6 +184,14 @@ SWGADSBDemodSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&samples_per_bit, pJson["samplesPerBit"], "qint32", ""); + ::SWGSDRangel::setValue(&correlate_full_preamble, pJson["correlateFullPreamble"], "qint32", ""); + + ::SWGSDRangel::setValue(&demod_mode_s, pJson["demodModeS"], "qint32", ""); + + ::SWGSDRangel::setValue(&interpolator_phase_steps, pJson["interpolatorPhaseSteps"], "qint32", ""); + + ::SWGSDRangel::setValue(&interpolator_taps_per_phase, pJson["interpolatorTapsPerPhase"], "float", ""); + ::SWGSDRangel::setValue(&remove_timeout, pJson["removeTimeout"], "qint32", ""); ::SWGSDRangel::setValue(&beast_enabled, pJson["beastEnabled"], "qint32", ""); @@ -167,6 +200,8 @@ SWGADSBDemodSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&beast_port, pJson["beastPort"], "qint32", ""); + ::SWGSDRangel::setValue(&feed_format, pJson["feedFormat"], "qint32", ""); + ::SWGSDRangel::setValue(&log_filename, pJson["logFilename"], "QString", "QString"); ::SWGSDRangel::setValue(&log_enabled, pJson["logEnabled"], "qint32", ""); @@ -215,6 +250,18 @@ SWGADSBDemodSettings::asJsonObject() { if(m_samples_per_bit_isSet){ obj->insert("samplesPerBit", QJsonValue(samples_per_bit)); } + if(m_correlate_full_preamble_isSet){ + obj->insert("correlateFullPreamble", QJsonValue(correlate_full_preamble)); + } + if(m_demod_mode_s_isSet){ + obj->insert("demodModeS", QJsonValue(demod_mode_s)); + } + if(m_interpolator_phase_steps_isSet){ + obj->insert("interpolatorPhaseSteps", QJsonValue(interpolator_phase_steps)); + } + if(m_interpolator_taps_per_phase_isSet){ + obj->insert("interpolatorTapsPerPhase", QJsonValue(interpolator_taps_per_phase)); + } if(m_remove_timeout_isSet){ obj->insert("removeTimeout", QJsonValue(remove_timeout)); } @@ -227,6 +274,9 @@ SWGADSBDemodSettings::asJsonObject() { if(m_beast_port_isSet){ obj->insert("beastPort", QJsonValue(beast_port)); } + if(m_feed_format_isSet){ + obj->insert("feedFormat", QJsonValue(feed_format)); + } if(log_filename != nullptr && *log_filename != QString("")){ toJsonValue(QString("logFilename"), log_filename, obj, QString("QString")); } @@ -301,6 +351,46 @@ SWGADSBDemodSettings::setSamplesPerBit(qint32 samples_per_bit) { this->m_samples_per_bit_isSet = true; } +qint32 +SWGADSBDemodSettings::getCorrelateFullPreamble() { + return correlate_full_preamble; +} +void +SWGADSBDemodSettings::setCorrelateFullPreamble(qint32 correlate_full_preamble) { + this->correlate_full_preamble = correlate_full_preamble; + this->m_correlate_full_preamble_isSet = true; +} + +qint32 +SWGADSBDemodSettings::getDemodModeS() { + return demod_mode_s; +} +void +SWGADSBDemodSettings::setDemodModeS(qint32 demod_mode_s) { + this->demod_mode_s = demod_mode_s; + this->m_demod_mode_s_isSet = true; +} + +qint32 +SWGADSBDemodSettings::getInterpolatorPhaseSteps() { + return interpolator_phase_steps; +} +void +SWGADSBDemodSettings::setInterpolatorPhaseSteps(qint32 interpolator_phase_steps) { + this->interpolator_phase_steps = interpolator_phase_steps; + this->m_interpolator_phase_steps_isSet = true; +} + +float +SWGADSBDemodSettings::getInterpolatorTapsPerPhase() { + return interpolator_taps_per_phase; +} +void +SWGADSBDemodSettings::setInterpolatorTapsPerPhase(float interpolator_taps_per_phase) { + this->interpolator_taps_per_phase = interpolator_taps_per_phase; + this->m_interpolator_taps_per_phase_isSet = true; +} + qint32 SWGADSBDemodSettings::getRemoveTimeout() { return remove_timeout; @@ -341,6 +431,16 @@ SWGADSBDemodSettings::setBeastPort(qint32 beast_port) { this->m_beast_port_isSet = true; } +qint32 +SWGADSBDemodSettings::getFeedFormat() { + return feed_format; +} +void +SWGADSBDemodSettings::setFeedFormat(qint32 feed_format) { + this->feed_format = feed_format; + this->m_feed_format_isSet = true; +} + QString* SWGADSBDemodSettings::getLogFilename() { return log_filename; @@ -458,6 +558,18 @@ SWGADSBDemodSettings::isSet(){ if(m_samples_per_bit_isSet){ isObjectUpdated = true; break; } + if(m_correlate_full_preamble_isSet){ + isObjectUpdated = true; break; + } + if(m_demod_mode_s_isSet){ + isObjectUpdated = true; break; + } + if(m_interpolator_phase_steps_isSet){ + isObjectUpdated = true; break; + } + if(m_interpolator_taps_per_phase_isSet){ + isObjectUpdated = true; break; + } if(m_remove_timeout_isSet){ isObjectUpdated = true; break; } @@ -470,6 +582,9 @@ SWGADSBDemodSettings::isSet(){ if(m_beast_port_isSet){ isObjectUpdated = true; break; } + if(m_feed_format_isSet){ + isObjectUpdated = true; break; + } if(log_filename && *log_filename != QString("")){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.h b/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.h index 4e11d7c35..014b06372 100644 --- a/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGADSBDemodSettings.h @@ -54,6 +54,18 @@ public: qint32 getSamplesPerBit(); void setSamplesPerBit(qint32 samples_per_bit); + qint32 getCorrelateFullPreamble(); + void setCorrelateFullPreamble(qint32 correlate_full_preamble); + + qint32 getDemodModeS(); + void setDemodModeS(qint32 demod_mode_s); + + qint32 getInterpolatorPhaseSteps(); + void setInterpolatorPhaseSteps(qint32 interpolator_phase_steps); + + float getInterpolatorTapsPerPhase(); + void setInterpolatorTapsPerPhase(float interpolator_taps_per_phase); + qint32 getRemoveTimeout(); void setRemoveTimeout(qint32 remove_timeout); @@ -66,6 +78,9 @@ public: qint32 getBeastPort(); void setBeastPort(qint32 beast_port); + qint32 getFeedFormat(); + void setFeedFormat(qint32 feed_format); + QString* getLogFilename(); void setLogFilename(QString* log_filename); @@ -112,6 +127,18 @@ private: qint32 samples_per_bit; bool m_samples_per_bit_isSet; + qint32 correlate_full_preamble; + bool m_correlate_full_preamble_isSet; + + qint32 demod_mode_s; + bool m_demod_mode_s_isSet; + + qint32 interpolator_phase_steps; + bool m_interpolator_phase_steps_isSet; + + float interpolator_taps_per_phase; + bool m_interpolator_taps_per_phase_isSet; + qint32 remove_timeout; bool m_remove_timeout_isSet; @@ -124,6 +151,9 @@ private: qint32 beast_port; bool m_beast_port_isSet; + qint32 feed_format; + bool m_feed_format_isSet; + QString* log_filename; bool m_log_filename_isSet;