From 599c31493a72442d145fb7049cf243ba2d554fb2 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Tue, 10 Nov 2020 12:03:36 +0000 Subject: [PATCH] Add decode of Mode-A transonder (Squawk) code --- plugins/channelrx/demodadsb/adsbdemodgui.cpp | 47 ++++++++++++++------ plugins/channelrx/demodadsb/adsbdemodgui.h | 3 ++ plugins/channelrx/demodadsb/adsbdemodgui.ui | 18 +++++--- plugins/channelrx/demodadsb/readme.md | 1 + 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/plugins/channelrx/demodadsb/adsbdemodgui.cpp b/plugins/channelrx/demodadsb/adsbdemodgui.cpp index 08b8ca36f..d62ee3e41 100644 --- a/plugins/channelrx/demodadsb/adsbdemodgui.cpp +++ b/plugins/channelrx/demodadsb/adsbdemodgui.cpp @@ -61,16 +61,17 @@ #define ADSB_COL_LONGITUDE 11 #define ADSB_COL_CATEGORY 12 #define ADSB_COL_STATUS 13 -#define ADSB_COL_REGISTRATION 14 -#define ADSB_COL_COUNTRY 15 -#define ADSB_COL_REGISTERED 16 -#define ADSB_COL_MANUFACTURER 17 -#define ADSB_COL_OWNER 18 -#define ADSB_COL_OPERATOR_ICAO 19 -#define ADSB_COL_TIME 20 -#define ADSB_COL_FRAMECOUNT 21 -#define ADSB_COL_CORRELATION 22 -#define ADSB_COL_RSSI 23 +#define ADSB_COL_SQUAWK 14 +#define ADSB_COL_REGISTRATION 15 +#define ADSB_COL_COUNTRY 16 +#define ADSB_COL_REGISTERED 17 +#define ADSB_COL_MANUFACTURER 18 +#define ADSB_COL_OWNER 19 +#define ADSB_COL_OPERATOR_ICAO 20 +#define ADSB_COL_TIME 21 +#define ADSB_COL_FRAMECOUNT 22 +#define ADSB_COL_CORRELATION 23 +#define ADSB_COL_RSSI 24 const char *Aircraft::m_speedTypeNames[] = { "GS", "TAS", "IAS" @@ -617,6 +618,7 @@ void ADSBDemodGUI::handleADSB( ui->adsbData->setItem(row, ADSB_COL_LONGITUDE, aircraft->m_longitudeItem); ui->adsbData->setItem(row, ADSB_COL_CATEGORY, aircraft->m_emitterCategoryItem); ui->adsbData->setItem(row, ADSB_COL_STATUS, aircraft->m_statusItem); + ui->adsbData->setItem(row, ADSB_COL_SQUAWK, aircraft->m_squawkItem); ui->adsbData->setItem(row, ADSB_COL_REGISTRATION, aircraft->m_registrationItem); ui->adsbData->setItem(row, ADSB_COL_COUNTRY, aircraft->m_countryItem); ui->adsbData->setItem(row, ADSB_COL_REGISTERED, aircraft->m_registeredItem); @@ -957,12 +959,27 @@ void ADSBDemodGUI::handleADSB( { // Aircraft status int st = data[4] & 0x7; // Subtype - int es = (data[5] >> 5) & 0x7; // Emergency state if (st == 1) + { + int es = (data[5] >> 5) & 0x7; // Emergency state + int modeA = ((data[5] << 8) & 0x1f00) | (data[6] & 0xff); // Mode-A code (squawk) aircraft->m_status = emergencyStatus[es]; - else - aircraft->m_status = QString(""); - aircraft->m_statusItem->setText(aircraft->m_status); + aircraft->m_statusItem->setText(aircraft->m_status); + int a, b, c, d; + c = ((modeA >> 12) & 1) | ((modeA >> (10-1)) & 0x2) | ((modeA >> (8-2)) & 0x4); + a = ((modeA >> 11) & 1) | ((modeA >> (9-1)) & 0x2) | ((modeA >> (7-2)) & 0x4); + b = ((modeA >> 5) & 1) | ((modeA >> (3-1)) & 0x2) | ((modeA << (1)) & 0x4); + d = ((modeA >> 4) & 1) | ((modeA >> (2-1)) & 0x2) | ((modeA << (2)) & 0x4); + aircraft->m_squawk = a*1000 + b*100 + c*10 + d; + if (modeA & 0x40) + aircraft->m_squawkItem->setText(QString("%1 IDENT").arg(aircraft->m_squawk, 4, 10, QLatin1Char('0'))); + else + aircraft->m_squawkItem->setText(QString("%1").arg(aircraft->m_squawk, 4, 10, QLatin1Char('0'))); + } + else if (st == 2) + { + // TCAS/ACAS RA Broadcast + } } else if (tc == 29) { @@ -1872,6 +1889,7 @@ void ADSBDemodGUI::resizeTable() ui->adsbData->setItem(row, ADSB_COL_LONGITUDE, new QTableWidgetItem("-180.00000")); ui->adsbData->setItem(row, ADSB_COL_CATEGORY, new QTableWidgetItem("Heavy")); ui->adsbData->setItem(row, ADSB_COL_STATUS, new QTableWidgetItem("No emergency")); + ui->adsbData->setItem(row, ADSB_COL_SQUAWK, new QTableWidgetItem("Squawk")); ui->adsbData->setItem(row, ADSB_COL_REGISTRATION, new QTableWidgetItem("G-12345")); ui->adsbData->setItem(row, ADSB_COL_COUNTRY, new QTableWidgetItem("Country")); ui->adsbData->setItem(row, ADSB_COL_REGISTERED, new QTableWidgetItem("Registered")); @@ -1897,6 +1915,7 @@ void ADSBDemodGUI::resizeTable() ui->adsbData->removeCellWidget(row, ADSB_COL_LONGITUDE); ui->adsbData->removeCellWidget(row, ADSB_COL_CATEGORY); ui->adsbData->removeCellWidget(row, ADSB_COL_STATUS); + ui->adsbData->removeCellWidget(row, ADSB_COL_SQUAWK); ui->adsbData->removeCellWidget(row, ADSB_COL_REGISTRATION); ui->adsbData->removeCellWidget(row, ADSB_COL_COUNTRY); ui->adsbData->removeCellWidget(row, ADSB_COL_REGISTERED); diff --git a/plugins/channelrx/demodadsb/adsbdemodgui.h b/plugins/channelrx/demodadsb/adsbdemodgui.h index d00c6c961..e62d51334 100644 --- a/plugins/channelrx/demodadsb/adsbdemodgui.h +++ b/plugins/channelrx/demodadsb/adsbdemodgui.h @@ -91,6 +91,7 @@ struct Aircraft { int m_verticalRate; // Vertical climb rate in ft/min QString m_emitterCategory; // Aircraft type QString m_status; // Aircraft status + int m_squawk; // Mode-A code Real m_range; // Distance from station to aircraft Real m_azimuth; // Azimuth from station to aircraft Real m_elevation; // Elevation from station to aicraft; @@ -138,6 +139,7 @@ struct Aircraft { QTableWidgetItem *m_azElItem; QTableWidgetItem *m_emitterCategoryItem; QTableWidgetItem *m_statusItem; + QTableWidgetItem *m_squawkItem; QTableWidgetItem *m_registrationItem; QTableWidgetItem *m_countryItem; QTableWidgetItem *m_registeredItem; @@ -193,6 +195,7 @@ struct Aircraft { m_longitudeItem = new QTableWidgetItem(); m_emitterCategoryItem = new QTableWidgetItem(); m_statusItem = new QTableWidgetItem(); + m_squawkItem = new QTableWidgetItem(); m_registrationItem = new QTableWidgetItem(); m_countryItem = new QTableWidgetItem(); m_registeredItem = new QTableWidgetItem(); diff --git a/plugins/channelrx/demodadsb/adsbdemodgui.ui b/plugins/channelrx/demodadsb/adsbdemodgui.ui index 582c8ba0b..d02baadfc 100644 --- a/plugins/channelrx/demodadsb/adsbdemodgui.ui +++ b/plugins/channelrx/demodadsb/adsbdemodgui.ui @@ -693,6 +693,14 @@ Aircraft emergency status + + + Squawk + + + Mode-A transponder code + + Reg @@ -844,6 +852,11 @@ QWidget
QtQuickWidgets/QQuickWidget
+ + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
RollupWidget QWidget @@ -862,11 +875,6 @@
gui/valuedialz.h
1
- - ButtonSwitch - QToolButton -
gui/buttonswitch.h
-
deltaFrequency diff --git a/plugins/channelrx/demodadsb/readme.md b/plugins/channelrx/demodadsb/readme.md index 34cfecd82..faedb3e33 100644 --- a/plugins/channelrx/demodadsb/readme.md +++ b/plugins/channelrx/demodadsb/readme.md @@ -109,6 +109,7 @@ The table displays the decoded ADS-B data for each aircraft along side data avai * Longitude - Horizontal position coordinate, in decimal degrees. (ADS-B) * Category - The vehicle category, such as Light, Large, Heavy or Rotorcraft. (ADS-B) * Status - The status of the flight, including if there is an emergency. (ADS-B) +* Squawk - The squawk code (Mode-A transponder code). (ADS-B) * Registration - The registration number of the aircraft. (DB) * Country - The flag of the country the aircraft is registered in. (DB) * Registered - The date when the aircraft was registered. (DB)