1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-03-25 21:59:19 -04:00

Merge branch 'f4exb:master' into mac_ci

This commit is contained in:
srcejon 2025-01-22 20:35:49 +00:00 committed by GitHub
commit 2248b42a06
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
49 changed files with 1744 additions and 61 deletions

View File

@ -17,10 +17,18 @@ if (NOT SERVER_MODE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_DIR}")
if(WIN32 AND Qt6_FOUND)
# https://bugreports.qt.io/browse/QTBUG-124589
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINS_RUNTIME_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_RUNTIME_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_RUNTIME_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_RUNTIME_DIR}")
else()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINS_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINS_DIR}")
endif()
else()
if(WIN32)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_RUNTIME_DIR}")
@ -32,10 +40,17 @@ else()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_DIR}")
if(WIN32 AND Qt6_FOUND)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_RUNTIME_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_RUNTIME_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_RUNTIME_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_RUNTIME_DIR}")
else()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BUILD_PLUGINSSRV_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${BUILD_PLUGINSSRV_DIR}")
endif()
endif()
if (ENABLE_CHANNELMIMO)

View File

@ -5935,9 +5935,6 @@ void ADSBDemodGUI::applyImportSettings()
void ADSBDemodGUI::import()
{
QString urlString = "https://";
if (!m_settings.m_importUsername.isEmpty() && !m_settings.m_importPassword.isEmpty()) {
urlString = urlString + m_settings.m_importUsername + ":" + m_settings.m_importPassword + "@";
}
urlString = urlString + m_settings.m_importHost + "/api/states/all";
QChar join = '?';
if (!m_settings.m_importParameters.isEmpty())
@ -5965,7 +5962,13 @@ void ADSBDemodGUI::import()
urlString = urlString + join + "lomax=" + m_settings.m_importMaxLongitude;
join = '&';
}
m_networkManager->get(QNetworkRequest(QUrl(urlString)));
QNetworkRequest request = QNetworkRequest(QUrl(urlString));
if (!m_settings.m_importUsername.isEmpty() && !m_settings.m_importPassword.isEmpty())
{
QByteArray encoded = (m_settings.m_importUsername + ":" + m_settings.m_importPassword).toLocal8Bit().toBase64();
request.setRawHeader("Authorization", "Basic " + encoded);
}
m_networkManager->get(request);
}
// Handle opensky-network API call reply

View File

@ -205,7 +205,7 @@
<file>flags/kazakhstan_mil.bmp</file>
<file>flags/kenya.bmp</file>
<file>flags/kenya_mil.bmp</file>
<file>flags/khazakstan.bmp</file>
<file>flags/kazakhstan.bmp</file>
<file>flags/kiribati.bmp</file>
<file>flags/korea_north.bmp</file>
<file>flags/korea_north_mil.bmp</file>

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -105,7 +105,7 @@ JA,japan
ZJ,jersey
JY,jordan
5Y,kenya
UP,khazakstan
UP,kazakhstan
T3,kiribati
P,korea_north
HL,korea-south

1 prefix country
105 ZJ jersey
106 JY jordan
107 5Y kenya
108 UP khazakstan kazakhstan
109 T3 kiribati
110 P korea_north
111 HL korea-south

View File

@ -133,7 +133,7 @@ As a server:
The Beast binary and Hex formats are as detailed here: https://wiki.jetvision.de/wiki/Mode-S_Beast:Data_Output_Formats
When Enable import is checked, aircraft data for aircraft anywhere in the world can be imported from OpenSky Network.
A username and password are not required, but when specified, this allows the update period to be reduced to 5 seconds instead of 10 seconds.
A username and password are not required, but when specified, this allows the update period to be reduced to 5 seconds instead of 10 seconds, and 4000 API calls per day instead of 400.
To limit network traffic and processing power requirements, a geographical region can be set via the minimum and maximum latitude and longitude fields.
<h3>17: Open Notifications Dialog</h3>

View File

@ -27,10 +27,12 @@ if(NOT SERVER_MODE)
${demoddsc_SOURCES}
dscdemodgui.cpp
dscdemodgui.ui
coaststations.cpp
)
set(demoddsc_HEADERS
${demoddsc_HEADERS}
dscdemodgui.h
coaststations.h
)
set(TARGET_NAME ${PLUGINS_PREFIX}demoddsc)

View File

@ -0,0 +1,798 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Jon Beniston, M7RCE <jon@beniston.com> //
// //
// 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "coaststations.h"
// Map from MMSI to Coast Station Name
// From https://www.itu.int/mmsapp/coaststation/list
const QMap<QString, QString> CoastStations {
{"003311000", "AASIAAT RADIO"},
{"004224102", "ABADAN RADIO"},
{"004224300", "ABBAS RADIO"},
{"004225300", "ABBAS RADIO"},
{"002320004", "ABERDEEN"},
{"006191000", "ABIDJAN RADIO"},
{"004225310", "ABOMUSA RADIO"},
{"003451810", "ACAPULCO, GUERRERO RADIO"},
{"004224311", "AFTAB RADIO"},
{"006052110", "AIN TAYA RADIO"},
{"005251558", "AIR BANGIS RADIO"},
{"002711000", "AKCAKOCA RADIO"},
{"002711000", "AKDAG RADIO"},
{"004030000", "AL BIRK RADIO"},
{"004030000", "AL LITH RADIO"},
{"004030000", "AL QUNFUDHAH RADIO"},
{"004030000", "AL WAJH RADIO"},
{"006221111", "ALEXANDRIA RADIO"},
{"006052110", "ALGER RADIO"},
{"002470064", "ALNG SHORE BASE"},
{"002470063", "ALNG TERMINAL"},
{"005250006", "AMBOINA RADIO / PKE"},
{"004225601", "AMIRABAD RADIO"},
{"002713000", "ANAMUR RADIO"},
{"002470119", "ANCONA RADIO"},
{"007250240", "ANCUD RADIO"},
{"006053814", "ANNABA RADIO"},
{"002713000", "ANTALYA TURK RADIO"},
{"007250050", "ANTOFAGASTA ZONAL RADIO"},
{"002050485", "ANTWERPEN RADIO"},
{"004224500", "ANZALI RADIO"},
{"004225500", "ANZALI RADIO"},
{"004381234", "AQABA COASTAL RADIO STATION/JYO - AQABA PORT CONTROL/JYP"},
{"002633000", "ARGA"},
{"007010111", "ARGENTINA RADIO"},
{"007250010", "ARICA RADIO"},
{"002734414", "ARKHANGELSK RADIO"},
{"002241026", "ARRECIFE RADIO"},
{"004224202", "ASALUYEH RADIO"},
{"004225202", "ASALUYEH RADIO"},
{"002391000", "ASPROPYRGOS ATTIKIS RADIO"},
{"004224501", "ASTARA RADIO"},
{"002731147", "ASTRAKHAN AMP"},
{"002734419", "ASTRAKHAN RADIO MRCC"},
{"002470120", "AUGUSTA RADIO"},
{"002711000", "AYVALIK RADIO"},
{"005743040", "BAC LIEU RADIO"},
{"005741050", "BACH LONG VY RADIO"},
{"007250370", "BAHIA FELIX RADIO"},
{"007250450", "BAHIA FILDES RADIO"},
{"007250470", "BAHIA PARAISO RADIO"},
{"007354753", "BAHIA RADIO"},
{"004224301", "BAHONAR RADIO"},
{"004231000", "BAKU TRAFFIC CONTROL"},
{"004233000", "BAKU TRAFFIC CONTROL"},
{"004234000", "BAKU TRAFFIC CONTROL"},
{"004235000", "BAKU TRAFFIC CONTROL"},
{"004236000", "BAKU TRAFFIC CONTROL"},
{"004237000", "BAKU TRAFFIC CONTROL"},
{"004238000", "BAKU TRAFFIC CONTROL"},
{"004239000", "BAKU TRAFFIC CONTROL"},
{"004232000", "BAKU TRAFFIC CONTROL"},
{"005250009", "BALIKPAPAN RADIO / PKN"},
{"005250087", "BALIKPAPAN RADIO / PKN2"},
{"002711000", "BANDIRMA RADIO"},
{"005671000", "BANGKOK RADIO"},
{"005251520", "BANJARMASIN RADIO / PKG"},
{"002620001", "BAR RADIO"},
{"002620002", "BAR RADIO"},
{"002620003", "BAR RADIO"},
{"002470121", "BARI RADIO"},
{"004123600", "BASUO RADIO"},
{"005250012", "BATU AMPAR RADIO"},
{"005251526", "BAU-BAU RADIO"},
{"004123400", "BEIHAI RADIO"},
{"005250003", "BELAWAN RADIO / PKB"},
{"002320021", "BELFAST"},
{"005741070", "BEN THUY RADIO"},
{"005250088", "BENETE RADIO"},
{"005250034", "BENGKALIS RADIO"},
{"005250062", "BENGKULU RADIO"},
{"005250014", "BENOA RADIO / PKD5"},
{"002723672", "BERDYANSK RADIO"},
{"005250031", "BIAK RADIO / PKY2"},
{"005251516", "BIMA RADIO"},
{"005250026", "BINTUNI RADIO"},
{"005250005", "BITUNG RADIO / PKM"},
{"002713000", "BODRUM RADIO"},
{"005250089", "BONTANG RADIO"},
{"002470094", "BOSA"},
{"002111240", "BREMEN RESCUE RADIO"},
{"003621001", "BRIGAND HILL"},
{"007010001", "BUENOS AIRES PREFECTURA NAVAL RADIO"},
{"002731243", "BUKHTA SEVER KRASNOYARSK/BUKHTA-SEVER"},
{"005330195", "BUKIT ANDRASY"},
{"005330010", "BUKIT BAKAR"},
{"005330009", "BUKIT BESAR"},
{"005330189", "BUKIT KAYU MALAM"},
{"005330185", "BUKIT KELAPA"},
{"005330013", "BUKIT KERATONG"},
{"005330186", "BUKIT LIMA"},
{"005330012", "BUKIT NYABAU"},
{"004402101", "BUSAN/SUHYUP"},
{"004402107", "BUSAN/SUHYUP"},
{"004402111", "BUSAN/SUHYUP"},
{"004224200", "BUSHEHR RADIO"},
{"004225200", "BUSHEHR RADIO"},
{"005743070", "CA MAU RADIO"},
{"002241024", "CABO DE GATA RADIO"},
{"002241026", "CABO DE GATA RADIO"},
{"002241024", "CABO LA NAO RADIO"},
{"002470122", "CAGLIARI RADIO"},
{"007250080", "CALDERA RADIO"},
{"007600125", "CALLAO RADIO"},
{"005742090", "CAM RANH RADIO"},
{"002711000", "CAMLICA RADIO"},
{"005743050", "CAN THO RADIO"},
{"002633020", "CANDEEIROS"},
{"004121203", "CANGZHOU"},
{"004121202", "CAO FEI DIAN"},
{"006010001", "CAPE TOWN RADIO"},
{"007250250", "CASTRO RADIO"},
{"002470095", "CESENATICO"},
{"004224401", "CHABAHAR RADIO"},
{"004225400", "CHABAHAR RADIO"},
{"007250260", "CHAITEN RADIO"},
{"007250070", "CHANARAL RADIO"},
{"007600135", "CHANCAY RADIO"},
{"006052111", "CHERCHELL RADIO"},
{"003451120", "CHETUMAL, QUINTANA ROO RADIO"},
{"007600126", "CHIMBOTE RADIO"},
{"005250033", "CIGADING RADIO"},
{"005250030", "CILACAP RADIO / PKR3"},
{"005250089", "CILACAP RADIO / PKR6"},
{"005250032", "CIREBON RADIO"},
{"003450710", "CIUDAD DEL CARMEN, CAMPECHE RADIO"},
{"002470123", "CIVITAVECCHIA RADIO"},
{"003621111", "COAST GUARD CONTROL"},
{"003621112", "COAST GUARD CONTROL"},
{"003621113", "COAST GUARD CONTROL"},
{"003621114", "COAST GUARD CONTROL"},
{"003621117", "COAST GUARD CONTROL"},
{"003621118", "COAST GUARD CONTROL"},
{"003621119", "COAST GUARD CONTROL"},
{"003621120", "COAST GUARD CONTROL"},
{"003450320", "COATZACOALCOS, VERACRUZ RADIO"},
{"002713000", "COBANDEDE RADIO"},
{"007010008", "COMODORO RIVADAVIA PREFECTURA NAVAL RADIO"},
{"005743060", "CON DAO RADIO"},
{"007250150", "CONSTITUCION RADIO"},
{"007250110", "COQUIMBO RADIO"},
{"007250210", "CORRAL RADIO"},
{"002241022", "CORUNA RADIO"},
{"003451110", "COZUMEL, QUINTANA ROO RADIO"},
{"002470124", "CROTONE RADIO"},
{"005741020", "CUA ONG RADIO"},
{"005742010", "CUA VIET RADIO"},
{"002091000", "CYPRUS RADIO"},
{"005742030", "DA NANG RADIO"},
{"005251559", "DABO SINGKEP RADIO"},
{"004121300", "DALIAN RADIO"},
{"004030000", "DAMMAM RADIO"},
{"004224203", "DAYER RADIO"},
{"004225203", "DAYER RADIO"},
{"002734427", "DE KASTRI TERMINAL"},
{"002734447", "DE-KASTRI KHAB/DE-KASTRI-RADIOCENTR"},
{"007250390", "DELGADA RADIO"},
{"006052112", "DELLYS RADIO"},
{"004224205", "DEYLAM RADIO"},
{"004225205", "DEYLAM RADIO"},
{"007250440", "DIEGO RAMIREZ RADIO"},
{"002712000", "DIKMENTEPE RADIO"},
{"002731107", "DIKSON TAO"},
{"002733717", "DIKSON TAO"},
{"002713000", "DILEKTEPE RADIO"},
{"006211000", "DJIBOUTI RADIO"},
{"004661010", "DOHA RADIO"},
{"004121402", "DONG YING RADIO"},
{"004402606", "DONGHAE/SUHYUP"},
{"004402607", "DONGHAE/SUHYUP"},
{"002320010", "DOVER"},
{"004030000", "DUBA RADIO"},
{"002380300", "DUBROVNIK RADIO"},
{"005250004", "DUMAI RADIO / PKP"},
{"005250083", "DUMAI RADIO / PKP4"},
{"005742040", "DUNG QUAT RADIO"},
{"002712000", "DUTMEN RADIO"},
{"007300301", "ECTVM - BARRANQUILLA - CP03"},
{"007300101", "ECTVM - BUENAVENTURA- CP01"},
{"007300501", "ECTVM - CARTAGENA - CP05"},
{"007300901", "ECTVM - COVEÑAS - CP09"},
{"007300401", "ECTVM - SANTA MARTA - CP04"},
{"007300201", "ECTVM - TUMACO - CP02"},
{"007300801", "ECTVM - TURBO - CP08"},
{"004700000", "EMIRATES RADIO"},
{"004701001", "EMIRATES RESCUE (JRCCAD)"},
{"005251517", "ENDE RADIO / PKD20"},
{"003450210", "ENSENADA, BAJA CALIFORNIA RADIO"},
{"007354752", "ESMERALDAS RADIO"},
{"002734422", "EYSK RADIO CENTR/EYSK-RADIO-CENTR"},
{"005250026", "FAK-FAK RADIO"},
{"002320014", "FALMOUTH"},
{"007250235", "FARO CORONA RADIO"},
{"007250400", "FARO DUNGENESS RADIO"},
{"007250410", "FARO ESPIRITU SANTO RADIO"},
{"007250350", "FARO EVANGELISTAS RADIO"},
{"007250360", "FARO FAIRWAY RADIO"},
{"007250290", "FARO GUAFO RADIO"},
{"007250310", "FARO RAPER RADIO"},
{"002633090", "FIGUEIRA DA FOZ"},
{"002241022", "FINISTERRE RADIO"},
{"002633050", "FOIA"},
{"002633010", "FREITA"},
{"003621001", "FRENCH FORT"},
{"004122600", "FUZHOU RADIO"},
{"005330190", "GEBENG"},
{"004224206", "GENAVEH RADIO"},
{"004225206", "GENAVEH RADIO"},
{"002470125", "GENOVA RADIO"},
{"006054119", "GHAZAOUET RADIO"},
{"002361001", "GIBRALTAR PORT AUTHORITY"},
{"002734468", "GORKI LEN"},
{"002733700", "GORKI LEN"},
{"006191000", "GRAND LAHOU RADIO"},
{"004123100", "GUANGZHOU RADIO"},
{"007354750", "GUAYAQUIL RADIO"},
{"004400201", "GUNSAN RADIO"},
{"004400501", "GUNSAN RADIO"},
{"004403501", "GUNSAN RADIO"},
{"004402501", "GUNSAN/SUHYUP"},
{"004402502", "GUNSAN/SUHYUP"},
{"004402503", "GUNSAN/SUHYUP"},
{"004402504", "GUNSAN/SUHYUP"},
{"005330003", "GUNUNG BRINCHANG"},
{"005330001", "GUNUNG JERAI"},
{"005330005", "GUNUNG LEDANG"},
{"005251556", "GUNUNG SITOLI RADIO / PKB29"},
{"005743090", "HA TIEN RADIO"},
{"005741040", "HAI PHONG RADIO"},
{"003160016", "HALIFAX COAST GUARD RADIO"},
{"004310601", "HIROSHIMA COAST GUARD RADIO"},
{"004030000", "HMB (AZIZYA) RADIO"},
{"005743030", "HO CHI MINH RADIO"},
{"004310101", "HOKKAIDO COAST GUARD RADIO"},
{"002320018", "HOLYHEAD"},
{"005741030", "HON GAI RADIO"},
{"005741080", "HON LA RADIO"},
{"003669993", "HONOLULU"},
{"002510100", "HORNAFJOERDUR RADIO"},
{"007600128", "HUACHO RADIO"},
{"007250090", "HUASCO RADIO"},
{"005742020", "HUE RADIO"},
{"002320007", "HUMBER"},
{"007600132", "ILO RADIO"},
{"004400003", "INCHEON RADIO"},
{"004400004", "INCHEON RADIO"},
{"004403001", "INCHEON RADIO"},
{"004402001", "INCHEON/SUHYUP"},
{"004402002", "INCHEON/SUHYUP"},
{"004402003", "INCHEON/SUHYUP"},
{"004402004", "INCHEON/SUHYUP"},
{"002712000", "INEBOLU RADIO"},
{"003160023", "IQALUIT COAST GUARD RADIO"},
{"007250020", "IQUIQUE RADIO"},
{"007600133", "IQUITOS RADIO"},
{"002510100", "ISAFJOERDUR RADIO"},
{"002711000", "ISTANBUL TURK RADIO"},
{"002715000", "IZMIR TURK RADIO"},
{"005250000", "JAKARTA RADIO / PKX"},
{"005250086", "JAKARTA RADIO / PKX2"},
{"005251510", "JAMBI RADIO"},
{"004225308", "JASK RADIO"},
{"005250007", "JAYAPURA RADIO / PNK"},
{"004030000", "JEDDAH RADIO"},
{"004400701", "JEJU RADIO"},
{"004400702", "JEJU RADIO"},
{"004403701", "JEJU RADIO"},
{"004402701", "JEJU/SUHYUP"},
{"004402702", "JEJU/SUHYUP"},
{"004402703", "JEJU/SUHYUP"},
{"005251583", "JEPARA RADIO"},
{"002470096", "JESOLO"},
{"004126620", "JIANGYIN RADIO"},
{"004030000", "JIZAN RADIO"},
{"005030001", "JRCC AUSTRALIA"},
{"003061000", "JRCC CURACAO/DUTCH CARIBBEAN COAST GUARD"},
{"002653000", "JRCC SWEDEN"},
{"002760100", "JRCC TALLINN"},
{"007250130", "JUAN FERNANDEZ RADIO"},
{"004030000", "JUBAIL RADIO"},
{"004402602", "JUMOONJIN/SUHYUP"},
{"004402604", "JUMOONJIN/SUHYUP"},
{"004311001", "KAGOSHIMA COAST GUARD RADIO"},
{"005251514", "KALIANGET RADIO"},
{"002731188", "KAMENNYY C YNAO"},
{"002731198", "KAMENNYY C YNAO"},
{"004400602", "KANGNUNG RADIO"},
{"004400603", "KANGNUNG RADIO"},
{"004400604", "KANGNUNG RADIO"},
{"005251582", "KARIMUNJAWA RADIO"},
{"002711000", "KARTEPE RADIO"},
{"002711000", "KAYALIDAG RADIO"},
{"002713000", "KAZAKIN RADIO"},
{"005330008", "KEMUNING"},
{"005250019", "KENDARI RADIO / PKF3"},
{"005251503", "KETAPANG RADIO"},
{"004030000", "KHAFJI RADIO"},
{"004224201", "KHARK RADIO"},
{"004225201", "KHARK RADIO"},
{"002734429", "KHOLMSK RADIO"},
{"004225100", "KHOMEINI RADIO"},
{"004224103", "KHORMUSA RADIO"},
{"004224101", "KHORRAMSHAHR RADIO"},
{"004225101", "KHORRAMSHAHR RADIO"},
{"005743080", "KIEN GIANG RADIO"},
{"004224303", "KISH RADIO"},
{"002770330", "KLAIPEDA RESCUE RADIO"},
{"004310501", "KOBE COAST GUARD RADIO"},
{"003669899", "KODIAK RADIO"},
{"005251575", "KOLAKA RADIO"},
{"006221112", "KOSSEIR RADIO"},
{"006191000", "KOUAKRO RADIO"},
{"002734417", "KRASNOE KAL/KALININGRAD RADIO-SKC"},
{"005330007", "KUALA ROMPIN"},
{"005251504", "KUALA TANJUNG RADIO"},
{"005251511", "KUALA TUNGKAL RADIO"},
{"005251522", "KUMAI RADIO"},
{"005250010", "KUPANG RADIO / PKK"},
{"005259991", "KWANDANG RADIO"},
{"003160022", "LABRADOR COAST GUARD RADIO"},
{"002470126", "LAMPEDUSA RADIO"},
{"002241026", "LAS PALMAS RADIO"},
{"004680011", "LATTAKIA RADIO"},
{"004224204", "LAVAR RADIO"},
{"004225204", "LAVAR RADIO"},
{"003451610", "LAZARO CARDENAS, MICHOACAN RADIO"},
{"005250022", "LEMBAR RADIO / PKD3"},
{"004224302", "LENGEH RADIO"},
{"003160026", "LES ESCOUMINS COAST GUARD RADIO"},
{"004122300", "LIANYUNGANG RADIO"},
{"002470127", "LIVORNO RADIO"},
{"002050480", "LOMBARDSIJDE RADIO"},
{"002320063", "LONDON COASTGUARD"},
{"007250120", "LOS VILOS RADIO"},
{"005330011", "LOWER SERAPI"},
{"005250005", "LUWUK RADIO"},
{"005742050", "LY SON RADIO"},
{"002191000", "LYNGBY RADIO"},
{"002241022", "MACHICHACO RADIO"},
{"002712000", "MACKA R/L"},
{"002241022", "MADRID RADIO"},
{"002734416", "MAGADAN 4"},
{"007250380", "MAGALLANES ZONAL RADIO"},
{"002711000", "MAHYADAG RADIO"},
{"004310801", "MAIZURU COAST GUARD RADIO"},
{"005250002", "MAKASSAR RADIO / PKF"},
{"002734423", "MAKHACHKALA DAG/MAHACHKALA-RADIOCENTR"},
{"002734489", "MAKHACHKALA DAG/MAHACHKALA-RADIOCENTR"},
{"002150100", "MALTA RADIO"},
{"005251529", "MANADO RADIO"},
{"007100003", "MANAUS-RADIO (VALDIR LEAL)"},
{"005250023", "MANOKWARI RADIO"},
{"007354754", "MANTA RADIO"},
{"003451410", "MANZANILLO, COLIMA RADIO"},
{"007010003", "MAR DEL PLATA PREFECTURA NAVAL RADIO"},
{"007010221", "MAR DEL PLATA RADIO"},
{"002723650", "MARIUPOL RSC"},
{"002713000", "MARKIZ RADIO"},
{"005251518", "MAUMERE RADIO"},
{"006452700", "MAURITIUS RADIO"},
{"002470128", "MAZARA DEL VALLO RADIO"},
{"003450810", "MAZATLAN, SINALOA RADIO"},
{"007250040", "MEJILLONES RADIO"},
{"005030126", "MELBOURNE (SANDRINGHAM)"},
{"007250280", "MELINKA RADIO"},
{"005251518", "MENENG RADIO"},
{"005250021", "MERAUKE RADIO"},
{"002470129", "MESSINA RADIO"},
{"002320017", "MILFORD HAVEN"},
{"003660003", "MOBILE, ALABAMA RADIO / WLO"},
{"004310701", "MOJI COAST GUARD RADIO"},
{"004400304", "MOKPO RADIO"},
{"004400307", "MOKPO RADIO"},
{"004400308", "MOKPO RADIO"},
{"004400309", "MOKPO RADIO"},
{"004400310", "MOKPO RADIO"},
{"004403301", "MOKPO RADIO"},
{"004402301", "MOKPO/SUHYUP"},
{"004402302", "MOKPO/SUHYUP"},
{"004402305", "MOKPO/SUHYUP"},
{"004402308", "MOKPO/SUHYUP"},
{"004402309", "MOKPO/SUHYUP"},
{"004402310", "MOKPO/SUHYUP"},
{"004402311", "MOKPO/SUHYUP"},
{"004402312", "MOKPO/SUHYUP"},
{"007600129", "MOLLENDO RADIO"},
{"005741010", "MONG CAI RADIO"},
{"002633060", "MONTE FIGO"},
{"002633030", "MONTE FUNCHAL"},
{"007703870", "MONTEVIDEO ARMADA RADIO"},
{"006054118", "MOSTAGANEM RADIO"},
{"005061411", "MRCC AYEYARWADY"},
{"004194401", "MRCC CHENNAI"},
{"002275300", "MRCC CORSEN"},
{"006631008", "MRCC DAKAR"},
{"002275000", "MRCC ETEL"},
{"002275010", "MRCC ETEL"},
{"002130100", "MRCC GEORGIA"},
{"002275100", "MRCC GRIS-NEZ"},
{"004773500", "MRCC HONG KONG"},
{"002275200", "MRCC JOBOURG"},
{"002275400", "MRCC LA GARDE"},
{"002630100", "MRCC LISBOA"},
{"002633040", "MRCC LISBOA"},
{"004550191", "MRCC MALE"},
{"004192203", "MRCC MUMBAI"},
{"005401000", "MRCC NOUMEA"},
{"005461000", "MRCC PAPEETE"},
{"002040100", "MRCC PONTA DELGADA"},
{"004194409", "MRCC PORT BLAIR"},
{"006601000", "MRCC REUNION"},
{"002470010", "MRCC ROMA"},
{"002301000", "MRCC TURKU"},
{"002050480", "MRCC-OOSTENDE RADIO"},
{"002059981", "MRCC-OOSTENDE RADIO"},
{"002275420", "MRSC AJACCIO"},
{"002470017", "MRSC ANCONA"},
{"004192209", "MRSC ANDROTH"},
{"002470016", "MRSC BARI"},
{"004192205", "MRSC BEYPORE"},
{"002470023", "MRSC CAGLIARI"},
{"004194408", "MRSC CAMPBELL BAY"},
{"002470021", "MRSC CATANIA"},
{"004192203", "MRSC DAHANU"},
{"004192201", "MRSC DAMAN"},
{"004194407", "MRSC DIGLIPUR"},
{"004194404", "MRSC FRAZERGANJ"},
{"002470011", "MRSC GENOVA"},
{"004192206", "MRSC GOA"},
{"004194403", "MRSC GOPALPUR"},
{"004194404", "MRSC HALDIA"},
{"002302000", "MRSC HELSINKI"},
{"004194409", "MRSC HUTBAY"},
{"004192208", "MRSC JAKHAU"},
{"004194402", "MRSC KAKINADA"},
{"004194408", "MRSC KAMORTA"},
{"004194405", "MRSC KARAIKAL"},
{"004192204", "MRSC KARWAR"},
{"004192209", "MRSC KAVARATTI"},
{"004192205", "MRSC KOCHI"},
{"004194402", "MRSC KRISHNAPATNAM"},
{"002470012", "MRSC LIVORNO"},
{"002500100", "MRSC MALIN HEAD RADIO"},
{"004194406", "MRSC MANDAPAM"},
{"004194407", "MRSC MAYABUNDAR"},
{"004192209", "MRSC MINICOY"},
{"004192207", "MRSC MUNDRA"},
{"004192203", "MRSC MURUD JANJIRA"},
{"002470014", "MRSC NAPOLI"},
{"004192204", "MRSC NEW MANGALORE"},
{"004194402", "MRSC NIZAMPATNAM"},
{"004192207", "MRSC OKHA"},
{"002470022", "MRSC PALERMO"},
{"004194403", "MRSC PARADIP"},
{"004192207", "MRSC PIPAVAV"},
{"004192202", "MRSC PORBANDAR"},
{"004194401", "MRSC PUDUCHERRY"},
{"004192203", "MRSC RATNAGIRI"},
{"002470018", "MRSC RAVENNA"},
{"002470015", "MRSC REGGIO CALABRIA"},
{"002470013", "MRSC ROMA"},
{"002470020", "MRSC TRIESTE"},
{"004194405", "MRSC TUTICORIN"},
{"004192210", "MRSC VADINAR"},
{"002500200", "MRSC VALENTIA RADIO"},
{"002470019", "MRSC VENEZIA"},
{"004192207", "MRSC VERAVAL"},
{"004194402", "MRSC VISHAKHAPATNAM"},
{"004192205", "MRSC VIZHINJAM"},
{"005250546", "MUNTOK RADIO"},
{"002734441", "MURMANSK RADIO 30"},
{"002734420", "MURMANSK RADIO MRCC"},
{"005060200", "MYEIK RADIO"},
{"004310401", "NAGOYA COAST GUARD RADIO"},
{"002470130", "NAPOLI RADIO"},
{"002500300", "NATIONAL MARITIME OPERATIONS CENTRE (MRCC DUBLIN)"},
{"005251505", "NATUNA RADIO"},
{"006459022", "NCG"},
{"004224602", "NEKA RADIO"},
{"005330183", "NENASI"},
{"002510100", "NESKAUPSTADUR RADIO"},
{"002442000", "NETHERLANDS COAST GUARD RADIO"},
{"005742080", "NHA TRANG RADIO"},
{"004310901", "NIIGATA COAST GUARD RADIO"},
{"004122400", "NINGBO RADIO"},
{"003621001", "NORTH POST RADIO STATION"},
{"002570000", "NORWEGIAN COASTAL RADIO NORTH"},
{"002570300", "NORWEGIAN COASTAL RADIO, SOUTH"},
{"002570000", "NORWEGIAN COASTAL RADIO, SOUTH"},
{"002731223", "NOVAYA ZEMLYA ARKH/NOVAYA ZEMLYA-RADIO"},
{"002734411", "NOVOROSSIYSK RADIO MRCC/NOVOROSSIYSK-RADIO-SKC"},
{"004224600", "NOWSHAHR RADIO"},
{"004225600", "NOWSHAHR RADIO"},
{"004030000", "OBHUR RADIO"},
{"002723660", "ODESSA MRCC"},
{"004311101", "OKINAWA COAST GUARD RADIO"},
{"002371000", "OLYMPIA RADIO NOC"},
{"004610013", "OMAN COAST RADIO/A4A20 (MUSCAT)"},
{"004610014", "OMAN COAST RADIO/A4A21 (SALALAH)"},
{"004610015", "OMAN COAST RADIO/A4A22 (KHASAB)"},
{"004610016", "OMAN COAST RADIO/A4A23 (ASHKARAH)"},
{"006054117", "ORAN RADIO"},
{"002713000", "OREN RADIO"},
{"002734426", "ORLAN RADIO"},
{"007600121", "PAITA RADIO"},
{"002713000", "PALAMUT RADIO"},
{"005251507", "PALEMBANG RADIO"},
{"002470002", "PALERMO RADIO"},
{"002241024", "PALMA RADIO"},
{"005250071", "PALOPO RADIO"},
{"005251508", "PANGKAL BALAM RADIO"},
{"005250013", "PANJANG RADIO / PKC4"},
{"005250018", "PANTOLOAN RADIO"},
{"005251525", "PARE-PARE RADIO / PKF23"},
{"007250100", "PASCUA ZONAL RADIO"},
{"002712000", "PAZAR RADIO"},
{"005330192", "PENGERANG"},
{"002470131", "PESCARA RADIO"},
{"002734418", "PETROPAVLOVSK-KAMCHATSKIY"},
{"002731117", "PEVEK CHAO"},
{"002733730", "PEVEK CHAO"},
{"005742100", "PHAN RANG RADIO"},
{"005743010", "PHAN THIET RADIO"},
{"005743110", "PHU QUOC RADIO"},
{"005742070", "PHU YEN RADIO"},
{"002633040", "PICOTO"},
{"007600123", "PIMENTEL RADIO"},
{"002392000", "PIRAEUS RADIO"},
{"007600130", "PISCO RADIO"},
{"003160019", "PLACENTIA COAST GUARD RADIO"},
{"005250084", "PLAJU RADIO"},
{"002734442", "PLASTUN RADIO"},
{"004400401", "POHANG RADIO"},
{"004400402", "POHANG RADIO"},
{"004403401", "POHANG RADIO"},
{"004402402", "POHANG/SUHYUP"},
{"003621001", "POINT FORTIN"},
{"002618102", "POLISH RESCUE RADIO"},
{"002633100", "PONTA DO ALTAR"},
{"005250016", "PONTIANAK RADIO / PKS"},
{"003160018", "PORT AUX BASQUES COAST GUARD RADIO"},
{"004702007", "PORT OF FUJAIRAH"},
{"004702008", "PORT OF FUJAIRAH"},
{"006221113", "PORT SAID RADIO"},
{"002470132", "PORTO CERVO RADIO"},
{"002470097", "PORTO NOGARO"},
{"002470133", "PORTO TORRES RADIO"},
{"002470098", "PORTOSCUSO"},
{"005251527", "POSO RADIO"},
{"003160029", "PRESCOTT COAST GUARD RADIO"},
{"003160013", "PRINCE RUPERT COAST GUARD RADIO"},
{"003450910", "PROGRESO, YUCATAN RADIO"},
{"007250294", "PUERTO AGUIRRE RADIO"},
{"007354757", "PUERTO AYORA RADIO"},
{"007250300", "PUERTO AYSEN RADIO"},
{"007354756", "PUERTO BOLIVAR RADIO"},
{"007250298", "PUERTO CHACABUCO RADIO"},
{"007250330", "PUERTO EDEN RADIO"},
{"007250230", "PUERTO MONTT ZONAL RADIO"},
{"007250340", "PUERTO NATALES RADIO"},
{"003451210", "PUERTO VALLARTA, JALISCO RADIO"},
{"007250420", "PUERTO WILLIAMS RADIO"},
{"005330006", "PULAU TIOMAN"},
{"007600134", "PUNO RADIO"},
{"004400101", "PUSAN RADIO"},
{"004400103", "PUSAN RADIO"},
{"004400104", "PUSAN RADIO"},
{"004400105", "PUSAN RADIO"},
{"004400106", "PUSAN RADIO"},
{"004403102", "PUSAN RADIO"},
{"004122200", "QINGDAO RADIO"},
{"004121200", "QINHUANGDAO RADIO"},
{"003160027", "QUEBEC COAST GUARD RADIO"},
{"007250270", "QUELLON RADIO"},
{"004224304", "QUESHM RADIO"},
{"007250125", "QUINTERO RADIO"},
{"005742060", "QUY NHON RADIO"},
{"004030000", "RABIGH RADIO"},
{"002733728", "RADUZHNYY MAGADAN"},
{"003669991", "RCC BOSTON"},
{"004401002", "RCC DONGHAE"},
{"004401001", "RCC INCHEON"},
{"004401005", "RCC JEJU"},
{"003669997", "RCC MIAMI"},
{"004401004", "RCC NAMHAE"},
{"003669998", "RCC NEW ORLEANS"},
{"003669992", "RCC SAN JUAN"},
{"004401003", "RCC SEOHAE"},
{"007100002", "RECIFE BONGI"},
{"002510100", "REYKJAVIK RADIO"},
{"004122201", "RI ZHAO"},
{"002750100", "RIGA RESCUE RADIO"},
{"002380200", "RIJEKA RADIO"},
{"007100001", "RIO DE JANEIRO (SANTA CRUZ)"},
{"007010010", "RIO GALLEGOS PREFECTURA NAVAL RADIO"},
{"006341000", "RMRCC MOMBASA"},
{"002470001", "ROMA RADIO"},
{"003621001", "RUNNEMEDE"},
{"007250140", "S. ANTONIO RADIO"},
{"002470134", "S. BENEDETTO DEL TRONTO RADIO"},
{"007600131", "S. JUAN RADIO"},
{"007250320", "S. PEDRO RADIO"},
{"002733700", "S. PETERSBURG RADIO MRCC"},
{"005251501", "SABANG RADIO / PKA4"},
{"002731177", "SABETTA PT YNAO"},
{"002731187", "SABETTA PT YNAO"},
{"002731197", "SABETTA PT YNAO"},
{"002733733", "SAKHALIN RADIO SPC"},
{"007600124", "SALAVERRY RADIO"},
{"007354755", "SALINAS RADIO"},
{"005251524", "SAMARINDA RADIO / PKN6"},
{"004402106", "SAMCHEONPO/SUHYUP"},
{"004402112", "SAMCHEONPO/SUHYUP"},
{"005251521", "SAMPIT RADIO"},
{"002712000", "SAMSUN TURK RADIO"},
{"007010006", "SAN BLAS PREFECTURA NAVAL RADIO"},
{"003669990", "SAN FRANCISCO"},
{"005250025", "SANANA RADIO"},
{"006191000", "SAN-PEDRO RADIO"},
{"004123700", "SANYA RADIO"},
{"002711000", "SARKOY RADIO"},
{"003160030", "SARNIA COAST GUARD RADIO"},
{"006191000", "SASSANDRA RADIO"},
{"005251531", "SAUMLAKI RADIO"},
{"005250029", "SEI KOLAK KIJANG RADIO"},
{"005250090", "SEI PAKNING RADIO"},
{"005250008", "SEMARANG RADIO / PKR"},
{"004400002", "SEOUL RADIO"},
{"004122100", "SHANGHAI RADIO"},
{"004123200", "SHANTOU RADIO"},
{"004123106", "SHENZHEN RADIO"},
{"002320001", "SHETLAND"},
{"004310201", "SHIOGAMA COAST GUARD RADIO"},
{"004030000", "SHUAIBA RADIO"},
{"004030000", "SHUQAIQ RADIO"},
{"005250028", "SIBOLGA RADIO / PKB3"},
{"002510100", "SIGLUFJOERDUR RADIO"},
{"005630002", "SINGAPORE PORT OPERATIONS CONTROL"},
{"002734417", "SINYAVINO KLN/KALININGRAD-1"},
{"005250047", "SIPORA RADIO"},
{"002731108", "SOCHI AKHUN MTN KRAS"},
{"004402603", "SOKCHO/SUHYUP"},
{"002320011", "SOLENT"},
{"005250011", "SORONG RADIO / PKY4"},
{"002380100", "SPLIT RADIO"},
{"003751001", "ST. VINCENT AND THE GRENADINES COAST GUARD"},
{"005330196", "STESEN PANTAI KUALA MUDA"},
{"005330188", "STESEN PEMANCAR PERMATANG PAUH, P. PINANG"},
{"005330184", "STESEN PEMANCAR STAPOK"},
{"005330193", "STESEN PEMANCAR TUARAN"},
{"005330199", "STESEN PENERIMAAN RADIO TANJUNG ARU"},
{"005330200", "STESEN PENERIMAAN SEMANTAN"},
{"005330198", "STESEN SATELLITE BUMI BESERAH"},
{"002320024", "STORNOWAY"},
{"007600127", "SUPE RADIO"},
{"005250001", "SURABAYA RADIO / PKD"},
{"002733733", "SVOBODNYY SAKH"},
{"003160017", "SYDNEY COAST GUARD RADIO"},
{"006191000", "TABOU RADIO"},
{"004402201", "TAEAN/SUHYUP"},
{"004402202", "TAEAN/SUHYUP"},
{"004402203", "TAEAN/SUHYUP"},
{"004402204", "TAEAN/SUHYUP"},
{"002734487", "TAGANROG RADIO"},
{"002734487", "TAGANROG ROST/TAGANROG-RADIO-1"},
{"005250024", "TAHUNA RADIO"},
{"007600122", "TALARA RADIO"},
{"007250170", "TALCAHUANO ZONAL RADIO"},
{"002761000", "TALLINN RADIO"},
{"007250060", "TALTAL RADIO"},
{"003450110", "TAMPICO, TAMAULIPAS RADIO"},
{"005330187", "TANJUNG LOBANG"},
{"005251506", "TANJUNG UBAN RADIO / PKJ"},
{"005251502", "TAPAK TUAN RADIO"},
{"005250017", "TARAKAN RADIO / PKO"},
{"002241026", "TARIFA RADIO"},
{"004680012", "TARTOUS RADIO"},
{"005120010", "TAUPO MARITIME RADIO"},
{"005251513", "TEGAL RADIO / PKR26"},
{"005251075", "TELUK BAYUR RADIO / PKP20"},
{"005250075", "TELUK BAYUR RADIO / PKV"},
{"005250094", "TEMBILAHAN RADIO"},
{"006052113", "TENES RADIO"},
{"005250020", "TERNATE RADIO / PKE5"},
{"002470099", "TERRASINI"},
{"005330014", "TG TARAS"},
{"005741060", "THANH HOA RADIO"},
{"005743100", "THO CHU RADIO"},
{"004121100", "TIANJIN RADIO"},
{"002734449", "TIKSI MRSC"},
{"002731196", "TIKSI-3 YAK"},
{"002733718", "TIKSI-3 YAK"},
{"004225309", "TIYAB RADIO"},
{"007250030", "TOCOPILLA RADIO"},
{"004310001", "TOKYO COAST GUARD RADIO"},
{"005251528", "TOLI-TOLI RADIO"},
{"004402105", "TONGYEONG/SUHYUP"},
{"004402108", "TONGYEONG/SUHYUP"},
{"004402109", "TONGYEONG/SUHYUP"},
{"004402110", "TONGYEONG/SUHYUP"},
{"002311000", "TORSHAVN RADIO"},
{"002470135", "TRIESTE RADIO"},
{"005330194", "TRIG HILL"},
{"005251530", "TUAL RADIO"},
{"002734413", "TUAPSE KRAS/TUAPSE-CENTR"},
{"002300230", "TURKU RADIO"},
{"002734448", "UGOLNYE KOPI 3-Y CHAO/MARIYA-RADIO"},
{"002731178", "UGOLNYE KOPI CHAO"},
{"004402404", "ULLENG/SUHYUP"},
{"004402405", "ULLENG/SUHYUP"},
{"004402406", "ULLENG/SUHYUP"},
{"004400403", "ULREUNG RADIO"},
{"004400404", "ULREUNG RADIO"},
{"004400102", "ULSAN RADIO"},
{"004402102", "ULSAN/SUHYUP"},
{"004402104", "ULSAN/SUHYUP"},
{"005330004", "ULU KALI"},
{"004030000", "UMM LAJJ RADIO"},
{"007250220", "VALDIVIA RADIO"},
{"007251860", "VALPARAISO PLAYA ANCHA RADIO"},
{"002734421", "VANINO RADIO"},
{"002070810", "VARNA RADIO"},
{"003450310", "VERACRUZ, VERACRUZ RADIO"},
{"002770090", "VESSEL TRAFFIC MONITORING"},
{"002770100", "VESSEL TRAFFIC MONITORING"},
{"002770110", "VESSEL TRAFFIC MONITORING"},
{"002770120", "VESSEL TRAFFIC MONITORING"},
{"002770130", "VESSEL TRAFFIC MONITORING"},
{"002510100", "VESTMANNAEYJAR RADIO"},
{"002633070", "VIANA DO CASTELO"},
{"003160011", "VICTORIA COAST GUARD RADIO"},
{"002734412", "VLADIVOSTOCK RADIO MRCC"},
{"005743020", "VUNG TAU RADIO"},
{"002734451", "VYSOTSK LEN"},
{"005788020", "WALLIS RADIO"},
{"004121403", "WEI FANG"},
{"004121404", "WEIHAI"},
{"004402403", "WHOPO/SUHYUP"},
{"004402407", "WHOPO/SUHYUP"},
{"004403408", "WHOPO/SUHYUP"},
{"007250430", "WOLLASTON RADIO"},
{"004122700", "XIAMEN RADIO"},
{"004030000", "YANBU RADIO"},
{"005060100", "YANGON RADIO"},
{"004121400", "YANTAI RADIO"},
{"004400305", "YEOSU RADIO"},
{"004400306", "YEOSU RADIO"},
{"004402303", "YEOSU/SUHYUP"},
{"004402304", "YEOSU/SUHYUP"},
{"004402307", "YEOSU/SUHYUP"},
{"002712000", "YILDIZTEPE RADIO"},
{"004310301", "YOKOHAMA COAST GUARD RADIO"},
{"002713000", "YUMRUTEPE RADIO"},
{"002711000", "YUSA RADIO"},
{"002050480", "ZEEBRUGGE RADIO"},
{"004123300", "ZHANJIANG RADIO"},
{"004125725", "ZHANJIANG RADIO"},
{"002712000", "ZONGULDAK RADIO"},
{"007600120", "ZORRITOS RADIO"},
// Not from ITU database
{"004472188", "KUWAIT"},
{"002241078", "MADRID RADIO"},
{"002640570", "CONSTANTA RADIO"},
{"004280001", "HAIFA RADIO"},
{"004634060", "MRCC KARACHI"}
};

View File

@ -0,0 +1,25 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Jon Beniston, M7RCE <jon@beniston.com> //
// //
// 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_COASTSTATIONS_H
#define INCLUDE_COASTSTATIONS_H
#include <QMap>
extern const QMap<QString, QString> CoastStations;
#endif /* INCLUDE_COASTSTATIONS_H */

View File

@ -27,6 +27,7 @@
#include <QDesktopServices>
#include "dscdemodgui.h"
#include "coaststations.h"
#include "device/deviceuiset.h"
#include "device/deviceset.h"
@ -325,6 +326,13 @@ void DSCDemodGUI::messageReceived(const DSCMessage& message, int errors, float r
ui->messages->scrollToBottom();
}
if (CoastStations.contains(message.m_address)) {
addressNameItem->setText(CoastStations.value(message.m_address));
}
if (CoastStations.contains(message.m_selfId)) {
selfIdNameItem->setText(CoastStations.value(message.m_selfId));
}
// Get latest APRS.fi data to calculate distance
if (m_aprsFi && message.m_valid)
{

View File

@ -881,8 +881,8 @@ RemoteTCPProtocol::Device RemoteTCPSinkSink::getDevice()
void RemoteTCPSinkSink::acceptWebConnection()
{
QMutexLocker mutexLocker(&m_mutex);
QWebSocket *client = m_webSocketServer->nextPendingConnection();
QMutexLocker mutexLocker(&m_mutex);
QWebSocket *client = m_webSocketServer->nextPendingConnection();
connect(client, &QWebSocket::binaryMessageReceived, this, &RemoteTCPSinkSink::processCommand);
connect(client, &QWebSocket::disconnected, this, &RemoteTCPSinkSink::disconnected);
@ -891,8 +891,11 @@ void RemoteTCPSinkSink::acceptWebConnection()
// https://bugreports.qt.io/browse/QTBUG-125874
QTimer::singleShot(200, this, [this, client] () {
QMutexLocker mutexLocker(&m_mutex);
m_clients.append(new WebSocket(client));
acceptConnection(m_clients.last());
if (client->isValid())
{
m_clients.append(new WebSocket(client));
acceptConnection(m_clients.last());
}
});
}
@ -912,8 +915,11 @@ void RemoteTCPSinkSink::acceptTCPConnection()
QTimer::singleShot(200, this, [this, client] () {
QMutexLocker mutexLocker(&m_mutex);
m_clients.append(new TCPSocket(client));
acceptConnection(m_clients.last());
if (client->isValid())
{
m_clients.append(new TCPSocket(client));
acceptConnection(m_clients.last());
}
});
}

View File

@ -128,7 +128,7 @@ void AMModSource::pullOne(Sample& sample)
void AMModSource::prefetch(unsigned int nbSamples)
{
auto nbSamplesAudio = (nbSamples * (unsigned int) ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
unsigned int nbSamplesAudio = (unsigned int) (nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
pullAudio(nbSamplesAudio);
}

View File

@ -119,7 +119,7 @@ void NFMModSource::pullOne(Sample& sample)
void NFMModSource::prefetch(unsigned int nbSamples)
{
unsigned int nbSamplesAudio = (nbSamples * (unsigned int) ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
unsigned int nbSamplesAudio = (unsigned int) (nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
pullAudio(nbSamplesAudio);
}

View File

@ -68,6 +68,7 @@ SSBMod::SSBMod(DeviceAPI *deviceAPI) :
m_basebandSource->setSpectrumSink(&m_spectrumVis);
m_basebandSource->setInputFileStream(&m_ifstream);
m_basebandSource->setChannel(this);
m_basebandSource->setCWKeyer(&m_cwKeyer);
m_basebandSource->moveToThread(m_thread);
applySettings(m_settings, true);

View File

@ -131,7 +131,7 @@ void SSBModSource::pullOne(Sample& sample)
void SSBModSource::prefetch(unsigned int nbSamples)
{
unsigned int nbSamplesAudio = (nbSamples * (unsigned int) ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
unsigned int nbSamplesAudio = (unsigned int) (nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
pullAudio(nbSamplesAudio);
}

View File

@ -191,7 +191,7 @@ void WFMModSource::modulateAudio()
void WFMModSource::prefetch(unsigned int nbSamples)
{
unsigned int nbSamplesAudio = nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate);
unsigned int nbSamplesAudio = (unsigned int) (nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
pullAudio(nbSamplesAudio);
}

View File

@ -190,6 +190,8 @@ RadiosondeGUI::RadiosondeGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, F
// Get updated when position changes
connect(&MainCore::instance()->getSettings(), &MainSettings::preferenceChanged, this, &RadiosondeGUI::preferenceChanged);
connect(&m_positionUpdateTimer, &QTimer::timeout, this, &RadiosondeGUI::updatePosition);
m_positionUpdateTimer.setSingleShot(true);
ui->radiosondes->setItemDelegateForColumn(RADIOSONDE_COL_LATITUDE, new DecimalDelegate(5, ui->radiosondes));
ui->radiosondes->setItemDelegateForColumn(RADIOSONDE_COL_LONGITUDE, new DecimalDelegate(5, ui->radiosondes));
@ -979,22 +981,41 @@ QStringList RadiosondeGUI::getRadios()
void RadiosondeGUI::updatePosition()
{
// Limit number of position updates sent to SondeHub
const int updateTime = m_settings.m_mobile ? m_minMobilePositionUpdateTime : m_minFixedPositionUpdateTime;
if (m_sondeHub && m_settings.m_displayPosition)
{
float stationLatitude = MainCore::instance()->getSettings().getLatitude();
float stationLongitude = MainCore::instance()->getSettings().getLongitude();
float stationAltitude = MainCore::instance()->getSettings().getAltitude();
if (!m_lastPositionUpdate.isValid() || (m_lastPositionUpdate.secsTo(QDateTime::currentDateTime()) >= updateTime))
{
float stationLatitude = MainCore::instance()->getSettings().getLatitude();
float stationLongitude = MainCore::instance()->getSettings().getLongitude();
float stationAltitude = MainCore::instance()->getSettings().getAltitude();
m_sondeHub->updatePosition(
m_settings.m_callsign,
stationLatitude,
stationLongitude,
stationAltitude,
getRadios().join(" "),
m_settings.m_antenna,
m_settings.m_email,
m_settings.m_mobile
);
m_sondeHub->updatePosition(
m_settings.m_callsign,
stationLatitude,
stationLongitude,
stationAltitude,
getRadios().join(" "),
m_settings.m_antenna,
m_settings.m_email,
m_settings.m_mobile
);
m_positionUpdateTimer.stop();
m_lastPositionUpdate = QDateTime::currentDateTime();
}
else
{
qint64 msecs = (updateTime * 1000) - m_lastPositionUpdate.msecsTo(QDateTime::currentDateTime());
if (msecs < 0) {
msecs = 0;
}
m_positionUpdateTimer.setInterval(msecs);
m_positionUpdateTimer.start();
}
}
}

View File

@ -103,6 +103,10 @@ private:
QMenu *radiosondesMenu; // Column select context menu
SondeHub *m_sondeHub;
QDateTime m_lastPositionUpdate;
QTimer m_positionUpdateTimer;
static const int m_minMobilePositionUpdateTime = 30; // In seconds
static const int m_minFixedPositionUpdateTime = 5 * 60;
explicit RadiosondeGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *feature, QWidget* parent = nullptr);
virtual ~RadiosondeGUI();

View File

@ -2396,8 +2396,11 @@ void SIDGUI::readCSV(const QString& filename, bool autoload)
if (CSV::readRow(in, &colNames))
{
QList<ChannelMeasurement *> measurements;
for (int i = 0; i < colNames.size() - 1; i++) {
QList<int> measurementIdx;
for (int i = 0; i < colNames.size() - 1; i++)
{
measurements.append(nullptr);
measurementIdx.append(-1);
}
for (int i = 1; i < colNames.size(); i++)
{
@ -2439,7 +2442,8 @@ void SIDGUI::readCSV(const QString& filename, bool autoload)
} else {
id = name;
}
measurements[i-1] = &addMeasurements(id);
addMeasurements(id);
measurementIdx[i-1] = m_channelMeasurements.size() - 1;
// Create settings, if we don't have them
SIDSettings::ChannelSettings *channelSettings = m_settings.getChannelSettings(id);
@ -2482,7 +2486,11 @@ void SIDGUI::readCSV(const QString& filename, bool autoload)
if (!valueStr.isEmpty())
{
double value = valueStr.toDouble();
measurements[i]->append(dateTime, value, false);
if (measurements[i]) {
measurements[i]->append(dateTime, value, false);
} else {
m_channelMeasurements[measurementIdx[i]].append(dateTime, value, false);
}
}
}
}

View File

@ -123,3 +123,10 @@ This label turns green when data has been transmitted to the device.
- **D**: turns red if stream experiences packet drop outs
The stream warning indicators are reset when the acquisition is started.
<h2>GPIOs</h2>
The USRP device settings supports 8-bit `gpioDir` and `gpioPins` settings. These can be set via the Web API or Simple PTT feature.
`gpioDir` can be set to 0 for default ATR (automatic transmit/receive) functionality or 1 for GPIO output.
On the b210, the GPIOs are on J504 header. Bit 0 corresponds to pin 1.
On other USRP devices, that may have multiple GPIO banks, these settings correspond to bank `FP0` (Front panel).

View File

@ -813,6 +813,25 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, const QList<Q
}
}
if (settingsKeys.contains("gpioDir") || force)
{
if (m_deviceShared.m_deviceParams->getDevice())
{
m_deviceShared.m_deviceParams->getDevice()->set_gpio_attr("FP0", "CTRL", ~settings.m_gpioDir, 0xff); // 0 for GPIO, 1 for ATR
m_deviceShared.m_deviceParams->getDevice()->set_gpio_attr("FP0", "DDR", settings.m_gpioDir, 0xff); // 0 for input, 1 for output
qDebug() << "USRPOutput::applySettings: set GPIO dir to " << settings.m_gpioDir;
}
}
if (settingsKeys.contains("gpioPins") || force)
{
if (m_deviceShared.m_deviceParams->getDevice())
{
m_deviceShared.m_deviceParams->getDevice()->set_gpio_attr("FP0", "OUT", settings.m_gpioPins, 0xff);
qDebug() << "USRPOutput::applySettings: set GPIO pins to " << settings.m_gpioPins;
}
}
if (settingsKeys.contains("useReverseAPI"))
{
bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) ||
@ -1036,6 +1055,12 @@ void USRPOutput::webapiUpdateDeviceSettings(
if (deviceSettingsKeys.contains("transverterMode")) {
settings.m_transverterMode = response.getUsrpOutputSettings()->getTransverterMode() != 0;
}
if (deviceSettingsKeys.contains("gpioDir")) {
settings.m_gpioDir = response.getUsrpOutputSettings()->getGpioDir();
}
if (deviceSettingsKeys.contains("gpioPins")) {
settings.m_gpioPins = response.getUsrpOutputSettings()->getGpioPins();
}
if (deviceSettingsKeys.contains("useReverseAPI")) {
settings.m_useReverseAPI = response.getUsrpOutputSettings()->getUseReverseApi() != 0;
}
@ -1072,6 +1097,8 @@ void USRPOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& resp
response.getUsrpOutputSettings()->setLpfBw(settings.m_lpfBW);
response.getUsrpOutputSettings()->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency);
response.getUsrpOutputSettings()->setTransverterMode(settings.m_transverterMode ? 1 : 0);
response.getUsrpOutputSettings()->setGpioDir(settings.m_gpioDir);
response.getUsrpOutputSettings()->setGpioPins(settings.m_gpioPins);
response.getUsrpOutputSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
if (response.getUsrpOutputSettings()->getReverseApiAddress()) {
@ -1172,6 +1199,12 @@ void USRPOutput::webapiReverseSendSettings(const QList<QString>& deviceSettingsK
if (deviceSettingsKeys.contains("transverterMode") || force) {
swgUsrpOutputSettings->setTransverterMode(settings.m_transverterMode ? 1 : 0);
}
if (deviceSettingsKeys.contains("gpioDir") || force) {
swgUsrpOutputSettings->setGpioDir(settings.m_gpioDir);
}
if (deviceSettingsKeys.contains("gpioPins") || force) {
swgUsrpOutputSettings->setGpioPins(settings.m_gpioPins);
}
QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings")
.arg(settings.m_reverseAPIAddress)

View File

@ -40,6 +40,8 @@ void USRPOutputSettings::resetToDefaults()
m_clockSource = "internal";
m_transverterMode = false;
m_transverterDeltaFrequency = 0;
m_gpioDir = 0;
m_gpioPins = 0;
m_useReverseAPI = false;
m_reverseAPIAddress = "127.0.0.1";
m_reverseAPIPort = 8888;
@ -63,6 +65,8 @@ QByteArray USRPOutputSettings::serialize() const
s.writeU32(11, m_reverseAPIPort);
s.writeU32(12, m_reverseAPIDeviceIndex);
s.writeS32(13, m_loOffset);
s.writeU32(14, m_gpioDir);
s.writeU32(15, m_gpioPins);
return s.final();
}
@ -102,6 +106,10 @@ bool USRPOutputSettings::deserialize(const QByteArray& data)
d.readU32(12, &uintval, 0);
m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval;
d.readS32(13, &m_loOffset, 0);
d.readU32(14, &uintval, 0);
m_gpioDir = uintval & 0xFF;
d.readU32(15, &uintval, 0);
m_gpioPins = uintval & 0xFF;
return true;
}
@ -148,6 +156,12 @@ void USRPOutputSettings::applySettings(const QStringList& settingsKeys, const US
if (settingsKeys.contains("transverterDeltaFrequency")) {
m_transverterDeltaFrequency = settings.m_transverterDeltaFrequency;
}
if (settingsKeys.contains("gpioDir")) {
m_gpioDir = settings.m_gpioDir;
}
if (settingsKeys.contains("gpioPins")) {
m_gpioPins = settings.m_gpioPins;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
@ -199,6 +213,12 @@ QString USRPOutputSettings::getDebugString(const QStringList& settingsKeys, bool
if (settingsKeys.contains("transverterDeltaFrequency") || force) {
ostr << " m_transverterDeltaFrequency: " << m_transverterDeltaFrequency;
}
if (settingsKeys.contains("gpioDir") || force) {
ostr << " m_gpioDir: " << (int) m_gpioDir;
}
if (settingsKeys.contains("gpioPins") || force) {
ostr << " m_gpioPins: " << (int) m_gpioPins;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}

View File

@ -45,6 +45,8 @@ struct USRPOutputSettings
QString m_clockSource;
bool m_transverterMode;
qint64 m_transverterDeltaFrequency;
uint8_t m_gpioDir; //!< GPIO pin direction; 0 ATR (automatic transmit/receive), 1 output
uint8_t m_gpioPins; //!< GPIO pins levels for outputs
bool m_useReverseAPI;
QString m_reverseAPIAddress;
uint16_t m_reverseAPIPort;

View File

@ -143,3 +143,10 @@ On Ubuntu 20, the libuhd-dev package should be installed. The FPGA images then n
```shell
sudo /usr/lib/uhd/utils/uhd_images_downloader.py
```
<h2>GPIOs</h2>
The USRP device settings supports 8-bit `gpioDir` and `gpioPins` settings. These can be set via the Web API or Simple PTT feature.
`gpioDir` can be set to 0 for default ATR (automatic transmit/receive) functionality or 1 for GPIO output.
On the b210, the GPIOs are on J504 header. Bit 0 corresponds to pin 1.
On other USRP devices, that may have multiple GPIO banks, these settings correspond to bank `FP0` (Front panel).

View File

@ -895,6 +895,25 @@ bool USRPInput::applySettings(const USRPInputSettings& settings, const QList<QSt
}
}
if (settingsKeys.contains("gpioDir") || force)
{
if (m_deviceShared.m_deviceParams->getDevice())
{
m_deviceShared.m_deviceParams->getDevice()->set_gpio_attr("FP0", "CTRL", ~settings.m_gpioDir, 0xff); // 0 for GPIO, 1 for ATR
m_deviceShared.m_deviceParams->getDevice()->set_gpio_attr("FP0", "DDR", settings.m_gpioDir, 0xff); // 0 for input, 1 for output
qDebug() << "USRPInput::applySettings: set GPIO dir to " << settings.m_gpioDir;
}
}
if (settingsKeys.contains("gpioPins") || force)
{
if (m_deviceShared.m_deviceParams->getDevice())
{
m_deviceShared.m_deviceParams->getDevice()->set_gpio_attr("FP0", "OUT", settings.m_gpioPins, 0xff);
qDebug() << "USRPInput::applySettings: set GPIO pins to " << settings.m_gpioPins;
}
}
if (settingsKeys.contains("useReverseAPI"))
{
bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) ||
@ -1162,6 +1181,12 @@ void USRPInput::webapiUpdateDeviceSettings(
if (deviceSettingsKeys.contains("transverterMode")) {
settings.m_transverterMode = response.getUsrpInputSettings()->getTransverterMode() != 0;
}
if (deviceSettingsKeys.contains("gpioDir")) {
settings.m_gpioDir = response.getUsrpInputSettings()->getGpioDir();
}
if (deviceSettingsKeys.contains("gpioPins")) {
settings.m_gpioPins = response.getUsrpInputSettings()->getGpioPins();
}
if (deviceSettingsKeys.contains("useReverseAPI")) {
settings.m_useReverseAPI = response.getUsrpInputSettings()->getUseReverseApi() != 0;
}
@ -1191,6 +1216,8 @@ void USRPInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& respo
response.getUsrpInputSettings()->setLpfBw(settings.m_lpfBW);
response.getUsrpInputSettings()->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency);
response.getUsrpInputSettings()->setTransverterMode(settings.m_transverterMode ? 1 : 0);
response.getUsrpInputSettings()->setGpioDir(settings.m_gpioDir);
response.getUsrpInputSettings()->setGpioPins(settings.m_gpioPins);
response.getUsrpInputSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
if (response.getUsrpInputSettings()->getReverseApiAddress()) {
@ -1311,6 +1338,12 @@ void USRPInput::webapiReverseSendSettings(const QList<QString>& deviceSettingsKe
if (deviceSettingsKeys.contains("transverterMode") || force) {
swgUsrpInputSettings->setTransverterMode(settings.m_transverterMode ? 1 : 0);
}
if (deviceSettingsKeys.contains("gpioDir") || force) {
swgUsrpInputSettings->setGpioDir(settings.m_gpioDir);
}
if (deviceSettingsKeys.contains("gpioPins") || force) {
swgUsrpInputSettings->setGpioPins(settings.m_gpioPins);
}
QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings")
.arg(settings.m_reverseAPIAddress)

View File

@ -46,6 +46,8 @@ void USRPInputSettings::resetToDefaults()
m_replayLength = 20.0f;
m_replayStep = 5.0f;
m_replayLoop = false;
m_gpioDir = 0;
m_gpioPins = 0;
m_useReverseAPI = false;
m_reverseAPIAddress = "127.0.0.1";
m_reverseAPIPort = 8888;
@ -76,6 +78,8 @@ QByteArray USRPInputSettings::serialize() const
s.writeFloat(18, m_replayLength);
s.writeFloat(19, m_replayStep);
s.writeBool(20, m_replayLoop);
s.writeU32(21, m_gpioDir);
s.writeU32(22, m_gpioPins);
return s.final();
}
@ -124,6 +128,10 @@ bool USRPInputSettings::deserialize(const QByteArray& data)
d.readFloat(18, &m_replayLength, 20.0f);
d.readFloat(19, &m_replayStep, 5.0f);
d.readBool(20, &m_replayLoop, false);
d.readU32(21, &uintval, 0);
m_gpioDir = uintval & 0xFF;
d.readU32(22, &uintval, 0);
m_gpioPins = uintval & 0xFF;
return true;
}
@ -191,6 +199,12 @@ void USRPInputSettings::applySettings(const QStringList& settingsKeys, const USR
if (settingsKeys.contains("replayLoop")) {
m_replayLoop = settings.m_replayLoop;
}
if (settingsKeys.contains("gpioDir")) {
m_gpioDir = settings.m_gpioDir;
}
if (settingsKeys.contains("gpioPins")) {
m_gpioPins = settings.m_gpioPins;
}
if (settingsKeys.contains("useReverseAPI")) {
m_useReverseAPI = settings.m_useReverseAPI;
}
@ -263,6 +277,12 @@ QString USRPInputSettings::getDebugString(const QStringList& settingsKeys, bool
if (settingsKeys.contains("replayLoop") || force) {
ostr << " m_replayLoop: " << m_replayLoop;
}
if (settingsKeys.contains("gpioDir") || force) {
ostr << " m_gpioDir: " << (int) m_gpioDir;
}
if (settingsKeys.contains("gpioPins") || force) {
ostr << " m_gpioPins: " << (int) m_gpioPins;
}
if (settingsKeys.contains("useReverseAPI") || force) {
ostr << " m_useReverseAPI: " << m_useReverseAPI;
}

View File

@ -52,10 +52,12 @@ struct USRPInputSettings
QString m_clockSource;
bool m_transverterMode;
qint64 m_transverterDeltaFrequency;
float m_replayOffset; //!< Replay offset in seconds
float m_replayOffset; //!< Replay offset in seconds
float m_replayLength; //!< Replay buffer size in seconds
float m_replayStep; //!< Replay forward/back step size in seconds
bool m_replayLoop; //!< Replay buffer repeatedly without recording new data
uint8_t m_gpioDir; //!< GPIO pin direction; 0 ATR (automatic transmit/receive), 1 output
uint8_t m_gpioPins; //!< GPIO pins levels for outputs
bool m_useReverseAPI;
QString m_reverseAPIAddress;
uint16_t m_reverseAPIPort;

View File

@ -1319,9 +1319,15 @@ bool ChannelWebAPIUtils::patchDeviceSetting(unsigned int deviceIndex, const QStr
SWGSDRangel::SWGErrorResponse errorResponse2;
delete jsonObj;
DeviceSampleSource *source = deviceSet->m_deviceAPI->getSampleSource();
httpRC = source->webapiSettingsPutPatch(false, deviceSettingsKeys, deviceSettingsResponse, *errorResponse2.getMessage());
if (DeviceSampleSource *source = deviceSet->m_deviceAPI->getSampleSource()) {
httpRC = source->webapiSettingsPutPatch(false, deviceSettingsKeys, deviceSettingsResponse, *errorResponse2.getMessage());
} else if (DeviceSampleSink *sink = deviceSet->m_deviceAPI->getSampleSink()) {
httpRC = sink->webapiSettingsPutPatch(false, deviceSettingsKeys, deviceSettingsResponse, *errorResponse2.getMessage());
} else if (DeviceSampleMIMO *mimo = deviceSet->m_deviceAPI->getSampleMIMO()) {
httpRC = mimo->webapiSettingsPutPatch(false, deviceSettingsKeys, deviceSettingsResponse, *errorResponse2.getMessage());
} else {
httpRC = 404;
}
if (httpRC/100 == 2)
{

View File

@ -20,12 +20,42 @@
#include "SWGFeatureActions.h"
#include "SWGMapActions.h"
#include "SWGPERTesterActions.h"
#include "SWGDeviceState.h"
#include "maincore.h"
#include "feature/featureset.h"
#include "feature/feature.h"
#include "featurewebapiutils.h"
// Start feature
bool FeatureWebAPIUtils::run(int featureSetIndex, int featureIndex)
{
Feature *feature = FeatureWebAPIUtils::getFeature(featureSetIndex, featureIndex, "");
if (feature != nullptr)
{
SWGSDRangel::SWGDeviceState runResponse;
QString errorResponse;
int httpRC;
runResponse.setState(new QString());
httpRC = feature->webapiRun(true, runResponse, errorResponse);
if (httpRC/100 != 2)
{
qWarning("FeatureWebAPIUtils::run: run error %d: %s",
httpRC, qPrintable(errorResponse));
return false;
}
return true;
}
else
{
qWarning("FeatureWebAPIUtils::run: no feature F%d:%d", featureSetIndex, featureIndex);
return false;
}
}
// Find the specified target on the map
bool FeatureWebAPIUtils::mapFind(const QString& target, int featureSetIndex, int featureIndex)
{

View File

@ -47,6 +47,7 @@ private slots:
class SDRBASE_API FeatureWebAPIUtils
{
public:
static bool run(int featureSetIndex, int featureIndex);
static bool mapFind(const QString& target, int featureSetIndex=-1, int featureIndex=-1);
static bool mapSetDateTime(const QDateTime& dateTime, int featureSetIndex=-1, int featureIndex=-1);
static bool skyMapFind(const QString& target, int featureSetIndex=-1, int featureIndex=-1);

View File

@ -42,7 +42,8 @@ MainParser::MainParser() :
m_remoteTCPSinkPortOption("remote-tcp-port", "Remote TCP Sink port (Default 1234).", "port", "1234"),
m_remoteTCPSinkHWTypeOption("remote-tcp-hwtype", "Remote TCP Sink device hardware type (Optional. E.g. RTLSDR/SDRplayV3/AirspyHF).", "hwtype"),
m_remoteTCPSinkSerialOption("remote-tcp-serial", "Remote TCP Sink device serial (Optional).", "serial"),
m_listDevicesOption("list-devices", "List available physical devices.")
m_listDevicesOption("list-devices", "List available physical devices."),
m_startOption("start", "Start all devices and features")
{
m_serverAddress = ""; // Bind to any address
@ -56,6 +57,7 @@ MainParser::MainParser() :
m_remoteTCPSinkHWType = "";
m_remoteTCPSinkSerial = "";
m_listDevices = false;
m_start = false;
m_parser.setApplicationDescription("Software Defined Radio application");
m_parser.addHelpOption();
@ -72,6 +74,7 @@ MainParser::MainParser() :
m_parser.addOption(m_remoteTCPSinkHWTypeOption);
m_parser.addOption(m_remoteTCPSinkSerialOption);
m_parser.addOption(m_listDevicesOption);
m_parser.addOption(m_startOption);
}
MainParser::~MainParser()
@ -154,4 +157,8 @@ void MainParser::parse(const QCoreApplication& app)
qCritical() << "You must specify a device with either --remote-tcp-hwtype or --remote-tcp-serial";
exit (EXIT_FAILURE);
}
// Start devices and features
m_start = m_parser.isSet(m_startOption);
}

View File

@ -45,6 +45,7 @@ public:
const QString& getRemoteTCPSinkHWType() const { return m_remoteTCPSinkHWType; }
const QString& getRemoteTCPSinkSerial() const { return m_remoteTCPSinkSerial; }
bool getListDevices() const { return m_listDevices; }
bool getStart() const { return m_start; }
private:
QString m_serverAddress;
@ -58,6 +59,7 @@ private:
QString m_remoteTCPSinkHWType;
QString m_remoteTCPSinkSerial;
bool m_listDevices;
bool m_start;
QCommandLineParser m_parser;
QCommandLineOption m_serverAddressOption;
@ -71,6 +73,7 @@ private:
QCommandLineOption m_remoteTCPSinkHWTypeOption;
QCommandLineOption m_remoteTCPSinkSerialOption;
QCommandLineOption m_listDevicesOption;
QCommandLineOption m_startOption;
};

View File

@ -13451,6 +13451,18 @@ margin-bottom: 20px;
"properties" : {
"sampleRate" : {
"type" : "integer"
},
"latitude" : {
"type" : "number",
"format" : "float"
},
"longitude" : {
"type" : "number",
"format" : "float"
},
"altitude" : {
"type" : "number",
"format" : "float"
}
},
"description" : "RemoteTCPInput"
@ -16824,6 +16836,14 @@ margin-bottom: 20px;
"type" : "integer",
"format" : "int64"
},
"gpioDir" : {
"type" : "integer",
"format" : "int8"
},
"gpioPins" : {
"type" : "integer",
"format" : "int8"
},
"useReverseAPI" : {
"type" : "integer",
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
@ -16893,6 +16913,14 @@ margin-bottom: 20px;
"type" : "integer",
"format" : "int64"
},
"gpioDir" : {
"type" : "integer",
"format" : "int8"
},
"gpioPins" : {
"type" : "integer",
"format" : "int8"
},
"useReverseAPI" : {
"type" : "integer",
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
@ -59441,7 +59469,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2024-07-16T23:20:27.082+02:00
Generated 2024-12-24T11:56:24.260+01:00
</div>
</div>
</div>

View File

@ -61,3 +61,12 @@ RemoteTCPInputReport:
properties:
sampleRate:
type: integer
latitude:
type: number
format: float
longitude:
type: number
format: float
altitude:
type: number
format: float

View File

@ -30,6 +30,12 @@ USRPInputSettings:
transverterDeltaFrequency:
type: integer
format: int64
gpioDir:
type: integer
format: int8
gpioPins:
type: integer
format: int8
useReverseAPI:
description: Synchronize with reverse API (1 for yes, 0 for no)
type: integer
@ -65,6 +71,12 @@ USRPOutputSettings:
transverterDeltaFrequency:
type: integer
format: int64
gpioDir:
type: integer
format: int8
gpioPins:
type: integer
format: int8
useReverseAPI:
description: Synchronize with reverse API (1 for yes, 0 for no)
type: integer

View File

@ -72,6 +72,7 @@ QHash<QString, const float *> ColorMap::m_colorMaps{
{"Cubehlx2", &m_cubehlx2[0]},
{"Icy", &m_icy[0]},
{"Mint", &m_mint[0]},
{"A.C.A.B.", &m_acab[0]},
};
const float ColorMap::m_angel[m_size] =
@ -7102,3 +7103,263 @@ const float ColorMap::m_mint[m_size] =
0.999, 0.997, 0.995,
1.000, 1.000, 1.000,
};
const float ColorMap::m_acab[m_size] =
{
0.00000, 0.00000, 0.00000,
0.01042, 0.01042, 0.01042,
0.02083, 0.02083, 0.02083,
0.03125, 0.03125, 0.03125,
0.04167, 0.04167, 0.04167,
0.05208, 0.05208, 0.05208,
0.06250, 0.06250, 0.06250,
0.07292, 0.07292, 0.07292,
0.08333, 0.08333, 0.08333,
0.09375, 0.09375, 0.09375,
0.10417, 0.10417, 0.10417,
0.11458, 0.11458, 0.11458,
0.12500, 0.12500, 0.12500,
0.13542, 0.13542, 0.13542,
0.14583, 0.14583, 0.14583,
0.15625, 0.15625, 0.15625,
0.16667, 0.16667, 0.16667,
0.17708, 0.17708, 0.17708,
0.18750, 0.18750, 0.18750,
0.19792, 0.19792, 0.19792,
0.20833, 0.20833, 0.20833,
0.21875, 0.21875, 0.21875,
0.22917, 0.22917, 0.22917,
0.23958, 0.23958, 0.23958,
0.25000, 0.25000, 0.25000,
0.26042, 0.26042, 0.26042,
0.27083, 0.27083, 0.27083,
0.28125, 0.28125, 0.28125,
0.29167, 0.29167, 0.29167,
0.30208, 0.30208, 0.30208,
0.31250, 0.31250, 0.31250,
0.32292, 0.32292, 0.32292,
0.33333, 0.33333, 0.33333,
0.32292, 0.32292, 0.35417,
0.31250, 0.31250, 0.37500,
0.30208, 0.30208, 0.39583,
0.29167, 0.29167, 0.41667,
0.28125, 0.28125, 0.43750,
0.27083, 0.27083, 0.45833,
0.26042, 0.26042, 0.47917,
0.25000, 0.25000, 0.50000,
0.23958, 0.23958, 0.52083,
0.22917, 0.22917, 0.54167,
0.21875, 0.21875, 0.56250,
0.20833, 0.20833, 0.58333,
0.19792, 0.19792, 0.60417,
0.18750, 0.18750, 0.62500,
0.17708, 0.17708, 0.64583,
0.16667, 0.16667, 0.66667,
0.15625, 0.15625, 0.68750,
0.14583, 0.14583, 0.70833,
0.13542, 0.13542, 0.72917,
0.12500, 0.12500, 0.75000,
0.11458, 0.11458, 0.77083,
0.10417, 0.10417, 0.79167,
0.09375, 0.09375, 0.81250,
0.08333, 0.08333, 0.83333,
0.07292, 0.07292, 0.85417,
0.06250, 0.06250, 0.87500,
0.05208, 0.05208, 0.89583,
0.04167, 0.04167, 0.91667,
0.03125, 0.03125, 0.93750,
0.02083, 0.02083, 0.95833,
0.01042, 0.01042, 0.97917,
0.00000, 0.00000, 1.00000,
0.00000, 0.03125, 1.00000,
0.00000, 0.06250, 1.00000,
0.00000, 0.09375, 1.00000,
0.00000, 0.12500, 1.00000,
0.00000, 0.15625, 1.00000,
0.00000, 0.18750, 1.00000,
0.00000, 0.21875, 1.00000,
0.00000, 0.25000, 1.00000,
0.00000, 0.28125, 1.00000,
0.00000, 0.31250, 1.00000,
0.00000, 0.34375, 1.00000,
0.00000, 0.37500, 1.00000,
0.00000, 0.40625, 1.00000,
0.00000, 0.43750, 1.00000,
0.00000, 0.46875, 1.00000,
0.00000, 0.50000, 1.00000,
0.00000, 0.53125, 1.00000,
0.00000, 0.56250, 1.00000,
0.00000, 0.59375, 1.00000,
0.00000, 0.62500, 1.00000,
0.00000, 0.65625, 1.00000,
0.00000, 0.68750, 1.00000,
0.00000, 0.71875, 1.00000,
0.00000, 0.75000, 1.00000,
0.00000, 0.78125, 1.00000,
0.00000, 0.81250, 1.00000,
0.00000, 0.84375, 1.00000,
0.00000, 0.87500, 1.00000,
0.00000, 0.90625, 1.00000,
0.00000, 0.93750, 1.00000,
0.00000, 0.96875, 1.00000,
0.00000, 1.00000, 1.00000,
0.00000, 1.00000, 0.96875,
0.00000, 1.00000, 0.93750,
0.00000, 1.00000, 0.90625,
0.00000, 1.00000, 0.87500,
0.00000, 1.00000, 0.84375,
0.00000, 1.00000, 0.81250,
0.00000, 1.00000, 0.78125,
0.00000, 1.00000, 0.75000,
0.00000, 1.00000, 0.71875,
0.00000, 1.00000, 0.68750,
0.00000, 1.00000, 0.65625,
0.00000, 1.00000, 0.62500,
0.00000, 1.00000, 0.59375,
0.00000, 1.00000, 0.56250,
0.00000, 1.00000, 0.53125,
0.00000, 1.00000, 0.50000,
0.00000, 1.00000, 0.46875,
0.00000, 1.00000, 0.43750,
0.00000, 1.00000, 0.40625,
0.00000, 1.00000, 0.37500,
0.00000, 1.00000, 0.34375,
0.00000, 1.00000, 0.31250,
0.00000, 1.00000, 0.28125,
0.00000, 1.00000, 0.25000,
0.00000, 1.00000, 0.21875,
0.00000, 1.00000, 0.18750,
0.00000, 1.00000, 0.15625,
0.00000, 1.00000, 0.12500,
0.00000, 1.00000, 0.09375,
0.00000, 1.00000, 0.06250,
0.00000, 1.00000, 0.03125,
0.00000, 1.00000, 0.00000,
0.03125, 1.00000, 0.00000,
0.06250, 1.00000, 0.00000,
0.09375, 1.00000, 0.00000,
0.12500, 1.00000, 0.00000,
0.15625, 1.00000, 0.00000,
0.18750, 1.00000, 0.00000,
0.21875, 1.00000, 0.00000,
0.25000, 1.00000, 0.00000,
0.28125, 1.00000, 0.00000,
0.31250, 1.00000, 0.00000,
0.34375, 1.00000, 0.00000,
0.37500, 1.00000, 0.00000,
0.40625, 1.00000, 0.00000,
0.43750, 1.00000, 0.00000,
0.46875, 1.00000, 0.00000,
0.50000, 1.00000, 0.00000,
0.53125, 1.00000, 0.00000,
0.56250, 1.00000, 0.00000,
0.59375, 1.00000, 0.00000,
0.62500, 1.00000, 0.00000,
0.65625, 1.00000, 0.00000,
0.68750, 1.00000, 0.00000,
0.71875, 1.00000, 0.00000,
0.75000, 1.00000, 0.00000,
0.78125, 1.00000, 0.00000,
0.81250, 1.00000, 0.00000,
0.84375, 1.00000, 0.00000,
0.87500, 1.00000, 0.00000,
0.90625, 1.00000, 0.00000,
0.93750, 1.00000, 0.00000,
0.96875, 1.00000, 0.00000,
1.00000, 1.00000, 0.00000,
1.00000, 0.96875, 0.00000,
1.00000, 0.93750, 0.00000,
1.00000, 0.90625, 0.00000,
1.00000, 0.87500, 0.00000,
1.00000, 0.84375, 0.00000,
1.00000, 0.81250, 0.00000,
1.00000, 0.78125, 0.00000,
1.00000, 0.75000, 0.00000,
1.00000, 0.71875, 0.00000,
1.00000, 0.68750, 0.00000,
1.00000, 0.65625, 0.00000,
1.00000, 0.62500, 0.00000,
1.00000, 0.59375, 0.00000,
1.00000, 0.56250, 0.00000,
1.00000, 0.53125, 0.00000,
1.00000, 0.50000, 0.00000,
1.00000, 0.46875, 0.00000,
1.00000, 0.43750, 0.00000,
1.00000, 0.40625, 0.00000,
1.00000, 0.37500, 0.00000,
1.00000, 0.34375, 0.00000,
1.00000, 0.31250, 0.00000,
1.00000, 0.28125, 0.00000,
1.00000, 0.25000, 0.00000,
1.00000, 0.21875, 0.00000,
1.00000, 0.18750, 0.00000,
1.00000, 0.15625, 0.00000,
1.00000, 0.12500, 0.00000,
1.00000, 0.09375, 0.00000,
1.00000, 0.06250, 0.00000,
1.00000, 0.03125, 0.00000,
1.00000, 0.00000, 0.00000,
1.00000, 0.00000, 0.03125,
1.00000, 0.00000, 0.06250,
1.00000, 0.00000, 0.09375,
1.00000, 0.00000, 0.12500,
1.00000, 0.00000, 0.15625,
1.00000, 0.00000, 0.18750,
1.00000, 0.00000, 0.21875,
1.00000, 0.00000, 0.25000,
1.00000, 0.00000, 0.28125,
1.00000, 0.00000, 0.31250,
1.00000, 0.00000, 0.34375,
1.00000, 0.00000, 0.37500,
1.00000, 0.00000, 0.40625,
1.00000, 0.00000, 0.43750,
1.00000, 0.00000, 0.46875,
1.00000, 0.00000, 0.50000,
1.00000, 0.00000, 0.53125,
1.00000, 0.00000, 0.56250,
1.00000, 0.00000, 0.59375,
1.00000, 0.00000, 0.62500,
1.00000, 0.00000, 0.65625,
1.00000, 0.00000, 0.68750,
1.00000, 0.00000, 0.71875,
1.00000, 0.00000, 0.75000,
1.00000, 0.00000, 0.78125,
1.00000, 0.00000, 0.81250,
1.00000, 0.00000, 0.84375,
1.00000, 0.00000, 0.87500,
1.00000, 0.00000, 0.90625,
1.00000, 0.00000, 0.93750,
1.00000, 0.00000, 0.96875,
1.00000, 0.00000, 1.00000,
1.00000, 0.03125, 1.00000,
1.00000, 0.06250, 1.00000,
1.00000, 0.09375, 1.00000,
1.00000, 0.12500, 1.00000,
1.00000, 0.15625, 1.00000,
1.00000, 0.18750, 1.00000,
1.00000, 0.21875, 1.00000,
1.00000, 0.25000, 1.00000,
1.00000, 0.28125, 1.00000,
1.00000, 0.31250, 1.00000,
1.00000, 0.34375, 1.00000,
1.00000, 0.37500, 1.00000,
1.00000, 0.40625, 1.00000,
1.00000, 0.43750, 1.00000,
1.00000, 0.46875, 1.00000,
1.00000, 0.50000, 1.00000,
1.00000, 0.53125, 1.00000,
1.00000, 0.56250, 1.00000,
1.00000, 0.59375, 1.00000,
1.00000, 0.62500, 1.00000,
1.00000, 0.65625, 1.00000,
1.00000, 0.68750, 1.00000,
1.00000, 0.71875, 1.00000,
1.00000, 0.75000, 1.00000,
1.00000, 0.78125, 1.00000,
1.00000, 0.81250, 1.00000,
1.00000, 0.84375, 1.00000,
1.00000, 0.87500, 1.00000,
1.00000, 0.90625, 1.00000,
1.00000, 0.93750, 1.00000,
1.00000, 0.96875, 1.00000,
};

View File

@ -69,6 +69,7 @@ private:
static const float m_cubehlx2[m_size];
static const float m_icy[m_size];
static const float m_mint[m_size];
static const float m_acab[m_size];
};
#endif

View File

@ -126,6 +126,7 @@ void SondeHub::upload(
obj.insert("subtype", subframe->getType());
}
//obj.insert("dev", true);
//qDebug() << obj;
QJsonArray payloads {
obj
@ -189,7 +190,43 @@ void SondeHub::handleReply(QNetworkReply* reply)
if (!reply->error())
{
QByteArray bytes = reply->readAll();
//qDebug() << bytes;
QJsonDocument document = QJsonDocument::fromJson(bytes);
if (document.isObject())
{
QJsonObject obj = document.object();
if (obj.contains(QStringLiteral("message")))
{
QString message = obj.value(QStringLiteral("message")).toString();
qWarning() << "SondeHub message:" << message;
}
if (obj.contains(QStringLiteral("errors")))
{
QJsonArray errors = obj.value(QStringLiteral("errors")).toArray();
for (auto errorObjRef : errors)
{
QJsonObject errorObj = errorObjRef.toObject();
if (errorObj.contains(QStringLiteral("error_message")))
{
QString errorMessage = errorObj.value(QStringLiteral("error_message")).toString();
qWarning() << "SondeHub error:" << errorMessage;
if (errorObj.contains(QStringLiteral("payload")))
{
QJsonObject payload = errorObj.value(QStringLiteral("payload")).toObject();
qWarning() << "SondeHub error:" << QJsonDocument(payload);
}
}
else
{
qWarning() << "SondeHub error:" << QJsonDocument(errorObj);
}
}
}
//qDebug() << "SondeHub::handleReply: obj" << QJsonDocument(obj);
}
else
{
qDebug() << "SondeHub::handleReply:" << bytes;
}
}
else
{

View File

@ -81,6 +81,17 @@ bool CRightClickEnabler::eventFilter(QObject *obj, QEvent *event)
}
}
}
else if (event->type() == QEvent::KeyPress)
{
auto keyEvent = (QKeyEvent*) event;
if ((keyEvent->key() == Qt::Key_Menu && keyEvent->modifiers() == 0) || (keyEvent->modifiers() & Qt::ShiftModifier && keyEvent->key() == Qt::Key_F10))
{
emit rightClick(QCursor::pos());
keyEvent->setAccepted(true);
return true;
}
}
else if (event->type() == QEvent::ContextMenu)
{
// Filter ContextMenu events, so we don't get popup menus as well

View File

@ -61,6 +61,7 @@
#include "feature/featureset.h"
#include "feature/feature.h"
#include "feature/featuregui.h"
#include "feature/featurewebapiutils.h"
#include "mainspectrum/mainspectrumgui.h"
#include "commands/commandkeyreceiver.h"
#include "gui/presetitem.h"
@ -275,6 +276,9 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse
InitFSM *fsm = new InitFSM(this, splash, !parser.getScratch());
connect(fsm, &InitFSM::finished, fsm, &InitFSM::deleteLater);
connect(fsm, &InitFSM::finished, splash, &SDRangelSplash::deleteLater);
if (parser.getStart()) {
connect(fsm, &InitFSM::finished, this, &MainWindow::startAllAfterDelay);
}
fsm->start();
qDebug() << "MainWindow::MainWindow: end";
@ -3382,6 +3386,30 @@ void MainWindow::showAllChannels(int deviceSetIndex)
}
}
void MainWindow::startAllAfterDelay()
{
// Wait a little bit before starting all devices and features,
// as some devices, such as FileSinks, can fail to start if run before initialised
// Is there a better way than this arbitrary time?
QTimer::singleShot(1000, this, &MainWindow::startAll);
}
// Start all devices and features in all workspaces
void MainWindow::startAll()
{
// Start all devices
for (const auto& workspace : m_workspaces) {
startAllDevices(workspace);
}
// Start all features
for (int featureSetIndex = 0; featureSetIndex < m_featureUIs.size(); featureSetIndex++)
{
for (int featureIndex = 0; featureIndex < m_featureUIs[featureSetIndex]->getNumberOfFeatures(); featureIndex++) {
FeatureWebAPIUtils::run(featureSetIndex, featureIndex);
}
}
}
// Start all devices in the workspace
void MainWindow::startAllDevices(const Workspace *workspace) const
{

View File

@ -458,6 +458,8 @@ private slots:
void featureMove(FeatureGUI *gui, int wsIndexDestnation);
void deviceStateChanged(DeviceAPI *deviceAPI);
void openFeaturePresetsDialog(QPoint p, Workspace *workspace);
void startAllAfterDelay();
void startAll();
void startAllDevices(const Workspace *workspace) const;
void stopAllDevices(const Workspace *workspace) const;
void deviceMove(DeviceGUI *gui, int wsIndexDestnation);

View File

@ -30,6 +30,12 @@ USRPInputSettings:
transverterDeltaFrequency:
type: integer
format: int64
gpioDir:
type: integer
format: int8
gpioPins:
type: integer
format: int8
useReverseAPI:
description: Synchronize with reverse API (1 for yes, 0 for no)
type: integer
@ -65,6 +71,12 @@ USRPOutputSettings:
transverterDeltaFrequency:
type: integer
format: int64
gpioDir:
type: integer
format: int8
gpioPins:
type: integer
format: int8
useReverseAPI:
description: Synchronize with reverse API (1 for yes, 0 for no)
type: integer

View File

@ -13451,6 +13451,18 @@ margin-bottom: 20px;
"properties" : {
"sampleRate" : {
"type" : "integer"
},
"latitude" : {
"type" : "number",
"format" : "float"
},
"longitude" : {
"type" : "number",
"format" : "float"
},
"altitude" : {
"type" : "number",
"format" : "float"
}
},
"description" : "RemoteTCPInput"
@ -16824,6 +16836,14 @@ margin-bottom: 20px;
"type" : "integer",
"format" : "int64"
},
"gpioDir" : {
"type" : "integer",
"format" : "int8"
},
"gpioPins" : {
"type" : "integer",
"format" : "int8"
},
"useReverseAPI" : {
"type" : "integer",
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
@ -16893,6 +16913,14 @@ margin-bottom: 20px;
"type" : "integer",
"format" : "int64"
},
"gpioDir" : {
"type" : "integer",
"format" : "int8"
},
"gpioPins" : {
"type" : "integer",
"format" : "int8"
},
"useReverseAPI" : {
"type" : "integer",
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
@ -59441,7 +59469,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2024-07-16T23:20:27.082+02:00
Generated 2024-12-24T11:56:24.260+01:00
</div>
</div>
</div>

View File

@ -1,6 +1,6 @@
/**
* SDRangel
* This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time ---
* This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time ---
*
* OpenAPI spec version: 7.0.0
* Contact: f4exb06@gmail.com
@ -30,6 +30,12 @@ SWGRemoteTCPInputReport::SWGRemoteTCPInputReport(QString* json) {
SWGRemoteTCPInputReport::SWGRemoteTCPInputReport() {
sample_rate = 0;
m_sample_rate_isSet = false;
latitude = 0.0f;
m_latitude_isSet = false;
longitude = 0.0f;
m_longitude_isSet = false;
altitude = 0.0f;
m_altitude_isSet = false;
}
SWGRemoteTCPInputReport::~SWGRemoteTCPInputReport() {
@ -40,11 +46,20 @@ void
SWGRemoteTCPInputReport::init() {
sample_rate = 0;
m_sample_rate_isSet = false;
latitude = 0.0f;
m_latitude_isSet = false;
longitude = 0.0f;
m_longitude_isSet = false;
altitude = 0.0f;
m_altitude_isSet = false;
}
void
SWGRemoteTCPInputReport::cleanup() {
}
SWGRemoteTCPInputReport*
@ -59,7 +74,13 @@ SWGRemoteTCPInputReport::fromJson(QString &json) {
void
SWGRemoteTCPInputReport::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&sample_rate, pJson["sampleRate"], "qint32", "");
::SWGSDRangel::setValue(&latitude, pJson["latitude"], "float", "");
::SWGSDRangel::setValue(&longitude, pJson["longitude"], "float", "");
::SWGSDRangel::setValue(&altitude, pJson["altitude"], "float", "");
}
QString
@ -79,9 +100,15 @@ SWGRemoteTCPInputReport::asJsonObject() {
if(m_sample_rate_isSet){
obj->insert("sampleRate", QJsonValue(sample_rate));
}
obj->insert("latitude", QJsonValue(latitude));
obj->insert("longitude", QJsonValue(longitude));
obj->insert("altitude", QJsonValue(altitude));
if(m_latitude_isSet){
obj->insert("latitude", QJsonValue(latitude));
}
if(m_longitude_isSet){
obj->insert("longitude", QJsonValue(longitude));
}
if(m_altitude_isSet){
obj->insert("altitude", QJsonValue(altitude));
}
return obj;
}
@ -96,6 +123,36 @@ SWGRemoteTCPInputReport::setSampleRate(qint32 sample_rate) {
this->m_sample_rate_isSet = true;
}
float
SWGRemoteTCPInputReport::getLatitude() {
return latitude;
}
void
SWGRemoteTCPInputReport::setLatitude(float latitude) {
this->latitude = latitude;
this->m_latitude_isSet = true;
}
float
SWGRemoteTCPInputReport::getLongitude() {
return longitude;
}
void
SWGRemoteTCPInputReport::setLongitude(float longitude) {
this->longitude = longitude;
this->m_longitude_isSet = true;
}
float
SWGRemoteTCPInputReport::getAltitude() {
return altitude;
}
void
SWGRemoteTCPInputReport::setAltitude(float altitude) {
this->altitude = altitude;
this->m_altitude_isSet = true;
}
bool
SWGRemoteTCPInputReport::isSet(){
@ -104,6 +161,15 @@ SWGRemoteTCPInputReport::isSet(){
if(m_sample_rate_isSet){
isObjectUpdated = true; break;
}
if(m_latitude_isSet){
isObjectUpdated = true; break;
}
if(m_longitude_isSet){
isObjectUpdated = true; break;
}
if(m_altitude_isSet){
isObjectUpdated = true; break;
}
}while(false);
return isObjectUpdated;
}

View File

@ -1,6 +1,6 @@
/**
* SDRangel
* This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time ---
* This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time ---
*
* OpenAPI spec version: 7.0.0
* Contact: f4exb06@gmail.com
@ -43,21 +43,31 @@ public:
qint32 getSampleRate();
void setSampleRate(qint32 sample_rate);
float getLatitude() { return latitude; }
float getLongitude() { return longitude; }
float getAltitude() { return altitude; }
void setLatitude(float latitude) { this->latitude = latitude; }
void setLongitude(float longitude) { this->longitude = longitude; }
void setAltitude(float altitude) { this->altitude = altitude; }
float getLatitude();
void setLatitude(float latitude);
float getLongitude();
void setLongitude(float longitude);
float getAltitude();
void setAltitude(float altitude);
virtual bool isSet() override;
private:
qint32 sample_rate;
bool m_sample_rate_isSet;
float latitude;
bool m_latitude_isSet;
float longitude;
bool m_longitude_isSet;
float altitude;
bool m_altitude_isSet;
};

View File

@ -54,6 +54,10 @@ SWGUSRPInputSettings::SWGUSRPInputSettings() {
m_transverter_mode_isSet = false;
transverter_delta_frequency = 0L;
m_transverter_delta_frequency_isSet = false;
gpio_dir = 0;
m_gpio_dir_isSet = false;
gpio_pins = 0;
m_gpio_pins_isSet = false;
use_reverse_api = 0;
m_use_reverse_api_isSet = false;
reverse_api_address = nullptr;
@ -96,6 +100,10 @@ SWGUSRPInputSettings::init() {
m_transverter_mode_isSet = false;
transverter_delta_frequency = 0L;
m_transverter_delta_frequency_isSet = false;
gpio_dir = 0;
m_gpio_dir_isSet = false;
gpio_pins = 0;
m_gpio_pins_isSet = false;
use_reverse_api = 0;
m_use_reverse_api_isSet = false;
reverse_api_address = new QString("");
@ -126,6 +134,8 @@ SWGUSRPInputSettings::cleanup() {
if(reverse_api_address != nullptr) {
delete reverse_api_address;
}
@ -170,6 +180,10 @@ SWGUSRPInputSettings::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&transverter_delta_frequency, pJson["transverterDeltaFrequency"], "qint64", "");
::SWGSDRangel::setValue(&gpio_dir, pJson["gpioDir"], "qint32", "");
::SWGSDRangel::setValue(&gpio_pins, pJson["gpioPins"], "qint32", "");
::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", "");
::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString");
@ -233,6 +247,12 @@ SWGUSRPInputSettings::asJsonObject() {
if(m_transverter_delta_frequency_isSet){
obj->insert("transverterDeltaFrequency", QJsonValue(transverter_delta_frequency));
}
if(m_gpio_dir_isSet){
obj->insert("gpioDir", QJsonValue(gpio_dir));
}
if(m_gpio_pins_isSet){
obj->insert("gpioPins", QJsonValue(gpio_pins));
}
if(m_use_reverse_api_isSet){
obj->insert("useReverseAPI", QJsonValue(use_reverse_api));
}
@ -379,6 +399,26 @@ SWGUSRPInputSettings::setTransverterDeltaFrequency(qint64 transverter_delta_freq
this->m_transverter_delta_frequency_isSet = true;
}
qint32
SWGUSRPInputSettings::getGpioDir() {
return gpio_dir;
}
void
SWGUSRPInputSettings::setGpioDir(qint32 gpio_dir) {
this->gpio_dir = gpio_dir;
this->m_gpio_dir_isSet = true;
}
qint32
SWGUSRPInputSettings::getGpioPins() {
return gpio_pins;
}
void
SWGUSRPInputSettings::setGpioPins(qint32 gpio_pins) {
this->gpio_pins = gpio_pins;
this->m_gpio_pins_isSet = true;
}
qint32
SWGUSRPInputSettings::getUseReverseApi() {
return use_reverse_api;
@ -463,6 +503,12 @@ SWGUSRPInputSettings::isSet(){
if(m_transverter_delta_frequency_isSet){
isObjectUpdated = true; break;
}
if(m_gpio_dir_isSet){
isObjectUpdated = true; break;
}
if(m_gpio_pins_isSet){
isObjectUpdated = true; break;
}
if(m_use_reverse_api_isSet){
isObjectUpdated = true; break;
}

View File

@ -81,6 +81,12 @@ public:
qint64 getTransverterDeltaFrequency();
void setTransverterDeltaFrequency(qint64 transverter_delta_frequency);
qint32 getGpioDir();
void setGpioDir(qint32 gpio_dir);
qint32 getGpioPins();
void setGpioPins(qint32 gpio_pins);
qint32 getUseReverseApi();
void setUseReverseApi(qint32 use_reverse_api);
@ -136,6 +142,12 @@ private:
qint64 transverter_delta_frequency;
bool m_transverter_delta_frequency_isSet;
qint32 gpio_dir;
bool m_gpio_dir_isSet;
qint32 gpio_pins;
bool m_gpio_pins_isSet;
qint32 use_reverse_api;
bool m_use_reverse_api_isSet;

View File

@ -48,6 +48,10 @@ SWGUSRPOutputSettings::SWGUSRPOutputSettings() {
m_transverter_mode_isSet = false;
transverter_delta_frequency = 0L;
m_transverter_delta_frequency_isSet = false;
gpio_dir = 0;
m_gpio_dir_isSet = false;
gpio_pins = 0;
m_gpio_pins_isSet = false;
use_reverse_api = 0;
m_use_reverse_api_isSet = false;
reverse_api_address = nullptr;
@ -84,6 +88,10 @@ SWGUSRPOutputSettings::init() {
m_transverter_mode_isSet = false;
transverter_delta_frequency = 0L;
m_transverter_delta_frequency_isSet = false;
gpio_dir = 0;
m_gpio_dir_isSet = false;
gpio_pins = 0;
m_gpio_pins_isSet = false;
use_reverse_api = 0;
m_use_reverse_api_isSet = false;
reverse_api_address = new QString("");
@ -111,6 +119,8 @@ SWGUSRPOutputSettings::cleanup() {
if(reverse_api_address != nullptr) {
delete reverse_api_address;
}
@ -149,6 +159,10 @@ SWGUSRPOutputSettings::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&transverter_delta_frequency, pJson["transverterDeltaFrequency"], "qint64", "");
::SWGSDRangel::setValue(&gpio_dir, pJson["gpioDir"], "qint32", "");
::SWGSDRangel::setValue(&gpio_pins, pJson["gpioPins"], "qint32", "");
::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", "");
::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString");
@ -203,6 +217,12 @@ SWGUSRPOutputSettings::asJsonObject() {
if(m_transverter_delta_frequency_isSet){
obj->insert("transverterDeltaFrequency", QJsonValue(transverter_delta_frequency));
}
if(m_gpio_dir_isSet){
obj->insert("gpioDir", QJsonValue(gpio_dir));
}
if(m_gpio_pins_isSet){
obj->insert("gpioPins", QJsonValue(gpio_pins));
}
if(m_use_reverse_api_isSet){
obj->insert("useReverseAPI", QJsonValue(use_reverse_api));
}
@ -319,6 +339,26 @@ SWGUSRPOutputSettings::setTransverterDeltaFrequency(qint64 transverter_delta_fre
this->m_transverter_delta_frequency_isSet = true;
}
qint32
SWGUSRPOutputSettings::getGpioDir() {
return gpio_dir;
}
void
SWGUSRPOutputSettings::setGpioDir(qint32 gpio_dir) {
this->gpio_dir = gpio_dir;
this->m_gpio_dir_isSet = true;
}
qint32
SWGUSRPOutputSettings::getGpioPins() {
return gpio_pins;
}
void
SWGUSRPOutputSettings::setGpioPins(qint32 gpio_pins) {
this->gpio_pins = gpio_pins;
this->m_gpio_pins_isSet = true;
}
qint32
SWGUSRPOutputSettings::getUseReverseApi() {
return use_reverse_api;
@ -394,6 +434,12 @@ SWGUSRPOutputSettings::isSet(){
if(m_transverter_delta_frequency_isSet){
isObjectUpdated = true; break;
}
if(m_gpio_dir_isSet){
isObjectUpdated = true; break;
}
if(m_gpio_pins_isSet){
isObjectUpdated = true; break;
}
if(m_use_reverse_api_isSet){
isObjectUpdated = true; break;
}

View File

@ -72,6 +72,12 @@ public:
qint64 getTransverterDeltaFrequency();
void setTransverterDeltaFrequency(qint64 transverter_delta_frequency);
qint32 getGpioDir();
void setGpioDir(qint32 gpio_dir);
qint32 getGpioPins();
void setGpioPins(qint32 gpio_pins);
qint32 getUseReverseApi();
void setUseReverseApi(qint32 use_reverse_api);
@ -118,6 +124,12 @@ private:
qint64 transverter_delta_frequency;
bool m_transverter_delta_frequency_isSet;
qint32 gpio_dir;
bool m_gpio_dir_isSet;
qint32 gpio_pins;
bool m_gpio_pins_isSet;
qint32 use_reverse_api;
bool m_use_reverse_api_isSet;