From 489b9b391eb638d76b3f358bf52e1853d70e69a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pinkava?= Date: Wed, 28 Sep 2022 16:02:54 +0200 Subject: [PATCH 1/8] Remove unused QFrame from IQ recordig tool --- src/qtgui/iq_tool.ui | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/qtgui/iq_tool.ui b/src/qtgui/iq_tool.ui index e28618dd1..1d9d74eb1 100644 --- a/src/qtgui/iq_tool.ui +++ b/src/qtgui/iq_tool.ui @@ -209,22 +209,6 @@ - - - - - 0 - 50 - - - - QFrame::Box - - - QFrame::Sunken - - - From 3802cdc0f317c9080bc4e00f7e7cd180c10c69b5 Mon Sep 17 00:00:00 2001 From: Clayton Smith Date: Fri, 4 Nov 2022 18:50:30 -0400 Subject: [PATCH 2/8] Update news --- resources/news.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/news.txt b/resources/news.txt index 3c86256da..5e6edfc2c 100644 --- a/resources/news.txt +++ b/resources/news.txt @@ -3,6 +3,7 @@ NEW: Restore FFT zoom level between sessions. NEW: Restore peak detect & peak hold between sessions. + FIXED: Remove empty frame from bottom of I/Q tool window. IMPROVED: AGC performance. From 44fc718b03601be86ad4df644173dc41af8f15d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pinkava?= Date: Sun, 6 Nov 2022 17:38:16 +0100 Subject: [PATCH 3/8] Simplify setFrequencyFocus() * Replace depreceted QMouseEvent constructor * Focus only if not already focuses * Keep the current position if focused --- src/qtgui/freqctrl.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/qtgui/freqctrl.cpp b/src/qtgui/freqctrl.cpp index f5b2c158a..30477cf4c 100644 --- a/src/qtgui/freqctrl.cpp +++ b/src/qtgui/freqctrl.cpp @@ -876,13 +876,12 @@ void CFreqCtrl::cursorEnd() void CFreqCtrl::setFrequencyFocus() { - uint8_t position = floor(log10(m_freq)); - position = (uint8_t)fmax(position, 4); // restrict min to 100s of kHz - - QMouseEvent mouseEvent(QEvent::MouseMove, - m_DigitInfo[position].dQRect.center(), - Qt::NoButton, - Qt::NoButton, - Qt::NoModifier); - mouseMoveEvent(&mouseEvent); + // Select last digit or 5th digit (100s of kHz), whatever is bigger. + int position = std::max(int(log10(m_freq)), 5); + + if (!hasFocus()) { + setFocus(Qt::ShortcutFocusReason); + } + + setActiveDigit(position); } From e2b8fce302c7aa46142d631d53d63804b8f1616f Mon Sep 17 00:00:00 2001 From: Vladislav P Date: Mon, 7 Nov 2022 02:45:46 +0300 Subject: [PATCH 4/8] IQ Tool: Fix jumpy scrollbar of IQ player When file list grows long and the user tries to scroll the list to a new postion, the list continues to return it's scroll to the last selected item. That's really annoying. Return the list to last seen position after refreshing it's contents. --- src/qtgui/iq_tool.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qtgui/iq_tool.cpp b/src/qtgui/iq_tool.cpp index 8375db8e9..683406e50 100644 --- a/src/qtgui/iq_tool.cpp +++ b/src/qtgui/iq_tool.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -302,6 +303,8 @@ void CIqTool::timeoutFunction(void) void CIqTool::refreshDir() { int selection = ui->listWidget->currentRow(); + QScrollBar * sc = ui->listWidget->verticalScrollBar(); + int lastScroll = sc->sliderPosition(); recdir->refresh(); QStringList files = recdir->entryList(); @@ -310,6 +313,7 @@ void CIqTool::refreshDir() ui->listWidget->clear(); ui->listWidget->insertItems(0, files); ui->listWidget->setCurrentRow(selection); + sc->setSliderPosition(lastScroll); ui->listWidget->blockSignals(false); if (is_recording) From 4d0bdb2bb363755c4ac3695410a4da400473780e Mon Sep 17 00:00:00 2001 From: Clayton Smith Date: Thu, 10 Nov 2022 17:04:09 -0500 Subject: [PATCH 5/8] Update news --- resources/news.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/news.txt b/resources/news.txt index 5e6edfc2c..6583e21a1 100644 --- a/resources/news.txt +++ b/resources/news.txt @@ -4,6 +4,7 @@ NEW: Restore FFT zoom level between sessions. NEW: Restore peak detect & peak hold between sessions. FIXED: Remove empty frame from bottom of I/Q tool window. + FIXED: Sudden scrolling of file list in I/Q tool window. IMPROVED: AGC performance. From 53bd3c50e3892a646a0c88187597d5e1f6ef42f3 Mon Sep 17 00:00:00 2001 From: Clayton Smith Date: Fri, 11 Nov 2022 10:08:08 -0500 Subject: [PATCH 6/8] Use consistent numbering in ifdefs for searchability --- src/dsp/rx_rds.cpp | 2 +- src/dsp/rx_rds.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dsp/rx_rds.cpp b/src/dsp/rx_rds.cpp index 2b337a6d3..41befdef9 100644 --- a/src/dsp/rx_rds.cpp +++ b/src/dsp/rx_rds.cpp @@ -69,7 +69,7 @@ rx_rds::rx_rds(double sample_rate) int interpolation = 19; int decimation = 24; -#if GNURADIO_VERSION < 0x30900 +#if GNURADIO_VERSION < 0x030900 float rate = (float) interpolation / (float) decimation; d_rsmp_tap = gr::filter::firdes::low_pass(interpolation, interpolation, rate * 0.45, rate * 0.1); d_rsmp = gr::filter::rational_resampler_base_ccf::make(interpolation, decimation, d_rsmp_tap); diff --git a/src/dsp/rx_rds.h b/src/dsp/rx_rds.h index 1378b9002..29e74c09f 100644 --- a/src/dsp/rx_rds.h +++ b/src/dsp/rx_rds.h @@ -36,9 +36,9 @@ #include #endif -#if GNURADIO_VERSION < 0x30800 +#if GNURADIO_VERSION < 0x030800 #include -#elif GNURADIO_VERSION < 0x30900 +#elif GNURADIO_VERSION < 0x030900 #include #else #include From 52aa15b321bb8d2d7b80df22c40322394f14479b Mon Sep 17 00:00:00 2001 From: shawnj007 Date: Mon, 14 Nov 2022 22:42:11 -0600 Subject: [PATCH 7/8] touch controls and bandplan --- resources/bandplan.csv | 1878 +++- resources/bandplan.old.csv | 114 + src/applications/CMakeLists.txt | 6 +- src/applications/gqrx/main_touch.cpp | 242 + src/applications/gqrx/mainwindow_touch.cpp | 2470 +++++ src/applications/gqrx/mainwindow_touch.h | 255 + src/applications/gqrx/mainwindow_touch.ui | 1250 +++ src/applications/gqrx/receiver.cpp | 79 + src/applications/gqrx/receiver.h | 12 + src/dsp/correct_iq_cc.cpp | 39 + src/dsp/correct_iq_cc.h | 45 + src/qtgui/CMakeLists.txt | 3 + src/qtgui/audio_options.cpp | 21 +- src/qtgui/audio_options.h | 25 +- src/qtgui/bookmarks.cpp | 8 +- src/qtgui/dockaudio.cpp | 65 +- src/qtgui/dockaudio.h | 12 + src/qtgui/dockaudio.ui | 1949 +++- src/qtgui/dockbookmarks.cpp | 6 +- src/qtgui/dockbookmarks.ui | 2071 +++- src/qtgui/dockfft.cpp | 47 +- src/qtgui/dockfft.ui | 4423 ++++++-- src/qtgui/dockinputctl.cpp | 39 +- src/qtgui/dockinputctl.h | 10 + src/qtgui/dockinputctl.ui | 10553 ++++++++++++++++++- src/qtgui/dockrds.cpp | 2 +- src/qtgui/dockrds.h | 1 - src/qtgui/dockrds.ui | 1738 ++- src/qtgui/dockrxopt.cpp | 14 +- src/qtgui/dockrxopt.ui | 2880 +++-- src/qtgui/docktouchcontrols.cpp | 147 + src/qtgui/docktouchcontrols.h | 117 + src/qtgui/docktouchcontrols.ui | 3734 +++++++ 33 files changed, 31624 insertions(+), 2631 deletions(-) create mode 100644 resources/bandplan.old.csv create mode 100644 src/applications/gqrx/main_touch.cpp create mode 100755 src/applications/gqrx/mainwindow_touch.cpp create mode 100755 src/applications/gqrx/mainwindow_touch.h create mode 100644 src/applications/gqrx/mainwindow_touch.ui mode change 100644 => 100755 src/qtgui/CMakeLists.txt mode change 100644 => 100755 src/qtgui/dockbookmarks.cpp create mode 100644 src/qtgui/docktouchcontrols.cpp create mode 100644 src/qtgui/docktouchcontrols.h create mode 100644 src/qtgui/docktouchcontrols.ui diff --git a/resources/bandplan.csv b/resources/bandplan.csv index f5603c533..ece7c2753 100644 --- a/resources/bandplan.csv +++ b/resources/bandplan.csv @@ -1,114 +1,1764 @@ -# minFrequency, maxFrequency, mode, step, color, name - -# USA Amateur Radio -135700, 137800, CW, 10, #90009470, 2200m Ham Band -472000, 479000, CW, 10, #90009470, 630m Ham Band -1800000, 2000000, CW, 10, #90009470, 160m Ham Band -3500000, 3600000, CW, 10, #90009470, 80m CW/Data Ham Band -3600000, 4000000, CW, 10, #90009470, 80m Phone Ham Band -5351500, 5366500, USB, 10, #90009470, 60m Ham Band -7000000, 7125000, CW, 10, #90009470, 40m CW/Data Ham Band -7125000, 7300000, LSB, 10, #90009470, 40m Phone Ham Band -10100000, 10150000, CW, 10, #90009470, 30m CW/Data Ham Band -14000000, 14150000, CW, 10, #90009470, 20m CW/Data Ham Band -14150000, 14350000, USB, 10, #90009470, 20m Phone Ham Band -18068000, 18110000, CW, 10, #90009470, 17m CW/Data Ham Band -18110000, 18168000, USB, 10, #90009470, 17m Ham Band -21000000, 21200000, CW, 10, #90009470, 15m CW/Data Ham Band -21200000, 21450000, USB, 10, #90009470, 15m Ham Band -24890000, 24930000, CW, 10, #90009470, 12m CW/Data Ham Band -24930000, 24990000, USB, 10, #90009470, 12m Ham Band -28000000, 28300000, CW, 10, #90009470, 10m CW/Data Ham Band -28300000, 29700000, USB, 10, #90009470, 10m Ham Band -50000000, 50100000, CW, 10, #90009470, 6m CW/Data Ham Band -50100000, 54000000, USB, 10, #90009470, 6m Ham Band -144000000, 144100000, CW, 10, #90009470, 2m CW/Data Ham Band -144100000, 148000000, NFM, 10, #90009470, 2m Ham Band -222000000, 225000000, NFM, 10, #90009470, 1.25m Ham Band -420000000, 450000000, NFM, 10, #90009470, 70cm Ham Band -902000000, 928000000, NFM, 10, #90009470, 33cm Ham Band -1240000000, 1300000000, NFM, 10, #90009470, 23cm Ham Band -2300000000, 2310000000, NFM, 10, #90009470, GHz Ham Band -2390000000, 2450000000, NFM, 10, #90009470, GHz Ham Band -3300000000, 3500000000, NFM, 10, #90009470, GHz Ham Band -5650000000, 5925000000, NFM, 10, #90009470, GHz Ham Band -10000000000, 10500000000, NFM, 10, #90009470, GHz Ham Band -24000000000, 24250000000, NFM, 10, #90009470, GHz Ham Band -47000000000, 47200000000, NFM, 10, #90009470, GHz Ham Band -77000000000, 81000000000, NFM, 10, #90009470, GHz Ham Band -122250000000, 123000000000, NFM, 10, #90009470, GHz Ham Band -134000000000, 141000000000, NFM, 10, #90009470, GHz Ham Band -241000000000, 250000000000, NFM, 10, #90009470, GHz Ham Band - -# Radionavigation - Source: https://www.ntia.doc.gov/files/ntia/publications/2003-allochrt.pdf -9000, 14000, USB, 10, #99AABD26, Radionavigation -90000, 110000, USB, 10, #99AABD26, Radionavigation -190000, 200000, USB, 10, #99C05017, Aeronautical Radionavigation -200000, 275000, USB, 10, #99C05017, Aeronautical Radionavigation -275000, 285000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) -275000, 285000, USB, 10, #99C05017, Aeronautical Radionavigation -285000, 300000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) -285000, 300000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) -300000, 325000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) -300000, 325000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) -325000, 335000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) -325000, 335000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) -335000, 405000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) -405000, 415000, USB, 10, #99AABD26, Radionavigation -415000, 495000, USB, 10, #99C05017, Aeronautical Radionavigation -510000, 535000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) -74800000, 75200000, USB, 10, #99C05017, Aeronautical Radionavigation -328600000, 335400000, USB, 10, #99C05017, Aeronautical Radionavigation -399900000, 400050000, USB, 10, #99E9EB7C, Radionavigation Satellite -960000000, 1215000000, USB, 10, #99C05017, Aeronautical Radionavigation -1215000000, 1240000000, USB, 10, #99E9EB7C, Radionavigation Satellite -1300000000, 1350000000, USB, 10, #99C05017, Aeronautical Radionavigation -1559000000, 1610000000, USB, 10, #99E9EB7C, Radionavigation Satellite (Space to Earth) -1559000000, 1626500000, USB, 10, #99C05017, Aeronautical Radionavigation -2700000000, 2900000000, USB, 10, #99C05017, Aeronautical Radionavigation -2900000000, 3100000000, USB, 10, #994C8E75, Maritime Radionavigation -3500000000, 3650000000, USB, 10, #99C05017, Aeronautical Radionavigation (Ground) -4200000000, 4400000000, USB, 10, #99C05017, Aeronautical Radionavigation -5000000000, 5250000000, USB, 10, #99C05017, Aeronautical Radionavigation -5350000000, 5460000000, USB, 10, #99C05017, Aeronautical Radionavigation -5460000000, 5470000000, USB, 10, #99AABD26, Radionavigation -5470000000, 5650000000, USB, 10, #994C8E75, Maritime Radionavigation -9000000000, 9200000000, USB, 10, #99C05017, Aeronautical Radionavigation -9200000000, 9300000000, USB, 10, #994C8E75, Maritime Radionavigation -9300000000, 9500000000, USB, 10, #99AABD26, Radionavigation -13250000000, 13400000000, USB, 10, #99C05017, Aeronautical Radionavigation -14000000000, 14200000000, USB, 10, #99AABD26, Radionavigation -15400000000, 15700000000, USB, 10, #99C05017, Aeronautical Radionavigation -24450000000, 24650000000, USB, 10, #99AABD26, Radionavigation -24750000000, 25050000000, USB, 10, #99AABD26, Radionavigation -31800000000, 33400000000, USB, 10, #99AABD26, Radionavigation -45500000000, 47000000000, USB, 10, #99E9EB7C, Radionavigation Satellite -66000000000, 71000000000, USB, 10, #99AABD26, Radionavigation -66000000000, 71000000000, USB, 10, #99E9EB7C, Radionavigation Satellite -95000000000, 100000000000, USB, 10, #99AABD26, Radionavigation -95000000000, 100000000000, USB, 10, #99E9EB7C, Radionavigation Satellite -134000000000, 142000000000, USB, 10, #99E9EB7C, Radionavigation Satellite -134000000000, 142000000000, USB, 10, #99AABD26, Radionavigation -190000000000, 200000000000, USB, 10, #99E9EB7C, Radionavigation Satellite -190000000000, 200000000000, USB, 10, #99AABD26, Radionavigation -252000000000, 265000000000, USB, 10, #99E9EB7C, Radionavigation Satellite -252000000000, 265000000000, USB, 10, #99AABD26, Radionavigation - -# Broadcast -54000000, 72000000, AM, 10, #902E98BB, Broadcast Television -76000000, 088000000, AM, 10, #902E98BB, Broadcast Television -88000000, 108000000, WFM, 10, #902E98BB, Broadcast Radio -174000000, 216000000, AM, 10, #902E98BB, Broadcast Television -470000000, 512000000, AM, 10, #902E98BB, Broadcast Television -512000000, 608000000, AM, 10, #902E98BB, Broadcast Television -614000000, 698000000, AM, 10, #902E98BB, Broadcast Television -698000000, 763000000, AM, 10, #902E98BB, Broadcast Television - -# Other -108000000, 118000000, AM, 5000, #906600FF, Air Band VOR/ILS -118000000, 137000000, AM, 5000, #900000FF, Air Band Voice -26960000, 27410000, AM, 5000, #90FF0000, CB -156000000, 162025000, NFM, 12500, #90000080, Marine -225000000, 380000000, NFM, 12500, #90FF0000, Military Air -240000000, 270000000, NFM, 12500, #90FF0000, Mil Sat -446000000, 446200000, NFM, 6250, #9000FF00, PMR446 +0, 8300, CW, 1, #40FFFFFF, Not Allocated +8300, 14000, CW, 1, #5500C9C9, Radionavigation/ Meteorological Aids +14000, 19650, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +19650, 19950, CW, 1, #5580C0C0, NWC (AU) +19950, 20050, AM, 1, #44FF00FF, 20KHz Time Signal +20050, 21250, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +21250, 21550, CW, 1, #5580C0C0, NPM (US) +21550, 24650, CW, 1, #40BAFD00, Power Line Carrier (PLC) +24650, 24950, CW, 1, #5580C0C0, NLK (US)(Jim Creek) +24950, 25050, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +25050, 25350, CW, 1, #5580C0C0, NML (US) +25350, 26750, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +26750, 27050, CW, 1, #5580C0C0, NOV (US) +27050, 37850, CW, 1, #40BAFD00, Power Line Carrier (PLC) +37850, 38150, CW, 1, #5580C0C0, SHR (SE) +38150, 39950, CW, 1, #40BAFD00, Power Line Carrier (PLC) +39950, 40050, CW, 1, #44FF00FF, JJY-40 (JP) +40050, 40250, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +40250, 40550, CW, 1, #5580C0C0, SAS/SRC (SE) +40550, 42350, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +42350, 42650, CW, 1, #5580C0C0, SAS2 (SE) +42650, 44050, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +44050, 44350, CW, 1, #5580C0C0, SAS3 (SE) +44350, 59500, CW, 1, #40BAFD00, Power Line Carrier (PLC) +59500, 60500, AM, 1, #44FF00FF, WWVB NIST +60500, 66335, CW, 1, #40BAFD00, Power Line Carrier (PLC) +66335, 66985, CW, 1, #44FF00FF, RBU (RU) +66985, 68350, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +68350, 68650, CW, 1, #44FF00FF, BPC (CN) +68650, 76850, CW, 1, #40BAFD00, Power Line Carrier (PLC) +76850, 78150, CW, 1, #44FF00FF, DCF77 (DE) +78150, 80850, CW, 1, #40BAFD00, Power Line Carrier (PLC) +80850, 81150, CW, 1, #5580C0C0, GYN2 GBR (UK) +81150, 120600, CW, 1, #55008080, Radiolocation +120600, 123600, USB, 10, #5500FF91, WEFAX Halifax CA +123600, 135700, CW, 1, #507676FF, RFID (LF) +135700, 137800, LSB, 10, #50FF0000, 2200m +137800, 140000, CW, 1, #507676FF, RFID (LF) +140000, 148500, USB, 10, #55008080, Maritime Mobile Service +148500, 160000, AM, 10, #505347FF, Long Wave +160000, 161850, CW, 10, #50FF44AA, 1750m (LowFER) and Long Wave +161850, 162150, CW, 10, #44FF00FF, TDF (FR) +162150, 190000, CW, 10, #50FF44AA, 1750m (LowFER) and Long Wave +190000, 283500, AM, 10, #505347FF, Long Wave +283500, 472000, CW, 1, #55008080, Maritime Mobile Service +472000, 479000, CW, 10, #50FF0000, 630m Ham Band +479000, 525000, USB, 10, #55008080, Maritime Mobile/ Aeronautical Radionavigation/ RFID +525000, 1705000, AM, 10, #33FF0000, AM Radio/ Medium Wave (212m) +1705000, 1800000, CW, 1, #40BAFD00, Power Line Carrier (PLC) Communications +1800000, 1810000, LSB, 10, #508000FF, 160m Ham Band| Digital +1810000, 1843000, CW, 10, #50FF0000, 160m +1843000, 1995000, LSB, 10, #50FF0000, SSB SSTV (160m) +1995000, 2000000, CW, 10, #503CCCFF, Experimental, Beacons |160m Ham Band +2000000, 2052100, USB, 10, #55008080, Maritime Mobile +2052100, 2055100, USB, 10, #5500FF91, WEFAX Kodiak AK +2055100, 2182000, USB, 10, #55008080, Maritime Mobile +2182000, 2185000, USB, 10, #50FF0091, Distress and Calling for Maritime +2185000, 2300000, USB, 10, #55008080, Maritime Mobile +2300000, 2495000, AM, 10, #505D63FF, Shortwave (Tropical Band 120m) Broadcast +2495000, 2505000, AM, 10, #44FF00FF, WWV NIST +2505000, 3200000, USB, 10, #55008080, Maritime Mobile +3200000, 3251100, AM, 10, #505D63FF, Shortwave (Tropical Band 90m) Broadcast +3251100, 3254100, USB, 10, #5500FF91, WEFAX Iqaluit/ Resolute CA +3254100, 3329000, AM, 10, #505D63FF, Shortwave (Tropical Band 90m) Broadcast +3329000, 3331000, AM, 10, #44FF00FF, CHU Canada +3331000, 3400000, AM, 10, #505D63FF, Shortwave (Tropical Band 90m) Broadcast +3400000, 3500000, LSB, 10, #40AFFFEE, Aeronautical (HFDL) +3500000, 3570000, LSB, 10, #50FF0000, 80m Ham Band| +3570000, 3600000, LSB, 10, #50FFFFFF, RTTY/Data DX (80m) +3600000, 3790000, LSB, 10, #50FF0000, 80m +3790000, 3800000, LSB, 10, #40FF0000, DX window (80m) +3800000, 3882000, LSB, 10, #50FF0000, 80m +3882000, 3888000, AM, 10, #5000FF00, AM calling frequency (80m) +3888000, 3900000, LSB, 10, #50FF0000, 80m Ham Band +3900000, 4000000, AM, 10, #40FF00FF, Shared 80m| and Shortwave (75m) Broadcast +4000000, 4065000, USB, 10, #55008080, Maritime +4000000, 4125000, USB, 10, #55008080, (Ship TX) Maritime +4065000, 4068000, USB, 10, #55008080, ITU Ch.401 (Ship TX) +4068000, 4071000, USB, 10, #5500C9C9, 402 +4071000, 4074000, USB, 10, #55008080, 403 +4074000, 4077000, USB, 10, #5500C9C9, 404 +4077000, 4080000, USB, 10, #55008080, 405 +4080000, 4083000, USB, 10, #5500C9C9, 406 +4083000, 4086000, USB, 10, #55008080, 407 +4086000, 4089000, USB, 10, #5500C9C9, 408 +4089000, 4092000, USB, 10, #55008080, 409 +4092000, 4095000, USB, 10, #5500C9C9, 410 +4095000, 4098000, USB, 10, #55008080, 411 +4098000, 4101000, USB, 10, #5500C9C9, 412 +4101000, 4104000, USB, 10, #55008080, 413 +4104000, 4107000, USB, 10, #5500C9C9, 414 +4107000, 4110000, USB, 10, #55008080, 415 +4110000, 4113000, USB, 10, #5500C9C9, 416 +4113000, 4116000, USB, 10, #55008080, 417 +4116000, 4119000, USB, 10, #5500C9C9, 418 +4119000, 4122000, USB, 10, #55008080, 419 +4122000, 4125000, USB, 10, #5500C9C9, 420 +4125000, 4128000, USB, 10, #50FF0091, 421 (Calling/Distress/Safety) +4125000, 4128000, USB, 10, #50FF0091, (Distress/ Safety) +4128000, 4131000, USB, 10, #55008080, 422 +4128000, 4233100, USB, 10, #55008080, (Ship TX) Maritime +4131000, 4134000, USB, 10, #5500C9C9, 423 +4134000, 4137000, USB, 10, #55008080, 424 +4137000, 4140000, USB, 10, #5500C9C9, 425 +4140000, 4143000, USB, 10, #55008080, 426 +4143000, 4146000, USB, 10, #5500C9C9, 427 +4146000, 4233100, USB, 10, #55008080, Maritime +4233100, 4236100, USB, 10, #5500FF91, WEFAX Boston MA Night +4236100, 4269100, USB, 10, #55008080, Maritime +4269100, 4272100, USB, 10, #5500FF91, WEFAX Halifax CA +4272100, 4290100, USB, 10, #55008080, Maritime +4290100, 4293100, USB, 10, #5500FF91, WEFAX Inuvik CA +4296100, 4299100, USB, 10, #5500FF91, WEFAX Kodiak AK +4299100, 4316000, USB, 10, #55008080, Maritime +4316000, 4319000, USB, 10, #5500FF91, WEFAX New Orleans LA +4319000, 4344100, USB, 10, #55008080, Maritime +4344100, 4347100, USB, 10, #5500FF91, WEFAX PT. Reyes CA (Night) +4347100, 4351000, USB, 10, #55008080, Maritime +4347100, 4414100, USB, 10, #55008080, (Coast TX) Maritime +4351000, 4354000, USB, 10, #5500C9C9, ITU Ch.428 (Coast TX) +4354000, 4357000, USB, 10, #55008080, 429 +4357000, 4360000, USB, 10, #5500C9C9, 401 +4360000, 4363000, USB, 10, #55008080, 402 +4363000, 4366000, USB, 10, #5500C9C9, 403 +4366000, 4369000, USB, 10, #55008080, 404 +4369000, 4372000, USB, 10, #5500C9C9, 405 +4372000, 4375000, USB, 10, #55008080, 406 +4375000, 4378000, USB, 10, #5500C9C9, 407 +4378000, 4381000, USB, 10, #55008080, 408 +4381000, 4384000, USB, 10, #5500C9C9, 409 +4384000, 4387000, USB, 10, #55008080, 410 +4387000, 4390000, USB, 10, #5500C9C9, 411 +4390000, 4393000, USB, 10, #55008080, 412 +4393000, 4396000, USB, 10, #5500C9C9, 413 +4396000, 4399000, USB, 10, #55008080, 414 +4399000, 4402000, USB, 10, #5500C9C9, 415 +4402000, 4405000, USB, 10, #55008080, 416 +4405000, 4408000, USB, 10, #5500C9C9, 417 +4408000, 4411000, USB, 10, #55008080, 418 +4411000, 4414000, USB, 10, #5500C9C9, 419 +4414000, 4417000, USB, 10, #5500FF91, 420/WEFAX Sydney -Nova Scotia CA (Night) +4414100, 4417100, USB, 10, #5500FF91, WEFAX Sydney -Nova Scotia CA (Night) +4417000, 4420000, USB, 10, #5500FF91, 421 +4417100, 4625000, USB, 10, #55008080, (Coast TX) Maritime/ CODAR +4420000, 4423000, USB, 10, #5500C9C9, 422 +4423000, 4426000, USB, 10, #55008080, 423 +4426000, 4429000, USB, 10, #5500C9C9, 424 +4429000, 4432000, USB, 10, #55008080, 425 +4432000, 4435000, USB, 10, #5500C9C9, 426 +4435000, 4438000, USB, 10, #55008080, 427 +4438000, 4625000, USB, 10, #5500C9C9, Maritime/ CODAR +4625000, 4628000, USB, 1, #50DD1111, UVB-76 (Lower) +4625000, 4724000, USB, 10, #55008080, Maritime +4724000, 4727000, USB, 10, #5090EE90, HFGCS +4727000, 4750000, USB, 10, #55008080, Maritime +4750000, 4995000, AM, 10, #505D63FF, Shortwave (Tropical Band 60m) Broadcast +4995000, 5005000, AM, 10, #44FF00FF, WWV NIST +5005000, 5060000, AM, 10, #505D63FF, Shortwave (Tropical Band 60m) Broadcast +5060000, 5330500, USB, 10, #55008080, Maritime/ Private Land Mobile +5330500, 5333400, USB, 10, #500000FF, 60m Ham Band| Ch. 1 +5346500, 5349400, USB, 10, #500000FF, Ch. 2 (60m) +5357000, 5359900, USB, 10, #500000FF, Ch. 3 (60m) +5371500, 5374400, USB, 10, #500000FF, Ch. 4 (60m) +5403500, 5406400, USB, 10, #500000FF, Ch. 5 |60m Ham Band +5406400, 5900000, USB, 10, #505D88FF, Aeronautical (HFDL) +5900000, 6200000, AM, 10, #505D63FF, Shortwave (49m) Broadcast +6200000, 6203000, USB, 10, #55008080, ITU Ch.601 (Ship TX) +6200000, 6215000, USB, 10, #55008080, (Ship TX) Maritime +6203000, 6206000, USB, 10, #5500C9C9, 602 +6206000, 6209000, USB, 10, #55008080, 603 +6209000, 6212000, USB, 10, #5500C9C9, 604 +6212000, 6215000, USB, 10, #55008080, 605 +6215000, 6218000, USB, 10, #50FF0091, 606 (Calling/Distress/Safety) +6215000, 6218000, USB, 10, #50FF0091, (Distress/ Safety) +6218000, 6221000, USB, 10, #55008080, 607 +6218000, 6338600, USB, 10, #55008080, (Ship TX) Maritime +6221000, 6224000, USB, 10, #5500C9C9, 608 +6224000, 6338600, USB, 10, #55008080, Maritime +6338600, 6341600, USB, 10, #5500FF91, WEFAX Boston MA +6341600, 6494500, USB, 10, #55008080, Maritime +6494500, 6497500, USB, 10, #5500FF91, WEFAX Halifax CA +6497500, 6501000, USB, 10, #55008080, (Ship TX) Maritime +6501000, 6504000, USB, 10, #55008080, ITU Ch.601 (Ship TX) +6501000, 6712000, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +6504000, 6507000, USB, 10, #5500C9C9, 602 +6507000, 6510000, USB, 10, #55008080, 603 +6510000, 6513000, USB, 10, #5500C9C9, 604 +6513000, 6516000, USB, 10, #55008080, 605 +6516000, 6519000, USB, 10, #5500C9C9, 606 +6519000, 6522000, USB, 10, #55008080, 607 +6522000, 6525000, USB, 10, #5500C9C9, 608 +6525000, 6712000, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +6712000, 6715000, USB, 10, #5090EE90, HFGCS +6715000, 6739000, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +6739000, 6742000, USB, 10, #5090EE90, HFGCS +6742000, 6765000, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +6765000, 6795000, NFM, 10, #44006179, ISM Band (50m) +6795000, 6913200, USB, 10, #55008080, Maritime +6913200, 6916200, USB, 10, #5500FF91, WEFAX Sydney -Nova Scotia CA (Day) +6916200, 7000000, USB, 10, #55008080, Maritime +7000000, 7080000, LSB, 10, #50FF0000, 40m Ham Band| +7080000, 7169000, LSB, 10, #500089FF, RTTY/Data (40m) +7169000, 7173000, LSB, 10, #50FF004D, SSTV (40m) +7173000, 7200000, LSB, 10, #50FF0000, 40m +7200000, 7300000, LSB, 10, #50AD63FF, Shared 40m and Shortwave (41m) Broadcast +7300000, 7450000, AM, 10, #505D63FF, Shortwave (41m) Broadcast +7450000, 7633500, USB, 10, #505D88FF, Aeronautical/ Maritime +7633500, 7636500, USB, 10, #5090EE90, MARS +7636500, 7708100, USB, 10, #505D88FF, Aeronautical/ Maritime +7708100, 7711100, USB, 10, #5500FF91, WEFAX Iqaluit/ Resolute CA +7711100, 7848500, USB, 10, #505D88FF, Aeronautical/ Maritime +7848500, 7851500, USB, 10, #44FF00FF, CHU Canada +7851500, 8195000, USB, 10, #55008080, Maritime +8195000, 8198000, USB, 10, #55008080, ITU Ch.801 (Ship TX) +8195000, 8294000, USB, 10, #505D88FF, (Transoceanic Flights) Aeronautical and (Ship/Shore) Maritime +8198000, 8201000, USB, 10, #5500C9C9, 802 +8201000, 8204000, USB, 10, #55008080, 803 +8204000, 8207000, USB, 10, #5500C9C9, 804 +8207000, 8210000, USB, 10, #55008080, 805 +8210000, 8213000, USB, 10, #5500C9C9, 806 +8213000, 8216000, USB, 10, #55008080, 807 +8216000, 8219000, USB, 10, #5500C9C9, 808 +8219000, 8222000, USB, 10, #55008080, 809 +8222000, 8225000, USB, 10, #5500C9C9, 810 +8225000, 8228000, USB, 10, #55008080, 811 +8228000, 8231000, USB, 10, #5500C9C9, 812 +8231000, 8234000, USB, 10, #55008080, 813 +8234000, 8237000, USB, 10, #5500C9C9, 814 +8237000, 8240000, USB, 10, #55008080, 815 +8240000, 8243000, USB, 10, #50FF0091, 816 (USCG Calling) +8243000, 8246000, USB, 10, #5500C9C9, 817 +8246000, 8249000, USB, 10, #55008080, 818 +8249000, 8252000, USB, 10, #5500C9C9, 819 +8252000, 8255000, USB, 10, #55008080, 820 +8255000, 8258000, USB, 10, #50FF0091, 821 (Calling) +8258000, 8261000, USB, 10, #55008080, 822 +8261000, 8264000, USB, 10, #5500C9C9, 823 +8264000, 8267000, USB, 10, #55008080, 824 +8267000, 8270000, USB, 10, #5500C9C9, 825 +8270000, 8273000, USB, 10, #55008080, 826 +8273000, 8276000, USB, 10, #5500C9C9, 827 +8276000, 8279000, USB, 10, #55008080, 828 +8279000, 8282000, USB, 10, #5500C9C9, 829 +8282000, 8285000, USB, 10, #55008080, 830 +8285000, 8288000, USB, 10, #5500C9C9, 831 +8288000, 8291000, USB, 10, #55008080, 832 +8291000, 8294000, USB, 10, #55008080, 833 +8294000, 8454100, USB, 10, #505D88FF, Aeronautical (HFDL)/ Maritime +8454100, 8457100, USB, 10, #5500FF91, WEFAX Inuvik CA +8457100, 8460100, USB, 10, #5500FF91, WEFAX Kodiak AK +8460100, 8502000, USB, 10, #505D88FF, Aeronautical (HFDL)/ Maritime +8502000, 8505000, USB, 10, #5500FF91, WEFAX New Orleans LA +8505000, 8680100, USB, 10, #505D88FF, Aeronautical (HFDL)/ Maritime +8680100, 8683100, USB, 10, #5500FF91, WEFAX PT. Reyes CA +8683100, 8707000, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +8683100, 8992000, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +8707000, 8710000, USB, 10, #55008080, ITU Ch.834 (Coast TX) +8710000, 8713000, USB, 10, #5500C9C9, 835 +8713000, 8716000, USB, 10, #55008080, 836 +8716000, 8719000, USB, 10, #5500C9C9, 837 +8719000, 8722000, USB, 10, #55008080, 801 +8722000, 8725000, USB, 10, #5500C9C9, 802 +8725000, 8728000, USB, 10, #55008080, 803 +8728000, 8731000, USB, 10, #5500C9C9, 804 +8731000, 8734000, USB, 10, #55008080, 805 +8734000, 8737000, USB, 10, #5500C9C9, 806 +8737000, 8740000, USB, 10, #55008080, 807 +8740000, 8743000, USB, 10, #5500C9C9, 808 +8743000, 8746000, USB, 10, #55008080, 809 +8746000, 8749000, USB, 10, #5500C9C9, 810 +8749000, 8752000, USB, 10, #55008080, 811 +8752000, 8755000, USB, 10, #5500C9C9, 812 +8755000, 8758000, USB, 10, #55008080, 813 +8758000, 8761000, USB, 10, #5500C9C9, 814 +8761000, 8764000, USB, 10, #55008080, 815 +8764000, 8767000, USB, 10, #5500C9C9, 816 +8767000, 8770000, USB, 10, #55008080, 817 +8770000, 8773000, USB, 10, #5500C9C9, 818 +8773000, 8776000, USB, 10, #55008080, 819 +8776000, 8779000, USB, 10, #5500C9C9, 820 +8779000, 8782000, USB, 10, #55008080, 821 +8782000, 8785000, USB, 10, #5500C9C9, 822 +8785000, 8788000, USB, 10, #55008080, 823 +8788000, 8791000, USB, 10, #5500C9C9, 824 +8791000, 8794000, USB, 10, #55008080, 825 +8794000, 8797000, USB, 10, #5500C9C9, 826 +8797000, 8800000, USB, 10, #55008080, 827 +8800000, 8803000, USB, 10, #5500C9C9, 828 +8803000, 8806000, USB, 10, #55008080, 829 +8806000, 8809000, USB, 10, #5500C9C9, 830 +8809000, 8812000, USB, 10, #55008080, 831 +8812000, 8815000, USB, 10, #5500C9C9, 832 +8815000, 8992000, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +8992000, 8995000, USB, 10, #5090EE90, HFGCS +8995000, 9108100, USB, 10, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +9108100, 9111100, USB, 10, #5500FF91, WEFAX Boston MA +9111100, 9400000, USB, 10, #55008080, Maritime +9400000, 9900000, AM, 10, #505D63FF, Shortwave (31m) Broadcast +9900000, 9980600, USB, 10, #55008080, Maritime +9980600, 9983600, USB, 10, #5500FF91, WEFAX Honolulu HI (Night) +9983600, 9995000, USB, 10, #55008080, Maritime +9995000, 10005000, AM, 10, #44FF00FF, WWV NIST +10005000, 10100000, USB, 100, #40AFFFEE, Aeronautical (HFDL) +10100000, 10130000, USB, 10, #50FF0000, 30m Ham Band| +10130000, 10140000, USB, 10, #5000FF00, RTTY (30m) +10140000, 10150000, USB, 10, #5000B3FF, Packet |30m Ham Band +10150000, 10534100, USB, 100, #55008080, Private Land Mobile +10534100, 10537100, USB, 10, #5500FF91, WEFAX Halifax CA +10537100, 11088100, USB, 100, #55008080, Private Land Mobile +11088100, 11091100, USB, 10, #5500FF91, WEFAX Honolulu HI +11091100, 11175000, USB, 100, #55008080, Private Land Mobile +11175000, 11178000, USB, 100, #5090EE90, HFGCS +11178000, 11407000, AM, 10, #40AFFFEE, Transoceanic Flights (HFDL) +11407000, 11600000, USB, 100, #55008080, Private Land Mobile +11600000, 12100000, AM, 100, #505D63FF, Shortwave (25m) Broadcast +12100000, 12230000, USB, 10, #5500C9C9, Private Land Mobile +12100000, 12410600, USB, 100, #55008080, (Ship/Shore) Maritime +12230000, 12233000, USB, 10, #55008080, ITU Ch.1201 (Ship TX) +12233000, 12236000, USB, 10, #5500C9C9, 1202 +12236000, 12239000, USB, 10, #55008080, 1203 +12239000, 12242000, USB, 10, #5500C9C9, 1204 +12242000, 12245000, USB, 10, #55008080, 1205 +12245000, 12248000, USB, 10, #5500C9C9, 1206 +12248000, 12251000, USB, 10, #55008080, 1207 +12251000, 12254000, USB, 10, #5500C9C9, 1208 +12254000, 12257000, USB, 10, #55008080, 1209 +12257000, 12260000, USB, 10, #5500C9C9, 1210 +12260000, 12263000, USB, 10, #55008080, 1211 +12263000, 12266000, USB, 10, #5500C9C9, 1212 +12266000, 12269000, USB, 10, #55008080, 1213 +12269000, 12272000, USB, 10, #5500C9C9, 1214 +12272000, 12275000, USB, 10, #55008080, 1215 +12275000, 12278000, USB, 10, #5500C9C9, 1216 +12278000, 12281000, USB, 10, #55008080, 1217 +12281000, 12284000, USB, 10, #5500C9C9, 1218 +12284000, 12287000, USB, 10, #55008080, 1219 +12287000, 12290000, USB, 10, #5500C9C9, 1220 +12290000, 12293000, USB, 10, #55008080, 1221 +12293000, 12296000, USB, 10, #5500C9C9, 1222 +12296000, 12299000, USB, 10, #55008080, 1223 +12299000, 12302000, USB, 10, #5500C9C9, 1224 +12302000, 12305000, USB, 10, #55008080, 1225 +12305000, 12308000, USB, 10, #5500C9C9, 1226 +12308000, 12311000, USB, 10, #55008080, 1227 +12311000, 12314000, USB, 10, #5500C9C9, 1228 +12314000, 12317000, USB, 10, #55008080, 1229 +12317000, 12320000, USB, 10, #5500C9C9, 1230 +12320000, 12323000, USB, 10, #55008080, 1231 +12323000, 12326000, USB, 10, #5500C9C9, 1232 +12326000, 12329000, USB, 10, #55008080, 1233 +12329000, 12332000, USB, 10, #5500C9C9, 1234 +12332000, 12335000, USB, 10, #55008080, 1235 +12335000, 12338000, USB, 10, #5500C9C9, 1236 +12338000, 12341000, USB, 10, #55008080, 1237 +12341000, 12344000, USB, 10, #5500C9C9, 1238 +12344000, 12347000, USB, 10, #55008080, 1239 +12347000, 12350000, USB, 10, #5500C9C9, 1240 +12350000, 12353000, USB, 10, #55008080, 1241 +12353000, 12410600, USB, 100, #5500C9C9, Maritime +12410600, 12413600, USB, 10, #5500FF91, WEFAX Kodiak AK +12413600, 12748100, USB, 100, #55008080, Maritime +12748100, 12751100, USB, 100, #5500FF91, WEFAX Boston MA (Day) +12751100, 12784100, USB, 100, #55008080, Maritime +12784100, 12787100, USB, 100, #5500FF91, WEFAX PT. Reyes CA +12787100, 12788000, USB, 100, #55008080, Maritime +12788000, 12791000, USB, 100, #5500FF91, WEFAX New Orleans LA +12791000, 13077000, USB, 10, #505D88FF, Maritime +12791000, 13200000, USB, 100, #505D88FF, (Transoceanic Flights) (HFDL) and (Ship/Shore) Maritime +13077000, 13080000, USB, 10, #55008080, ITU Ch.1201 (Coast TX) +13080000, 13083000, USB, 10, #5500C9C9, 1202 +13083000, 13086000, USB, 10, #55008080, 1203 +13086000, 13089000, USB, 10, #5500C9C9, 1204 +13089000, 13092000, USB, 10, #55008080, 1205 +13092000, 13095000, USB, 10, #5500C9C9, 1206 +13095000, 13098000, USB, 10, #55008080, 1207 +13098000, 13101000, USB, 10, #5500C9C9, 1208 +13101000, 13104000, USB, 10, #55008080, 1209 +13104000, 13107000, USB, 10, #5500C9C9, 1210 +13107000, 13110000, USB, 10, #55008080, 1211 +13110000, 13113000, USB, 10, #5500C9C9, 1212 +13113000, 13116000, USB, 10, #55008080, 1213 +13116000, 13119000, USB, 10, #5500C9C9, 1214 +13119000, 13122000, USB, 10, #55008080, 1215 +13122000, 13125000, USB, 10, #5500C9C9, 1216 +13125000, 13128000, USB, 10, #55008080, 1217 +13128000, 13131000, USB, 10, #5500C9C9, 1218 +13131000, 13134000, USB, 10, #55008080, 1219 +13134000, 13137000, USB, 10, #5500C9C9, 1220 +13137000, 13140000, USB, 10, #55008080, 1221 +13140000, 13143000, USB, 10, #5500C9C9, 1222 +13143000, 13146000, USB, 10, #55008080, 1223 +13146000, 13149000, USB, 10, #5500C9C9, 1224 +13149000, 13152000, USB, 10, #55008080, 1225 +13152000, 13155000, USB, 10, #5500C9C9, 1226 +13155000, 13158000, USB, 10, #55008080, 1227 +13158000, 13161000, USB, 10, #5500C9C9, 1228 +13161000, 13164000, USB, 10, #55008080, 1229 +13164000, 13167000, USB, 10, #5500C9C9, 1230 +13167000, 13170000, USB, 10, #55008080, 1231 +13170000, 13173000, USB, 10, #5500C9C9, 1232 +13173000, 13176000, USB, 10, #55008080, 1233 +13176000, 13179000, USB, 10, #5500C9C9, 1234 +13179000, 13182000, USB, 10, #55008080, 1235 +13182000, 13185000, USB, 10, #5500C9C9, 1236 +13185000, 13188000, USB, 10, #55008080, 1237 +13188000, 13191000, USB, 10, #5500C9C9, 1238 +13191000, 13194000, USB, 10, #55008080, 1239 +13194000, 13197000, USB, 10, #5500C9C9, 1240 +13197000, 13200000, USB, 10, #55008080, 1241 +13200000, 13203000, USB, 10, #5090EE90, HFGCS +13203000, 13360000, USB, 10, #505D88FF, Aeronautical (HFDL) +13360000, 13410000, AM, 100, #40FFFF00, Radio Astronomy +13410000, 13508100, USB, 100, #5500FF7F, Radiolocation +13508100, 13511100, USB, 10, #5500FF91, WEFAX Halifax CA +13511100, 13553000, USB, 100, #5500FF7F, Radiolocation +13553000, 13567000, CW, 10, #50FF0000, 22m (HiFER) Band and 22m ISM +13567000, 13570000, CW, 10, #44006179, 22m ISM Band +13570000, 13870000, AM, 100, #505D63FF, Shortwave (22m) Broadcast +13870000, 13927000, USB, 100, #55008080, Propagation Testing +13927000, 13930000, USB, 10, #5090EE90, MARS +13930000, 14000000, USB, 100, #55008080, Propagation Testing +14000000, 14070000, USB, 10, #50FF0000, 20m Ham Band| +14070000, 14095000, USB, 10, #500000FF, RTTY (20m) +14095000, 14099500, USB, 10, #5000B3FF, Packet (20m) +14099500, 14100500, USB, 10, #50ACFFEC, NCDXF Beacons (20m) +14100500, 14112000, USB, 10, #5000B3FF, Packet (20m) +14112000, 14228000, USB, 10, #50FF0000, 20m +14228000, 14232000, USB, 10, #50FF004D, SSTV (20m) +14232000, 14284000, USB, 10, #50FF0000, 20m +14284000, 14288000, USB, 10, #5000FF00, AM calling frequency (20m) +14288000, 14350000, USB, 10, #50FF0000, |20m Ham Band +14350000, 14669000, USB, 100, #55008080, Propagation Testing +14669000, 14671000, AM, 100, #44FF00FF, CHU Canada +14671000, 14995000, USB, 100, #55008080, Propagation Testing +14995000, 15005000, AM, 100, #44FF00FF, WWV NIST +15016000, 15019000, USB, 100, #5090EE90, HFGCS +15019000, 15100000, USB, 100, #40AFFFEE, (Transoceanic Flights) (HFDL) +15100000, 15800000, AM, 100, #505D63FF, Shortwave (19m) Broadcast +15800000, 16133100, USB, 100, #5500C9C9, (Ship/Shore) Maritime +16133100, 16136100, USB, 10, #5500FF91, WEFAX Honolulu HI (Day) +16136100, 16360000, USB, 100, #5500C9C9, (Ship/Shore) Maritime +16136100, 17144500, USB, 100, #55008080, (Ship/Shore) Maritime +16360000, 16363000, USB, 10, #55008080, ITU Ch.1601 (Ship TX) +16363000, 16366000, USB, 10, #5500C9C9, 1602 +16366000, 16369000, USB, 10, #55008080, 1603 +16369000, 16372000, USB, 10, #5500C9C9, 1604 +16372000, 16375000, USB, 10, #55008080, 1605 +16375000, 16378000, USB, 10, #5500C9C9, 1606 +16378000, 16381000, USB, 10, #55008080, 1607 +16381000, 16384000, USB, 10, #5500C9C9, 1608 +16384000, 16387000, USB, 10, #55008080, 1609 +16387000, 16390000, USB, 10, #5500C9C9, 1610 +16390000, 16393000, USB, 10, #55008080, 1611 +16393000, 16396000, USB, 10, #5500C9C9, 1612 +16396000, 16399000, USB, 10, #55008080, 1613 +16399000, 16402000, USB, 10, #5500C9C9, 1614 +16402000, 16405000, USB, 10, #55008080, 1615 +16405000, 16408000, USB, 10, #5500C9C9, 1616 +16408000, 16411000, USB, 10, #55008080, 1617 +16411000, 16414000, USB, 10, #5500C9C9, 1618 +16414000, 16417000, USB, 10, #55008080, 1619 +16417000, 16420000, USB, 10, #5500C9C9, 1620 +16420000, 16423000, USB, 10, #55008080, 1621 +16423000, 16426000, USB, 10, #5500C9C9, 1622 +16426000, 16429000, USB, 10, #55008080, 1623 +16429000, 16432000, USB, 10, #5500C9C9, 1624 +16432000, 16435000, USB, 10, #55008080, 1625 (USGS Calling) +16435000, 16438000, USB, 10, #5500C9C9, 1626 +16438000, 16441000, USB, 10, #55008080, 1627 +16441000, 16444000, USB, 10, #5500C9C9, 1628 +16444000, 16447000, USB, 10, #55008080, 1629 +16447000, 16450000, USB, 10, #5500C9C9, 1630 +16450000, 16453000, USB, 10, #55008080, 1631 +16453000, 16456000, USB, 10, #5500C9C9, 1632 +16456000, 16459000, USB, 10, #55008080, 1633 +16459000, 16462000, USB, 10, #5500C9C9, 1634 +16462000, 16465000, USB, 10, #55008080, 1635 +16465000, 16468000, USB, 10, #5500C9C9, 1636 +16468000, 16471000, USB, 10, #55008080, 1637 +16471000, 16474000, USB, 10, #5500C9C9, 1638 +16474000, 16477000, USB, 10, #55008080, 1639 +16477000, 16480000, USB, 10, #5500C9C9, 1640 +16480000, 16483000, USB, 10, #55008080, 1641 +16483000, 16486000, USB, 10, #5500C9C9, 1642 +16486000, 16489000, USB, 10, #55008080, 1643 +16489000, 16492000, USB, 10, #5500C9C9, 1644 +16492000, 16495000, USB, 10, #55008080, 1645 +16495000, 16498000, USB, 10, #5500C9C9, 1646 +16498000, 16501000, USB, 10, #55008080, 1647 +16501000, 16504000, USB, 10, #5500C9C9, 1648 +16504000, 16507000, USB, 10, #55008080, 1649 +16507000, 16510000, USB, 10, #5500C9C9, 1650 +16510000, 16513000, USB, 10, #55008080, 1651 +16513000, 16516000, USB, 10, #5500C9C9, 1652 +16516000, 16519000, USB, 10, #55008080, 1653 +16519000, 16522000, USB, 10, #5500C9C9, 1654 +16522000, 16525000, USB, 10, #55008080, 1655 +16525000, 16528000, USB, 10, #5500C9C9, 1656 +16528000, 17144500, USB, 100, #55008080, (Ship/Shore) Maritime +17144500, 17147500, USB, 100, #5500FF91, WEFAX New Orleans LA (Day) +17149300, 17152300, USB, 100, #5500FF91, WEFAX PT. Reyes CA +17152300, 17242000, USB, 100, #5500C9C9, (Ship/Shore) Maritime +17152300, 17480000, USB, 100, #55008080, (Ship/Shore) Maritime +17242000, 17245000, USB, 10, #55008080, ITU Ch.1601 (Coast TX) +17245000, 17248000, USB, 10, #5500C9C9, 1602 +17248000, 17251000, USB, 10, #55008080, 1603 +17251000, 17254000, USB, 10, #5500C9C9, 1604 +17254000, 17257000, USB, 10, #55008080, 1605 +17257000, 17260000, USB, 10, #5500C9C9, 1606 +17260000, 17263000, USB, 10, #55008080, 1607 +17263000, 17266000, USB, 10, #5500C9C9, 1608 +17266000, 17269000, USB, 10, #55008080, 1609 +17269000, 17272000, USB, 10, #5500C9C9, 1610 +17272000, 17275000, USB, 10, #55008080, 1611 +17275000, 17278000, USB, 10, #5500C9C9, 1612 +17278000, 17281000, USB, 10, #55008080, 1613 +17281000, 17284000, USB, 10, #5500C9C9, 1614 +17284000, 17287000, USB, 10, #55008080, 1615 +17287000, 17290000, USB, 10, #5500C9C9, 1616 +17290000, 17293000, USB, 10, #55008080, 1617 +17293000, 17296000, USB, 10, #5500C9C9, 1618 +17296000, 17299000, USB, 10, #55008080, 1619 +17299000, 17302000, USB, 10, #5500C9C9, 1620 +17302000, 17305000, USB, 10, #55008080, 1621 +17305000, 17308000, USB, 10, #5500C9C9, 1622 +17308000, 17311000, USB, 10, #55008080, 1623 +17311000, 17314000, USB, 10, #5500C9C9, 1624 +17314000, 17317000, USB, 10, #55008080, 1625 +17317000, 17320000, USB, 10, #5500C9C9, 1626 +17320000, 17323000, USB, 10, #55008080, 1627 +17323000, 17326000, USB, 10, #5500C9C9, 1628 +17326000, 17329000, USB, 10, #55008080, 1629 +17329000, 17332000, USB, 10, #5500C9C9, 1630 +17332000, 17335000, USB, 10, #55008080, 1631 +17335000, 17338000, USB, 10, #5500C9C9, 1632 +17338000, 17341000, USB, 10, #55008080, 1633 +17341000, 17344000, USB, 10, #5500C9C9, 1634 +17344000, 17347000, USB, 10, #55008080, 1635 +17347000, 17350000, USB, 10, #5500C9C9, 1636 +17350000, 17353000, USB, 10, #55008080, 1637 +17353000, 17356000, USB, 10, #5500C9C9, 1638 +17356000, 17359000, USB, 10, #55008080, 1639 +17359000, 17362000, USB, 10, #5500C9C9, 1640 +17362000, 17365000, USB, 10, #55008080, 1641 +17365000, 17368000, USB, 10, #5500C9C9, 1642 +17368000, 17371000, USB, 10, #55008080, 1643 +17371000, 17374000, USB, 10, #5500C9C9, 1644 +17374000, 17377000, USB, 10, #55008080, 1645 +17377000, 17380000, USB, 10, #5500C9C9, 1646 +17380000, 17383000, USB, 10, #55008080, 1647 +17383000, 17386000, USB, 10, #5500C9C9, 1648 +17386000, 17389000, USB, 10, #55008080, 1649 +17389000, 17392000, USB, 10, #5500C9C9, 1650 +17392000, 17395000, USB, 10, #55008080, 1651 +17395000, 17398000, USB, 10, #5500C9C9, 1652 +17398000, 17401000, USB, 10, #55008080, 1653 +17401000, 17404000, USB, 10, #5500C9C9, 1654 +17404000, 17407000, USB, 10, #55008080, 1655 +17407000, 17410000, USB, 10, #5500C9C9, 1656 +17410000, 17480000, USB, 100, #55008080, (Ship/Shore) Maritime +17480000, 17900000, AM, 100, #505D63FF, Shortwave (16m) Broadcast +17900000, 18068000, USB, 100, #40AFFFEE, (Transoceanic Flights) (HFDL) +18068000, 18100000, USB, 10, #50FF0000, 17m Ham Band| +18100000, 18105000, USB, 10, #500000FF, RTTY (17m) +18105000, 18110000, USB, 10, #5000B3FF, Packet (17m) +18110000, 18168000, USB, 10, #50FF0000, |17m Ham Band +18168000, 18780000, USB, 100, #55008080, (Ship/Shore) Maritime +18168000, 18900000, USB, 100, #55008080, (Ship/Shore) Maritime/ Fixed Service +18780000, 18783000, USB, 10, #5500C9C9, ITU Ch.1801 (Ship TX) +18783000, 18786000, USB, 10, #55008080, 1802 +18786000, 18789000, USB, 10, #5500C9C9, 1803 +18789000, 18792000, USB, 10, #55008080, 1804 +18792000, 18795000, USB, 10, #5500C9C9, 1805 +18795000, 18798000, USB, 10, #55008080, 1806 (Calling) +18798000, 18801000, USB, 10, #5500C9C9, 1807 +18801000, 18804000, USB, 10, #55008080, 1808 +18804000, 18807000, USB, 10, #5500C9C9, 1809 +18807000, 18810000, USB, 10, #55008080, 1810 +18810000, 18813000, USB, 10, #5500C9C9, 1811 +18813000, 18816000, USB, 10, #55008080, 1812 +18816000, 18819000, USB, 10, #5500C9C9, 1813 +18819000, 18822000, USB, 10, #55008080, 1814 +18822000, 18825000, USB, 10, #5500C9C9, 1815 +18825000, 18900000, USB, 100, #55008080, (Ship/Shore) Maritime +18900000, 19020000, AM, 100, #505D63FF, Shortwave (15m) Broadcast +19020000, 19755000, USB, 100, #55008080, (Ship/Shore) Maritime +19020000, 19995000, USB, 100, #55008080, (Ship/Shore) Maritime +19755000, 19758000, USB, 10, #5500C9C9, ITU Ch.1801 (Coast TX) +19758000, 19761000, USB, 10, #55008080, 1802 +19761000, 19764000, USB, 10, #5500C9C9, 1803 +19764000, 19767000, USB, 10, #55008080, 1804 +19767000, 19770000, USB, 10, #5500C9C9, 1805 +19770000, 19773000, USB, 10, #55008080, 1806 +19773000, 19776000, USB, 10, #5500C9C9, 1807 +19776000, 19779000, USB, 10, #55008080, 1808 +19779000, 19782000, USB, 10, #5500C9C9, 1809 +19782000, 19785000, USB, 10, #55008080, 1810 +19785000, 19788000, USB, 10, #5500C9C9, 1811 +19788000, 19791000, USB, 10, #55008080, 1812 +19791000, 19794000, USB, 10, #5500C9C9, 1813 +19794000, 19797000, USB, 10, #55008080, 1814 +19797000, 19800000, USB, 10, #5500C9C9, 1815 +19800000, 19995000, USB, 100, #55008080, (Ship/Shore) Maritime +19995000, 20005000, AM, 100, #44FF00FF, WWV NIST +20005000, 21000000, USB, 100, #55008080, Propagation Testing +21000000, 21070000, USB, 10, #50FF0000, 15m Ham Band| +21070000, 21100000, USB, 10, #500089FF, RTTY/Data (15m) +21100000, 21338000, USB, 10, #50FF0000, 15m +21338000, 21342000, USB, 10, #50FF004D, SSTV (15m) +21342000, 21450000, USB, 10, #50FF0000, |15m Ham Band +21450000, 21850000, AM, 100, #505D63FF, Shortwave (13m) Broadcast +21850000, 22000000, USB, 100, #505D88FF, Aeronautical (HFDL) +22000000, 22003000, USB, 10, #55008080, ITU Ch.2201 (Ship TX) +22000000, 22525100, USB, 100, #505D88FF, (Ship/Shore) Maritime +22003000, 22006000, USB, 10, #5500C9C9, 2202 +22006000, 22009000, USB, 10, #55008080, 2203 +22009000, 22012000, USB, 10, #5500C9C9, 2204 +22012000, 22015000, USB, 10, #55008080, 2205 +22015000, 22018000, USB, 10, #5500C9C9, 2206 +22018000, 22021000, USB, 10, #55008080, 2207 +22021000, 22024000, USB, 10, #5500C9C9, 2208 +22024000, 22027000, USB, 10, #55008080, 2209 +22027000, 22030000, USB, 10, #5500C9C9, 2210 +22030000, 22033000, USB, 10, #55008080, 2211 +22033000, 22036000, USB, 10, #5500C9C9, 2212 +22036000, 22039000, USB, 10, #55008080, 2213 +22039000, 22042000, USB, 10, #5500C9C9, 2214 +22042000, 22045000, USB, 10, #55008080, 2215 +22045000, 22048000, USB, 10, #5500C9C9, 2216 +22048000, 22051000, USB, 10, #55008080, 2217 +22051000, 22054000, USB, 10, #5500C9C9, 2218 +22054000, 22057000, USB, 10, #55008080, 2219 +22057000, 22060000, USB, 10, #5500C9C9, 2220 +22060000, 22063000, USB, 10, #55008080, 2221 (Calling) +22063000, 22066000, USB, 10, #5500C9C9, 2222 +22066000, 22069000, USB, 10, #55008080, 2223 +22069000, 22072000, USB, 10, #5500C9C9, 2224 +22072000, 22075000, USB, 10, #55008080, 2225 +22075000, 22078000, USB, 10, #5500C9C9, 2226 +22078000, 22081000, USB, 10, #55008080, 2227 +22081000, 22084000, USB, 10, #5500C9C9, 2228 +22084000, 22087000, USB, 10, #55008080, 2229 +22087000, 22090000, USB, 10, #5500C9C9, 2230 +22090000, 22093000, USB, 10, #55008080, 2231 +22093000, 22096000, USB, 10, #5500C9C9, 2232 +22096000, 22099000, USB, 10, #55008080, 2233 +22099000, 22102000, USB, 10, #5500C9C9, 2234 +22102000, 22105000, USB, 10, #55008080, 2235 +22105000, 22108000, USB, 10, #5500C9C9, 2236 +22108000, 22111000, USB, 10, #55008080, 2237 +22111000, 22114000, USB, 10, #5500C9C9, 2238 +22114000, 22117000, USB, 10, #55008080, 2239 +22117000, 22120000, USB, 10, #5500C9C9, 2240 +22120000, 22123000, USB, 10, #55008080, 2241 +22123000, 22126000, USB, 10, #5500C9C9, 2242 +22126000, 22129000, USB, 10, #55008080, 2243 +22129000, 22132000, USB, 10, #5500C9C9, 2244 +22132000, 22135000, USB, 10, #55008080, 2245 +22135000, 22138000, USB, 10, #5500C9C9, 2246 +22138000, 22141000, USB, 10, #55008080, 2247 +22141000, 22144000, USB, 10, #5500C9C9, 2248 +22144000, 22147000, USB, 10, #55008080, 2249 +22147000, 22150000, USB, 10, #5500C9C9, 2250 +22150000, 22153000, USB, 10, #55008080, 2251 +22153000, 22156000, USB, 10, #5500C9C9, 2252 +22156000, 22159000, USB, 10, #55008080, 2253 +22159000, 22525100, USB, 100, #5500C9C9, (Ship/Shore) Maritime +22525100, 22528100, USB, 100, #5500FF91, WEFAX PT. Reyes CA (Day) +22528100, 22696000, USB, 100, #55008080, (Ship/Shore) Maritime +22528100, 24890000, USB, 100, #505D88FF, (Ship/Shore) Maritime +22696000, 22699000, USB, 10, #5500C9C9, ITU Ch.2201 (Coast TX) +22699000, 22702000, USB, 10, #55008080, 2202 +22702000, 22705000, USB, 10, #5500C9C9, 2203 +22705000, 22708000, USB, 10, #55008080, 2204 +22708000, 22711000, USB, 10, #5500C9C9, 2205 +22711000, 22714000, USB, 10, #55008080, 2206 +22714000, 22717000, USB, 10, #5500C9C9, 2207 +22717000, 22720000, USB, 10, #55008080, 2208 +22720000, 22723000, USB, 10, #5500C9C9, 2209 +22723000, 22726000, USB, 10, #55008080, 2210 +22726000, 22729000, USB, 10, #5500C9C9, 2211 +22729000, 22732000, USB, 10, #55008080, 2212 +22732000, 22735000, USB, 10, #5500C9C9, 2213 +22735000, 22738000, USB, 10, #55008080, 2214 +22738000, 22741000, USB, 10, #5500C9C9, 2215 +22741000, 22744000, USB, 10, #55008080, 2216 +22744000, 22747000, USB, 10, #5500C9C9, 2217 +22747000, 22750000, USB, 10, #55008080, 2218 +22750000, 22753000, USB, 10, #5500C9C9, 2219 +22753000, 22756000, USB, 10, #55008080, 2220 +22756000, 22759000, USB, 10, #5500C9C9, 2221 +22759000, 22762000, USB, 10, #55008080, 2222 +22762000, 22765000, USB, 10, #5500C9C9, 2223 +22765000, 22768000, USB, 10, #55008080, 2224 +22768000, 22771000, USB, 10, #5500C9C9, 2225 +22771000, 22774000, USB, 10, #55008080, 2226 +22774000, 22777000, USB, 10, #5500C9C9, 2227 +22777000, 22780000, USB, 10, #55008080, 2228 +22780000, 22783000, USB, 10, #5500C9C9, 2229 +22783000, 22786000, USB, 10, #55008080, 2230 +22786000, 22789000, USB, 10, #5500C9C9, 2231 +22789000, 22792000, USB, 10, #55008080, 2232 +22792000, 22795000, USB, 10, #5500C9C9, 2233 +22795000, 22798000, USB, 10, #55008080, 2234 +22798000, 22801000, USB, 10, #5500C9C9, 2235 +22801000, 22804000, USB, 10, #55008080, 2236 +22804000, 22807000, USB, 10, #5500C9C9, 2237 +22807000, 22810000, USB, 10, #55008080, 2238 +22810000, 22813000, USB, 10, #5500C9C9, 2239 +22813000, 22816000, USB, 10, #55008080, 2240 +22816000, 22819000, USB, 10, #5500C9C9, 2241 +22819000, 22822000, USB, 10, #55008080, 2242 +22822000, 22825000, USB, 10, #5500C9C9, 2243 +22825000, 22828000, USB, 10, #55008080, 2244 +22828000, 22831000, USB, 10, #5500C9C9, 2245 +22831000, 22834000, USB, 10, #55008080, 2246 +22834000, 22837000, USB, 10, #5500C9C9, 2247 +22837000, 22840000, USB, 10, #55008080, 2248 +22840000, 22843000, USB, 10, #5500C9C9, 2249 +22843000, 22846000, USB, 10, #55008080, 2250 +22846000, 22849000, USB, 10, #5500C9C9, 2251 +22849000, 22852000, USB, 10, #55008080, 2252 +22852000, 22855000, USB, 10, #5500C9C9, 2253 +22855000, 24890000, USB, 100, #55008080, (Ship/Shore) Maritime +24890000, 24920000, USB, 10, #50FF0000, 12m Ham Band| +24920000, 24925000, USB, 10, #500000FF, RTTY (12m) +24925000, 24930000, USB, 10, #5000B3FF, Packet (12m) +24930000, 24990000, USB, 10, #50FF0000, |12m Ham Band +24995000, 25005000, AM, 100, #44FF00FF, WWV NIST +25005000, 25070000, USB, 100, #55008080, (Ship/Shore) Maritime +25005000, 25550000, USB, 100, #505D88FF, (Ship/Shore) Maritime +25070000, 25073000, USB, 10, #5500C9C9, ITU Ch.2501 (Ship TX) +25073000, 25076000, USB, 10, #55008080, 2502 +25076000, 25079000, USB, 10, #5500C9C9, 2503 +25079000, 25082000, USB, 10, #55008080, 2504 +25082000, 25085000, USB, 10, #5500C9C9, 2505 +25085000, 25088000, USB, 10, #55008080, 2506 +25088000, 25091000, USB, 10, #5500C9C9, 2507 +25091000, 25094000, USB, 10, #55008080, 2508 +25094000, 25097000, USB, 10, #5500C9C9, 2509 +25097000, 25100000, USB, 10, #55008080, 2510 +25100000, 25550000, USB, 10, #5500C9C9, (Ship/Shore) Maritime +25550000, 25670000, USB, 100, #40FFFF00, Radio Astronomy +25670000, 26100000, AM, 100, #505D63FF, Shortwave (11m) Broadcast +26100000, 26145000, USB, 100, #55008080, (Ship/Shore) Maritime +26100000, 26957000, USB, 100, #55008080, (Ship/Shore) Maritime +26145000, 26148000, USB, 10, #5500C9C9, ITU Ch.2501 (Coast TX) +26148000, 26151000, USB, 10, #55008080, 2502 +26151000, 26154000, USB, 10, #5500C9C9, 2503 +26154000, 26157000, USB, 10, #55008080, 2504 +26157000, 26160000, USB, 10, #5500C9C9, 2505 +26160000, 26163000, USB, 10, #55008080, 2506 +26163000, 26166000, USB, 10, #5500C9C9, 2507 +26166000, 26169000, USB, 10, #55008080, 2508 +26169000, 26172000, USB, 10, #5500C9C9, 2509 +26172000, 26175000, USB, 10, #55008080, 2510 +26175000, 26957000, USB, 100, #55008080, Marine Propagation Testing +26957000, 26960000, NFM, 100, #44006179, ISM Band (10m) +26960000, 26970000, AM, 100, #77FF7777, CB| Ch. 1 +26960000, 27410000, USB, 100, #77FF7777, CB +26970000, 26980000, AM, 100, #77FF5858, 2 +26980000, 26990000, AM, 100, #77FF7777, 3 +26990000, 27000000, AM, 100, #77ADFF7D, R/C +27000000, 27010000, AM, 100, #77FF7777, 4 (4x4 Channel) +27010000, 27020000, AM, 100, #77FF5858, 5 +27020000, 27030000, AM, 100, #77FF7777, 6 +27030000, 27040000, AM, 100, #77FF5858, 7 +27040000, 27050000, AM, 100, #77ADFF7D, R/C +27050000, 27060000, AM, 100, #77FF7777, 8 +27060000, 27070000, AM, 100, #50FF0091, 9 (Emergency Channel) +27070000, 27080000, AM, 100, #77FF7777, 10 (Regional Roads) +27080000, 27090000, AM, 100, #77FF5858, 11 +27090000, 27100000, AM, 100, #77ADFF7D, R/C +27100000, 27110000, AM, 100, #77FF5858, 12 +27110000, 27120000, AM, 100, #77FF7777, 13 (Marine, RV) +27120000, 27130000, AM, 100, #77FF5858, 14 (Walkie Talkies) +27130000, 27140000, AM, 100, #77FF7777, 15 +27140000, 27150000, AM, 100, #77ADFF7D, R/C +27150000, 27160000, AM, 100, #77FF7777, 16 (Also SSB) +27160000, 27170000, AM, 100, #77FF5858, 17 (North/South Hwy) +27170000, 27180000, AM, 100, #77FF7777, 18 +27180000, 27190000, AM, 100, #77FF5858, 19 (Truckers, East/West Hwy) +27190000, 27200000, AM, 100, #77FF7777, (Gap in CB) +27200000, 27210000, AM, 100, #77FF5858, 20 +27210000, 27220000, AM, 100, #77FF7777, 21 (Regional Roads) +27220000, 27230000, AM, 100, #77FF5858, 22 +27230000, 27240000, AM, 100, #77FF7777, 24 +27240000, 27250000, AM, 100, #77FF5858, 25 +27250000, 27260000, AM, 100, #77FF7777, 23 and R/C +27260000, 27270000, AM, 100, #77FF5858, 26 +27270000, 27280000, AM, 100, #77FF7777, 27 +27280000, 27290000, AM, 100, #77FF5858, 28 +27290000, 27300000, AM, 100, #77FF7777, 29 +27300000, 27310000, AM, 100, #77FF5858, 30 +27310000, 27320000, AM, 100, #77FF7777, 31 +27320000, 27330000, AM, 100, #77FF5858, 32 +27330000, 27340000, AM, 100, #77FF7777, 33 +27340000, 27350000, AM, 100, #77FF5858, 34 +27350000, 27360000, AM, 100, #77FF7777, 35 +27360000, 27370000, AM, 100, #77FF5858, 36 (Also SSB) +27370000, 27380000, AM, 100, #77FF7777, 37 (Also SSB) +27380000, 27390000, AM, 100, #77FF5858, 38 (Also SSB, LSB) +27390000, 27400000, AM, 100, #77FF7777, 39 (Also SSB) +27400000, 27410000, AM, 100, #77FF5858, 40 (Also SSB) |CB +27410000, 28000000, NFM, 100, #50D00098, Public Safety Industrial/Business and Meteorological Aids +28000000, 28070000, CW, 10, #50FF0000, 10m Ham Band| CW +28070000, 28150000, USB, 10, #500000FF, RTTY (10m) +28150000, 28190000, CW, 10, #50FFFFFF, CW (10m) +28200000, 28300000, USB, 10, #50ACFFEC, Beacons (10m) +28300000, 28679000, USB, 10, #40FF0000, Phone (10m) +28679000, 28681000, USB, 10, #50FF004D, SSTV (10m) +28681000, 29000000, USB, 10, #50FF0000, 10m +29000000, 29200000, AM, 10, #50FF0000, AM (10m) +29200000, 29300000, USB, 10, #40FF0000, Phone (10m) +29300000, 29510000, NFM, 10, #5500E6FF, Satellite Downlinks (10m) +29520000, 29590000, NFM, 10, #50FFFF00, Repeater Inputs (10m) +29590000, 29610000, NFM, 10, #503CFF00, FM Simplex (10m) +29610000, 29700000, NFM, 10, #5089FF00, Repeater Outputs| 10m Ham Band +29700000, 35200000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) and Industrial/Business +35200000, 35660000, NFM, 100, #50FFCE83, Paging +35660000, 37500000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) and Industrial/Business +37500000, 38250000, NFM, 100, #40FFFF00, Radio Astronomy +38250000, 40660000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) and Industrial/Business +40660000, 40700000, NFM, 100, #44006179, ISM Band (8m) +40700000, 43200000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) and Industrial/Business +43200000, 43660000, NFM, 100, #50FFCE83, Paging +43660000, 50000000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) and Industrial/Business +50000000, 50100000, CW, 10, #50FFFFFF, 6m Ham Band| CW Beacons +50100000, 50124000, USB, 10, #50FF0000, DX Window (6m) +50124000, 50126000, USB, 10, #50FF0000, SSB Calling (6m) +50126000, 50300000, USB, 10, #50FF0000, 6m +50300000, 50600000, NFM, 10, #50FF0000, All modes (6m) +50600000, 50640000, NFM, 10, #508000FF, Digital (Packet) Calling (6m) +50640000, 50800000, NFM, 10, #50FF0000, 6m +50800000, 51000000, NFM, 10, #500000FF, Radio Remote Control (6m) +51000000, 51100000, USB, 10, #40FF0000, Pacific DX window (6m) +51100000, 51120000, NFM, 10, #50FF0000, 6m +51120000, 51480000, NFM, 10, #50FFFF00, Repeater Inputs (6m) +51500000, 51620000, NFM, 10, #50FF0000, Simplex (6m) +51620000, 51990000, NFM, 10, #5089FF00, Repeater Outputs (6m) +51990000, 52000000, NFM, 10, #503CFF00, FM Simplex (6m) +52000000, 52500000, NFM, 10, #50FFFF00, Repeater Inputs (6m) +52500000, 52500000, NFM, 10, #508000FF, Repeater Output (6m) +52500000, 52570000, NFM, 10, #50FF0000, Primary/ Secondary Simplex (6m) +52570000, 53000000, NFM, 10, #50FF0000, 6m +53000000, 53050000, NFM, 10, #500000FF, Simplex/ Remote Control (6m) +53050000, 53480000, NFM, 10, #50FFFF00, Repeater Inputs (6m) +53500000, 54000000, NFM, 10, #5089FF00, Repeater Outputs Simplex |6m Ham Band +54000000, 60000000, WFM, 100, #50FFE55C, Television Ch.2 (VHF) +60000000, 66000000, WFM, 100, #50FFE55C, Television Ch.3 +66000000, 72000000, WFM, 100, #50FFE55C, Television Ch.4 +72000000, 73000000, NFM, 10, #50FFCE83, Paging +73000000, 74600000, NFM, 100, #40FFFF00, Radio Astronomy +74600000, 74800000, USB, 100, #AA000000, Guard Band +74800000, 75200000, NFM, 100, #505D88FF, Aeronautical Radionavigation (Marker Beacons) +75200000, 75460000, USB, 100, #AA000000, Guard Band +75460000, 76000000, NFM, 10, #50FFCE83, Paging +76000000, 82000000, WFM, 100, #50FFE55C, Television Ch.5 +82000000, 88000000, WFM, 100, #50FFE55C, Television Ch.6 +88000000, 108000000, WFM, 100, #4000FF9A, FM Broadcast +108000000, 118000000, AM, 100, #505D88FF, Air Band VOR/ILS +118000000, 121490000, AM, 100, #505D88FF, Air Band Voice +121490000, 121510000, AM, 100, #50FF0091, Civilian Aircraft Distress/ Emergency +121510000, 129112500, AM, 100, #505D88FF, Air Band Voice +129112500, 129137500, AM, 100, #400000FF, ACARS +129137500, 130012500, AM, 100, #505D88FF, Air Band Voice +130012500, 130037500, AM, 100, #400000FF, ACARS +130037500, 130412500, AM, 100, #505D88FF, Air Band Voice +130412500, 130437500, AM, 100, #400000FF, ACARS +130437500, 130462500, AM, 100, #400000FF, ACARS +131112500, 131137500, AM, 100, #400000FF, ACARS +131137500, 131545000, AM, 100, #505D88FF, Air Band Voice +131545000, 131555000, AM, 100, #400000FF, Worldwide ACARS +131555000, 136637500, AM, 100, #505D88FF, Air Band Voice +136637500, 136662500, RAW, 10, #400000FF, VDL-M2/ Transit 5B-5 +136687500, 136712500, RAW, 10, #400000FF, VDL-M2/ ACARS +136737500, 136762500, AM, 100, #400000FF, ACARS +136787500, 136812500, RAW, 10, #400000FF, VDL-M2/ ACARS +136837500, 136862500, AM, 100, #400000FF, ACARS +136862500, 136962500, AM, 100, #505D88FF, Air Band Voice +136962500, 136987500, RAW, 10, #400000FF, Worldwide VDL-M2 +137025000, 137040000, WFM, 10, #55008CFF, |SpaceBees +137040000, 137080000, WFM, 10, #2200BFFF, | METEOR +137080000, 137120000, WFM, 10, #5500FFFF, NOAA-19 +137120000, 137160000, WFM, 10, #2200BFFF, METEOR | +137160000, 137175000, WFM, 10, #55008CFF, SpaceBees| +137175000, 137327500, NFM, 10, #33FF4400, OrbComm Segment 1 +137187500, 137212500, NFM, 10, #33FF4400, OrbComm Ch.1 (Downlink) +137212500, 137237500, NFM, 10, #33FF713D, Ch.2 +137237500, 137262500, NFM, 10, #33FF4400, Ch.3 +137275000, 137300000, NFM, 10, #33FF713D, Ch.11 +137300000, 137325000, NFM, 10, #33FF4400, Ch.12 +137327500, 137333000, WFM, 10, #55008CFF, |SpaceBees +137333000, 137367000, NFM, 10, #44FF00FF, DSB NOAA-15 and NOAA-18 +137367000, 137375000, WFM, 10, #55008CFF, SpaceBees| +137422500, 137472500, NFM, 10, #33FF4400, OrbComm Segment 2 +137427500, 137450000, NFM, 10, #33FF4400, Ch.4 +137450000, 137472500, NFM, 10, #33FF713D, Ch.5 +137472500, 137535000, WFM, 10, #55008CFF, SpaceBees +137535000, 137585000, NFM, 10, #55FF8000, OrbComm Gateway +137585000, 137600000, WFM, 10, #55008CFF, |SpaceBees +137600000, 137640000, WFM, 10, #5500FFFF, NOAA-15 +137640000, 137650000, WFM, 10, #55008CFF, SpaceBees| +137650000, 137675000, NFM, 10, #33FF4400, Ch.6 +137650000, 137750000, NFM, 10, #33FF4400, OrbComm Segment 3 +137675000, 137700000, NFM, 10, #33FF713D, Ch.7 +137700000, 137725000, NFM, 10, #33FF4400, Ch.8 +137725000, 137750000, NFM, 10, #33FF713D, Ch.9 +137753000, 137787000, NFM, 10, #44FF00FF, DSB NOAA-19 +137787500, 137812500, NFM, 10, #33FF4400, OrbComm Ch.10 (Downlink) +137787500, 137812500, NFM, 10, #33FF4400, OrbComm Segment 4 +137812500, 137892500, WFM, 10, #55008CFF, SpaceBees +137892500, 137932500, WFM, 10, #5500FFFF, NOAA-18 +137932500, 138000000, WFM, 10, #55008CFF, SpaceBees +138000000, 144000000, NFM, 100, #5004B704, Military +144000000, 144190000, NFM, 100, #50FFFFFF, 2m Ham Band| CW +144190000, 144210000, NFM, 100, #5000FF00, National Call (2m) +144210000, 144275000, NFM, 100, #50FF0000, SSB (2m) +144275000, 144300000, NFM, 100, #50ACFFEC, Beacons (2m) +144300000, 144385000, NFM, 100, #5033FF00, Satellites (2m) +144385000, 144395000, NFM, 100, #5000FFBF, APRS +144395000, 144480000, NFM, 100, #5033FF00, Satellites (2m) +144480000, 144500000, NFM, 100, #50FFFF00, ISS Voice Uplink (2m) +144500000, 144600000, NFM, 100, #50FF004D, Linear Translator Inputs (2m) +144600000, 144900000, NFM, 100, #50FFFF00, Repeater Inputs (2m) +144900000, 145100000, NFM, 100, #50FF0000, Weak Signal/ Packet (2m) +145100000, 145200000, NFM, 100, #50FF0000, Linear Translator Output (2m) +145200000, 145500000, NFM, 100, #5089FF00, Repeater Outputs (2m) +145500000, 145790000, NFM, 100, #503CCCFF, Experimental (2m) +145790000, 145810000, NFM, 100, #5500BCFF, ISS Voice/ SSTV Downlink (2m) +145810000, 145815000, NFM, 100, #5033FF00, Satellites (2m) +145815000, 145832500, NFM, 100, #55C4FF00, ISS VHF Packet U/D (2m) +145832500, 145840000, NFM, 100, #50ACFFEC, CAS-4A AX.25 Telemetry +145845000, 145852500, NFM, 100, #50FFFF00, SO-50 Uplink +145852500, 145860000, NFM, 100, #50ACFFEC, CAS-4A CW Telemetry +145865000, 145875000, NFM, 100, #5500E6FF, CAS-4A Downlink +145885000, 145895000, NFM, 100, #50ACFFEC, CAS-4B AX.25 Telemetry +145895000, 145905000, NFM, 100, #5500E6FF, PO-101 Downlink/ Beacon +145905000, 145915000, NFM, 100, #50ACFFEC, CAS-4B CW Telemetry +145920000, 145930000, NFM, 100, #5500E6FF, CAS-4B Downlink +145930000, 145940000, NFM, 100, #50ACFFEC, AO-73 Beacon/ RS-44 Uplink| +145945000, 145955000, NFM, 100, #5500E6FF, AO-73 Downlink +145955000, 145970000, NFM, 100, #5500E6FF, AO-91 Downlink +145970000, 145980000, NFM, 100, #5033FF00, Satellites (2m) +145980000, 146000000, NFM, 100, #55C4FF00, ISS V/U Voice Repeater Uplink |RS-44 Uplink +146000000, 146370000, NFM, 100, #50FFFF00, Repeater Inputs (2m) +146400000, 146515000, NFM, 100, #5000FFBF, Simplex (2m) +146515000, 146525000, NFM, 100, #5000FF00, FM National Call (2m) +146525000, 146580000, NFM, 100, #5000FFBF, Simplex (2m) +146610000, 146970000, NFM, 100, #5089FF00, Repeater Outputs (2m) +147000000, 147390000, NFM, 100, #5089FF00, Repeater Outputs (2m) +147420000, 147570000, NFM, 100, #5000FFBF, Simplex (2m) +147600000, 148000000, NFM, 100, #50FFFF00, Repeater Inputs |2m Ham Band +148000000, 148250000, NFM, 100, #33EBC334, Orbcomm Uplink (Ch.2) +148250000, 148585000, NFM, 100, #40FFCD00, Orbcomm or SpaceBees Uplink +148585000, 148635000, NFM, 100, #33EBC334, Orbcomm Uplink (Ch.2) +148635000, 148750000, NFM, 100, #40FFCD00, Orbcomm or SpaceBees Uplink +148750000, 149585000, NFM, 100, #33EBC334, Orbcomm Uplink (Ch.2) +149585000, 149635000, NFM, 100, #33FFC800, Orbcomm Uplink (Ch.1) +149635000, 149900000, NFM, 100, #5500FFFF, Satellite (Earth-to-space) +149900000, 149950000, NFM, 100, #40FFCD00, Orbcomm or SpaceBees Uplink +149950000, 150050000, NFM, 100, #33EBC334, Orbcomm Uplink (Ch.1a) +150050000, 151505000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +151505000, 151815000, NFM, 100, #50D00098, Public Safety and Industrial/Business +151815000, 151950000, NFM, 100, #40BAFD00, Multi-Use Radio Service (MURS) +151950000, 152000000, NFM, 100, #50D00098, Public Safety and Industrial/Business +152000000, 152300000, NFM, 100, #50FFCE83, Paging +152300000, 152480000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +152480000, 152840000, NFM, 100, #50FFCE83, Paging +152840000, 154560000, NFM, 100, #50D00098, Public Safety and Industrial/Business +154560000, 154610000, NFM, 100, #40BAFD00, Multi-Use Radio Service (MURS) +154610000, 155987500, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +155987500, 156012500, NFM, 100, #5500C9C9, Marine VHF Ch. 0 +156012500, 156037500, NFM, 100, #55008080, 60 +156037500, 156062500, NFM, 100, #5500C9C9, 1 +156062500, 156087500, NFM, 100, #55008080, 61 +156087500, 156112500, NFM, 100, #5500C9C9, 2 +156112500, 156137500, NFM, 100, #55008080, 62 +156137500, 156162500, NFM, 100, #5500C9C9, 3 +156162500, 156187500, NFM, 100, #55008080, 63 +156187500, 156212500, NFM, 100, #5500C9C9, 4 +156212500, 156237500, NFM, 100, #55008080, 64 +156237500, 156262500, NFM, 100, #5500C9C9, 5 +156262500, 156287500, NFM, 100, #55008080, 65 +156287500, 156312500, NFM, 100, #5500C9C9, 6 (Splx) +156312500, 156337500, NFM, 100, #55008080, 66 +156337500, 156362500, NFM, 100, #5500C9C9, 7 +156362500, 156387500, NFM, 100, #55008080, 67 (Splx) +156387500, 156412500, NFM, 100, #5500C9C9, 8 (Splx) +156412500, 156437500, NFM, 100, #55008080, 68 (Splx) +156437500, 156462500, NFM, 100, #5500C9C9, 9 (Splx) +156462500, 156487500, NFM, 100, #55008080, 69 (Splx) +156487500, 156512500, NFM, 100, #5500C9C9, 10 (Splx) +156512500, 156537500, NFM, 100, #55008080, 70 (Splx) +156537500, 156562500, NFM, 100, #5500C9C9, 11 (Splx) +156562500, 156587500, NFM, 100, #55008080, 71 (Splx) +156587500, 156612500, NFM, 100, #5500C9C9, 12 (Splx) +156612500, 156637500, NFM, 100, #55008080, 72 (Splx) +156637500, 156662500, NFM, 100, #5500C9C9, 13 (Splx) +156662500, 156687500, NFM, 100, #55008080, 73 (Splx) +156687500, 156712500, NFM, 100, #5500C9C9, 14 (Splx) +156712500, 156737500, NFM, 100, #55008080, 74 (Splx) +156737500, 156762500, NFM, 100, #5500C9C9, 15 (Splx) +156762500, 156787500, NFM, 100, #55008080, 75 (Splx) +156787500, 156812500, NFM, 100, #50FF0091, International Distress (Ch. 16) +156812500, 156837500, NFM, 100, #55008080, 76 (Splx) +156837500, 156862500, NFM, 100, #5500C9C9, 17 (Splx) +156862500, 156887500, NFM, 100, #55008080, 77 (Splx) +156887500, 156912500, NFM, 100, #5500C9C9, 18 +156912500, 156937500, NFM, 100, #55008080, 78 +156937500, 156962500, NFM, 100, #5500C9C9, 19 +156962500, 156987500, NFM, 100, #55008080, 79 +156987500, 157012500, NFM, 100, #5500C9C9, 20 +157012500, 157037500, NFM, 100, #55008080, 80 +157037500, 157062500, NFM, 100, #5500C9C9, 21 +157062500, 157087500, NFM, 100, #55008080, 81 +157087500, 157112500, NFM, 100, #5500C9C9, 22 +157112500, 157137500, NFM, 100, #55008080, 82 +157137500, 157162500, NFM, 100, #5500C9C9, 23 +157162500, 157187500, NFM, 100, #55008080, 83 +157187500, 157212500, NFM, 100, #5500C9C9, 24 +157212500, 157237500, NFM, 100, #55008080, 84 +157237500, 157262500, NFM, 100, #5500C9C9, 25 +157262500, 157287500, NFM, 100, #55008080, 85 +157287500, 157312500, NFM, 100, #5500C9C9, 26 +157312500, 157337500, NFM, 100, #55008080, 86 +157337500, 157362500, NFM, 100, #5500C9C9, 27 +157362500, 157387500, NFM, 100, #55008080, 87 (Splx) +157387500, 157412500, NFM, 100, #5500C9C9, 28 +157412500, 157437500, NFM, 100, #55008080, 88 (Splx) +157437500, 157480000, NFM, 100, #50D00098, Public Safety and Industrial/Business +157480000, 157537500, NFM, 100, #50FFCE83, Paging +157537500, 157562500, NFM, 100, #5500C9C9, 31 |Marine +157562500, 157837500, NFM, 100, #50FFCE83, Paging +157837500, 157862500, NFM, 100, #55008080, M1/37A (Splx) +157862500, 158670000, NFM, 100, #50FFCE83, Paging +158670000, 159500000, NFM, 100, #50D00098, Public Safety and Industrial/Business +159500000, 159675000, NFM, 100, #55008080, Marine +159675000, 160587500, NFM, 100, #50D00098, Public Safety and Industrial/Business +160587500, 160612500, NFM, 100, #5500C9C9, Marine VHF Ch. 0 (Coast Stations) +160612500, 160637500, NFM, 100, #55008080, 60 +160637500, 160662500, NFM, 100, #5500C9C9, 1 +160662500, 160687500, NFM, 100, #55008080, 61 +160687500, 160712500, NFM, 100, #5500C9C9, 2 +160712500, 160737500, NFM, 100, #55008080, 62 +160737500, 160762500, NFM, 100, #5500C9C9, 3 +160762500, 160787500, NFM, 100, #55008080, 63 +160787500, 160812500, NFM, 100, #5500C9C9, 4 +160812500, 160837500, NFM, 100, #55008080, 64 +160837500, 160862500, NFM, 100, #5500C9C9, 5 +160862500, 160887500, NFM, 100, #55008080, 65 +160887500, 160912500, NFM, 100, #5500C9C9, Marine +160912500, 160937500, NFM, 100, #55008080, 66 +160937500, 160962500, NFM, 100, #5500C9C9, 7 +160962500, 161487500, NFM, 100, #50FFD500, RailRoad and Industrial/Business +161487500, 161512500, NFM, 100, #55008080, 18 +161512500, 161537500, NFM, 100, #5500C9C9, 78 +161537500, 161562500, NFM, 100, #55008080, 19 +161562500, 161587500, NFM, 100, #5500C9C9, 79 +161587500, 161612500, NFM, 100, #55008080, 20 +161612500, 161637500, NFM, 100, #5500C9C9, 80 +161637500, 161662500, NFM, 100, #55008080, 21 +161662500, 161687500, NFM, 100, #5500C9C9, 81 +161687500, 161712500, NFM, 100, #55008080, 22 +161712500, 161737500, NFM, 100, #5500C9C9, 82 +161737500, 161762500, NFM, 100, #55008080, 23 +161762500, 161787500, NFM, 100, #5500C9C9, 83 +161787500, 161812500, NFM, 100, #55008080, 24 +161812500, 161837500, NFM, 100, #5500C9C9, 84 +161837500, 161862500, NFM, 100, #55008080, 25 +161862500, 161887500, NFM, 100, #5500C9C9, 85 +161887500, 161912500, NFM, 100, #55008080, 26 +161912500, 161937500, NFM, 100, #5500C9C9, 86 +161937500, 161962500, NFM, 100, #55008080, 27 +161962500, 161987500, NFM, 100, #5500C9C9, AIS Ch. A (87B) +161987500, 162012500, NFM, 100, #55008080, 88B/ 28 +162012500, 162037500, NFM, 100, #5500C9C9, AIS Ch. B +162037500, 162137500, NFM, 100, #55008080, Marine +162137500, 162162500, NFM, 100, #5500C9C9, 31 +162162500, 162387500, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +162387500, 162562500, NFM, 100, #5000CED1, NOAA Radio +162562500, 163290000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +163290000, 163310000, NFM, 10, #5000CED1, EMWIN Ch. 1 +163315000, 163335000, NFM, 10, #5000CED1, EMWIN Ch. 2 +163340000, 163360000, NFM, 10, #5000CED1, EMWIN Ch. 3 +163360000, 168702500, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +168702500, 168722500, NFM, 100, #5000CED1, EMWIN Ch. 4 +168722500, 168802500, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +168802500, 168822500, NFM, 100, #5000CED1, EMWIN Ch. 5 +168822500, 174000000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +174000000, 180000000, WFM, 100, #50FFE55C, Television Ch.7 +180000000, 186000000, WFM, 100, #50FFE55C, Television Ch.8 +186000000, 192000000, WFM, 100, #50FFE55C, Television Ch.9 +192000000, 198000000, WFM, 100, #50FFE55C, Television Ch.10 +198000000, 204000000, WFM, 100, #50FFE55C, Television Ch.11 +204000000, 210000000, WFM, 100, #50FFE55C, Television Ch.12 +210000000, 216000000, WFM, 100, #50FFE55C, Television Ch.13 (VHF) +216000000, 219000000, NFM, 100, #5091FF00, Buoy Telemetry +219000000, 220000000, NFM, 100, #50FF0000, 1.25m Ham Band| (Lower) Fixed Digital Forwarding Systems Only +220000000, 222000000, NFM, 100, #5091FF00, Telemetry/ Control (1.25m) +222000000, 222095000, NFM, 100, #507DDDFF, Weak Signal (1.25m) +222095000, 222105000, NFM, 100, #5000FF00, National Call (1.25m) +222105000, 222250000, NFM, 100, #507DDDFF, Weak Signal (1.25m) +222250000, 223380000, NFM, 100, #50FFFF00, Repeater Inputs (1.25m) +223380000, 223400000, NFM, 100, #50777777, Locally Assigned (1.25m) +223400000, 223520000, NFM, 100, #5000FFBF, Simplex (1.25m) +223520000, 223640000, NFM, 100, #508000FF, Digital/ packet (1.25m) +223640000, 223700000, NFM, 100, #50FF009A, Links/ control (1.25m) +223700000, 223850000, NFM, 100, #50777777, Locally Assigned (1.25m) +223850000, 225000000, NFM, 100, #5089FF00, Repeater Outputs |1.25m Ham Band +225000000, 243520000, NFM, 100, #5090EE90, Military Air +243520000, 243760000, NFM, 10, #50C2F542, Military Sat +243760000, 243855000, RAW, 10, #50C2F5AA, Milstar +243910000, 243985000, NFM, 10, #50ABAAF5, FltSatCom8/ UFO-5 +243985000, 244075000, NFM, 10, #50CCAAFF, FltSatCom8 +244075000, 244145000, NFM, 10, #50ABAAF5, FltSatCom8/ UFO-7 +244145000, 244155000, NFM, 10, #50CCAAFF, FltSatCom8 +244155000, 244230000, NFM, 10, #50ABAAF5, FltSatCom8/ UFO-6 +244230000, 248840000, NFM, 10, #50C2F542, Military Sat +248840000, 248970000, NFM, 10, #50ABAAF5, UFO-5 +249100000, 249230000, NFM, 10, #50CCAAFF, UFO-7 +249230000, 249360000, NFM, 10, #50ABAAF5, UFO-6 +249360000, 270000000, NFM, 100, #50C2F542, Military Sat +249450000, 250225000, NFM, 10, #50F5D3AA, SDS/ Skynet +250225000, 251275000, NFM, 10, #50C2F542, Military Sat +251275000, 251700000, NFM, 10, #50F5D3AA, SDS +251845000, 253855000, NFM, 10, #50ABAAF5, UFO-5 6 7 +253855000, 254775000, NFM, 10, #50C2F542, Military Sat +254775000, 255775000, NFM, 10, #506B6A8A, ComSatBw +255775000, 256375000, NFM, 10, #50C2F542, Military Sat +256375000, 256600000, NFM, 10, #50F5D3AA, SDS/ Skynet +256600000, 256845000, NFM, 10, #50C2F542, Military Sat +256845000, 257155000, NFM, 10, #50ABAAF5, UFO-5 6 7 +257155000, 257300000, NFM, 10, #50C2F542, Military Sat +257300000, 257900000, NFM, 10, #50F5D3AA, SDS/ Skynet +257900000, 258175000, NFM, 10, #50C2F542, Military Sat +258175000, 258275000, NFM, 10, #50F5D3AA, SICRAL +258275000, 260300000, NFM, 10, #50C2F542, Military Sat +260300000, 260875000, NFM, 10, #50ABAAF5, UFO-5 6 7/ FltSatCom +260875000, 261095000, NFM, 10, #50C2F542, Military Sat +261095000, 261355000, NFM, 10, #50F5D3AA, Skynet +261400000, 262575000, NFM, 10, #50ABAAF5, UFO-5 6/ FltSatCom/ Skynet +262575000, 262675000, NFM, 10, #50C2F542, Military Sat +262675000, 263375000, NFM, 10, #50F5D3AA, SDS +263500000, 264075000, NFM, 10, #50ABAAF5, UFO-5 6 7/ FltSatCom +264075000, 265225000, NFM, 10, #50C2F542, Military Sat +265225000, 265555000, NFM, 10, #50ABAAF5, UFO-5 6 7 +265555000, 266745000, NFM, 10, #50C2F542, Military Sat +266745000, 267055000, NFM, 10, #50ABAAF5, UFO-5 6 7 +267125000, 267225000, NFM, 10, #50F5D3AA, SICRAL +267225000, 267550000, NFM, 10, #50C2F542, Military Sat +267550000, 267825000, NFM, 10, #50F5D3AA, SDS +267875000, 268100000, NFM, 10, #50F5D3AA, SICRAL +268145000, 268455000, NFM, 10, #50ABAAF5, UFO-5 6 7 +268455000, 268675000, NFM, 10, #50C2F542, Military Sat +268675000, 268950000, NFM, 10, #50F5D3AA, SDS +268950000, 269645000, NFM, 10, #50C2F542, Military Sat +269645000, 269955000, NFM, 10, #50ABAAF5, UFO-5 6 7 +270000000, 328600000, NFM, 100, #5090EE90, Military Air +328600000, 335400000, NFM, 100, #400000FF, Aeronautical Radionavigation (ILS) +335400000, 380000000, NFM, 100, #5090EE90, Military Air +380000000, 400050000, NFM, 100, #50C2F542, Military Mobile Satellite Service (MSS)/ Radionavigation Satellite +400050000, 400150000, NFM, 100, #50DE91EE, Standard Frequency and Beacon +400150000, 401000000, NFM, 100, #40FFCD00, (NVNG)/ Mobile Satellite Service (MSS) +401000000, 401580000, NFM, 100, #5091A4EE, Earth Exploration Satellite +401580000, 402550000, NFM, 100, #55C4FF00, DCS and DCP (For POES and GOES) +402550000, 403000000, NFM, 100, #5091A4EE, Earth Exploration Satellite +403000000, 406000000, NFM, 100, #507676FF, Medical Device Radiocommunication Service +406000000, 406048000, NFM, 100, #50FF0091, Personal Locator Beacons +406048000, 406052000, NFM, 100, #50FF0091, Distress Beacons (S and RSAT| NOAAs 15 18 19) +406052000, 406100000, NFM, 100, #50FF0091, Personal Locator Beacons +406100000, 410000000, NFM, 100, #40FFFF00, Radio Astronomy +410000000, 420000000, WFM, 100, #50FFE600, Cellular Services +420000000, 432000000, NFM, 100, #50FF0089, 70cm Ham Band| ATV +432000000, 432070000, NFM, 100, #5086FFFC, EME (70cm) +432070000, 432090000, NFM, 100, #507DDDFF, Weak Signal (70cm) +432090000, 432110000, NFM, 100, #5000FF00, National Call (70cm) +432110000, 432300000, NFM, 100, #40FF00BC, Mixed Mode (70cm) +432300000, 432400000, NFM, 100, #50ACFFEC, Beacons (70cm) +432400000, 433050000, NFM, 100, #40FF00BC, Mixed Mode/ Weak Signal (70cm) +433050000, 434790000, NFM, 100, #44006179, (433MHz Part 15) and 70cm Band +434790000, 435000000, NFM, 100, #50FF0000, Auxiliary/repeater links (70cm) +435000000, 435120000, NFM, 100, #5033FF00, Satellite (70cm) +435120000, 435140000, NFM, 100, #50FFFF00, AO-73 Uplink +435140000, 435210000, NFM, 100, #5033FF00, Satellite (70cm) +435210000, 435230000, NFM, 100, #50FFFF00, CAS-4A Uplink +435240000, 435260000, NFM, 100, #50FFFF00, AO-91 Uplink +435270000, 435290000, NFM, 100, #50FFFF00, CAS-4B Uplink +435290000, 435595000, NFM, 100, #5033FF00, Satellite (70cm) +435595000, 435607500, NFM, 100, #50ACFFEC, RS-44 Beacon +435607500, 435680000, NFM, 100, #5500E6FF, RS-44 Downlink +435680000, 436785000, NFM, 100, #5033FF00, Satellite (70cm) +436785000, 436805000, NFM, 100, #5500E6FF, SO-50 Downlink +436805000, 437490000, NFM, 100, #5033FF00, Satellite (70cm) +437490000, 437510000, NFM, 100, #50FFFF00, PO-101 Uplink +437510000, 437540000, NFM, 100, #5033FF00, Satellite (70cm) +437540000, 437560000, NFM, 100, #55C4FF00, ISS UHF Packet U/D +437560000, 437790000, NFM, 100, #5033FF00, Satellite (70cm) +437790000, 437810000, NFM, 100, #5500E6FF, ISS V/U Voice Repeater Downlink +437810000, 438000000, NFM, 100, #5033FF00, Satellite (70cm) +438000000, 439981250, NFM, 100, #50FFFF00, ATV Repeater Inputs +439981250, 439993750, NFM, 100, #50FFCE83, Ham Paging Service +439993750, 442000000, NFM, 100, #50FFFF00, ATV Repeater Inputs +442000000, 444000000, NFM, 100, #50FFFF00, ATV Repeater Input and FM Repeater I/O +444000000, 445000000, NFM, 100, #508000FF, Repeaters I/O (70cm) +445000000, 445990000, NFM, 100, #50FF0000, Mixed +445990000, 446010000, NFM, 100, #5000FF00, FM National Call (70cm) +446010000, 447000000, NFM, 100, #50FF0000, Mixed (70cm) +447000000, 450000000, NFM, 100, #508000FF, Repeaters I/O |70cm Ham Band +450000000, 452300000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +452300000, 452933500, NFM, 100, #50FFD500, RailRoad and Industrial/Business +452933500, 452941500, NFM, 100, #5091FF00, H.O.T. Device +452941500, 453000000, NFM, 100, #50FFD500, RailRoad and Industrial/Business +453000000, 454000000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +454000000, 454350000, NFM, 10, #50FFCE83, Paging +454350000, 457300000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +457300000, 457921000, NFM, 100, #50FFD500, RailRoad and Industrial/Business +457921000, 457929000, NFM, 100, #5091FF00, DPU +457929000, 457933500, NFM, 100, #50FFD500, RailRoad and Industrial/Business +457933500, 457941500, NFM, 100, #5091FF00, E.O.T. Device +457941500, 458000000, NFM, 100, #50FFD500, RailRoad and Industrial/Business +458000000, 459000000, NFM, 100, #505D88FF, General Aviation Air-Ground +459000000, 459330000, NFM, 10, #50FFCE83, Paging +459330000, 462543750, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +462543750, 462556250, NFM, 100, #40BBE100, GMRS and FRS Ch. 15 +462556250, 462568750, NFM, 100, #40BAFD00, 1 +462568750, 462581250, NFM, 100, #40BBE100, 16 +462581250, 462593750, NFM, 100, #40BAFD00, 2 +462593750, 462606250, NFM, 100, #40BBE100, 17 +462606250, 462618750, NFM, 100, #40BAFD00, 3 +462618750, 462631250, NFM, 100, #40BBE100, 18 +462631250, 462643750, NFM, 100, #40BAFD00, 4 +462643750, 462656250, NFM, 100, #40BBE100, 19 +462656250, 462668750, NFM, 100, #40BAFD00, 5 +462668750, 462681250, NFM, 100, #40BBE100, 20 +462681250, 462693750, NFM, 100, #40BAFD00, 6 +462693750, 462706250, NFM, 100, #40BBE100, 21 +462706250, 462718750, NFM, 100, #40BAFD00, 7 +462718750, 462731250, NFM, 100, #40BBE100, 22 GMRS and FRS (Lower) +462731250, 462925000, NFM, 10, #50FFCE83, Paging +462925000, 465986500, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +465986500, 465988500, NFM, 100, #5091A4EE, Metop DCP configuration control +465988500, 467543750, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +467543750, 467556250, NFM, 100, #40BBE100, GMRS Only +467556250, 467568750, NFM, 100, #40BAFD00, 8 +467568750, 467581250, NFM, 100, #40BBE100, GMRS Only +467581250, 467593750, NFM, 100, #40BAFD00, 9 +467593750, 467606250, NFM, 100, #40BBE100, GMRS Only +467606250, 467618750, NFM, 100, #40BAFD00, 10 +467618750, 467631250, NFM, 100, #40BBE100, GMRS Only +467631250, 467643750, NFM, 100, #40BAFD00, 11 +467643750, 467656250, NFM, 100, #40BBE100, GMRS Only +467656250, 467668750, NFM, 100, #40BAFD00, 12 +467668750, 467681250, NFM, 100, #40BBE100, GMRS Only +467681250, 467693750, NFM, 100, #40BAFD00, 13 +467693750, 467706250, NFM, 100, #40BBE100, GMRS Only +467706250, 467718750, NFM, 100, #40BAFD00, 14 +467718750, 467731250, NFM, 100, #40BBE100, GMRS Only +467731250, 467925000, NFM, 10, #50FFCE83, Paging +467925000, 468757000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +468757000, 468847000, NFM, 100, #5091A4EE, GOES DCP Commanding +468847000, 470000000, NFM, 100, #50D00098, Public Safety (EMS/ Fire/ Police) +470000000, 476000000, WFM, 100, #50FFE55C, Television Ch.14 (UHF) +476000000, 482000000, WFM, 100, #50FFE55C, Television Ch.15 +482000000, 488000000, WFM, 100, #50FFE55C, Television Ch.16 +488000000, 494000000, WFM, 100, #50FFE55C, Television Ch.17 +494000000, 500000000, WFM, 100, #50FFE55C, Television Ch.18 +500000000, 506000000, WFM, 100, #50FFE55C, Television Ch.19 +506000000, 512000000, WFM, 100, #50FFE55C, Television Ch.20 +512000000, 518000000, WFM, 100, #50FFE55C, Television Ch.21 +518000000, 524000000, WFM, 100, #50FFE55C, Television Ch.22 +524000000, 530000000, WFM, 100, #50FFE55C, Television Ch.23 +530000000, 536000000, WFM, 100, #50FFE55C, Television Ch.24 +536000000, 542000000, WFM, 100, #50FFE55C, Television Ch.25 +542000000, 548000000, WFM, 100, #50FFE55C, Television Ch.26 +548000000, 554000000, WFM, 100, #50FFE55C, Television Ch.27 +554000000, 560000000, WFM, 100, #50FFE55C, Television Ch.28 +560000000, 566000000, WFM, 100, #50FFE55C, Television Ch.29 +566000000, 572000000, WFM, 100, #50FFE55C, Television Ch.30 +572000000, 578000000, WFM, 100, #50FFE55C, Television Ch.31 +578000000, 584000000, WFM, 100, #50FFE55C, Television Ch.32 +584000000, 590000000, WFM, 100, #50FFE55C, Television Ch.33 +590000000, 596000000, WFM, 100, #50FFE55C, Television Ch.34 +596000000, 602000000, WFM, 100, #50FFE55C, Television Ch.35 +602000000, 608000000, WFM, 100, #50FFE55C, Television Ch.36 (UHF) +608000000, 614000000, NFM, 100, #40FFFF00, Radio Astronomy (Old TV Ch.37) +614000000, 620000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.38) +620000000, 626000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.39) +626000000, 632000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.40) +632000000, 638000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.41) +638000000, 644000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.42) +644000000, 650000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.43) +650000000, 656000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.44) +656000000, 662000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.45) +662000000, 668000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.46) +668000000, 674000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.47) +674000000, 680000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.48) +680000000, 686000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.49) +686000000, 692000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.50) +692000000, 698000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.51) +698000000, 704000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.52) +704000000, 710000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.53) +710000000, 716000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.54) +716000000, 722000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.55) +722000000, 728000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.56) +728000000, 734000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.57) +734000000, 740000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.58) +740000000, 746000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.59) +746000000, 752000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.60) +752000000, 758000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.61) +758000000, 764000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.62) +764000000, 770000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.63) +770000000, 776000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.64) +776000000, 782000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.65) +782000000, 788000000, WFM, 100, #50FFE600, Cellular Services (Old TV Ch.66) +788000000, 794000000, WFM, 100, #50FFE600, Cellular Services/ Public Safety (Old TV Ch.67) +794000000, 800000000, WFM, 100, #50FFE600, Cellular Services/ Public Safety (Old TV Ch.68) +800000000, 806000000, WFM, 100, #50FFE600, Cellular Services/ Public Safety (Old TV Ch.69) +806000000, 824000000, NFM, 100, #40FF0077, 800MHz Band (Lower)/ Cellular +824000000, 851000000, WFM, 100, #50FFE600, Cellular Services +851000000, 869000000, NFM, 100, #40FF0077, 800MHz Band (Upper)/ Cellular +869000000, 902000000, WFM, 100, #50FFE600, Cellular Services +902000000, 902075000, WFM, 100, #50FF0000, Shared 33cm Ham Band and 33cm ISM| +902075000, 902125000, NFM, 100, #507DDDFF, Weak Signal (33cm) +902125000, 903000000, NFM, 100, #50FFFF00, Repeater Inputs (33cm) +903000000, 903400000, NFM, 100, #507DDDFF, Weak Signal (33cm) +903400000, 909000000, NFM, 100, #40FF00BC, Mixed Mode (33cm) +909000000, 927000000, NFM, 100, #40FF00BC, Analog/Digital (33cm) +927000000, 927075000, NFM, 100, #5089FF00, Repeater Outputs (33cm) +927075000, 927125000, NFM, 100, #50FF0000, Simplex (33cm) +927125000, 928000000, NFM, 100, #5089FF00, Repeater Outputs |Shared 33cm Ham Band and 33cm ISM +928000000, 929000000, NFM, 100, #50FF9A00, Multiple Address Service (MAS)/ Broadcast Microwave +929000000, 929990000, NFM, 10, #50FFCE83, Paging +929990000, 931000000, NFM, 100, #5000FF89, Government +931000000, 932000000, NFM, 10, #50FFCE83, Paging +932000000, 935000000, NFM, 100, #50FF9A00, Multiple Address Service (MAS)/ Broadcast Microwave +935000000, 940000000, NFM, 100, #5000FF89, Government +940000000, 941000000, NFM, 100, #401A00FF, Narrowband Personal Communications +941000000, 960000000, NFM, 100, #50FF9A00, Multiple Address Service (MAS)/ Broadcast Microwave +960000000, 977300000, NFM, 100, #505D88FF, Aviation +977300000, 978700000, NFM, 100, #400000FF, UAT 978 +978700000, 1029750000, NFM, 100, #505D88FF, Aviation +1029750000, 1030250000, NFM, 100, #400000FF, ADSB Interrogator +1030250000, 1089950000, NFM, 100, #505D88FF, Aviation +1089950000, 1090050000, NFM, 100, #400000FF, ADSB 1090 +1090050000, 1164000000, NFM, 100, #505D88FF, Aviation +1164000000, 1189000000, WFM, 100, #50FFFF00, GPS L5 and GALILEO E5a +1189000000, 1214000000, WFM, 100, #50FF44FF, GALILEO E5a and GLONASS G3 +1214000000, 1215000000, NFM, 100, #4089FF00, Radionavigation Satellite Service +1215000000, 1237000000, WFM, 100, #50FFFF00, GPS L2 +1237000000, 1239600000, WFM, 100, #50FFFF00, GPS L2 and GLONASS G2 +1239600000, 1240000000, WFM, 100, #50FF4400, GLONASS G2 +1240000000, 1246000000, WFM, 100, #50FF0089, 23cm Ham Band| ATV Ch. 1 +1246000000, 1248000000, NFM, 100, #50FF0000, FM Digital (23cm) +1248000000, 1252000000, NFM, 100, #508000FF, Digital (23cm) +1252000000, 1258000000, WFM, 100, #50FF0089, ATV Ch. 2 +1258000000, 1260000000, NFM, 100, #50FF0000, FM Digital (23cm) +1260000000, 1270000000, NFM, 100, #50FF0000, Various (23cm) +1270000000, 1276000000, NFM, 100, #50FFFF00, Repeater Inputs (23cm) +1276000000, 1282000000, WFM, 100, #50FF0089, ATV Ch. 3 +1282000000, 1288000000, NFM, 100, #5089FF00, Repeater Outputs (23cm) +1288000000, 1290000000, NFM, 100, #503CCCFF, Broadband Experimental, Simplex ATV +1290000000, 1294000000, NFM, 100, #5089FF00, Repeater Outputs (23cm) +1294000000, 1294490000, NFM, 100, #503CFF00, FM Simplex (23cm) +1294490000, 1294510000, NFM, 100, #50FFB300, FM Calling Frequency (23cm) +1294510000, 1295000000, NFM, 100, #503CFF00, FM Simplex (23cm) +1295000000, 1295800000, NFM, 100, #50FF0000, Narrow Band (23cm) +1295800000, 1296080000, NFM, 100, #5086FFFC, EME (23cm) +1296080000, 1296090000, NFM, 100, #507DDDFF, Weak Signal (23cm) +1296090000, 1296110000, NFM, 100, #5000FF00, CAlling Frequency (23cm) +1296110000, 1296200000, NFM, 100, #507DDDFF, Weak Signal (23cm) +1296200000, 1296400000, CW, 100, #50ACFFEC, Beacons (23cm) +1296400000, 1297000000, NFM, 100, #50FF0000, Various (23cm) +1297000000, 1300000000, NFM, 100, #508000FF, Digital |23cm Ham Band +1300000000, 1350000000, NFM, 100, #505D88FF, Aviation Propagation Testing +1350000000, 1370000000, NFM, 100, #5000FF89, Government (Radiolocation) +1370000000, 1400000000, NFM, 100, #40FFFF00, Radio Astronomy (1390 - 1395 MHz Band) +1400000000, 1420404750, NFM, 100, #5091A4EE, Earth Exploration Satellite/ Radio Astronomy +1420404750, 1420406750, NFM, 10, #40FFFF00, Hydrogen Line +1420406750, 1427000000, NFM, 100, #5091A4EE, Earth Exploration-Satellite/ Radio Astronomy +1427000000, 1432000000, NFM, 100, #5089FF00, Industrial Telemetry or Telecommand +1432000000, 1435000000, NFM, 100, #5090EE90, Military 1432 - 1435 MHz Band +1435000000, 1525000000, NFM, 100, #505D88FF, Aviation +1525000000, 1544000000, NFM, 100, #33FF4400, Inmarsat Satellites +1544000000, 1545000000, NFM, 100, #5000BFFF, SAR Downlinks +1545000000, 1559000000, NFM, 100, #33FF4400, Inmarsat Satellites +1559000000, 1563000000, WFM, 100, #500000AA, GALILEO E1 +1563000000, 1587000000, WFM, 100, #50FFFF00, GPS L1 and GALILEO E1 +1587000000, 1591000000, WFM, 100, #500000AA, GALILEO E1 +1591000000, 1593000000, NFM, 100, #4089FF00, Radionavigation Satellite Service +1593000000, 1610000000, WFM, 100, #50FF4400, GLONASS G1 +1610000000, 1610600000, NFM, 100, #40FFCD00, Aviation Service, and the Mobile Satellite Service (MSS) +1610600000, 1616000000, NFM, 100, #40FFCD00, Mobile Satellite Service (MSS) +1616000000, 1626000833, NFM, 100, #33FF672F, Iridium Satellites +1626000833, 1626040833, NFM, 100, #55FF672F, Ch.1 Guard Channel (Iridium) +1626042500, 1626082500, NFM, 100, #55FF672F, 2 Guard Channel +1626084167, 1626124167, NFM, 100, #55FF672F, 3 Quaternary Messaging +1626125833, 1626165833, NFM, 100, #55FF672F, 4 Tertiary Messaging +1626167500, 1626207500, NFM, 100, #55FF672F, 5 Guard Channel +1626209167, 1626249167, NFM, 100, #55FF672F, 6 Guard Channel +1626250833, 1626290833, NFM, 100, #55FF672F, 7 Ring Alert +1626292500, 1626332500, NFM, 100, #55FF672F, 8 Guard Channel +1626334167, 1626374167, NFM, 100, #55FF672F, 9 Guard Channel +1626375833, 1626415833, NFM, 100, #55FF672F, 10 Secondary Messaging +1626417500, 1626457500, NFM, 100, #55FF672F, 11 Primary Messaging +1626459167, 1626499167, NFM, 100, #55FF672F, 12 Guard Channel |Iridium +1626500000, 1660500000, NFM, 100, #33FF4400, Inmarsat Satellites +1660500000, 1668400000, NFM, 100, #40FFFF00, Radio Astronomy +1668400000, 1670000000, NFM, 100, #50738FFF, Meteorological Aids and Radio Astronomy +1670000000, 1675000000, NFM, 100, #40FFFF00, Radio Astronomy +1675000000, 1679750000, NFM, 100, #50738FFF, Radiosonde/ Meteorological Aids +1679750000, 1680050000, WFM, 100, #5500FFFF, GOES DCP (US Domestic) +1680050000, 1680350000, WFM, 100, #5500FFFF, GOES DCP (International) +1680350000, 1680600000, WFM, 100, #50738FFF, Meteorological Satellite +1680600000, 1692600000, WFM, 100, #5500FFFF, GOES GRB +1692600000, 1692960000, WFM, 100, #50738FFF, Meteorological Satellite +1692960000, 1693040000, WFM, 100, #50738FFF, GOES Telemetry +1693040000, 1693500000, WFM, 100, #50738FFF, Meteorological Satellite +1693500000, 1694700000, WFM, 100, #5500FFFF, GOES HRIT +1694700000, 1696500000, WFM, 100, #50738FFF, Meteorological Satellite +1696500000, 1697750000, WFM, 100, #50000000, HRPT Shared +1697750000, 1698250000, WFM, 100, #557AFFFF, NOAA-19 Center +1698250000, 1699750000, WFM, 100, #50000000, Shared +1699750000, 1700250000, WFM, 100, #555CBABA, METEOR M2 Center +1700250000, 1701050000, WFM, 100, #50000000, Shared +1701050000, 1701550000, WFM, 100, #55F07070, Metop-A, Metop-B, FY-3C Center +1701550000, 1702250000, WFM, 100, #50000000, Shared +1702250000, 1702750000, WFM, 100, #557AFFFF, NOAA-15 Center +1702750000, 1704250000, WFM, 100, #50000000, Shared +1704250000, 1704750000, WFM, 100, #55FFBA2E, FY-3A FY-3B Center +1704750000, 1705250000, WFM, 100, #555CBABA, METEOR M2-2 Center +1705250000, 1706750000, WFM, 100, #50000000, Shared +1706750000, 1707250000, WFM, 100, #557AFFFF, NOAA-18 Metop-C Center +1707250000, 1708500000, WFM, 100, #50000000, HRPT Shared +1708500000, 1710000000, NFM, 100, #50738FFF, Meteorological Satellite +1710000000, 1755000000, NFM, 100, #50FFEE4A, Cellular Services +1755000000, 1850000000, NFM, 100, #553AFFFF, Earth-to-space Communications +1850000000, 2000000000, NFM, 100, #50FFEE4A, Cellular Services/ Broadcast Microwave +2000000000, 2025000000, NFM, 100, #553AFFFF, Earth-to-space and Space-to-space Communications +2025000000, 2027000000, NFM, 100, #5500FFFF, NOAAs 15 18 19 Command +2027000000, 2030435000, NFM, 100, #553AFFFF, Earth-to-space and Space-to-space Communications +2030435000, 2064270000, NFM, 100, #55FFE430, TDRS Forward Link +2064270000, 2066270000, NFM, 100, #5500FFFF, | POES TDRSS +2066270000, 2068270000, NFM, 100, #2200BFFF, POES Command +2068270000, 2070270000, NFM, 100, #5500FFFF, POES TDRSS | +2070270000, 2110072532, NFM, 100, #55FFE430, TDRS Forward Link +2110072532, 2110413581, WFM, 100, #55FFEF85, Deep Space Network Ch. 5 Uplink +2110413581, 2110754630, WFM, 100, #55FFE430, DSN Ch. 6 Uplink +2110754630, 2111095680, WFM, 100, #55FFEF85, DSN Ch. 7 Uplink +2111095680, 2111436730, WFM, 100, #55FFE430, DSN Ch. 8 Uplink +2111436730, 2111777780, WFM, 100, #55FFEF85, DSN Ch. 9 Uplink +2111777780, 2112118830, WFM, 100, #55FFE430, DSN Ch. 10 Uplink +2112118830, 2112459880, WFM, 100, #55FFEF85, DSN Ch. 11 Uplink +2112459880, 2112800930, WFM, 100, #55FFE430, DSN Ch. 12 Uplink +2112800930, 2113141980, WFM, 100, #55FFEF85, DSN Ch. 13 Uplink +2113141980, 2113483030, WFM, 100, #55FFE430, DSN Ch. 14 Uplink +2113483030, 2113824080, WFM, 100, #55FFEF85, DSN Ch. 15 Uplink +2113824080, 2114165130, WFM, 100, #55FFE430, DSN Ch. 16 Uplink +2114165130, 2114506180, WFM, 100, #55FFEF85, DSN Ch. 17 Uplink +2114506180, 2114847230, WFM, 100, #55FFE430, DSN Ch. 18 Uplink +2114847230, 2115188280, WFM, 100, #55FFEF85, DSN Ch. 19 Uplink +2115188280, 2115529329, WFM, 100, #55FFE430, DSN Ch. 20 Uplink +2115529329, 2115870378, WFM, 100, #55FFEF85, DSN Ch. 21 Uplink +2115870378, 2116211427, WFM, 100, #55FFE430, DSN Ch. 22 Uplink +2116211427, 2116552476, WFM, 100, #55FFEF85, DSN Ch. 23 Uplink +2116552476, 2116893525, WFM, 100, #55FFE430, DSN Ch. 24 Uplink +2116893525, 2117234574, WFM, 100, #55FFEF85, DSN Ch. 25 Uplink +2117234574, 2117575623, WFM, 100, #55FFE430, DSN Ch. 26 Uplink +2117575623, 2117916672, WFM, 100, #55FFEF85, DSN Ch. 27 Uplink +2117916672, 2118257721, WFM, 100, #55FFE430, DSN Ch. 28 Uplink +2118257721, 2118598770, WFM, 100, #55FFEF85, DSN Ch. 29 Uplink +2118598770, 2118939819, WFM, 100, #55FFE430, DSN Ch. 30 Uplink +2118939819, 2119280868, WFM, 100, #55FFEF85, DSN Ch. 31 Uplink +2119280868, 2119621917, WFM, 100, #55FFE430, DSN Ch. 32 Uplink +2119621917, 2119962966, WFM, 100, #55FFEF85, DSN Ch. 33 Uplink +2119962966, 2180000000, NFM, 100, #50FFEE4A, Cellular Service| / Broadcast Microwave +2180000000, 2200000000, NFM, 100, #40FFCD00, Mobile Satellite Service (MSS)/ Broadcast Microwave Service +2200000000, 2208575000, NFM, 100, #55366FFF, TDRS Return Link +2208575000, 2213505000, WFM, 100, #5500FFFF, GOES Telemetry and Ranging +2213505000, 2244500000, NFM, 100, #55366FFF, TDRS Return Link +2244500000, 2250500000, NFM, 100, #2200BFFF, POES Telemetry, Command, and CDA +2250500000, 2290000000, NFM, 100, #55366FFF, TDRS Return Link +2290000000, 2290370370, WFM, 100, #556B95FF, Deep Space Network Ch. 1 Downlink +2290370370, 2290740740, WFM, 100, #55366FFF, DSN Ch. 2 Downlink +2290740740, 2291111110, WFM, 100, #556B95FF, DSN Ch. 3 Downlink +2291111110, 2291481480, WFM, 100, #55366FFF, DSN Ch. 4 Downlink +2291481480, 2291851850, WFM, 100, #556B95FF, DSN Ch. 5 Downlink +2291851850, 2292222220, WFM, 100, #55366FFF, DSN Ch. 6 Downlink +2292222220, 2292592590, WFM, 100, #556B95FF, DSN Ch. 7 Downlink +2292592590, 2292962960, WFM, 100, #55366FFF, DSN Ch. 8 Downlink +2292962960, 2293333330, WFM, 100, #556B95FF, DSN Ch. 9 Downlink +2293333330, 2293703700, WFM, 100, #55366FFF, DSN Ch. 10 Downlink +2293703700, 2294074070, WFM, 100, #556B95FF, DSN Ch. 11 Downlink +2294074070, 2294444440, WFM, 100, #55366FFF, DSN Ch. 12 Downlink +2294444440, 2294814815, WFM, 100, #556B95FF, DSN Ch. 13 Downlink +2294814815, 2295185185, WFM, 100, #55366FFF, DSN Ch. 14 Downlink +2295185185, 2295555555, WFM, 100, #556B95FF, DSN Ch. 15 Downlink +2295555555, 2295925925, WFM, 100, #55366FFF, DSN Ch. 16 Downlink +2295925925, 2296296295, WFM, 100, #556B95FF, DSN Ch. 17 Downlink +2296296295, 2296666665, WFM, 100, #55366FFF, DSN Ch. 18 Downlink +2296666665, 2297037035, WFM, 100, #556B95FF, DSN Ch. 19 Downlink +2297037035, 2297407405, WFM, 100, #55366FFF, DSN Ch. 20 Downlink +2297407405, 2297777775, WFM, 100, #556B95FF, DSN Ch. 21 Downlink +2297777775, 2298148145, WFM, 100, #55366FFF, DSN Ch. 22 Downlink +2298148145, 2298518515, WFM, 100, #556B95FF, DSN Ch. 23 Downlink +2298518515, 2298888885, WFM, 100, #55366FFF, DSN Ch. 24 Downlink +2298888885, 2299259255, WFM, 100, #556B95FF, DSN Ch. 25 Downlink +2299259255, 2299629625, WFM, 100, #55366FFF, DSN Ch. 26 Downlink +2299629625, 2300000000, WFM, 100, #556B95FF, DSN Ch. 27 Downlink +2300000000, 2303750000, NFM, 100, #50FF0000, 13cm Ham Band (Lower)| Analog and Digital +2303750000, 2304000000, NFM, 100, #50FF0000, SSB, CW, Digital Weak-Signal (13cm) +2304000000, 2304100000, NFM, 100, #5086FFFC, EME (13cm) +2304100000, 2304300000, NFM, 100, #50FF0000, SSB, CW, Digital Weak-Signal (13cm) +2304300000, 2304400000, NFM, 100, #50ACFFEC, Beacons (13cm) +2304400000, 2310000000, NFM, 100, #50FF0000, Analog and Digital |13cm Ham Band (Lower) +2310000000, 2320000000, NFM, 100, #505D88FF, Aviation Service/ Wireless Communications Service (WCS) +2320000000, 2332500000, NFM, 100, #5000ABFF, Satellite Digital Audio Radio Service (SDARS) +2332500000, 2345000000, NFM, 100, #40004DFF, SiriusXM Satellites +2345000000, 2360000000, NFM, 100, #505D88FF, Aviation Service and the Wireless Communications Service (WCS) +2360000000, 2390000000, NFM, 100, #505D88FF, Aviation +2390000000, 2393750000, NFM, 100, #50FF0000, 13cm Ham Band (Upper)| Analog and Digital +2393750000, 2394750000, NFM, 100, #503CCCFF, Experimental +2394750000, 2400000000, NFM, 100, #50FF0000, Analog and Digital +2400000000, 2401000000, NFM, 100, #5033FF00, Satellite +2401000000, 2410000000, WFM, 100, #44006179, WiFi shared with Satellite +2410000000, 2411900000, WFM, 100, #44006179, WiFi shared with Broadband Modes +2411900000, 2412100000, WFM, 100, #50000000, WiFi Ch. 1 (Center) +2412100000, 2450000000, WFM, 100, #44006179, WiFi shared with Broadband Modes |13cm Ham Band +2450000000, 2451900000, WFM, 100, #44006179, WiFi shared with ISM Band (13cm) +2451900000, 2452100000, WFM, 100, #50000000, WiFi Ch. 9 +2452100000, 2456900000, WFM, 100, #44006179, WiFi shared with ISM Band (13cm) +2456900000, 2457100000, WFM, 100, #50000000, WiFi Ch. 10 +2457100000, 2461900000, WFM, 100, #44006179, WiFi shared with ISM Band (13cm) +2461900000, 2462100000, WFM, 100, #50000000, WiFi Ch. 11 +2462100000, 2473000000, WFM, 100, #44006179, WiFi shared with ISM Band (13cm) +2473000000, 2500000000, WFM, 100, #44006179, ISM Band (13cm) +2500000000, 2655000000, WFM, 100, #50FFEE4A, Cellular Services +2655000000, 2700000000, WFM, 100, #40FFFF00, Radio Astronomy +2700000000, 2900000000, WFM, 100, #5000FF89, Government Aeronautical +2900000000, 3100000000, WFM, 100, #55008080, Marine +3100000000, 3260000000, WFM, 100, #5091A4EE, Earth Exploration Satellite/ Space Research +3260000000, 3267000000, WFM, 100, #40FFFF00, Radio Astronomy +3267000000, 3300000000, WFM, 100, #5091A4EE, Earth Exploration Satellite/ Space Research +3300000000, 3309000000, WFM, 100, #40FF00BC, 3GHz Ham Band| Analog and Digital (Paired w/ 3430-3439) +3309000000, 3310000000, WFM, 100, #503CCCFF, Experimental +3310000000, 3330000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3410-3430) +3330000000, 3332000000, WFM, 100, #503CCCFF, Experimental +3332000000, 3339000000, WFM, 100, #40FFFF00, Radio Astronomy +3339000000, 3345800000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3439-3445.8) +3345800000, 3352500000, WFM, 100, #40FFFF00, Radio Astronomy +3352500000, 3355000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3452.5-3455) +3355000000, 3357000000, WFM, 100, #503CCCFF, Experimental +3357000000, 3360000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3457-3460) +3360000000, 3380000000, WFM, 100, #40FF0000, |Broadband Modes/ ATV +3380000000, 3400000000, WFM, 100, #40FF0000, Broadband Modes| +3400000000, 3400090000, WFM, 100, #5086FFFC, EME +3400090000, 3400110000, WFM, 100, #50FFB300, EME Calling +3400110000, 3400300000, WFM, 100, #5086FFFC, EME +3400300000, 3401000000, WFM, 100, #507DDDFF, Terrestrial Weak Signal +3401000000, 3410000000, WFM, 100, #5033FF00, Satellite +3410000000, 3430000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3310-3330) +3430000000, 3439000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3300-3309) +3439000000, 3445800000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3339-3345.8) +3445800000, 3452500000, WFM, 100, #503CCCFF, Experimental +3452500000, 3455000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3352.5-3355) +3455000000, 3455500000, WFM, 100, #50FF578A, Crossband linear translator +3455500000, 3456095000, WFM, 100, #507DDDFF, Terrestrial Weak Signal +3456095000, 3456105000, WFM, 100, #50FFB300, Terrestrial Weak Signal Calling +3456105000, 3456300000, WFM, 100, #507DDDFF, Terrestrial Weak Signal +3456300000, 3457000000, WFM, 100, #50ACFFEC, Propagation Beacons +3457000000, 3460000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 3357-3360) +3460000000, 3480000000, WFM, 100, #40FF0000, |Broadband Modes/ ATV +3480000000, 3500000000, WFM, 100, #40FF0000, Broadband Modes |3GHz Ham Band +3500000000, 3600000000, WFM, 100, #50FFEE4A, Cellular Services +3600000000, 3629000000, WFM, 100, #505D88FF, SatCom ACARS +3629000000, 3700000000, WFM, 100, #553AFFFF, Space-to-Earth Communications +3700000000, 4000000000, WFM, 100, #50FFEE4A, Cellular Services +4000000000, 4200000000, WFM, 100, #553AFFFF, Space-to-Earth Communications +4200000000, 4400000000, WFM, 100, #40FFFF00, Radio Astronomy +4400000000, 4500000000, WFM, 100, #50FFEE4A, Cellular Services +4500000000, 4800000000, WFM, 100, #553AFFFF, Space-to-Earth Communications +4800000000, 4900000000, WFM, 100, #40FFFF00, Radio Astronomy +4900000000, 4950000000, WFM, 100, #50FFEE4A, Cellular Services +4950000000, 5000000000, WFM, 100, #40FFFF00, Radio Astronomy +5000000000, 5150000000, WFM, 100, #505D88FF, Aeronautical Satellite +5150000000, 5155000000, WFM, 100, #AA000000, WiFi Shared Area +5155000000, 5165000000, WFM, 100, #44006179, |5GHz WiFi Ch. 32 Center +5165000000, 5175000000, WFM, 100, #44009980, Ch. 34 Center +5175000000, 5185000000, WFM, 100, #44006179, Ch. 36 Center +5185000000, 5195000000, WFM, 100, #44009980, Ch. 38 Center +5195000000, 5205000000, WFM, 100, #44006179, Ch. 40 Center +5205000000, 5215000000, WFM, 100, #44009980, Ch. 42 Center +5215000000, 5225000000, WFM, 100, #44006179, Ch. 44 Center +5225000000, 5235000000, WFM, 100, #44009980, Ch. 46 Center +5235000000, 5245000000, WFM, 100, #44006179, Ch. 48 Center +5245000000, 5255000000, WFM, 100, #44009980, Ch. 50 Center +5255000000, 5265000000, WFM, 100, #44006179, Ch. 52 Center +5265000000, 5275000000, WFM, 100, #44009980, Ch. 54 Center +5275000000, 5285000000, WFM, 100, #44006179, Ch. 56 Center +5285000000, 5295000000, WFM, 100, #44009980, Ch. 58 Center +5295000000, 5305000000, WFM, 100, #44006179, Ch. 60 Center +5305000000, 5315000000, WFM, 100, #44009980, Ch. 62 Center +5315000000, 5325000000, WFM, 100, #44006179, Ch. 64 Center +5335000000, 5345000000, WFM, 100, #44006179, Ch. 68 Center +5475000000, 5485000000, WFM, 100, #44006179, Ch. 96 Center +5495000000, 5505000000, WFM, 100, #44006179, Ch. 100 Center +5505000000, 5515000000, WFM, 100, #44009980, Ch. 102 Center +5515000000, 5525000000, WFM, 100, #44006179, Ch. 104 Center +5525000000, 5535000000, WFM, 100, #44009980, Ch. 106 Center +5535000000, 5545000000, WFM, 100, #44006179, Ch. 108 Center +5545000000, 5555000000, WFM, 100, #44009980, Ch. 110 Center +5555000000, 5565000000, WFM, 100, #44006179, Ch. 112 Center +5565000000, 5575000000, WFM, 100, #44009980, Ch. 114 Center +5575000000, 5585000000, WFM, 100, #44006179, Ch. 116 Center +5585000000, 5595000000, WFM, 100, #44009980, Ch. 118 Center +5595000000, 5605000000, WFM, 100, #44006179, Ch. 120 Center +5605000000, 5615000000, WFM, 100, #44009980, Ch. 122 Center +5615000000, 5625000000, WFM, 100, #44006179, Ch. 124 Center +5625000000, 5635000000, WFM, 100, #44009980, Ch. 126 Center +5635000000, 5645000000, WFM, 100, #44006179, Ch. 128 Center +5650000000, 5670000000, WFM, 100, #50FFFF00, 5cm Ham Band| Satellite Uplink/ Experimental +5670000000, 5675000000, WFM, 100, #503CCCFF, Experimental (5cm) +5675000000, 5750000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 5850-5925) +5750000000, 5756000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 5820-5826) +5756000000, 5759000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 5826-5829) +5759000000, 5760000000, WFM, 100, #507DDDFF, Weak Signal (5cm) +5760000000, 5760095000, WFM, 100, #5086FFFC, EME (5cm) +5760095000, 5760105000, WFM, 100, #50FFB300, Weak Signal Calling (5cm) +5760105000, 5760300000, WFM, 100, #507DDDFF, Weak Signal (5cm) +5760300000, 5760400000, WFM, 100, #50ACFFEC, Beacons (5cm) +5760400000, 5761000000, WFM, 100, #507DDDFF, Weak Signal (5cm) +5761000000, 5820000000, WFM, 100, #503CCCFF, Experimental (5cm) +5820000000, 5826000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 5750-5756) +5826000000, 5829000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 5756-5759) +5829000000, 5830000000, WFM, 100, #503CCCFF, Experimental (5cm) +5830000000, 5850000000, WFM, 100, #5500E6FF, Satellite Downlink/ Experimental (5cm) +5850000000, 5925000000, WFM, 100, #40FF00BC, Analog and Digital (Paired w/ 5675-5750) |5cm Ham Band +5925000000, 6650000000, WFM, 100, #553AFFFF, Earth-to-space Communications/ Broadcast Microwave +6650000000, 6675200000, WFM, 100, #40FFFF00, Radio Astronomy/ Broadcast Microwave +6675200000, 6700000000, WFM, 100, #553AFFFF, Earth-to-space Communications +6700000000, 7025000000, WFM, 100, #553AFFFF, Earth-to-space and Space-to-Earth Communications +7025000000, 7075000000, WFM, 100, #553AFFFF, Earth-to-space Communications +7075000000, 7145000000, NFM, 100, #50738FFF, Meteorological Aids +7145000000, 7146708332, WFM, 100, #553AFFFF, Earth-to-space Communications +7146708332, 7147864198, WFM, 100, #55FFEF85, Deep Space Network Ch. 1 Uplink +7147864198, 7149020064, WFM, 100, #55FFE430, DSN Ch. 2 Uplink +7149020064, 7150175930, WFM, 100, #55FFEF85, DSN Ch. 3 Uplink +7150175930, 7151331796, WFM, 100, #55FFE430, DSN Ch. 4 Uplink +7151331796, 7152487662, WFM, 100, #55FFEF85, DSN Ch. 5 Uplink +7152487662, 7153643528, WFM, 100, #55FFE430, DSN Ch. 6 Uplink +7153643528, 7154799394, WFM, 100, #55FFEF85, DSN Ch. 7 Uplink +7154799394, 7155955260, WFM, 100, #55FFE430, DSN Ch. 8 Uplink +7155955260, 7157111126, WFM, 100, #55FFEF85, DSN Ch. 9 Uplink +7157111126, 7158266992, WFM, 100, #55FFE430, DSN Ch. 10 Uplink +7158266992, 7159422858, WFM, 100, #55FFEF85, DSN Ch. 11 Uplink +7159422858, 7160578724, WFM, 100, #55FFE430, DSN Ch. 12 Uplink +7160578724, 7161734590, WFM, 100, #55FFEF85, DSN Ch. 13 Uplink +7161734590, 7162890456, WFM, 100, #55FFE430, DSN Ch. 14 Uplink +7162890456, 7164046322, WFM, 100, #55FFEF85, DSN Ch. 15 Uplink +7164046322, 7165202188, WFM, 100, #55FFE430, DSN Ch. 16 Uplink +7165202188, 7166358022, WFM, 100, #55FFEF85, DSN Ch. 17 Uplink +7166358022, 7167513888, WFM, 100, #55FFE430, DSN Ch. 18 Uplink +7167513888, 7168669754, WFM, 100, #55FFEF85, DSN Ch. 19 Uplink +7168669754, 7169825620, WFM, 100, #55FFE430, DSN Ch. 20 Uplink +7169825620, 7170981486, WFM, 100, #55FFEF85, DSN Ch. 21 Uplink +7170981486, 7172137352, WFM, 100, #55FFE430, DSN Ch. 22 Uplink +7172137352, 7173293218, WFM, 100, #55FFEF85, DSN Ch. 23 Uplink +7173293218, 7174449084, WFM, 100, #55FFE430, DSN Ch. 24 Uplink +7174449084, 7175604950, WFM, 100, #55FFEF85, DSN Ch. 25 Uplink +7175604950, 7176760816, WFM, 100, #55FFE430, DSN Ch. 26 Uplink +7176760816, 7177916682, WFM, 100, #55FFEF85, DSN Ch. 27 Uplink +7177916682, 7179072548, WFM, 100, #55FFE430, DSN Ch. 28 Uplink +7179072548, 7180228414, WFM, 100, #55FFEF85, DSN Ch. 29 Uplink +7180228414, 7181384280, WFM, 100, #55FFE430, DSN Ch. 30 Uplink +7181384280, 7182540146, WFM, 100, #55FFEF85, DSN Ch. 31 Uplink +7182540146, 7183696012, WFM, 100, #55FFE430, DSN Ch. 32 Uplink +7183696012, 7184851878, WFM, 100, #55FFEF85, DSN Ch. 33 Uplink +7184851878, 7186007744, WFM, 100, #55FFE430, DSN Ch. 34 Uplink +7186007744, 7187163610, WFM, 100, #55FFEF85, DSN Ch. 35 Uplink +7187163610, 7188319476, WFM, 100, #55FFE430, DSN Ch. 36 Uplink +7188319476, 7189475342, WFM, 100, #55FFEF85, DSN Ch. 37 Uplink +7189475342, 7211600000, WFM, 100, #553AFFFF, Earth-to-space Communications +7211600000, 7221600000, WFM, 100, #5500FFFF, GOES GRB +7221600000, 7250000000, WFM, 100, #553AFFFF, Earth-to-space Communications +7250000000, 7737000000, WFM, 100, #553AFFFF, Space-to-Earth Communications +7737000000, 7887000000, WFM, 100, #5500FFFF, NOAA-20/ SNPP SMD, and Other Satellite Downlinks +7887000000, 7900000000, WFM, 100, #553AFFFF, Space-to-Earth Communications +7900000000, 8025000000, WFM, 100, #553AFFFF, Earth-to-space Communications +8025000000, 8130000000, WFM, 100, #553AFFFF, Space-to-Earth and Earth-to-space Communications +8130000000, 8310000000, WFM, 100, #5500FFFF, GOES Raw Data/ Other Satellite Downlinks +8310000000, 8399382717, WFM, 100, #553AFFFF, Space-to-Earth and Earth-to-space Communications +8399382717, 8400740740, WFM, 100, #556B95FF, Deep Space Network Ch. 3 Downlink +8400740740, 8402098763, WFM, 100, #55366FFF, DSN Ch. 4 Downlink +8402098763, 8403456786, WFM, 100, #556B95FF, DSN Ch. 5 Downlink +8403456786, 8404814809, WFM, 100, #55366FFF, DSN Ch. 6 Downlink +8404814809, 8406172832, WFM, 100, #556B95FF, DSN Ch. 7 Downlink +8406172832, 8407530855, WFM, 100, #55366FFF, DSN Ch. 8 Downlink +8407530855, 8408888878, WFM, 100, #556B95FF, DSN Ch. 9 Downlink +8408888878, 8410246901, WFM, 100, #55366FFF, DSN Ch. 10 Downlink +8410246901, 8411604924, WFM, 100, #556B95FF, DSN Ch. 11 Downlink +8411604924, 8412962947, WFM, 100, #55366FFF, DSN Ch. 12 Downlink +8412962947, 8414320970, WFM, 100, #556B95FF, DSN Ch. 13 Downlink +8414320970, 8415678993, WFM, 100, #55366FFF, DSN Ch. 14 Downlink +8415678993, 8417037016, WFM, 100, #556B95FF, DSN Ch. 15 Downlink +8417037016, 8418395039, WFM, 100, #55366FFF, DSN Ch. 16 Downlink +8418395039, 8419753085, WFM, 100, #556B95FF, DSN Ch. 17 Downlink +8419753085, 8421111108, WFM, 100, #55366FFF, DSN Ch. 18 Downlink +8421111108, 8422469131, WFM, 100, #556B95FF, DSN Ch. 19 Downlink +8422469131, 8423827154, WFM, 100, #55366FFF, DSN Ch. 20 Downlink +8423827154, 8425185177, WFM, 100, #556B95FF, DSN Ch. 21 Downlink +8425185177, 8426543200, WFM, 100, #55366FFF, DSN Ch. 22 Downlink +8426543200, 8427901223, WFM, 100, #556B95FF, DSN Ch. 23 Downlink +8427901223, 8429259246, WFM, 100, #55366FFF, DSN Ch. 24 Downlink +8429259246, 8430617269, WFM, 100, #556B95FF, DSN Ch. 25 Downlink +8430617269, 8431975292, WFM, 100, #55366FFF, DSN Ch. 26 Downlink +8431975292, 8433333315, WFM, 100, #556B95FF, DSN Ch. 27 Downlink +8433333315, 8434691338, WFM, 100, #55366FFF, DSN Ch. 28 Downlink +8434691338, 8436049361, WFM, 100, #556B95FF, DSN Ch. 29 Downlink +8436049361, 8437407384, WFM, 100, #55366FFF, DSN Ch. 30 Downlink +8437407384, 8438765407, WFM, 100, #556B95FF, DSN Ch. 31 Downlink +8438765407, 8440123430, WFM, 100, #55366FFF, DSN Ch. 32 Downlink +8440123430, 8441481453, WFM, 100, #556B95FF, DSN Ch. 33 Downlink +8441481453, 8442839476, WFM, 100, #55366FFF, DSN Ch. 34 Downlink +8442839476, 8444197499, WFM, 100, #556B95FF, DSN Ch. 35 Downlink +8444197499, 8445555522, WFM, 100, #55366FFF, DSN Ch. 36 Downlink +8445555522, 8446913545, WFM, 100, #556B95FF, DSN Ch. 37 Downlink +8446913545, 8448271568, WFM, 100, #55366FFF, DSN Ch. 38 Downlink +8448271568, 8449629627, WFM, 100, #556B95FF, DSN Ch. 39 Downlink +8449629627, 8500000000, WFM, 100, #553AFFFF, Space-to-Earth Communications +8500000000, 8550000000, WFM, 100, #5500FF7F, Radiolocation +8550000000, 8650000000, WFM, 100, #5091A4EE, Earth Exploration Satellite/ Space Research +8650000000, 9000000000, WFM, 100, #5500FF7F, Radiolocation +9000000000, 9200000000, WFM, 100, #505D88FF, Aeronautical Radionavigation +9200000000, 9300000000, WFM, 100, #55008080, Maritime Radionavigation +9300000000, 9500000000, WFM, 100, #5500FF7F, Radionavigation +9500000000, 9900000000, WFM, 100, #5091A4EE, Earth Exploration Satellite/ Space Research +9900000000, 10000000000, WFM, 100, #5500FF7F, Radiolocation +10000000000, 10050000000, WFM, 100, #503CCCFF, 3cm Ham Band| Experimental +10050000000, 10100000000, WFM, 100, #40FF00BC, Analog and Digital (paired w/ 10300-10350) +10100000000, 10115000000, WFM, 100, #40FF00BC, Analog and Digital (paired w/ 10350-10365) +10115000000, 10117000000, WFM, 100, #40FF00BC, Analog and Digital (paired w/ 10365-10367) +10117000000, 10120000000, WFM, 100, #503CCCFF, Experimental (3cm) +10120000000, 10125000000, WFM, 100, #40FF00BC, Analog and Digital (paired w/ 10370-10375) +10125000000, 10200000000, WFM, 100, #40FF00BC, Analog and Digital (paired w/10375-10450) +10200000000, 10300000000, WFM, 100, #40FF0000, Wideband Gunnplexers (3cm) +10300000000, 10350000000, WFM, 100, #40FF00BC, Analog and Digital +10350000000, 10365000000, WFM, 100, #40FF00BC, Analog and Digital +10365000000, 10367000000, WFM, 100, #40FF00BC, Analog and Digital +10367000000, 10368095000, WFM, 100, #40FF00BC, Mixed Mode (3cm) +10368095000, 10368105000, WFM, 100, #50FFB300, National Weak-Signal Calling +10368105000, 10368300000, WFM, 100, #40FF00BC, Mixed Mode (3cm) +10368300000, 10368400000, WFM, 100, #50ACFFEC, Beacons (3cm) +10368400000, 10370000000, WFM, 100, #40FF00BC, Mixed Mode (3cm) +10370000000, 10375000000, WFM, 100, #40FF00BC, Analog and Digital (paired w/10120-10125) +10375000000, 10450000000, WFM, 100, #40FF00BC, Analog and Digital (paired w/10125-10200) +10450000000, 10500000000, WFM, 100, #50FF009A, Space Earth and Telecommand Stations| 3cm Ham Band +10600000000, 10700000000, WFM, 100, #40FFFF00, Radio Astronomy +10700000000, 12700000000, WFM, 100, #553AFFFF, Starlink Downlink +14000000000, 14500000000, WFM, 100, #553AFFFF, Starlink Uplink +17800000000, 18600000000, WFM, 100, #553AFFFF, Starlink Downlink +18800000000, 19300000000, WFM, 100, #553AFFFF, Starlink Downlink +29500000000, 30000000000, WFM, 100, #553AFFFF, Starlink Uplink +37500000000, 42500000000, WFM, 100, #553AFFFF, Starlink Downlink +47200000000, 52400000000, WFM, 100, #553AFFFF, Starlink Uplink diff --git a/resources/bandplan.old.csv b/resources/bandplan.old.csv new file mode 100644 index 000000000..f5603c533 --- /dev/null +++ b/resources/bandplan.old.csv @@ -0,0 +1,114 @@ +# minFrequency, maxFrequency, mode, step, color, name + +# USA Amateur Radio +135700, 137800, CW, 10, #90009470, 2200m Ham Band +472000, 479000, CW, 10, #90009470, 630m Ham Band +1800000, 2000000, CW, 10, #90009470, 160m Ham Band +3500000, 3600000, CW, 10, #90009470, 80m CW/Data Ham Band +3600000, 4000000, CW, 10, #90009470, 80m Phone Ham Band +5351500, 5366500, USB, 10, #90009470, 60m Ham Band +7000000, 7125000, CW, 10, #90009470, 40m CW/Data Ham Band +7125000, 7300000, LSB, 10, #90009470, 40m Phone Ham Band +10100000, 10150000, CW, 10, #90009470, 30m CW/Data Ham Band +14000000, 14150000, CW, 10, #90009470, 20m CW/Data Ham Band +14150000, 14350000, USB, 10, #90009470, 20m Phone Ham Band +18068000, 18110000, CW, 10, #90009470, 17m CW/Data Ham Band +18110000, 18168000, USB, 10, #90009470, 17m Ham Band +21000000, 21200000, CW, 10, #90009470, 15m CW/Data Ham Band +21200000, 21450000, USB, 10, #90009470, 15m Ham Band +24890000, 24930000, CW, 10, #90009470, 12m CW/Data Ham Band +24930000, 24990000, USB, 10, #90009470, 12m Ham Band +28000000, 28300000, CW, 10, #90009470, 10m CW/Data Ham Band +28300000, 29700000, USB, 10, #90009470, 10m Ham Band +50000000, 50100000, CW, 10, #90009470, 6m CW/Data Ham Band +50100000, 54000000, USB, 10, #90009470, 6m Ham Band +144000000, 144100000, CW, 10, #90009470, 2m CW/Data Ham Band +144100000, 148000000, NFM, 10, #90009470, 2m Ham Band +222000000, 225000000, NFM, 10, #90009470, 1.25m Ham Band +420000000, 450000000, NFM, 10, #90009470, 70cm Ham Band +902000000, 928000000, NFM, 10, #90009470, 33cm Ham Band +1240000000, 1300000000, NFM, 10, #90009470, 23cm Ham Band +2300000000, 2310000000, NFM, 10, #90009470, GHz Ham Band +2390000000, 2450000000, NFM, 10, #90009470, GHz Ham Band +3300000000, 3500000000, NFM, 10, #90009470, GHz Ham Band +5650000000, 5925000000, NFM, 10, #90009470, GHz Ham Band +10000000000, 10500000000, NFM, 10, #90009470, GHz Ham Band +24000000000, 24250000000, NFM, 10, #90009470, GHz Ham Band +47000000000, 47200000000, NFM, 10, #90009470, GHz Ham Band +77000000000, 81000000000, NFM, 10, #90009470, GHz Ham Band +122250000000, 123000000000, NFM, 10, #90009470, GHz Ham Band +134000000000, 141000000000, NFM, 10, #90009470, GHz Ham Band +241000000000, 250000000000, NFM, 10, #90009470, GHz Ham Band + +# Radionavigation - Source: https://www.ntia.doc.gov/files/ntia/publications/2003-allochrt.pdf +9000, 14000, USB, 10, #99AABD26, Radionavigation +90000, 110000, USB, 10, #99AABD26, Radionavigation +190000, 200000, USB, 10, #99C05017, Aeronautical Radionavigation +200000, 275000, USB, 10, #99C05017, Aeronautical Radionavigation +275000, 285000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) +275000, 285000, USB, 10, #99C05017, Aeronautical Radionavigation +285000, 300000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) +285000, 300000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) +300000, 325000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) +300000, 325000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) +325000, 335000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) +325000, 335000, USB, 10, #994C8E75, Maritime Radionavigation (Radio Beacons) +335000, 405000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) +405000, 415000, USB, 10, #99AABD26, Radionavigation +415000, 495000, USB, 10, #99C05017, Aeronautical Radionavigation +510000, 535000, USB, 10, #99C05017, Aeronautical Radionavigation (Radio Beacons) +74800000, 75200000, USB, 10, #99C05017, Aeronautical Radionavigation +328600000, 335400000, USB, 10, #99C05017, Aeronautical Radionavigation +399900000, 400050000, USB, 10, #99E9EB7C, Radionavigation Satellite +960000000, 1215000000, USB, 10, #99C05017, Aeronautical Radionavigation +1215000000, 1240000000, USB, 10, #99E9EB7C, Radionavigation Satellite +1300000000, 1350000000, USB, 10, #99C05017, Aeronautical Radionavigation +1559000000, 1610000000, USB, 10, #99E9EB7C, Radionavigation Satellite (Space to Earth) +1559000000, 1626500000, USB, 10, #99C05017, Aeronautical Radionavigation +2700000000, 2900000000, USB, 10, #99C05017, Aeronautical Radionavigation +2900000000, 3100000000, USB, 10, #994C8E75, Maritime Radionavigation +3500000000, 3650000000, USB, 10, #99C05017, Aeronautical Radionavigation (Ground) +4200000000, 4400000000, USB, 10, #99C05017, Aeronautical Radionavigation +5000000000, 5250000000, USB, 10, #99C05017, Aeronautical Radionavigation +5350000000, 5460000000, USB, 10, #99C05017, Aeronautical Radionavigation +5460000000, 5470000000, USB, 10, #99AABD26, Radionavigation +5470000000, 5650000000, USB, 10, #994C8E75, Maritime Radionavigation +9000000000, 9200000000, USB, 10, #99C05017, Aeronautical Radionavigation +9200000000, 9300000000, USB, 10, #994C8E75, Maritime Radionavigation +9300000000, 9500000000, USB, 10, #99AABD26, Radionavigation +13250000000, 13400000000, USB, 10, #99C05017, Aeronautical Radionavigation +14000000000, 14200000000, USB, 10, #99AABD26, Radionavigation +15400000000, 15700000000, USB, 10, #99C05017, Aeronautical Radionavigation +24450000000, 24650000000, USB, 10, #99AABD26, Radionavigation +24750000000, 25050000000, USB, 10, #99AABD26, Radionavigation +31800000000, 33400000000, USB, 10, #99AABD26, Radionavigation +45500000000, 47000000000, USB, 10, #99E9EB7C, Radionavigation Satellite +66000000000, 71000000000, USB, 10, #99AABD26, Radionavigation +66000000000, 71000000000, USB, 10, #99E9EB7C, Radionavigation Satellite +95000000000, 100000000000, USB, 10, #99AABD26, Radionavigation +95000000000, 100000000000, USB, 10, #99E9EB7C, Radionavigation Satellite +134000000000, 142000000000, USB, 10, #99E9EB7C, Radionavigation Satellite +134000000000, 142000000000, USB, 10, #99AABD26, Radionavigation +190000000000, 200000000000, USB, 10, #99E9EB7C, Radionavigation Satellite +190000000000, 200000000000, USB, 10, #99AABD26, Radionavigation +252000000000, 265000000000, USB, 10, #99E9EB7C, Radionavigation Satellite +252000000000, 265000000000, USB, 10, #99AABD26, Radionavigation + +# Broadcast +54000000, 72000000, AM, 10, #902E98BB, Broadcast Television +76000000, 088000000, AM, 10, #902E98BB, Broadcast Television +88000000, 108000000, WFM, 10, #902E98BB, Broadcast Radio +174000000, 216000000, AM, 10, #902E98BB, Broadcast Television +470000000, 512000000, AM, 10, #902E98BB, Broadcast Television +512000000, 608000000, AM, 10, #902E98BB, Broadcast Television +614000000, 698000000, AM, 10, #902E98BB, Broadcast Television +698000000, 763000000, AM, 10, #902E98BB, Broadcast Television + +# Other +108000000, 118000000, AM, 5000, #906600FF, Air Band VOR/ILS +118000000, 137000000, AM, 5000, #900000FF, Air Band Voice +26960000, 27410000, AM, 5000, #90FF0000, CB +156000000, 162025000, NFM, 12500, #90000080, Marine +225000000, 380000000, NFM, 12500, #90FF0000, Military Air +240000000, 270000000, NFM, 12500, #90FF0000, Mil Sat +446000000, 446200000, NFM, 6250, #9000FF00, PMR446 diff --git a/src/applications/CMakeLists.txt b/src/applications/CMakeLists.txt index 88242d400..53a59489f 100644 --- a/src/applications/CMakeLists.txt +++ b/src/applications/CMakeLists.txt @@ -3,8 +3,8 @@ add_source_files(SRCS_LIST gqrx/gqrx.h gqrx/main.cpp - gqrx/mainwindow.cpp - gqrx/mainwindow.h + gqrx/mainwindow_touch.cpp + gqrx/mainwindow_touch.h gqrx/receiver.cpp gqrx/receiver.h gqrx/remote_control_settings.cpp @@ -19,6 +19,6 @@ add_source_files(SRCS_LIST ####################################################################################################################### # Add the UI files to UI_SRCS_LIST add_source_files(UI_SRCS_LIST - gqrx/mainwindow.ui + gqrx/mainwindow_touch.ui gqrx/remote_control_settings.ui ) diff --git a/src/applications/gqrx/main_touch.cpp b/src/applications/gqrx/main_touch.cpp new file mode 100644 index 000000000..8278f2a19 --- /dev/null +++ b/src/applications/gqrx/main_touch.cpp @@ -0,0 +1,242 @@ +/* -*- c++ -*- */ +/* + * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt + * https://gqrx.dk/ + * + * Copyright 2011-2013 Alexandru Csete OZ9AEC. + * + * Gqrx 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; either version 3, or (at your option) + * any later version. + * + * Gqrx 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with Gqrx; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WITH_PORTAUDIO +#include +#endif +#ifdef WITH_PULSEAUDIO +#include +#include +#endif + +#include "mainwindow_touch.h" +#include "gqrx.h" + +#include + +static void reset_conf(const QString &file_name); +static void list_conf(); + +int main(int argc, char *argv[]) +{ + QString cfg_file; + bool edit_conf = false; + int return_code = 0; + + QApplication app(argc, argv); + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QCoreApplication::setOrganizationName(GQRX_ORG_NAME); + QCoreApplication::setOrganizationDomain(GQRX_ORG_DOMAIN); + QCoreApplication::setApplicationName(GQRX_APP_NAME); + QCoreApplication::setApplicationVersion(VERSION); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true); +#endif + QLoggingCategory::setFilterRules("*.debug=false"); + + QString plugin_path = QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../soapy-modules"); + QFileInfo plugin_path_info(plugin_path); + if (plugin_path_info.isDir()) + { + qputenv("SOAPY_SDR_PLUGIN_PATH", plugin_path.toUtf8()); + qputenv("SOAPY_SDR_ROOT", "/invalid"); + } + + // setup controlport via environment variables + // see http://lists.gnu.org/archive/html/discuss-gnuradio/2013-05/msg00270.html + // Note: tried using gr::prefs().save() but that doesn't have effect until the next time + if (qputenv("GR_CONF_CONTROLPORT_ON", "False")) + qDebug() << "Controlport disabled"; + else + qDebug() << "Failed to disable controlport"; + + QCommandLineParser parser; + parser.setApplicationDescription("Gqrx software defined radio receiver " VERSION); + parser.addHelpOption(); + parser.addOptions({ + {{"s", "style"}, "Use the given style (fusion, windows)", "style"}, + {{"l", "list"}, "List existing configurations"}, + {{"c", "conf"}, "Start with this config file", "file"}, + {{"e", "edit"}, "Edit the config file before using it"}, + {{"r", "reset"}, "Reset configuration file"}, + }); + parser.process(app); + + if (parser.isSet("style")) + QApplication::setStyle(parser.value("style")); + + if (parser.isSet("list")) + { + list_conf(); + return 0; + } + + // check whether audio backend is functional +#ifdef WITH_PORTAUDIO + PaError err = Pa_Initialize(); + if (err != paNoError) + { + QString message = QString("Portaudio error: %1").arg(Pa_GetErrorText(err)); + qCritical() << message; + QMessageBox::critical(nullptr, "Audio Error", message, + QMessageBox::Abort, QMessageBox::NoButton); + return 1; + } +#endif + +#ifdef WITH_PULSEAUDIO + int error = 0; + pa_simple *test_sink; + pa_sample_spec ss; + + ss.format = PA_SAMPLE_FLOAT32LE; + ss.rate = 48000; + ss.channels = 2; + test_sink = pa_simple_new(NULL, "Gqrx Test", PA_STREAM_PLAYBACK, NULL, + "Test stream", &ss, NULL, NULL, &error); + if (!test_sink) + { + QString message = QString("Pulseaudio error: %1").arg(pa_strerror(error)); + qCritical() << message; + QMessageBox::critical(0, "Audio Error", message, + QMessageBox::Abort, QMessageBox::NoButton); + return 1; + } + pa_simple_free(test_sink); +#endif + + + if (parser.isSet("conf")) + { + cfg_file = parser.value("conf"); + qDebug() << "User specified config file:" << cfg_file; + } + else + { + cfg_file = "default.conf"; + qDebug() << "No user supplied config file. Using" << cfg_file; + } + + if (parser.isSet("reset")) + reset_conf(cfg_file); + else if (parser.isSet("edit")) + edit_conf = true; + + try { + // Mainwindow will check whether we have a configuration + // and open the config dialog if there is none or the specified + // file does not exist. + MainWindow w(cfg_file, edit_conf); + + if (w.configOk) + { + w.show(); + return_code = QApplication::exec(); + } + else + { + return_code = 1; + } + } + catch (std::exception &x) + { + QMessageBox::warning(nullptr, + QObject::tr("Crash detected"), + QObject::tr("

gqrx exited with an exception:

" + "

%1

" + "

More information can be found by launching it from the console.

") + .arg(x.what()), + QMessageBox::Close); + } + +#ifdef WITH_PORTAUDIO + Pa_Terminate(); +#endif + + return return_code; +} + +/** Reset configuration file specified by file_name. */ +static void reset_conf(const QString &file_name) +{ + QString cfg_file; + QByteArray xdg_dir = qgetenv("XDG_CONFIG_HOME"); + + if (xdg_dir.isEmpty()) + cfg_file = QString("%1/.config/gqrx/%2").arg(QDir::homePath()).arg(file_name); + else + cfg_file = QString("%1/gqrx/%2").arg(xdg_dir.data()).arg(file_name); + + if (QFile::exists(cfg_file)) + { + if (QFile::remove(cfg_file)) + qDebug() << cfg_file << "deleted"; + else + qDebug() << "Failed to remove" << cfg_file; + } + else + { + qDebug() << "Can not delete" << cfg_file << "- file does not exist!"; + } +} + +/** List available configurations. */ +static void list_conf() +{ + QString conf_path; + QByteArray xdg_dir = qgetenv("XDG_CONFIG_HOME"); + + if (xdg_dir.isEmpty()) + conf_path = QString("%1/.config/gqrx/").arg(QDir::homePath()); + else + conf_path = QString("%1/gqrx/").arg(xdg_dir.data()); + + QDir conf_dir = QDir(conf_path, "*.conf", QDir::Name, QDir::Files); + QStringList conf_files = conf_dir.entryList(QStringList("*.conf")); + + std::cout << std::endl + << " Existing configuration files in " + << conf_path.toStdString() + << std::endl; + + if (conf_files.isEmpty()) + { + std::cout << " *** NONE ***" << std::endl; + } + else + { + for (int i = 0; i < conf_files.count(); i++) + { + std::cout << " "; + std::cout << conf_files.at(i).toLocal8Bit().constData() << std::endl; + } + } +} diff --git a/src/applications/gqrx/mainwindow_touch.cpp b/src/applications/gqrx/mainwindow_touch.cpp new file mode 100755 index 000000000..a00deec6a --- /dev/null +++ b/src/applications/gqrx/mainwindow_touch.cpp @@ -0,0 +1,2470 @@ +/* -*- c++ -*- */ +/* + * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt + * https://gqrx.dk/ + * + * Copyright 2011-2014 Alexandru Csete OZ9AEC. + * Copyright (C) 2013 by Elias Oenal + * + * Gqrx 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; either version 3, or (at your option) + * any later version. + * + * Gqrx 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with Gqrx; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "qtgui/ioconfig.h" +#include "mainwindow_touch.h" +#include "qtgui/dxc_options.h" +#include "qtgui/dxc_spots.h" + +/* Qt Designer files */ +#include "ui_mainwindow_touch.h" + +/* DSP */ +#include "receiver.h" +#include "remote_control_settings.h" + +#include "qtgui/bookmarkstaglist.h" +#include "qtgui/bandplan.h" + +MainWindow::MainWindow(const QString& cfgfile, bool edit_conf, QWidget *parent) : + QMainWindow(parent), + configOk(true), + ui(new Ui::MainWindow), + d_lnb_lo(0), + d_hw_freq(0), + d_fftAvg(0.25), + d_have_audio(true), + dec_afsk1200(nullptr) +{ + ui->setupUi(this); + BandPlan::create(); + Bookmarks::create(); + DXCSpots::create(); + + /* Initialise default configuration directory */ + QByteArray xdg_dir = qgetenv("XDG_CONFIG_HOME"); + if (xdg_dir.isEmpty()) + { + // Qt takes care of conversion to native separators + m_cfg_dir = QString("%1/.config/gqrx").arg(QDir::homePath()); + } + else + { + m_cfg_dir = QString("%1/gqrx").arg(xdg_dir.data()); + } + + setWindowTitle(QString("Gqrx %1").arg(VERSION)); + + /* frequency control widget */ + ui->freqCtrl->setup(0, 0, 9999e6, 1, FCTL_UNIT_NONE); + ui->freqCtrl->setFrequency(144500000); + + d_filter_shape = receiver::FILTER_SHAPE_NORMAL; + + /* create receiver object */ + rx = new receiver("", "", 1); + rx->set_rf_freq(144500000.0f); + + // remote controller + remote = new RemoteControl(); + + /* meter timer */ + meter_timer = new QTimer(this); + connect(meter_timer, SIGNAL(timeout()), this, SLOT(meterTimeout())); + + /* FFT timer & data */ + iq_fft_timer = new QTimer(this); + connect(iq_fft_timer, SIGNAL(timeout()), this, SLOT(iqFftTimeout())); + + audio_fft_timer = new QTimer(this); + connect(audio_fft_timer, SIGNAL(timeout()), this, SLOT(audioFftTimeout())); + + d_fftData = new std::complex[MAX_FFT_SIZE]; + d_realFftData = new float[MAX_FFT_SIZE]; + d_iirFftData = new float[MAX_FFT_SIZE]; + for (int i = 0; i < MAX_FFT_SIZE; i++) + d_iirFftData[i] = -140.0; // dBFS + + /* timer for data decoders */ + dec_timer = new QTimer(this); + connect(dec_timer, SIGNAL(timeout()), this, SLOT(decoderTimeout())); + + // create I/Q tool widget + iq_tool = new CIqTool(this); + + // create DXC Objects + dxc_options = new DXCOptions(this); + + printf("---Creating dock widgets.\n"); + + /* create dock widgets */ + uiDockRxOpt = new DockRxOpt(); + uiDockRDS = new DockRDS(); + uiDockAudio = new DockAudio(); + uiDockInputCtl = new DockInputCtl(); + uiDockFft = new DockFft(); + BandPlan::Get().setConfigDir(m_cfg_dir); + Bookmarks::Get().setConfigDir(m_cfg_dir); + BandPlan::Get().load(); + uiDockBookmarks = new DockBookmarks(this); + + uiDockTouchControls = new DockTouchControls(this); + + // setup some toggle view shortcuts + //uiDockInputCtl->toggleViewAction()->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_J)); + //uiDockRxOpt->toggleViewAction()->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R)); + //uiDockFft->toggleViewAction()->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_F)); + //uiDockAudio->toggleViewAction()->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_A)); + //uiDockBookmarks->toggleViewAction()->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_B)); + //ui->mainToolBar->toggleViewAction()->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_T)); + + /* frequency setting shortcut */ + auto *freq_shortcut = new QShortcut(QKeySequence(Qt::Key_F), this); + QObject::connect(freq_shortcut, &QShortcut::activated, this, &MainWindow::frequencyFocusShortcut); + + setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea); + + setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); + setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); + + setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea); + + /* Add dock widgets to main window. This should be done even for + dock widgets that are going to be hidden, otherwise they will + end up floating in their own top-level window and can not be + docked to the mainwindow. + */ + + addDockWidget(Qt::BottomDockWidgetArea, uiDockInputCtl); + addDockWidget(Qt::BottomDockWidgetArea, uiDockRxOpt); + addDockWidget(Qt::BottomDockWidgetArea, uiDockFft); + addDockWidget(Qt::BottomDockWidgetArea, uiDockAudio); + addDockWidget(Qt::BottomDockWidgetArea, uiDockBookmarks); + tabifyDockWidget(uiDockInputCtl, uiDockRxOpt); + tabifyDockWidget(uiDockRxOpt, uiDockFft); + tabifyDockWidget(uiDockFft, uiDockAudio); + tabifyDockWidget(uiDockAudio, uiDockBookmarks); + uiDockRxOpt->raise(); + + addDockWidget(Qt::TopDockWidgetArea, uiDockRDS); + + addDockWidget(Qt::RightDockWidgetArea, uiDockTouchControls); + + uiDockInputCtl->setTitleBarWidget(new QWidget(uiDockInputCtl)); + uiDockRxOpt->setTitleBarWidget(new QWidget(uiDockRxOpt)); + uiDockFft->setTitleBarWidget(new QWidget(uiDockFft)); + uiDockAudio->setTitleBarWidget(new QWidget(uiDockAudio)); + uiDockBookmarks->setTitleBarWidget(new QWidget(uiDockBookmarks)); + uiDockRxOpt->setTitleBarWidget(new QWidget(uiDockRxOpt)); + uiDockFft->setTitleBarWidget(new QWidget(uiDockFft)); + uiDockAudio->setTitleBarWidget(new QWidget(uiDockAudio)); + uiDockBookmarks->setTitleBarWidget(new QWidget(uiDockBookmarks)); + + uiDockRDS->setTitleBarWidget(new QWidget(uiDockRDS)); + + uiDockTouchControls->setTitleBarWidget(new QWidget(uiDockTouchControls)); + + /* hide docks that we don't want to show initially */ + //uiDockBookmarks->hide(); + //uiDockRDS->hide(); + + /* Add dock widget actions to View menu. By doing it this way all signal/slot + connections will be established automagially. + */ + //ui->menu_View->addAction(uiDockInputCtl->toggleViewAction()); + //ui->menu_View->addAction(uiDockRxOpt->toggleViewAction()); + //ui->menu_View->addAction(uiDockRDS->toggleViewAction()); + //ui->menu_View->addAction(uiDockAudio->toggleViewAction()); + //ui->menu_View->addAction(uiDockFft->toggleViewAction()); + //ui->menu_View->addAction(uiDockBookmarks->toggleViewAction()); + //ui->menu_View->addSeparator(); + //ui->menu_View->addAction(ui->mainToolBar->toggleViewAction()); + //ui->menu_View->addSeparator(); + ui->menu_View->addAction(ui->actionFullScreen); + + /* connect signals and slots */ + connect(ui->freqCtrl, SIGNAL(newFrequency(qint64)), this, SLOT(setNewFrequency(qint64))); + connect(ui->freqCtrl, SIGNAL(newFrequency(qint64)), remote, SLOT(setNewFrequency(qint64))); + connect(ui->freqCtrl, SIGNAL(newFrequency(qint64)), uiDockAudio, SLOT(setRxFrequency(qint64))); + connect(ui->freqCtrl, SIGNAL(newFrequency(qint64)), uiDockRxOpt, SLOT(setRxFreq(qint64))); + connect(uiDockInputCtl, SIGNAL(lnbLoChanged(double)), this, SLOT(setLnbLo(double))); + connect(uiDockInputCtl, SIGNAL(lnbLoChanged(double)), remote, SLOT(setLnbLo(double))); + connect(uiDockInputCtl, SIGNAL(gainChanged(QString, double)), this, SLOT(setGain(QString,double))); + connect(uiDockInputCtl, SIGNAL(gainChanged(QString, double)), remote, SLOT(setGain(QString,double))); + connect(uiDockInputCtl, SIGNAL(autoGainChanged(bool)), this, SLOT(setAutoGain(bool))); + connect(uiDockInputCtl, SIGNAL(freqCorrChanged(double)), this, SLOT(setFreqCorr(double))); + connect(uiDockInputCtl, SIGNAL(iqSwapChanged(bool)), this, SLOT(setIqSwap(bool))); + connect(uiDockInputCtl, SIGNAL(dcBlockChanged(bool)), this, SLOT(setDcBlock(bool))); + connect(uiDockInputCtl, SIGNAL(dcCancelChanged(bool)), this, SLOT(setDcCancel(bool))); + connect(uiDockInputCtl, SIGNAL(dcTuneChanged(bool)), this, SLOT(setDcTune(bool))); + connect(uiDockInputCtl, SIGNAL(iqBalanceChanged(bool)), this, SLOT(setIqBalance(bool))); + connect(uiDockInputCtl, SIGNAL(ignoreLimitsChanged(bool)), this, SLOT(setIgnoreLimits(bool))); + connect(uiDockInputCtl, SIGNAL(antennaSelected(QString)), this, SLOT(setAntenna(QString))); + connect(uiDockInputCtl, SIGNAL(freqCtrlResetChanged(bool)), this, SLOT(setFreqCtrlReset(bool))); + connect(uiDockInputCtl, SIGNAL(invertScrollingChanged(bool)), this, SLOT(setInvertScrolling(bool))); + connect(uiDockRxOpt, SIGNAL(rxFreqChanged(qint64)), ui->freqCtrl, SLOT(setFrequency(qint64))); + connect(uiDockRxOpt, SIGNAL(filterOffsetChanged(qint64)), this, SLOT(setFilterOffset(qint64))); + connect(uiDockRxOpt, SIGNAL(filterOffsetChanged(qint64)), remote, SLOT(setFilterOffset(qint64))); + connect(uiDockRxOpt, SIGNAL(demodSelected(int)), this, SLOT(selectDemod(int))); + connect(uiDockRxOpt, SIGNAL(demodSelected(int)), remote, SLOT(setMode(int))); + connect(uiDockRxOpt, SIGNAL(fmMaxdevSelected(float)), this, SLOT(setFmMaxdev(float))); + connect(uiDockRxOpt, SIGNAL(fmEmphSelected(double)), this, SLOT(setFmEmph(double))); + connect(uiDockRxOpt, SIGNAL(amDcrToggled(bool)), this, SLOT(setAmDcr(bool))); + connect(uiDockRxOpt, SIGNAL(cwOffsetChanged(int)), this, SLOT(setCwOffset(int))); + connect(uiDockRxOpt, SIGNAL(amSyncDcrToggled(bool)), this, SLOT(setAmSyncDcr(bool))); + connect(uiDockRxOpt, SIGNAL(amSyncPllBwSelected(float)), this, SLOT(setAmSyncPllBw(float))); + connect(uiDockRxOpt, SIGNAL(agcToggled(bool)), this, SLOT(setAgcOn(bool))); + connect(uiDockRxOpt, SIGNAL(agcHangToggled(bool)), this, SLOT(setAgcHang(bool))); + connect(uiDockRxOpt, SIGNAL(agcThresholdChanged(int)), this, SLOT(setAgcThreshold(int))); + connect(uiDockRxOpt, SIGNAL(agcSlopeChanged(int)), this, SLOT(setAgcSlope(int))); + connect(uiDockRxOpt, SIGNAL(agcGainChanged(int)), this, SLOT(setAgcGain(int))); + connect(uiDockRxOpt, SIGNAL(agcDecayChanged(int)), this, SLOT(setAgcDecay(int))); + connect(uiDockRxOpt, SIGNAL(noiseBlankerChanged(int,bool,float)), this, SLOT(setNoiseBlanker(int,bool,float))); + connect(uiDockRxOpt, SIGNAL(sqlLevelChanged(double)), this, SLOT(setSqlLevel(double))); + connect(uiDockRxOpt, SIGNAL(sqlAutoClicked()), this, SLOT(setSqlLevelAuto())); + connect(uiDockAudio, SIGNAL(audioGainChanged(float)), this, SLOT(setAudioGain(float))); + connect(uiDockAudio, SIGNAL(audioStreamingStarted(QString,int,bool)), this, SLOT(startAudioStream(QString,int,bool))); + connect(uiDockAudio, SIGNAL(audioStreamingStopped()), this, SLOT(stopAudioStreaming())); + connect(uiDockAudio, SIGNAL(audioRecStarted(QString)), this, SLOT(startAudioRec(QString))); + connect(uiDockAudio, SIGNAL(audioRecStarted(QString)), remote, SLOT(startAudioRecorder(QString))); + connect(uiDockAudio, SIGNAL(audioRecStopped()), this, SLOT(stopAudioRec())); + connect(uiDockAudio, SIGNAL(audioRecStopped()), remote, SLOT(stopAudioRecorder())); + connect(uiDockAudio, SIGNAL(audioPlayStarted(QString)), this, SLOT(startAudioPlayback(QString))); + connect(uiDockAudio, SIGNAL(audioPlayStopped()), this, SLOT(stopAudioPlayback())); + connect(uiDockAudio, SIGNAL(fftRateChanged(int)), this, SLOT(setAudioFftRate(int))); + connect(uiDockFft, SIGNAL(fftSizeChanged(int)), this, SLOT(setIqFftSize(int))); + connect(uiDockFft, SIGNAL(fftRateChanged(int)), this, SLOT(setIqFftRate(int))); + connect(uiDockFft, SIGNAL(fftWindowChanged(int)), this, SLOT(setIqFftWindow(int))); + connect(uiDockFft, SIGNAL(wfSpanChanged(quint64)), this, SLOT(setWfTimeSpan(quint64))); + connect(uiDockFft, SIGNAL(fftSplitChanged(int)), this, SLOT(setIqFftSplit(int))); + connect(uiDockFft, SIGNAL(fftAvgChanged(float)), this, SLOT(setIqFftAvg(float))); + connect(uiDockFft, SIGNAL(fftZoomChanged(float)), ui->plotter, SLOT(zoomOnXAxis(float))); + connect(uiDockFft, SIGNAL(resetFftZoom()), ui->plotter, SLOT(resetHorizontalZoom())); + connect(uiDockFft, SIGNAL(gotoFftCenter()), ui->plotter, SLOT(moveToCenterFreq())); + connect(uiDockFft, SIGNAL(gotoDemodFreq()), ui->plotter, SLOT(moveToDemodFreq())); + connect(uiDockFft, SIGNAL(bandPlanChanged(bool)), ui->plotter, SLOT(toggleBandPlan(bool))); + connect(uiDockFft, SIGNAL(wfColormapChanged(const QString)), ui->plotter, SLOT(setWfColormap(const QString))); + connect(uiDockFft, SIGNAL(wfColormapChanged(const QString)), uiDockAudio, SLOT(setWfColormap(const QString))); + + connect(uiDockFft, SIGNAL(pandapterRangeChanged(float,float)), ui->plotter, SLOT(setPandapterRange(float,float))); + connect(uiDockFft, SIGNAL(waterfallRangeChanged(float,float)), ui->plotter, SLOT(setWaterfallRange(float,float))); + connect(ui->plotter, SIGNAL(pandapterRangeChanged(float,float)), uiDockFft, SLOT(setPandapterRange(float,float))); + connect(ui->plotter, SIGNAL(newZoomLevel(float)), uiDockFft, SLOT(setZoomLevel(float))); + connect(ui->plotter, SIGNAL(newSize()), this, SLOT(setWfSize())); + + connect(uiDockFft, SIGNAL(fftColorChanged(QColor)), this, SLOT(setFftColor(QColor))); + connect(uiDockFft, SIGNAL(fftFillToggled(bool)), this, SLOT(setFftFill(bool))); + connect(uiDockFft, SIGNAL(fftPeakHoldToggled(bool)), this, SLOT(setFftPeakHold(bool))); + connect(uiDockFft, SIGNAL(peakDetectionToggled(bool)), this, SLOT(setPeakDetection(bool))); + connect(uiDockRDS, SIGNAL(rdsDecoderToggled(bool)), this, SLOT(setRdsDecoder(bool))); + + // Bookmarks + connect(uiDockBookmarks, SIGNAL(newBookmarkActivated(qint64, QString, int)), this, SLOT(onBookmarkActivated(qint64, QString, int))); + connect(uiDockBookmarks->actionAddBookmark, SIGNAL(triggered()), this, SLOT(on_actionAddBookmark_triggered())); + + //DXC Spots + connect(&DXCSpots::Get(), SIGNAL(dxcSpotsUpdated()), this, SLOT(updateClusterSpots())); + + // I/Q playback + connect(iq_tool, SIGNAL(startRecording(QString)), this, SLOT(startIqRecording(QString))); + connect(iq_tool, SIGNAL(stopRecording()), this, SLOT(stopIqRecording())); + connect(iq_tool, SIGNAL(startPlayback(QString,float,qint64)), this, SLOT(startIqPlayback(QString,float,qint64))); + connect(iq_tool, SIGNAL(stopPlayback()), this, SLOT(stopIqPlayback())); + connect(iq_tool, SIGNAL(seek(qint64)), this,SLOT(seekIqFile(qint64))); + + // remote control + connect(remote, SIGNAL(newRDSmode(bool)), uiDockRDS, SLOT(setRDSmode(bool))); + connect(remote, SIGNAL(newFilterOffset(qint64)), this, SLOT(setFilterOffset(qint64))); + connect(remote, SIGNAL(newFilterOffset(qint64)), uiDockRxOpt, SLOT(setFilterOffset(qint64))); + connect(remote, SIGNAL(newFrequency(qint64)), ui->freqCtrl, SLOT(setFrequency(qint64))); + connect(remote, SIGNAL(newLnbLo(double)), uiDockInputCtl, SLOT(setLnbLo(double))); + connect(remote, SIGNAL(newLnbLo(double)), this, SLOT(setLnbLo(double))); + connect(remote, SIGNAL(newMode(int)), this, SLOT(selectDemod(int))); + connect(remote, SIGNAL(newMode(int)), uiDockRxOpt, SLOT(setCurrentDemod(int))); + connect(remote, SIGNAL(newSquelchLevel(double)), this, SLOT(setSqlLevel(double))); + connect(remote, SIGNAL(newSquelchLevel(double)), uiDockRxOpt, SLOT(setSquelchLevel(double))); + connect(uiDockRxOpt, SIGNAL(sqlLevelChanged(double)), remote, SLOT(setSquelchLevel(double))); + connect(remote, SIGNAL(startAudioRecorderEvent()), uiDockAudio, SLOT(startAudioRecorder())); + connect(remote, SIGNAL(stopAudioRecorderEvent()), uiDockAudio, SLOT(stopAudioRecorder())); + connect(ui->plotter, SIGNAL(newFilterFreq(int, int)), remote, SLOT(setPassband(int, int))); + connect(remote, SIGNAL(newPassband(int)), this, SLOT(setPassband(int))); + connect(remote, SIGNAL(gainChanged(QString, double)), uiDockInputCtl, SLOT(setGain(QString,double))); + connect(remote, SIGNAL(dspChanged(bool)), this, SLOT(on_actionDSP_triggered(bool))); + connect(uiDockRDS, SIGNAL(rdsPI(QString)), remote, SLOT(rdsPI(QString))); + + rds_timer = new QTimer(this); + connect(rds_timer, SIGNAL(timeout()), this, SLOT(rdsTimeout())); + + // enable frequency tooltips on FFT plot + ui->plotter->setTooltipsEnabled(true); + + // Create list of input devices. This must be done before the configuration is + // restored because device probing might change the device configuration + CIoConfig::getDeviceList(devList); + + m_recent_config = new RecentConfig(m_cfg_dir, ui->menu_RecentConfig); + connect(m_recent_config, SIGNAL(loadConfig(const QString &)), this, SLOT(loadConfigSlot(const QString &))); + + // restore last session + if (!loadConfig(cfgfile, true, true)) + { + + // first time config + qDebug() << "Launching I/O device editor"; + if (firstTimeConfig() != QDialog::Accepted) + { + qDebug() << "I/O device configuration cancelled."; + configOk = false; + } + else + { + configOk = true; + } + } + else if (edit_conf) + { + qDebug() << "Launching I/O device editor"; + if (on_actionIoConfig_triggered() != QDialog::Accepted) + { + qDebug() << "I/O device configuration cancelled."; + configOk = false; + } + else + { + configOk = true; + } + } + + qsvg_dummy = new QSvgWidget(); +} + +MainWindow::~MainWindow() +{ + on_actionDSP_triggered(false); + + /* stop and delete timers */ + dec_timer->stop(); + delete dec_timer; + + meter_timer->stop(); + delete meter_timer; + + iq_fft_timer->stop(); + delete iq_fft_timer; + + audio_fft_timer->stop(); + delete audio_fft_timer; + + if (m_settings) + { + m_settings->setValue("configversion", 3); + m_settings->setValue("crashed", false); + + // hide toolbar (default=false) + //if (ui->mainToolBar->isHidden()) + // m_settings->setValue("gui/hide_toolbar", true); + //else + // m_settings->remove("gui/hide_toolbar"); + + m_settings->setValue("gui/geometry", saveGeometry()); + m_settings->setValue("gui/state", saveState()); + + // save session + storeSession(); + + m_settings->sync(); + delete m_settings; + } + + delete m_recent_config; + + delete iq_tool; + delete dxc_options; + delete ui; + delete uiDockRxOpt; + delete uiDockAudio; + //delete uiDockBookmarks; + delete uiDockFft; + delete uiDockInputCtl; + delete uiDockRDS; + delete rx; + delete remote; + delete [] d_fftData; + delete [] d_realFftData; + delete [] d_iirFftData; + delete qsvg_dummy; +} + +/** + * Load new configuration. + * @param cfgfile + * @returns True if config is OK, False if not (e.g. no input device specified). + * + * If cfgfile is an absolute path it will be used as is, otherwise it is assumed + * to be the name of a file under m_cfg_dir. + * + * If cfgfile does not exist it will be created. + * + * If no input device is specified, we return false to signal that the I/O + * configuration dialog should be run. + * + * FIXME: Refactor. + */ +bool MainWindow::loadConfig(const QString& cfgfile, bool check_crash, + bool restore_mainwindow) +{ + double actual_rate; + qint64 int64_val; + int int_val; + //bool bool_val; + bool conf_ok = false; + bool conv_ok; + bool skip_loading_cfg = false; + + qDebug() << "Loading configuration from:" << cfgfile; + + if (m_settings) + { + // set current config to not crashed before loading new config + m_settings->setValue("crashed", false); + m_settings->sync(); + delete m_settings; + } + + if (QDir::isAbsolutePath(cfgfile)) + m_settings = new QSettings(cfgfile, QSettings::IniFormat); + else + m_settings = new QSettings(QString("%1/%2").arg(m_cfg_dir).arg(cfgfile), + QSettings::IniFormat); + + qDebug() << "Configuration file:" << m_settings->fileName(); + + if (check_crash) + { + if (m_settings->value("crashed", false).toBool()) + { + qDebug() << "Crash guard triggered!"; + auto* askUserAboutConfig = + new QMessageBox(QMessageBox::Warning, tr("Crash Detected!"), + tr("

Gqrx has detected problems with the current configuration. " + "Loading the configuration again could cause the application to crash.

" + "

Do you want to edit the settings?

"), + QMessageBox::Yes | QMessageBox::No); + askUserAboutConfig->setDefaultButton(QMessageBox::Yes); + askUserAboutConfig->setTextFormat(Qt::RichText); + askUserAboutConfig->exec(); + if (askUserAboutConfig->result() == QMessageBox::Yes) + skip_loading_cfg = true; + + delete askUserAboutConfig; + } + else + { + m_settings->setValue("crashed", true); // clean exit will set this to FALSE + m_settings->sync(); + } + } + + if (skip_loading_cfg) + return false; + + // manual reconf (FIXME: check status) + conv_ok = false; + + // hide toolbar + //bool_val = m_settings->value("gui/hide_toolbar", false).toBool(); + //if (bool_val) + // ui->mainToolBar->hide(); + + // main window settings + if (restore_mainwindow) + { + restoreGeometry(m_settings->value("gui/geometry", + saveGeometry()).toByteArray()); + restoreState(m_settings->value("gui/state", saveState()).toByteArray()); + } + + QString indev = m_settings->value("input/device", "").toString(); + if (!indev.isEmpty()) + { + try + { + rx->set_input_device(indev.toStdString()); + conf_ok = true; + } + catch (std::runtime_error &x) + { + QMessageBox::warning(nullptr, + QObject::tr("Failed to set input device"), + QObject::tr("

%1

" + "Please select another device.") + .arg(x.what()), + QMessageBox::Ok); + } + + // Update window title + setWindowTitle(QString("Gqrx %1 - %2").arg(VERSION).arg(indev)); + + // Add available antenna connectors to the UI + std::vector antennas = rx->get_antennas(); + uiDockInputCtl->setAntennas(antennas); + + // Update gain stages. + if (indev.contains("rtl", Qt::CaseInsensitive) + && !m_settings->contains("input/gains")) + { + /* rtlsdr gain is 0 by default making users think their device is + * deaf. Therefore, we don't read gain from the device, but initialize + * it to the midpoint. + */ + updateGainStages(false); + } + else + updateGainStages(true); + } + + QString outdev = m_settings->value("output/device", "").toString(); + + try { + rx->set_output_device(outdev.toStdString()); + } catch (std::exception &x) { + QMessageBox::warning(nullptr, + QObject::tr("Failed to set output device"), + QObject::tr("

%1

" + "Please select another device.") + .arg(x.what()), + QMessageBox::Ok); + } + + int_val = m_settings->value("input/sample_rate", 0).toInt(&conv_ok); + if (conv_ok && (int_val > 0)) + { + actual_rate = rx->set_input_rate(int_val); + + if (actual_rate == 0) + { + // There is an error with the device (perhaps not attached) + // Warn user and use 100 ksps (rate used by gr-osmocom null_source) + auto *dialog = + new QMessageBox(QMessageBox::Warning, tr("Device Error"), + tr("There was an error configuring the input device.\n" + "Please make sure that a supported device is attached " + "to the computer and restart gqrx."), + QMessageBox::Ok); + dialog->setModal(true); + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->show(); + + actual_rate = int_val; + } + + qDebug() << "Requested sample rate:" << int_val; + qDebug() << "Actual sample rate :" << QString("%1").arg(actual_rate, 0, 'f', 6); + } + else + actual_rate = rx->get_input_rate(); + + if (actual_rate > 0.) + { + int_val = m_settings->value("input/decimation", 1).toInt(&conv_ok); + if (conv_ok && int_val >= 2) + { + if (rx->set_input_decim(int_val) != (unsigned int)int_val) + { + qDebug() << "Failed to set decimation" << int_val; + qDebug() << " actual decimation:" << rx->get_input_decim(); + } + else + { + // update actual rate + actual_rate /= (double)int_val; + qDebug() << "Input decimation:" << int_val; + qDebug() << "Quadrature rate:" << QString("%1").arg(actual_rate, 0, 'f', 6); + } + } + else + rx->set_input_decim(1); + + // update various widgets that need a sample rate + uiDockRxOpt->setFilterOffsetRange((qint64)(actual_rate)); + uiDockFft->setSampleRate(actual_rate); + ui->plotter->setSampleRate(actual_rate); + ui->plotter->setSpanFreq((quint32)actual_rate); + remote->setBandwidth((qint64)actual_rate); + iq_tool->setSampleRate((qint64)actual_rate); + } + else + qDebug() << "Error: Actual sample rate is" << actual_rate; + + int64_val = m_settings->value("input/bandwidth", 0).toInt(&conv_ok); + if (conv_ok) + { + // set analog bw even if 0 since for some devices 0 Hz means "auto" + double actual_bw = rx->set_analog_bandwidth((double) int64_val); + qDebug() << "Requested bandwidth:" << int64_val << "Hz"; + qDebug() << "Actual bandwidth :" << actual_bw << "Hz"; + } + + uiDockInputCtl->readSettings(m_settings); // this will also update freq range + uiDockRxOpt->readSettings(m_settings); + uiDockFft->readSettings(m_settings); + uiDockAudio->readSettings(m_settings); + dxc_options->readSettings(m_settings); + + { + int64_val = m_settings->value("input/frequency", 14236000).toLongLong(&conv_ok); + + // If frequency is out of range set frequency to the center of the range. + qint64 hw_freq = int64_val - d_lnb_lo - (qint64)(rx->get_filter_offset()); + if (hw_freq < d_hw_freq_start || hw_freq > d_hw_freq_stop) + { + int64_val = (d_hw_freq_stop - d_hw_freq_start) / 2 + + (qint64)(rx->get_filter_offset()) + d_lnb_lo; + } + + ui->freqCtrl->setFrequency(int64_val); + setNewFrequency(ui->freqCtrl->getFrequency()); // ensure all GUI and RF is updated + } + + { + int flo = m_settings->value("receiver/filter_low_cut", 0).toInt(&conv_ok); + int fhi = m_settings->value("receiver/filter_high_cut", 0).toInt(&conv_ok); + + if (conv_ok && uiDockRxOpt->currentDemod() != DockRxOpt::MODE_OFF && flo != fhi) + { + on_plotter_newFilterFreq(flo, fhi); + } + } + + iq_tool->readSettings(m_settings); + + /* + * Initialization the remote control at the end. + * We must be sure that all variables initialized before starting RC server. + */ + remote->readSettings(m_settings); + //bool_val = m_settings->value("remote_control/enabled", false).toBool(); + //if (bool_val) + //{ + // remote->start_server(); + // ui->actionRemoteControl->setChecked(true); + //} + + emit m_recent_config->configLoaded(m_settings->fileName()); + + return conf_ok; +} + +/** + * @brief Save current configuration to a file. + * @param cfgfile + * @returns True if the operation was successful. + * + * If cfgfile is an absolute path it will be used as is, otherwise it is + * assumed to be the name of a file under m_cfg_dir. + * + * If cfgfile already exists it will be overwritten (we assume that a file + * selection dialog has already asked for confirmation of overwrite). + * + * Since QSettings does not support "save as" we do this by copying the current + * settings to a new file. + */ +bool MainWindow::saveConfig(const QString& cfgfile) +{ + QString oldfile = m_settings->fileName(); + QString newfile; + + qDebug() << "Saving configuration to:" << cfgfile; + + m_settings->sync(); + + if (QDir::isAbsolutePath(cfgfile)) + newfile = cfgfile; + else + newfile = QString("%1/%2").arg(m_cfg_dir).arg(cfgfile); + + if (newfile == oldfile) { + qDebug() << "New file is equal to old file => SYNCING..."; + emit m_recent_config->configSaved(newfile); + return true; + } + + if (QFile::exists(newfile)) + { + qDebug() << "File" << newfile << "already exists => DELETING..."; + if (QFile::remove(newfile)) + qDebug() << "Deleted" << newfile; + else + qDebug() << "Failed to delete" << newfile; + } + if (QFile::copy(oldfile, newfile)) + { + loadConfig(cfgfile, false, false); + return true; + } + else + { + qDebug() << "Error saving configuration to" << newfile; + return false; + } +} + +/** + * Store session-related parameters (frequency, gain,...) + * + * This needs to be called when we switch input source, otherwise the + * new source would use the parameters stored on last exit. + */ +void MainWindow::storeSession() +{ + if (m_settings) + { + m_settings->setValue("input/frequency", ui->freqCtrl->getFrequency()); + + uiDockInputCtl->saveSettings(m_settings); + uiDockRxOpt->saveSettings(m_settings); + uiDockFft->saveSettings(m_settings); + uiDockAudio->saveSettings(m_settings); + + remote->saveSettings(m_settings); + iq_tool->saveSettings(m_settings); + dxc_options->saveSettings(m_settings); + + { + int flo, fhi; + ui->plotter->getHiLowCutFrequencies(&flo, &fhi); + if (flo != fhi) + { + m_settings->setValue("receiver/filter_low_cut", flo); + m_settings->setValue("receiver/filter_high_cut", fhi); + } + } + } +} + +/** + * @brief Update hardware RF frequency range. + * @param ignore_limits Whether ignore the hardware specd and allow DC-to-light + * range. + * + * This function fetches the frequency range of the receiver. Useful when we + * read a new configuration with a new input device or when the ignore_limits + * setting is changed. + */ +void MainWindow::updateHWFrequencyRange(bool ignore_limits) +{ + double startd, stopd, stepd; + + if (ignore_limits) + { + d_hw_freq_start = (quint64) 0; + d_hw_freq_stop = (quint64) 9999e6; + } + else if (rx->get_rf_range(&startd, &stopd, &stepd) == receiver::STATUS_OK) + { + d_hw_freq_start = (quint64) startd; + d_hw_freq_stop = (quint64) stopd; + } + else + { + qDebug() << __func__ << "failed fetching new hardware frequency range"; + d_hw_freq_start = (quint64) 0; + d_hw_freq_stop = (quint64) 9999e6; + } + + updateFrequencyRange(); // Also update the available frequency range +} + +/** + * @brief Update available frequency range. + * + * This function sets the available frequency range based on the hardware + * frequency range, the selected filter offset and the LNB LO. + * + * This function must therefore be called whenever the LNB LO or the filter + * offset has changed. + */ +void MainWindow::updateFrequencyRange() +{ + auto start = (qint64)(rx->get_filter_offset()) + d_hw_freq_start + d_lnb_lo; + auto stop = (qint64)(rx->get_filter_offset()) + d_hw_freq_stop + d_lnb_lo; + + ui->freqCtrl->setup(0, start, stop, 1, FCTL_UNIT_NONE); + uiDockRxOpt->setRxFreqRange(start, stop); +} + +/** + * @brief Update gain stages. + * @param read_from_device If true, the gain value will be read from the device, + * otherwise we set gain to the midpoint. + * + * This function fetches a list of available gain stages with their range + * and sends them to the input control UI widget. + */ +void MainWindow::updateGainStages(bool read_from_device) +{ + gain_list_t gain_list; + std::vector gain_names = rx->get_gain_names(); + gain_t gain; + + std::vector::iterator it; + for (it = gain_names.begin(); it != gain_names.end(); ++it) + { + gain.name = *it; + rx->get_gain_range(gain.name, &gain.start, &gain.stop, &gain.step); + if (read_from_device) + { + gain.value = rx->get_gain(gain.name); + } + else + { + gain.value = (gain.start + gain.stop) / 2; + rx->set_gain(gain.name, gain.value); + } + gain_list.push_back(gain); + } + + uiDockInputCtl->setGainStages(gain_list); + remote->setGainStages(gain_list); +} + +/** + * @brief Slot for receiving frequency change signals. + * @param[in] freq The new frequency. + * + * This slot is connected to the CFreqCtrl::newFrequency() signal and is used + * to set new receive frequency. + */ +void MainWindow::setNewFrequency(qint64 rx_freq) +{ + auto hw_freq = (double)(rx_freq - d_lnb_lo) - rx->get_filter_offset(); + auto center_freq = rx_freq - (qint64)rx->get_filter_offset(); + + d_hw_freq = (qint64)hw_freq; + + // set receiver frequency + rx->set_rf_freq(hw_freq); + + // update widgets + ui->plotter->setCenterFreq(center_freq); + uiDockRxOpt->setHwFreq(d_hw_freq); + ui->freqCtrl->setFrequency(rx_freq); + //uiDockBookmarks->setNewFrequency(rx_freq); +} + +/** + * @brief Set new LNB LO frequency. + * @param freq_mhz The new frequency in MHz. + */ +void MainWindow::setLnbLo(double freq_mhz) +{ + // calculate current RF frequency + auto rf_freq = ui->freqCtrl->getFrequency() - d_lnb_lo; + + d_lnb_lo = qint64(freq_mhz*1e6); + qDebug() << "New LNB LO:" << d_lnb_lo << "Hz"; + + // Update ranges and show updated frequency + updateFrequencyRange(); + ui->freqCtrl->setFrequency(d_lnb_lo + rf_freq); + ui->plotter->setCenterFreq(d_lnb_lo + d_hw_freq); + + // update LNB LO in settings + if (freq_mhz == 0.f) + m_settings->remove("input/lnb_lo"); + else + m_settings->setValue("input/lnb_lo", d_lnb_lo); +} + +/** Select new antenna connector. */ +void MainWindow::setAntenna(const QString& antenna) +{ + qDebug() << "New antenna selected:" << antenna; + rx->set_antenna(antenna.toStdString()); +} + +/** + * @brief Set new channel filter offset. + * @param freq_hz The new filter offset in Hz. + */ +void MainWindow::setFilterOffset(qint64 freq_hz) +{ + rx->set_filter_offset((double) freq_hz); + ui->plotter->setFilterOffset(freq_hz); + + updateFrequencyRange(); + + auto rx_freq = d_hw_freq + d_lnb_lo + freq_hz; + ui->freqCtrl->setFrequency(rx_freq); + + if (rx->is_rds_decoder_active()) { + rx->reset_rds_parser(); + } +} + +/** + * @brief Set a specific gain. + * @param name The name of the gain stage to adjust. + * @param gain The new value. + */ +void MainWindow::setGain(const QString& name, double gain) +{ + rx->set_gain(name.toStdString(), gain); +} + +/** Enable / disable hardware AGC. */ +void MainWindow::setAutoGain(bool enabled) +{ + rx->set_auto_gain(enabled); + if (!enabled) + uiDockInputCtl->restoreManualGains(); +} + +/** + * @brief Set new frequency offset value. + * @param ppm Frequency correction. + * + * The valid range is between -200 and 200. + */ +void MainWindow::setFreqCorr(double ppm) +{ + if (ppm < -200.0) + ppm = -200.0; + else if (ppm > 200.0) + ppm = 200.0; + + qDebug() << __FUNCTION__ << ":" << ppm << "ppm"; + rx->set_freq_corr(ppm); +} + + +/** Enable/disable I/Q reversion. */ +void MainWindow::setIqSwap(bool reversed) +{ + rx->set_iq_swap(reversed); +} + +/** Enable/disable automatic DC blocker. */ +void MainWindow::setDcBlock(bool enabled) +{ + rx->set_dc_blocker(enabled); +} + +/** Enable/disable automatic DC removal. */ +void MainWindow::setDcCancel(bool enabled) +{ + rx->set_dc_cancel(enabled); +} + +/** Enable/disable automatic DC removal. */ +void MainWindow::setDcTune(bool enabled) +{ + rx->set_dc_tune(enabled); +} + +/** Enable/disable automatic IQ balance. */ +void MainWindow::setIqBalance(bool enabled) +{ + try + { + rx->set_iq_balance(enabled); + } + catch (std::exception &x) + { + qCritical() << "Failed to set IQ balance: " << x.what(); + m_settings->remove("input/iq_balance"); + uiDockInputCtl->setIqBalance(false); + if (enabled) + { + QMessageBox::warning(this, tr("Gqrx error"), + tr("Failed to set IQ balance.\n" + "IQ balance setting in Input Control disabled."), + QMessageBox::Ok, QMessageBox::Ok); + } + } +} + +/** + * @brief Ignore hardware limits. + * @param ignore_limits Whether hardware limits should be ignored or not. + * + * This slot is triggered when the user changes the "Ignore hardware limits" + * option. It will update the allowed frequency range and also update the + * current RF center frequency, which may change when we switch from ignore to + * don't ignore. + */ +void MainWindow::setIgnoreLimits(bool ignore_limits) +{ + updateHWFrequencyRange(ignore_limits); + + auto filter_offset = (qint64)rx->get_filter_offset(); + auto freq = (qint64)rx->get_rf_freq(); + ui->freqCtrl->setFrequency(d_lnb_lo + freq + filter_offset); + + // This will ensure that if frequency is clamped and that + // the UI is updated with the correct frequency. + freq = ui->freqCtrl->getFrequency(); + setNewFrequency(freq); +} + + +/** Reset lower digits of main frequency control widget */ +void MainWindow::setFreqCtrlReset(bool enabled) +{ + ui->freqCtrl->setResetLowerDigits(enabled); + uiDockRxOpt->setResetLowerDigits(enabled); +} + +/** Invert scroll wheel direction */ +void MainWindow::setInvertScrolling(bool enabled) +{ + ui->freqCtrl->setInvertScrolling(enabled); + ui->plotter->setInvertScrolling(enabled); + uiDockRxOpt->setInvertScrolling(enabled); + uiDockAudio->setInvertScrolling(enabled); +} + +/** + * @brief Select new demodulator. + * @param demod New demodulator. + */ +void MainWindow::selectDemod(const QString& strModulation) +{ + int iDemodIndex; + + iDemodIndex = DockRxOpt::GetEnumForModulationString(strModulation); + qDebug() << "selectDemod(str):" << strModulation << "-> IDX:" << iDemodIndex; + + return selectDemod(iDemodIndex); +} + +/** + * @brief Select new demodulator. + * @param demod New demodulator index. + * + * This slot basically maps the index of the mode selector to receiver::demod + * and configures the default channel filter. + * + */ +void MainWindow::selectDemod(int mode_idx) +{ + double cwofs = 0.0; + int filter_preset = uiDockRxOpt->currentFilter(); + int flo=0, fhi=0, click_res=100; + bool rds_enabled; + + // validate mode_idx + if (mode_idx < DockRxOpt::MODE_OFF || mode_idx >= DockRxOpt::MODE_LAST) + { + qDebug() << "Invalid mode index:" << mode_idx; + mode_idx = DockRxOpt::MODE_OFF; + } + qDebug() << "New mode index:" << mode_idx; + + uiDockRxOpt->getFilterPreset(mode_idx, filter_preset, &flo, &fhi); + d_filter_shape = (receiver::filter_shape)uiDockRxOpt->currentFilterShape(); + + rds_enabled = rx->is_rds_decoder_active(); + if (rds_enabled) + setRdsDecoder(false); + uiDockRDS->setDisabled(); + + switch (mode_idx) { + + case DockRxOpt::MODE_OFF: + /* Spectrum analyzer only */ + if (rx->is_recording_audio()) + { + stopAudioRec(); + uiDockAudio->setAudioRecButtonState(false); + } + if (dec_afsk1200 != nullptr) + { + dec_afsk1200->close(); + } + rx->set_demod(receiver::RX_DEMOD_OFF); + click_res = 1000; + break; + + case DockRxOpt::MODE_RAW: + /* Raw I/Q; max 96 ksps*/ + rx->set_demod(receiver::RX_DEMOD_NONE); + ui->plotter->setDemodRanges(-40000, -200, 200, 40000, true); + uiDockAudio->setFftRange(0,24000); + click_res = 100; + break; + + case DockRxOpt::MODE_AM: + rx->set_demod(receiver::RX_DEMOD_AM); + ui->plotter->setDemodRanges(-40000, -200, 200, 40000, true); + uiDockAudio->setFftRange(-6000,6000); + click_res = 100; + break; + + case DockRxOpt::MODE_AM_SYNC: + rx->set_demod(receiver::RX_DEMOD_AMSYNC); + ui->plotter->setDemodRanges(-40000, -200, 200, 40000, true); + uiDockAudio->setFftRange(-6000,6000); + click_res = 100; + break; + + case DockRxOpt::MODE_NFM: + ui->plotter->setDemodRanges(-40000, -1000, 1000, 40000, true); + uiDockAudio->setFftRange(-5000, 5000); + uiDockAudio->resetAudioSpectrumZoom(); + rx->set_demod(receiver::RX_DEMOD_NFM); + rx->set_fm_maxdev(uiDockRxOpt->currentMaxdev()); + rx->set_fm_deemph(uiDockRxOpt->currentEmph()); + click_res = 100; + break; + + case DockRxOpt::MODE_WFM_MONO: + case DockRxOpt::MODE_WFM_STEREO: + case DockRxOpt::MODE_WFM_STEREO_OIRT: + /* Broadcast FM */ + ui->plotter->setDemodRanges(-120e3, -10000, 10000, 120e3, true); + uiDockAudio->setFftRange(-24000,24000); /** FIXME: get audio rate from rx **/ + click_res = 1000; + if (mode_idx == DockRxOpt::MODE_WFM_MONO) + rx->set_demod(receiver::RX_DEMOD_WFM_M); + else if (mode_idx == DockRxOpt::MODE_WFM_STEREO_OIRT) + rx->set_demod(receiver::RX_DEMOD_WFM_S_OIRT); + else + rx->set_demod(receiver::RX_DEMOD_WFM_S); + + uiDockRDS->setEnabled(); + if (rds_enabled) + setRdsDecoder(true); + break; + + case DockRxOpt::MODE_LSB: + /* LSB */ + rx->set_demod(receiver::RX_DEMOD_SSB); + ui->plotter->setDemodRanges(-40000, -100, -5000, 0, false); + uiDockAudio->setFftRange(-3000,3000); + click_res = 100; + break; + + case DockRxOpt::MODE_USB: + /* USB */ + rx->set_demod(receiver::RX_DEMOD_SSB); + ui->plotter->setDemodRanges(0, 5000, 100, 40000, false); + uiDockAudio->setFftRange(-3000,3000); + click_res = 100; + break; + + case DockRxOpt::MODE_CWL: + /* CW-L */ + rx->set_demod(receiver::RX_DEMOD_SSB); + cwofs = -uiDockRxOpt->getCwOffset(); + ui->plotter->setDemodRanges(-5000, -100, 100, 5000, true); + uiDockAudio->setFftRange(-1500,1500); + click_res = 10; + break; + + case DockRxOpt::MODE_CWU: + /* CW-U */ + rx->set_demod(receiver::RX_DEMOD_SSB); + cwofs = uiDockRxOpt->getCwOffset(); + ui->plotter->setDemodRanges(-5000, -100, 100, 5000, true); + uiDockAudio->setFftRange(-1500,1500); + click_res = 10; + break; + + default: + qDebug() << "Unsupported mode selection (can't happen!): " << mode_idx; + flo = -5000; + fhi = 5000; + click_res = 100; + break; + } + + qDebug() << "Filter preset for mode" << mode_idx << "LO:" << flo << "HI:" << fhi; + ui->plotter->setHiLowCutFrequencies(flo, fhi); + ui->plotter->setClickResolution(click_res); + ui->plotter->setFilterClickResolution(click_res); + rx->set_filter((double)flo, (double)fhi, d_filter_shape); + rx->set_cw_offset(cwofs); + rx->set_sql_level(uiDockRxOpt->currentSquelchLevel()); + + remote->setMode(mode_idx); + remote->setPassband(flo, fhi); + + d_have_audio = (mode_idx != DockRxOpt::MODE_OFF); + + uiDockRxOpt->setCurrentDemod(mode_idx); +} + + +/** + * @brief New FM deviation selected. + * @param max_dev The enw FM deviation. + */ +void MainWindow::setFmMaxdev(float max_dev) +{ + qDebug() << "FM MAX_DEV: " << max_dev; + + /* receiver will check range */ + rx->set_fm_maxdev(max_dev); +} + + +/** + * @brief New FM de-emphasis time consant selected. + * @param tau The new time constant + */ +void MainWindow::setFmEmph(double tau) +{ + qDebug() << "FM TAU: " << tau; + + /* receiver will check range */ + rx->set_fm_deemph(tau); +} + + +/** + * @brief AM DCR status changed (slot). + * @param enabled Whether DCR is enabled or not. + */ +void MainWindow::setAmDcr(bool enabled) +{ + rx->set_am_dcr(enabled); +} + +void MainWindow::setCwOffset(int offset) +{ + rx->set_cw_offset(offset); +} + +/** + * @brief AM-Sync DCR status changed (slot). + * @param enabled Whether DCR is enabled or not. + */ +void MainWindow::setAmSyncDcr(bool enabled) +{ + rx->set_amsync_dcr(enabled); +} + +/** + * @brief New AM-Sync PLL BW selected. + * @param pll_bw The new PLL BW. + */ +void MainWindow::setAmSyncPllBw(float pll_bw) +{ + qDebug() << "AM-Sync PLL BW: " << pll_bw; + + /* receiver will check range */ + rx->set_amsync_pll_bw(pll_bw); +} + +/** + * @brief Audio gain changed. + * @param value The new audio gain in dB. + */ +void MainWindow::setAudioGain(float value) +{ + rx->set_af_gain(value); +} + +/** Set AGC ON/OFF. */ +void MainWindow::setAgcOn(bool agc_on) +{ + rx->set_agc_on(agc_on); +} + +/** AGC hang ON/OFF. */ +void MainWindow::setAgcHang(bool use_hang) +{ + rx->set_agc_hang(use_hang); +} + +/** AGC threshold changed. */ +void MainWindow::setAgcThreshold(int threshold) +{ + rx->set_agc_threshold(threshold); +} + +/** AGC slope factor changed. */ +void MainWindow::setAgcSlope(int factor) +{ + rx->set_agc_slope(factor); +} + +/** AGC manual gain changed. */ +void MainWindow::setAgcGain(int gain) +{ + rx->set_agc_manual_gain(gain); +} + +/** AGC decay changed. */ +void MainWindow::setAgcDecay(int msec) +{ + rx->set_agc_decay(msec); +} + +/** + * @brief Noise blanker configuration changed. + * @param nb1 Noise blanker 1 ON/OFF. + * @param nb2 Noise blanker 2 ON/OFF. + * @param threshold Noise blanker threshold. + */ +void MainWindow::setNoiseBlanker(int nbid, bool on, float threshold) +{ + qDebug() << "Noise blanker NB:" << nbid << " ON:" << on << "THLD:" + << threshold; + + rx->set_nb_on(nbid, on); + rx->set_nb_threshold(nbid, threshold); +} + +/** + * @brief Squelch level changed. + * @param level_db The new squelch level in dBFS. + */ +void MainWindow::setSqlLevel(double level_db) +{ + rx->set_sql_level(level_db); + ui->sMeter->setSqlLevel(level_db); +} + +/** + * @brief Squelch level auto clicked. + * @return The new squelch level. + */ +double MainWindow::setSqlLevelAuto() +{ + double level = rx->get_signal_pwr() + 3.0; + if (level > -10.0) // avoid 0 dBFS + level = uiDockRxOpt->getSqlLevel(); + + setSqlLevel(level); + return level; +} + +/** Signal strength meter timeout. */ +void MainWindow::meterTimeout() +{ + float level; + + level = rx->get_signal_pwr(); + ui->sMeter->setLevel(level); + remote->setSignalLevel(level); +} + +#define LOG2_10 3.321928094887362 + +/** Baseband FFT plot timeout. */ +void MainWindow::iqFftTimeout() +{ + unsigned int fftsize; + unsigned int i; + float pwr_scale; + + // FIXME: fftsize is a reference + rx->get_iq_fft_data(d_fftData, fftsize); + + if (fftsize == 0) + { + /* nothing to do, wait until next activation. */ + return; + } + + // NB: without cast to float the multiplication will overflow at 64k + // and pwr_scale will be inf + pwr_scale = 1.0 / ((float)fftsize * (float)fftsize); + + /* Normalize, calculate power and shift the FFT */ + volk_32fc_magnitude_squared_32f(d_realFftData, d_fftData + (fftsize/2), fftsize/2); + volk_32fc_magnitude_squared_32f(d_realFftData + (fftsize/2), d_fftData, fftsize/2); + volk_32f_s32f_multiply_32f(d_realFftData, d_realFftData, pwr_scale, fftsize); + volk_32f_log2_32f(d_realFftData, d_realFftData, fftsize); + volk_32f_s32f_multiply_32f(d_realFftData, d_realFftData, 10 / LOG2_10, fftsize); + + for (i = 0; i < fftsize; i++) + { + /* FFT averaging */ + d_iirFftData[i] += d_fftAvg * (d_realFftData[i] - d_iirFftData[i]); + } + + ui->plotter->setNewFftData(d_iirFftData, d_realFftData, fftsize); +} + +/** Audio FFT plot timeout. */ +void MainWindow::audioFftTimeout() +{ + unsigned int fftsize; + unsigned int i; + float pwr; + float pwr_scale; + std::complex pt; /* a single FFT point used in calculations */ + + if (!d_have_audio || !uiDockAudio->isVisible()) + return; + + rx->get_audio_fft_data(d_fftData, fftsize); + + if (fftsize == 0) + { + /* nothing to do, wait until next activation. */ + qDebug() << "No audio FFT data."; + return; + } + + pwr_scale = 1.0 / (fftsize * fftsize); + + /** FIXME: move post processing to rx_fft_f **/ + /* Normalize, calculate power and shift the FFT */ + for (i = 0; i < fftsize; i++) + { + /* normalize and shift */ + if (i < fftsize/2) + { + pt = d_fftData[fftsize/2+i]; + } + else + { + pt = d_fftData[i-fftsize/2]; + } + + /* calculate power in dBFS */ + pwr = pwr_scale * (pt.imag() * pt.imag() + pt.real() * pt.real()); + d_realFftData[i] = 10.0 * log10f(pwr + 1.0e-20); + } + + uiDockAudio->setNewFftData(d_realFftData, fftsize); +} + +/** RDS message display timeout. */ +void MainWindow::rdsTimeout() +{ + std::string buffer; + int num; + + rx->get_rds_data(buffer, num); + while(num!=-1) { + uiDockRDS->updateRDS(QString::fromStdString(buffer), num); + rx->get_rds_data(buffer, num); + } +} + +/** + * @brief Start audio recorder. + * @param filename The file name into which audio should be recorded. + */ +void MainWindow::startAudioRec(const QString& filename) +{ + if (!d_have_audio) + { + QMessageBox msg_box; + msg_box.setIcon(QMessageBox::Critical); + msg_box.setText(tr("Recording audio requires a demodulator.\n" + "Currently, demodulation is switched off " + "(Mode->Demod Off).")); + msg_box.exec(); + uiDockAudio->setAudioRecButtonState(false); + } + else if (rx->start_audio_recording(filename.toStdString())) + { + ui->statusBar->showMessage(tr("Error starting audio recorder")); + + /* reset state of record button */ + uiDockAudio->setAudioRecButtonState(false); + } + else + { + ui->statusBar->showMessage(tr("Recording audio to %1").arg(filename)); + } +} + +/** Stop audio recorder. */ +void MainWindow::stopAudioRec() +{ + if (rx->stop_audio_recording()) + { + /* okay, this one would be weird if it really happened */ + ui->statusBar->showMessage(tr("Error stopping audio recorder")); + + uiDockAudio->setAudioRecButtonState(true); + } + else + { + ui->statusBar->showMessage(tr("Audio recorder stopped"), 5000); + } +} + + +/** Start playback of audio file. */ +void MainWindow::startAudioPlayback(const QString& filename) +{ + if (rx->start_audio_playback(filename.toStdString())) + { + ui->statusBar->showMessage(tr("Error trying to play %1").arg(filename)); + + /* reset state of record button */ + uiDockAudio->setAudioPlayButtonState(false); + } + else + { + ui->statusBar->showMessage(tr("Playing %1").arg(filename)); + } +} + +/** Stop playback of audio file. */ +void MainWindow::stopAudioPlayback() +{ + if (rx->stop_audio_playback()) + { + /* okay, this one would be weird if it really happened */ + ui->statusBar->showMessage(tr("Error stopping audio playback")); + + uiDockAudio->setAudioPlayButtonState(true); + } + else + { + ui->statusBar->showMessage(tr("Audio playback stopped"), 5000); + } +} + +/** Start streaming audio over UDP. */ +void MainWindow::startAudioStream(const QString& udp_host, int udp_port, bool stereo) +{ + rx->start_udp_streaming(udp_host.toStdString(), udp_port, stereo); +} + +/** Stop streaming audio over UDP. */ +void MainWindow::stopAudioStreaming() +{ + rx->stop_udp_streaming(); +} + +/** Start I/Q recording. */ +void MainWindow::startIqRecording(const QString& recdir) +{ + qDebug() << __func__; + // generate file name using date, time, rf freq in kHz and BW in Hz + // gqrx_iq_yyyymmdd_hhmmss_freq_bw_fc.raw + auto freq = (qint64)(rx->get_rf_freq()); + auto sr = (qint64)(rx->get_input_rate()); + auto dec = (quint32)(rx->get_input_decim()); + auto lastRec = QDateTime::currentDateTimeUtc(). + toString("%1/gqrx_yyyyMMdd_hhmmss_%2_%3_fc.'raw'") + .arg(recdir).arg(freq).arg(sr/dec); + + // start recorder; fails if recording already in progress + if (rx->start_iq_recording(lastRec.toStdString())) + { + // reset action status + ui->statusBar->showMessage(tr("Error starting I/Q recoder")); + + // show an error message to user + QMessageBox msg_box; + msg_box.setIcon(QMessageBox::Critical); + msg_box.setText(tr("There was an error starting the I/Q recorder.\n" + "Check write permissions for the selected location.")); + msg_box.exec(); + + } + else + { + ui->statusBar->showMessage(tr("Recording I/Q data to: %1").arg(lastRec), + 5000); + } +} + +/** Stop current I/Q recording. */ +void MainWindow::stopIqRecording() +{ + qDebug() << __func__; + + if (rx->stop_iq_recording()) + ui->statusBar->showMessage(tr("Error stopping I/Q recoder")); + else + ui->statusBar->showMessage(tr("I/Q data recoding stopped"), 5000); +} + +void MainWindow::startIqPlayback(const QString& filename, float samprate, qint64 center_freq) +{ + if (ui->actionDSP->isChecked()) + { + // suspend DSP while we reload settings + on_actionDSP_triggered(false); + } + + storeSession(); + + auto sri = (int)samprate; + auto cf = center_freq; + double current_offset = rx->get_filter_offset(); + QString escapedFilename = receiver::escape_filename(filename.toStdString()).c_str(); + auto devstr = QString("file=%1,rate=%2,freq=%3,throttle=true,repeat=false") + .arg(escapedFilename).arg(sri).arg(cf); + + qDebug() << __func__ << ":" << devstr; + + rx->set_input_device(devstr.toStdString()); + updateHWFrequencyRange(false); + + // sample rate + auto actual_rate = rx->set_input_rate(samprate); + qDebug() << "Requested sample rate:" << samprate; + qDebug() << "Actual sample rate :" << QString("%1") + .arg(actual_rate, 0, 'f', 6); + + uiDockRxOpt->setFilterOffsetRange((qint64)(actual_rate)); + ui->plotter->setSampleRate(actual_rate); + ui->plotter->setSpanFreq((quint32)actual_rate); + if (std::abs(current_offset) > actual_rate / 2) + on_plotter_newDemodFreq(center_freq, 0); + else + on_plotter_newDemodFreq(center_freq + current_offset, current_offset); + + remote->setBandwidth(actual_rate); + + // FIXME: would be nice with good/bad status + ui->statusBar->showMessage(tr("Playing %1").arg(filename)); + + on_actionDSP_triggered(true); +} + +void MainWindow::stopIqPlayback() +{ + if (ui->actionDSP->isChecked()) + { + // suspend DSP while we reload settings + on_actionDSP_triggered(false); + } + + ui->statusBar->showMessage(tr("I/Q playback stopped"), 5000); + + // restore original input device + auto indev = m_settings->value("input/device", "").toString(); + rx->set_input_device(indev.toStdString()); + + // restore sample rate + bool conv_ok; + auto sr = m_settings->value("input/sample_rate", 0).toInt(&conv_ok); + if (conv_ok && (sr > 0)) + { + auto actual_rate = rx->set_input_rate(sr); + qDebug() << "Requested sample rate:" << sr; + qDebug() << "Actual sample rate :" << QString("%1") + .arg(actual_rate, 0, 'f', 6); + + uiDockRxOpt->setFilterOffsetRange((qint64)(actual_rate)); + ui->plotter->setSampleRate(actual_rate); + ui->plotter->setSpanFreq((quint32)actual_rate); + remote->setBandwidth(sr); + + // not needed as long as we are not recording in iq_tool + //iq_tool->setSampleRate(sr); + } + + // restore frequency, gain, etc... + uiDockInputCtl->readSettings(m_settings); + bool centerOK = false; + bool offsetOK = false; + qint64 oldCenter = m_settings->value("input/frequency", 0).toLongLong(¢erOK); + qint64 oldOffset = m_settings->value("receiver/offset", 0).toLongLong(&offsetOK); + if (centerOK && offsetOK) + { + on_plotter_newDemodFreq(oldCenter, oldOffset); + } + + if (ui->actionDSP->isChecked()) + { + // restsart DSP + on_actionDSP_triggered(true); + } +} + + +/** + * Go to a specific offset in the IQ file. + * @param seek_pos The byte offset from the beginning of the file. + */ +void MainWindow::seekIqFile(qint64 seek_pos) +{ + rx->seek_iq_file((long)seek_pos); +} + +/** FFT size has changed. */ +void MainWindow::setIqFftSize(int size) +{ + qDebug() << "Changing baseband FFT size to" << size; + rx->set_iq_fft_size(size); + for (int i = 0; i < size; i++) + d_iirFftData[i] = -140.0; // dBFS +} + +/** Baseband FFT rate has changed. */ +void MainWindow::setIqFftRate(int fps) +{ + int interval; + + if (fps == 0) + { + interval = 36e7; // 100 hours + ui->plotter->setRunningState(false); + } + else + { + interval = 1000 / fps; + + ui->plotter->setFftRate(fps); + if (iq_fft_timer->isActive()) + ui->plotter->setRunningState(true); + } + + if (interval > 9 && iq_fft_timer->isActive()) + iq_fft_timer->setInterval(interval); + + uiDockFft->setWfResolution(ui->plotter->getWfTimeRes()); +} + +void MainWindow::setIqFftWindow(int type) +{ + rx->set_iq_fft_window(type); +} + +/** Waterfall time span has changed. */ +void MainWindow::setWfTimeSpan(quint64 span_ms) +{ + // set new time span, then send back new resolution to be shown by GUI label + ui->plotter->setWaterfallSpan(span_ms); + uiDockFft->setWfResolution(ui->plotter->getWfTimeRes()); +} + +void MainWindow::setWfSize() +{ + uiDockFft->setWfResolution(ui->plotter->getWfTimeRes()); +} + +/** + * @brief Vertical split between waterfall and pandapter changed. + * @param pct_pand The percentage of the waterfall. + */ +void MainWindow::setIqFftSplit(int pct_wf) +{ + if ((pct_wf >= 0) && (pct_wf <= 100)) + ui->plotter->setPercent2DScreen(pct_wf); +} + +void MainWindow::setIqFftAvg(float avg) +{ + if ((avg >= 0) && (avg <= 1.0)) + d_fftAvg = avg; +} + +/** Audio FFT rate has changed. */ +void MainWindow::setAudioFftRate(int fps) +{ + auto interval = 1000 / fps; + + if (interval < 10) + return; + + if (audio_fft_timer->isActive()) + audio_fft_timer->setInterval(interval); +} + +/** Set FFT plot color. */ +void MainWindow::setFftColor(const QColor& color) +{ + ui->plotter->setFftPlotColor(color); + uiDockAudio->setFftColor(color); +} + +/** Enable/disable filling the aread below the FFT plot. */ +void MainWindow::setFftFill(bool enable) +{ + ui->plotter->setFftFill(enable); + uiDockAudio->setFftFill(enable); +} + +void MainWindow::setFftPeakHold(bool enable) +{ + ui->plotter->setPeakHold(enable); +} + +void MainWindow::setPeakDetection(bool enabled) +{ + ui->plotter->setPeakDetection(enabled ,2); +} + +/** + * @brief Start/Stop DSP processing. + * @param checked Flag indicating whether DSP processing should be ON or OFF. + * + * This slot is executed when the actionDSP is toggled by the user. This can + * either be via the menu bar or the "power on" button in the main toolbar or + * by remote control. + */ +void MainWindow::on_actionDSP_triggered(bool checked) +{ + remote->setReceiverStatus(checked); + + if (checked) + { + /* start receiver */ + rx->start(); + + /* start GUI timers */ + meter_timer->start(100); + + if (uiDockFft->fftRate()) + { + iq_fft_timer->start(1000/uiDockFft->fftRate()); + ui->plotter->setRunningState(true); + } + else + { + iq_fft_timer->start(36e7); // 100 hours + ui->plotter->setRunningState(false); + } + + audio_fft_timer->start(40); + + /* update menu text and button tooltip */ + ui->actionDSP->setToolTip(tr("Stop DSP processing")); + ui->actionDSP->setText(tr("Stop DSP")); + } + else + { + /* stop GUI timers */ + meter_timer->stop(); + iq_fft_timer->stop(); + audio_fft_timer->stop(); + rds_timer->stop(); + + /* stop receiver */ + rx->stop(); + + /* update menu text and button tooltip */ + ui->actionDSP->setToolTip(tr("Start DSP processing")); + ui->actionDSP->setText(tr("Start DSP")); + + ui->plotter->setRunningState(false); + } + + ui->actionDSP->setChecked(checked); //for remote control + +} + +/** + * @brief Action: I/O device configurator triggered. + * + * This slot is activated when the user selects "I/O Devices" in the + * menu. It activates the I/O configurator and if the user closes the + * configurator using the OK button, the new configuration is read and + * sent to the receiver. + */ +int MainWindow::on_actionIoConfig_triggered() +{ + qDebug() << "Configure I/O devices."; + + auto *ioconf = new CIoConfig(m_settings, devList); + auto confres = ioconf->exec(); + + if (confres == QDialog::Accepted) + { + bool dsp_running = ui->actionDSP->isChecked(); + + if (dsp_running) + // suspend DSP while we reload settings + on_actionDSP_triggered(false); + + // Refresh LNB LO in dock widget, otherwise changes will be lost + uiDockInputCtl->readLnbLoFromSettings(m_settings); + storeSession(); + loadConfig(m_settings->fileName(), false, false); + + if (dsp_running) + // restsart DSP + on_actionDSP_triggered(true); + } + + delete ioconf; + + return confres; +} + + +/** Run first time configurator. */ +int MainWindow::firstTimeConfig() +{ + qDebug() << __func__; + + auto *ioconf = new CIoConfig(m_settings, devList); + auto confres = ioconf->exec(); + + if (confres == QDialog::Accepted) + loadConfig(m_settings->fileName(), false, false); + + delete ioconf; + + return confres; +} + + +/** Load configuration activated by user. */ +void MainWindow::on_actionLoadSettings_triggered() +{ + auto cfgfile = QFileDialog::getOpenFileName(this, tr("Load settings"), + m_last_dir.isEmpty() ? m_cfg_dir : m_last_dir, + tr("Settings (*.conf)")); + + qDebug() << "File to open:" << cfgfile; + + if (cfgfile.isEmpty()) + return; + + if (!cfgfile.endsWith(".conf", Qt::CaseSensitive)) + cfgfile.append(".conf"); + + loadConfig(cfgfile, cfgfile != m_settings->fileName(), cfgfile != m_settings->fileName()); + + // store last dir + QFileInfo fi(cfgfile); + if (m_cfg_dir != fi.absolutePath()) + m_last_dir = fi.absolutePath(); +} + +/** Save configuration activated by user. */ +void MainWindow::on_actionSaveSettings_triggered() +{ + auto cfgfile = QFileDialog::getSaveFileName(this, tr("Save settings"), + m_last_dir.isEmpty() ? m_cfg_dir : m_last_dir, + tr("Settings (*.conf)")); + + qDebug() << "File to save:" << cfgfile; + + if (cfgfile.isEmpty()) + return; + + if (!cfgfile.endsWith(".conf", Qt::CaseSensitive)) + cfgfile.append(".conf"); + + storeSession(); + saveConfig(cfgfile); + + // store last dir + QFileInfo fi(cfgfile); + if (m_cfg_dir != fi.absolutePath()) + m_last_dir = fi.absolutePath(); +} + +void MainWindow::on_actionSaveWaterfall_triggered() +{ + QDateTime dt(QDateTime::currentDateTimeUtc()); + + // previously used location + auto save_path = m_settings->value("wf_save_dir", "").toString(); + if (!save_path.isEmpty()) + save_path += "/"; + save_path += dt.toString("gqrx_wf_yyyyMMdd_hhmmss.png"); + + auto wffile = QFileDialog::getSaveFileName(this, tr("Save waterfall"), + save_path, nullptr); + if (wffile.isEmpty()) + return; + + if (!ui->plotter->saveWaterfall(wffile)) + { + QMessageBox::critical(this, + tr("Error"), + tr("There was an error saving the waterfall")); + } + + // store the location used for the waterfall file + QFileInfo fi(wffile); + m_settings->setValue("wf_save_dir", fi.absolutePath()); +} + +/** Show I/Q player. */ +void MainWindow::on_actionIqTool_triggered() +{ + iq_tool->show(); +} + + +/* CPlotter::NewDemodFreq() is emitted */ +void MainWindow::on_plotter_newDemodFreq(qint64 freq, qint64 delta) +{ + // set RX filter + rx->set_filter_offset((double) delta); + + // update RF freq label and channel filter offset + uiDockRxOpt->setFilterOffset(delta); + ui->freqCtrl->setFrequency(freq); + + if (rx->is_rds_decoder_active()) + rx->reset_rds_parser(); +} + +/* CPlotter::NewfilterFreq() is emitted or bookmark activated */ +void MainWindow::on_plotter_newFilterFreq(int low, int high) +{ /* parameter correctness will be checked in receiver class */ + receiver::status retcode = rx->set_filter((double) low, (double) high, d_filter_shape); + + /* Update filter range of plotter, in case this slot is triggered by + * switching to a bookmark */ + ui->plotter->setHiLowCutFrequencies(low, high); + + if (retcode == receiver::STATUS_OK) + uiDockRxOpt->setFilterParam(low, high); +} + +/** Full screen button or menu item toggled. */ +void MainWindow::on_actionFullScreen_triggered(bool checked) +{ + if (checked) + { + ui->statusBar->hide(); + showFullScreen(); + } + else + { + ui->statusBar->show(); + showNormal(); + } +} + +/** Remote control button (or menu item) toggled. */ +void MainWindow::on_actionRemoteControl_triggered(bool checked) +{ + if (checked) + remote->start_server(); + else + remote->stop_server(); +} + +/** Remote control configuration button (or menu item) clicked. */ +void MainWindow::on_actionRemoteConfig_triggered() +{ + auto *rcs = new RemoteControlSettings(); + + rcs->setPort(remote->getPort()); + rcs->setHosts(remote->getHosts()); + + if (rcs->exec() == QDialog::Accepted) + { + remote->setPort(rcs->getPort()); + remote->setHosts(rcs->getHosts()); + } + + delete rcs; +} + + +#define DATA_BUFFER_SIZE 48000 + +/** + * AFSK1200 decoder action triggered. + * + * This slot is called when the user activates the AFSK1200 + * action. It will create an AFSK1200 decoder window and start + * and start pushing data from the receiver to it. + */ +void MainWindow::on_actionAFSK1200_triggered() +{ + if (!d_have_audio) + { + QMessageBox msg_box; + msg_box.setIcon(QMessageBox::Critical); + msg_box.setText(tr("AFSK1200 decoder requires a demodulator.\n" + "Currently, demodulation is switched off " + "(Mode->Demod Off).")); + msg_box.exec(); + return; + } + if (dec_afsk1200 != nullptr) + { + qDebug() << "AFSK1200 decoder already active."; + dec_afsk1200->raise(); + } + else + { + qDebug() << "Starting AFSK1200 decoder."; + + /* start sample sniffer */ + if (rx->start_sniffer(22050, DATA_BUFFER_SIZE) == receiver::STATUS_OK) + { + dec_afsk1200 = new Afsk1200Win(this); + connect(dec_afsk1200, SIGNAL(windowClosed()), this, SLOT(afsk1200win_closed())); + dec_afsk1200->setAttribute(Qt::WA_DeleteOnClose); + dec_afsk1200->show(); + + dec_timer->start(100); + } + else + QMessageBox::warning(this, tr("Gqrx error"), + tr("Error starting sample sniffer.\n" + "Close all data decoders and try again."), + QMessageBox::Ok, QMessageBox::Ok); + } +} + + +/** + * Destroy AFSK1200 decoder window got closed. + * + * This slot is connected to the windowClosed() signal of the AFSK1200 decoder + * object. We need this to properly destroy the object, stop timeout and clean + * up whatever need to be cleaned up. + */ +void MainWindow::afsk1200win_closed() +{ + /* stop cyclic processing */ + dec_timer->stop(); + rx->stop_sniffer(); + + dec_afsk1200 = nullptr; +} + +/** Show DXC Options. */ +void MainWindow::on_actionDX_Cluster_triggered() +{ + dxc_options->show(); +} + +/** + * Cyclic processing for acquiring samples from receiver and processing them + * with data decoders (see dec_* objects) + */ +void MainWindow::decoderTimeout() +{ + float buffer[DATA_BUFFER_SIZE]; + unsigned int num; + + rx->get_sniffer_data(&buffer[0], num); + if (dec_afsk1200) + dec_afsk1200->process_samples(&buffer[0], num); +} + +void MainWindow::setRdsDecoder(bool checked) +{ + if (checked) + { + qDebug() << "Starting RDS decoder."; + uiDockRDS->showEnabled(); + rx->start_rds_decoder(); + rx->reset_rds_parser(); + rds_timer->start(250); + } + else + { + qDebug() << "Stopping RDS decoder."; + uiDockRDS->showDisabled(); + rx->stop_rds_decoder(); + rds_timer->stop(); + } + remote->setRDSstatus(checked); +} + +void MainWindow::onBookmarkActivated(qint64 freq, const QString& demod, int bandwidth) +{ + setNewFrequency(freq); + selectDemod(demod); + + /* Check if filter is symmetric or not by checking the presets */ + auto mode = uiDockRxOpt->currentDemod(); + auto preset = uiDockRxOpt->currentFilter(); + + int lo, hi; + uiDockRxOpt->getFilterPreset(mode, preset, &lo, &hi); + + if(lo + hi == 0) + { + lo = -bandwidth / 2; + hi = bandwidth / 2; + } + else if(lo >= 0 && hi >= 0) + { + hi = lo + bandwidth; + } + else if(lo <= 0 && hi <= 0) + { + lo = hi - bandwidth; + } + + on_plotter_newFilterFreq(lo, hi); +} + +void MainWindow::setPassband(int bandwidth) +{ + /* Check if filter is symmetric or not by checking the presets */ + auto mode = uiDockRxOpt->currentDemod(); + auto preset = uiDockRxOpt->currentFilter(); + + int lo, hi; + uiDockRxOpt->getFilterPreset(mode, preset, &lo, &hi); + + if(lo + hi == 0) + { + lo = -bandwidth / 2; + hi = bandwidth / 2; + } + else if(lo >= 0 && hi >= 0) + { + hi = lo + bandwidth; + } + else if(lo <= 0 && hi <= 0) + { + lo = hi - bandwidth; + } + + remote->setPassband(lo, hi); + + on_plotter_newFilterFreq(lo, hi); +} + +/** Launch Gqrx google group website. */ +void MainWindow::on_actionUserGroup_triggered() +{ + auto res = QDesktopServices::openUrl(QUrl("https://groups.google.com/g/gqrx", + QUrl::TolerantMode)); + if (!res) + QMessageBox::warning(this, tr("Error"), + tr("Failed to open website:\n" + "https://groups.google.com/g/gqrx"), + QMessageBox::Close); +} + +/** + * Show ftxt in a dialog window. + */ +void MainWindow::on_actionNews_triggered() +{ + showSimpleTextFile(":/textfiles/news.txt", tr("Release news")); +} + +/** + * Show remote-contol.txt in a dialog window. + */ +void MainWindow::on_actionRemoteProtocol_triggered() +{ + showSimpleTextFile(":/textfiles/remote-control.txt", + tr("Remote control protocol")); +} + +/** + * Show kbd-shortcuts.txt in a dialog window. + */ +void MainWindow::on_actionKbdShortcuts_triggered() +{ + showSimpleTextFile(":/textfiles/kbd-shortcuts.txt", + tr("Keyboard shortcuts")); +} + +/** + * Show simple text file in a window. + */ +void MainWindow::showSimpleTextFile(const QString &resource_path, + const QString &window_title) +{ + QResource resource(resource_path); + QFile news(resource.absoluteFilePath()); + + if (!news.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qDebug() << "Unable to open file: " << news.fileName() << + " because of error " << news.errorString(); + + return; + } + + QTextStream in(&news); + auto content = in.readAll(); + news.close(); + + auto *browser = new QTextBrowser(); + browser->setLineWrapMode(QTextEdit::NoWrap); + browser->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); + browser->append(content); + browser->adjustSize(); + + // scroll to the beginning + auto cursor = browser->textCursor(); + cursor.setPosition(0); + browser->setTextCursor(cursor); + + + auto *layout = new QVBoxLayout(); + layout->addWidget(browser); + + auto *dialog = new QDialog(this); + dialog->setWindowTitle(window_title); + dialog->setLayout(layout); + dialog->resize(800, 400); + dialog->exec(); + + delete dialog; + // browser and layout deleted automatically +} + +/** + * @brief Slot for handling loadConfig signals + * @param cfgfile + */ +void MainWindow::loadConfigSlot(const QString &cfgfile) +{ + loadConfig(cfgfile, cfgfile != m_settings->fileName(), cfgfile != m_settings->fileName()); +} + +/** + * @brief Action: About gqrx. + * + * This slot is called when the user activates the + * Help|About menu item (or Gqrx|About on Mac) + */ +void MainWindow::on_actionAbout_triggered() +{ + QMessageBox::about(this, tr("About Gqrx"), + tr("

This is Gqrx %1

" + "

Copyright (C) 2011-2022 Alexandru Csete & contributors.

" + "

Gqrx is a software defined radio (SDR) receiver powered by " + "GNU Radio and the Qt toolkit. " + "

Gqrx uses the GrOsmoSDR " + "input source block and works with any input device supported by it, including " + "Funcube Dongle, RTL-SDR, Airspy, HackRF, RFSpace, BladeRF and USRP receivers." + "

" + "

You can download the latest version from the " + "Gqrx website." + "

" + "

" + "Gqrx is licensed under the GNU General Public License." + "

").arg(VERSION)); +} + +/** + * @brief Action: About Qt + * + * This slot is called when the user activates the + * Help|About Qt menu item (or Gqrx|About Qt on Mac) + */ +void MainWindow::on_actionAboutQt_triggered() +{ + QMessageBox::aboutQt(this, tr("About Qt")); +} + +void MainWindow::on_actionAddBookmark_triggered() +{ + bool ok=false; + QString name; + QStringList tags; + + // Create and show the Dialog for a new Bookmark. + // Write the result into variable 'name'. + { + QDialog dialog(this); + dialog.setWindowTitle("New bookmark"); + + auto* LabelAndTextfieldName = new QGroupBox(&dialog); + auto* label1 = new QLabel("Bookmark name:", LabelAndTextfieldName); + auto* textfield = new QLineEdit(LabelAndTextfieldName); + auto *layout = new QHBoxLayout; + layout->addWidget(label1); + layout->addWidget(textfield); + LabelAndTextfieldName->setLayout(layout); + + auto* buttonCreateTag = new QPushButton("Create new Tag", &dialog); + + auto* taglist = new BookmarksTagList(&dialog, false); + taglist->updateTags(); + taglist->DeselectAll(); + + auto* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok + | QDialogButtonBox::Cancel); + connect(buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject())); + connect(buttonCreateTag, SIGNAL(clicked()), taglist, SLOT(AddNewTag())); + + auto *mainLayout = new QVBoxLayout(&dialog); + mainLayout->addWidget(LabelAndTextfieldName); + mainLayout->addWidget(buttonCreateTag); + mainLayout->addWidget(taglist); + mainLayout->addWidget(buttonBox); + + ok = dialog.exec(); + if (ok) + { + name = textfield->text(); + tags = taglist->getSelectedTags(); + qDebug() << "Tags: " << tags; + } + else + { + name.clear(); + tags.clear(); + } + } + + // Add new Bookmark to Bookmarks. + if(ok) + { + int i; + + BookmarkInfo info; + info.frequency = ui->freqCtrl->getFrequency(); + info.bandwidth = ui->plotter->getFilterBw(); + info.modulation = uiDockRxOpt->currentDemodAsString(); + info.name=name; + info.tags.clear(); + if (tags.empty()) + info.tags.append(&Bookmarks::Get().findOrAddTag("")); + + + for (i = 0; i < tags.size(); ++i) + info.tags.append(&Bookmarks::Get().findOrAddTag(tags[i])); + + Bookmarks::Get().add(info); + //uiDockBookmarks->updateTags(); + //uiDockBookmarks->updateBookmarks(); + ui->plotter->updateOverlay(); + } +} + +void MainWindow::updateClusterSpots() +{ + ui->plotter->updateOverlay(); +} + +void MainWindow::frequencyFocusShortcut() +{ + ui->freqCtrl->setFrequencyFocus(); +} diff --git a/src/applications/gqrx/mainwindow_touch.h b/src/applications/gqrx/mainwindow_touch.h new file mode 100755 index 000000000..4e8a52616 --- /dev/null +++ b/src/applications/gqrx/mainwindow_touch.h @@ -0,0 +1,255 @@ +/* -*- c++ -*- */ +/* + * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt + * https://gqrx.dk/ + * + * Copyright 2011-2014 Alexandru Csete OZ9AEC. + * + * Gqrx 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; either version 3, or (at your option) + * any later version. + * + * Gqrx 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with Gqrx; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifndef MAINWINDOW_TOUCH_H +#define MAINWINDOW_TOUCH_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qtgui/dockrxopt.h" +#include "qtgui/dockaudio.h" +#include "qtgui/dockinputctl.h" +#include "qtgui/dockfft.h" +#include "qtgui/dockbookmarks.h" +#include "qtgui/dockrds.h" +#include "qtgui/docktouchcontrols.h" + +#include "qtgui/afsk1200win.h" +#include "qtgui/iq_tool.h" +#include "qtgui/dxc_options.h" + +#include "applications/gqrx/recentconfig.h" +#include "applications/gqrx/remote_control.h" +#include "applications/gqrx/receiver.h" + +namespace Ui { + class MainWindow; /*! The main window UI */ +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(const QString& cfgfile, bool edit_conf, QWidget *parent = nullptr); + ~MainWindow() override; + + bool loadConfig(const QString& cfgfile, bool check_crash, bool restore_mainwindow); + bool saveConfig(const QString& cfgfile); + void storeSession(); + + bool configOk; /*!< Main app uses this flag to know whether we should abort or continue. */ + +public slots: + void setNewFrequency(qint64 rx_freq); + +private: + Ui::MainWindow *ui; + + QPointer m_settings; /*!< Application wide settings. */ + QString m_cfg_dir; /*!< Default config dir, e.g. XDG_CONFIG_HOME. */ + QString m_last_dir; + RecentConfig *m_recent_config; /* Menu File Recent config */ + + qint64 d_lnb_lo; /* LNB LO in Hz. */ + qint64 d_hw_freq; + qint64 d_hw_freq_start{}; + qint64 d_hw_freq_stop{}; + + enum receiver::filter_shape d_filter_shape; + std::complex* d_fftData; + float *d_realFftData; + float *d_iirFftData; + float d_fftAvg; /*!< FFT averaging parameter set by user (not the true gain). */ + + bool d_have_audio; /*!< Whether we have audio (i.e. not with demod_off. */ + + /* dock widgets */ + DockRxOpt *uiDockRxOpt; + DockAudio *uiDockAudio; + DockInputCtl *uiDockInputCtl; + DockFft *uiDockFft; + DockBookmarks *uiDockBookmarks; + DockRDS *uiDockRDS; + + DockTouchControls *uiDockTouchControls; + + CAudioOptions *uiDockAudioOptions; + + CIqTool *iq_tool; + DXCOptions *dxc_options; + + + /* data decoders */ + Afsk1200Win *dec_afsk1200; + bool dec_rds{}; + + QTimer *dec_timer; + QTimer *meter_timer; + QTimer *iq_fft_timer; + QTimer *audio_fft_timer; + QTimer *rds_timer; + + receiver *rx; + + RemoteControl *remote; + + std::map devList; + + // dummy widget to enforce linking to QtSvg + QSvgWidget *qsvg_dummy; + +private: + void updateHWFrequencyRange(bool ignore_limits); + void updateFrequencyRange(); + void updateGainStages(bool read_from_device); + void showSimpleTextFile(const QString &resource_path, + const QString &window_title); + /* key shortcut */ + void frequencyFocusShortcut(); + +private slots: + /* RecentConfig */ + void loadConfigSlot(const QString &cfgfile); + + /* rf */ + void setLnbLo(double freq_mhz); + void setAntenna(const QString& antenna); + + /* baseband receiver */ + void setFilterOffset(qint64 freq_hz); + void setGain(const QString& name, double gain); + void setAutoGain(bool enabled); + void setFreqCorr(double ppm); + void setIqSwap(bool reversed); + void setDcBlock(bool enabled); + void setDcCancel(bool enabled); + void setDcTune(bool enabled); + void setIqBalance(bool enabled); + void setIgnoreLimits(bool ignore_limits); + void setFreqCtrlReset(bool enabled); + void setInvertScrolling(bool enabled); + void selectDemod(const QString& demod); + void selectDemod(int index); + void setFmMaxdev(float max_dev); + void setFmEmph(double tau); + void setAmDcr(bool enabled); + void setCwOffset(int offset); + void setAmSyncDcr(bool enabled); + void setAmSyncPllBw(float pll_bw); + void setAgcOn(bool agc_on); + void setAgcHang(bool use_hang); + void setAgcThreshold(int threshold); + void setAgcSlope(int factor); + void setAgcDecay(int msec); + void setAgcGain(int gain); + void setNoiseBlanker(int nbid, bool on, float threshold); + void setSqlLevel(double level_db); + double setSqlLevelAuto(); + void setAudioGain(float gain); + void setPassband(int bandwidth); + + /* audio recording and playback */ + void startAudioRec(const QString& filename); + void stopAudioRec(); + void startAudioPlayback(const QString& filename); + void stopAudioPlayback(); + + void startAudioStream(const QString& udp_host, int udp_port, bool stereo); + void stopAudioStreaming(); + + /* I/Q playback and recording*/ + void startIqRecording(const QString& recdir); + void stopIqRecording(); + void startIqPlayback(const QString& filename, float samprate, qint64 center_freq); + void stopIqPlayback(); + void seekIqFile(qint64 seek_pos); + + /* FFT settings */ + void setIqFftSize(int size); + void setIqFftRate(int fps); + void setIqFftWindow(int type); + void setIqFftSplit(int pct_wf); + void setIqFftAvg(float avg); + void setAudioFftRate(int fps); + void setFftColor(const QColor& color); + void setFftFill(bool enable); + void setPeakDetection(bool enabled); + void setFftPeakHold(bool enable); + void setWfTimeSpan(quint64 span_ms); + void setWfSize(); + + /* FFT plot */ + void on_plotter_newDemodFreq(qint64 freq, qint64 delta); /*! New demod freq (aka. filter offset). */ + void on_plotter_newFilterFreq(int low, int high); /*! New filter width */ + + /* RDS */ + void setRdsDecoder(bool checked); + + /* Bookmarks */ + void onBookmarkActivated(qint64 freq, const QString& demod, int bandwidth); + + /* DXC Spots */ + void updateClusterSpots(); + + /* menu and toolbar actions */ + void on_actionDSP_triggered(bool checked); + int on_actionIoConfig_triggered(); + void on_actionLoadSettings_triggered(); + void on_actionSaveSettings_triggered(); + void on_actionSaveWaterfall_triggered(); + void on_actionIqTool_triggered(); + void on_actionFullScreen_triggered(bool checked); + void on_actionRemoteControl_triggered(bool checked); + void on_actionRemoteConfig_triggered(); + void on_actionAFSK1200_triggered(); + void on_actionUserGroup_triggered(); + void on_actionNews_triggered(); + void on_actionRemoteProtocol_triggered(); + void on_actionKbdShortcuts_triggered(); + void on_actionAbout_triggered(); + void on_actionAboutQt_triggered(); + void on_actionAddBookmark_triggered(); + void on_actionDX_Cluster_triggered(); + + + /* window close signals */ + void afsk1200win_closed(); + int firstTimeConfig(); + + /* cyclic processing */ + void decoderTimeout(); + void meterTimeout(); + void iqFftTimeout(); + void audioFftTimeout(); + void rdsTimeout(); +}; + +#endif // MAINWINDOW_TOUCH_H diff --git a/src/applications/gqrx/mainwindow_touch.ui b/src/applications/gqrx/mainwindow_touch.ui new file mode 100644 index 000000000..0c7122a39 --- /dev/null +++ b/src/applications/gqrx/mainwindow_touch.ui @@ -0,0 +1,1250 @@ + + + MainWindow + + + + 0 + 0 + 800 + 436 + + + + + 0 + 0 + + + + + 800 + 436 + + + + + 1600 + 916 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + gqrx + + + + :/icons/icons/gqrx.svg:/icons/icons/gqrx.svg + + + + + + QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks + + + true + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + background-color: rgb(31, 29, 29); + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + QLayout::SetMinimumSize + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QSizePolicy::Ignored + + + + 5 + 15 + + + + + + + + + 0 + 0 + + + + + 280 + 40 + + + + + 280 + 16777215 + + + + Qt::ClickFocus + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QSizePolicy::Ignored + + + + 5 + 15 + + + + + + + + + 1 + 0 + + + + + 150 + 40 + + + + + 450 + 16777215 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QSizePolicy::Ignored + + + + 5 + 15 + + + + + + + + + + + + 0 + 0 + + + + + 0 + 115 + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + 0 + 0 + 800 + 22 + + + + + 0 + 0 + + + + + 16777215 + 44 + + + + + &File + + + + Load recently used setting + + + &Recent settings + + + + + + + + + + + + + + + + &View + + + + + &Help + + + + + + + + + + + + + &Tools + + + + + + + + + + + + + + + + + + + + true + + + + 1 + 1 + + + + + 400 + 0 + + + + + 16777215 + 0 + + + + + + Quit + + + Quit application + + + Ctrl+Q + + + + + About Gqrx + + + Information about Gqrx + + + + + About Qt + + + About the Qt toolkit + + + + + true + + + + :/icons/icons/play.svg:/icons/icons/play.svg + + + Start DSP + + + Start DSP + + + Start/stop DSP processing + + + Ctrl+D + + + + + AFSK1200 Decoder + + + Start AFSK1200 decoder + + + + + true + + + false + + + + :/icons/icons/clock.svg:/icons/icons/clock.svg + + + Scheduler + + + Schedule recordings and other actions + + + + + true + + + + :/icons/icons/flash.svg:/icons/icons/flash.svg + + + I/O Devices + + + Configure I/O devices + + + Opens the hardware configuration dialog + + + true + + + + + + :/icons/icons/help.svg:/icons/icons/help.svg + + + Gqrx user group + + + Discussion group for Gqrx users + + + + + true + + + + :/icons/icons/fullscreen.svg:/icons/icons/fullscreen.svg + + + Full screen + + + Toggle full screen mode + + + F11 + + + + + + :/icons/icons/folder.svg:/icons/icons/folder.svg + + + Load settings + + + Load previously stored configuration + + + Load previously stored settings from a file + + + Ctrl+L + + + + + + :/icons/icons/floppy.svg:/icons/icons/floppy.svg + + + Save settings + + + Save current configuration + + + Save current configuration to a file + + + Ctrl+S + + + + + + :/icons/icons/bookmark-new.svg:/icons/icons/bookmark-new.svg + + + Add bookmark + + + Bookmark the current frequency and mode (Ctrl+Shift+B) + + + Ctrl+Shift+B + + + + + true + + + true + + + + :/icons/icons/tangeo-network-idle.svg:/icons/icons/tangeo-network-idle.svg + + + &Remote control + + + Remote control via TCP + + + Activate the TCP interface + + + + + + :/icons/icons/settings.svg:/icons/icons/settings.svg + + + Remote &control settings + + + Configure remote control settings + + + + + + :/icons/icons/signal.svg:/icons/icons/signal.svg + + + I/Q recorder + + + Record and play I/Q data + + + Open I/Q recorder dialog + + + Ctrl+I + + + + + + :/icons/icons/info.svg:/icons/icons/info.svg + + + News + + + Show news about this release + + + + + + :/icons/icons/info.svg:/icons/icons/info.svg + + + Remote control + + + Remote control protocol + + + + + + :/icons/icons/info.svg:/icons/icons/info.svg + + + Keyboard shortcuts + + + Show help on keyboard shortcuts + + + + + Save waterfall + + + Save the current waterfall to a graphics file + + + Ctrl+W + + + + + DX Cluster + + + Open DX Cluster Dialog + + + Ctrl+C + + + + + + + CPlotter + QFrame +
qtgui/plotter.h
+ 1 +
+ + CFreqCtrl + QFrame +
qtgui/freqctrl.h
+ 1 +
+ + CMeter + QFrame +
qtgui/meter.h
+ 1 +
+
+ + + + + + actionQuit + triggered() + MainWindow + close() + + + -1 + -1 + + + 450 + 257 + + + + +
diff --git a/src/applications/gqrx/receiver.cpp b/src/applications/gqrx/receiver.cpp index 8f36d7818..f92a9f7bc 100644 --- a/src/applications/gqrx/receiver.cpp +++ b/src/applications/gqrx/receiver.cpp @@ -70,6 +70,8 @@ receiver::receiver(const std::string input_device, d_sniffer_active(false), d_iq_rev(false), d_dc_cancel(false), + d_dc_blocker(false), + d_dc_tune(false), d_iq_balance(false), d_demod(RX_DEMOD_OFF) { @@ -115,8 +117,12 @@ receiver::receiver(const std::string input_device, iq_swap = make_iq_swap_cc(false); dc_corr = make_dc_corr_cc(d_decim_rate, 1.0); + dc_block = make_dc_blocker_cc(8192u, true); iq_fft = make_rx_fft_c(8192u, d_decim_rate, gr::fft::window::WIN_HANN); + dc_auto = gr::blocks::correctiq_auto::make(d_decim_rate, d_rf_freq, DEFAULT_AUDIO_GAIN, 1.0); + dc_sub = gr::blocks::sub_cc::make(1); + audio_fft = make_rx_fft_f(8192u, d_audio_rate, gr::fft::window::WIN_HANN); audio_gain0 = gr::blocks::multiply_const_ff::make(0); audio_gain1 = gr::blocks::multiply_const_ff::make(0); @@ -487,6 +493,26 @@ void receiver::set_dc_cancel(bool enable) return; d_dc_cancel = enable; + + printf("d_dc_cancel: %s\n", (enable ? "enabled" : "disabled")); + + // until we have a way to switch on/off + // inside the dc_corr_cc we do a reconf + set_demod(d_demod, true); +} + +/** + * @brief Enable/disable automatic DC tuning in the I/Q stream. + * @param enable Whether DC tuning should enabled or not. + */ +void receiver::set_dc_tune(bool enable) +{ + if (enable == d_dc_tune) + return; + + d_dc_tune = enable; + + printf("d_dc_tune: %s\n", (enable ? "enabled" : "disabled")); // until we have a way to switch on/off // inside the dc_corr_cc we do a reconf @@ -503,6 +529,44 @@ bool receiver::get_dc_cancel(void) const return d_dc_cancel; } +/** + * @brief Get auto DC cancel status. + * @retval true Automatic DC removal is enabled. + * @retval false Automatic DC removal is disabled. + */ +bool receiver::get_dc_tune(void) const +{ + return d_dc_tune; +} + +/** + * @brief Enable/disable automatic DC blocker in the I/Q stream. + * @param enable Whether DC blocker should enabled or not. + */ +void receiver::set_dc_blocker(bool enable) +{ + if (enable == d_dc_blocker) + return; + + d_dc_blocker = enable; + + printf("d_dc_blocker: %s\n", (d_dc_blocker ? "enabled" : "disabled")); + + // until we have a way to switch on/off + // inside the dc_corr_cc we do a reconf + set_demod(d_demod, true); +} + +/** + * @brief Get auto DC blocker status. + * @retval true Automatic DC blocker is enabled. + * @retval false Automatic DC blocker is disabled. + */ +bool receiver::get_dc_blocker(void) const +{ + return d_dc_blocker; +} + /** * @brief Enable/disable automatic I/Q balance. * @param enable Whether automatic I/Q balance should be enabled. @@ -540,6 +604,8 @@ receiver::status receiver::set_rf_freq(double freq_hz) src->set_center_freq(d_rf_freq); // FIXME: read back frequency? + dc_auto->set_freq(freq_hz); + return STATUS_OK; } @@ -615,6 +681,7 @@ receiver::status receiver::get_gain_range(std::string &name, double *start, receiver::status receiver::set_gain(std::string name, double value) { src->set_gain(value, name); + dc_auto->set_gain(value); return STATUS_OK; } @@ -1335,12 +1402,24 @@ void receiver::connect_all(rx_chain type) tb->connect(b, 0, iq_swap, 0); b = iq_swap; + + if (d_dc_blocker) + { + tb->connect(b, 0, dc_block, 0); + b = dc_block; + } if (d_dc_cancel) { tb->connect(b, 0, dc_corr, 0); b = dc_corr; } + + if (d_dc_tune) + { + tb->connect(b, 0, dc_auto, 0); + b = dc_auto; + } // Visualization tb->connect(b, 0, iq_fft, 0); diff --git a/src/applications/gqrx/receiver.h b/src/applications/gqrx/receiver.h index abf827cb8..5f2a7bd9c 100644 --- a/src/applications/gqrx/receiver.h +++ b/src/applications/gqrx/receiver.h @@ -141,6 +141,12 @@ class receiver void set_dc_cancel(bool enable); bool get_dc_cancel(void) const; + + void set_dc_blocker(bool enable); + bool get_dc_blocker(void) const; + + void set_dc_tune(bool enable); + bool get_dc_tune(void) const; void set_iq_balance(bool enable); bool get_iq_balance(void) const; @@ -251,6 +257,8 @@ class receiver bool d_sniffer_active; /*!< Only one data decoder allowed. */ bool d_iq_rev; /*!< Whether I/Q is reversed or not. */ bool d_dc_cancel; /*!< Enable automatic DC removal. */ + bool d_dc_blocker; /*!< Enable automatic DC blocking. */ + bool d_dc_tune; /*!< Enable automatic DC tuning. */ bool d_iq_balance; /*!< Enable automatic IQ balance. */ std::string input_devstr; /*!< Current input device string. */ @@ -265,7 +273,11 @@ class receiver receiver_base_cf_sptr rx; /*!< receiver. */ dc_corr_cc_sptr dc_corr; /*!< DC corrector block. */ + dc_blocker_cc_sptr dc_block; /*!< DC blocker block. */ iq_swap_cc_sptr iq_swap; /*!< I/Q swapping block. */ + + gr::blocks::correctiq_auto::sptr dc_auto; + gr::blocks::sub_cc::sptr dc_sub; rx_fft_c_sptr iq_fft; /*!< Baseband FFT block. */ rx_fft_f_sptr audio_fft; /*!< Audio FFT block. */ diff --git a/src/dsp/correct_iq_cc.cpp b/src/dsp/correct_iq_cc.cpp index 70eeb0d5d..5a54fbb5c 100644 --- a/src/dsp/correct_iq_cc.cpp +++ b/src/dsp/correct_iq_cc.cpp @@ -49,6 +49,7 @@ dc_corr_cc::dc_corr_cc(double sample_rate, double tau) qDebug() << "IQ DCR alpha:" << d_alpha; d_iir = gr::filter::single_pole_iir_filter_cc::make(d_alpha, 1); + d_sub = gr::blocks::sub_cc::make(1); connect(self(), 0, d_iir, 0); @@ -86,6 +87,44 @@ void dc_corr_cc::set_tau(double tau) } + +dc_blocker_cc_sptr make_dc_blocker_cc(int D, bool long_form) +{ + return gnuradio::get_initial_sptr(new dc_blocker_cc(D, long_form)); +} + + +dc_blocker_cc::dc_blocker_cc(int D, bool long_form) + : gr::hier_block2 ("dc_blocker_cc", + gr::io_signature::make(1, 1, sizeof(gr_complex)), + gr::io_signature::make(1, 1, sizeof(gr_complex))) +{ + d_blk = gr::filter::dc_blocker_cc::make(D, long_form); + d_sub = gr::blocks::sub_cc::make(1); + + connect(self(), 0, d_blk, 0); + //connect(self(), 0, d_sub, 0); + //connect(d_blk, 0, d_sub, 1); + //connect(d_sub, 0, self(), 0); + connect(d_blk, 0, self(), 0); +} + +dc_blocker_cc::~dc_blocker_cc() +{ + +} + +/* +correctiq_auto_sptr make_correctiq_auto(double samp_rate, + double freq, + float gain, + float sync_window) +{ + return gnuradio::get_initial_sptr(new correctiq_auto_impl(samp_rate, freq, gain, sync_window)); + +} +*/ + /** I/Q swap **/ iq_swap_cc_sptr make_iq_swap_cc(bool enabled) { diff --git a/src/dsp/correct_iq_cc.h b/src/dsp/correct_iq_cc.h index 1bb7268a2..689f2f680 100644 --- a/src/dsp/correct_iq_cc.h +++ b/src/dsp/correct_iq_cc.h @@ -28,6 +28,9 @@ #include #include #include +#include + +#include #if GNURADIO_VERSION < 0x030800 #include @@ -36,13 +39,19 @@ #endif class dc_corr_cc; +class dc_blocker_cc; class iq_swap_cc; +class correctiq_auto; #if GNURADIO_VERSION < 0x030900 typedef boost::shared_ptr dc_corr_cc_sptr; +typedef boost::shared_ptr dc_blocker_cc_sptr; +//typedef boost::shared_ptr correctiq_auto_sptr typedef boost::shared_ptr iq_swap_cc_sptr; #else typedef std::shared_ptr dc_corr_cc_sptr; +typedef std::shared_ptr dc_blocker_cc_sptr; +typedef std::shared_ptr correctiq_auto_sptr; typedef std::shared_ptr iq_swap_cc_sptr; #endif @@ -52,6 +61,14 @@ typedef std::shared_ptr iq_swap_cc_sptr; */ dc_corr_cc_sptr make_dc_corr_cc(double sample_rate, double tau=1.0); +/*! + * Make a DC blocker block. + * + * \param D (int) the length of the delay line + * \param long_form (bool) whether to use long (true, default) or short form + */ +dc_blocker_cc_sptr make_dc_blocker_cc(int D, bool long_form); + /*! \brief Single pole IIR filter-based DC offset correction block. * \ingroup DSP * @@ -79,6 +96,34 @@ class dc_corr_cc : public gr::hier_block2 double d_alpha; /*!< 1/(1+tau/T). */ }; +/*! \brief a computationally efficient controllable DC blocker + * \ingroup DSP + * + * This block implements a computationally efficient DC blocker that produces a + * tighter notch filter around DC for a smaller group delay than an equivalent + * FIR filter or using a single pole IIR filter (though the IIR filter is + * computationally cheaper). + */ +class dc_blocker_cc : public gr::hier_block2 +{ + friend dc_blocker_cc_sptr make_dc_blocker_cc(int D, bool long_form); + +protected: + dc_blocker_cc(int D, bool long_form); + +public: + ~dc_blocker_cc(); + //void set_delay_line(int D); + //void set_long_form(bool long_form); + +private: + gr::filter::dc_blocker_cc::sptr d_blk; + gr::blocks::sub_cc::sptr d_sub; + + int d_delay; /*!< Delay Line Length. */ + bool d_long_form; /*!< Long Form. */ +}; + /*! \brief Return a shared_ptr to a new instance of iq_swap_cc. */ diff --git a/src/qtgui/CMakeLists.txt b/src/qtgui/CMakeLists.txt old mode 100644 new mode 100755 index a525a6d30..3087fc56d --- a/src/qtgui/CMakeLists.txt +++ b/src/qtgui/CMakeLists.txt @@ -32,6 +32,8 @@ add_source_files(SRCS_LIST dockrds.h dockrxopt.cpp dockrxopt.h + docktouchcontrols.cpp + docktouchcontrols.h dxc_options.cpp dxc_options.h dxc_spots.cpp @@ -65,6 +67,7 @@ add_source_files(UI_SRCS_LIST dockinputctl.ui dockrds.ui dockrxopt.ui + docktouchcontrols.ui dxc_options.ui ioconfig.ui iq_tool.ui diff --git a/src/qtgui/audio_options.cpp b/src/qtgui/audio_options.cpp index 403e467b3..2ab208cd4 100644 --- a/src/qtgui/audio_options.cpp +++ b/src/qtgui/audio_options.cpp @@ -24,9 +24,21 @@ #include #include -#include "audio_options.h" -#include "ui_audio_options.h" +#include "ui_dockaudio.h" +#include "qtgui/dockaudio.h" +//#include "ui_audio_options.h" +CAudioOptions::CAudioOptions(QWidget *parent, Ui::DockAudio* ui) : + QDialog(parent), + ui(ui) +{ + work_dir = new QDir(); + + error_palette = new QPalette(); + error_palette->setColor(QPalette::Text, Qt::red); +} + +/* CAudioOptions::CAudioOptions(QWidget *parent) : QDialog(parent), ui(new Ui::CAudioOptions) @@ -37,13 +49,13 @@ CAudioOptions::CAudioOptions(QWidget *parent) : error_palette = new QPalette(); error_palette->setColor(QPalette::Text, Qt::red); -} +}*/ CAudioOptions::~CAudioOptions() { delete work_dir; delete error_palette; - delete ui; + //delete ui; } @@ -96,7 +108,6 @@ void CAudioOptions::setUdpStereo(bool stereo) ui->udpStereo->setChecked(stereo); } - void CAudioOptions::setFftSplit(int pct_2d) { ui->fftSplitSlider->setValue(pct_2d); diff --git a/src/qtgui/audio_options.h b/src/qtgui/audio_options.h index c99ab036c..4cc5666d0 100644 --- a/src/qtgui/audio_options.h +++ b/src/qtgui/audio_options.h @@ -30,6 +30,7 @@ namespace Ui { class CAudioOptions; + class DockAudio; } /*! \brief GUI widget for configuring audio options. */ @@ -38,7 +39,8 @@ class CAudioOptions : public QDialog Q_OBJECT public: - explicit CAudioOptions(QWidget *parent = 0); + explicit CAudioOptions(QWidget *parent = 0, Ui::DockAudio *ui = 0); + //explicit CAudioOptions(QWidget *parent = 0); ~CAudioOptions(); void closeEvent(QCloseEvent *event); @@ -62,6 +64,15 @@ class CAudioOptions : public QDialog public slots: void setPandapterSliderValues(float min, float max); + void on_audioLockButton_toggled(bool checked); + void on_fftSplitSlider_valueChanged(int value); + void on_pandRangeSlider_valuesChanged(int min, int max); + void on_wfRangeSlider_valuesChanged(int min, int max); + void on_recDirEdit_textChanged(const QString &text); + void on_recDirButton_clicked(); + void on_udpHost_textChanged(const QString &text); + void on_udpPort_valueChanged(int port); + void on_udpStereo_stateChanged(int state); signals: void newFftSplit(int pct_2d); @@ -76,18 +87,10 @@ public slots: void newUdpStereo(bool enabled); private slots: - void on_fftSplitSlider_valueChanged(int value); - void on_pandRangeSlider_valuesChanged(int min, int max); - void on_wfRangeSlider_valuesChanged(int min, int max); - void on_audioLockButton_toggled(bool checked); - void on_recDirEdit_textChanged(const QString &text); - void on_recDirButton_clicked(); - void on_udpHost_textChanged(const QString &text); - void on_udpPort_valueChanged(int port); - void on_udpStereo_stateChanged(int state); private: - Ui::CAudioOptions *ui; /*!< The user interface widget. */ + //Ui::CAudioOptions *ui; /*!< The user interface widget. */ + Ui::DockAudio *ui; QDir *work_dir; /*!< Used for validating chosen directory. */ QPalette *error_palette; /*!< Palette used to indicate an error. */ bool m_pand_last_modified; /*!< Flag to indicate which slider was changed last */ diff --git a/src/qtgui/bookmarks.cpp b/src/qtgui/bookmarks.cpp index c57ba7442..74f170298 100644 --- a/src/qtgui/bookmarks.cpp +++ b/src/qtgui/bookmarks.cpp @@ -59,7 +59,7 @@ void Bookmarks::setConfigDir(const QString& cfg_dir) void Bookmarks::add(BookmarkInfo &info) { m_BookmarkList.append(info); - std::stable_sort(m_BookmarkList.begin(),m_BookmarkList.end()); + std::stable_sort(m_BookmarkList.rbegin(),m_BookmarkList.rend()); save(); emit( BookmarksChanged() ); } @@ -139,7 +139,7 @@ bool Bookmarks::load() } } file.close(); - std::stable_sort(m_BookmarkList.begin(),m_BookmarkList.end()); + std::stable_sort(m_BookmarkList.rbegin(),m_BookmarkList.rend()); emit BookmarksChanged(); return true; @@ -213,9 +213,9 @@ QList Bookmarks::getBookmarksInRange(qint64 low, qint64 high) { BookmarkInfo info; info.frequency=low; - QList::const_iterator lb = std::lower_bound(m_BookmarkList.begin(), m_BookmarkList.end(), info); + QList::reverse_iterator lb = std::lower_bound(m_BookmarkList.rbegin(), m_BookmarkList.rend(), info); info.frequency=high; - QList::const_iterator ub = std::upper_bound(m_BookmarkList.begin(), m_BookmarkList.end(), info); + QList::reverse_iterator ub = std::upper_bound(m_BookmarkList.rbegin(), m_BookmarkList.rend(), info); QList found; diff --git a/src/qtgui/dockaudio.cpp b/src/qtgui/dockaudio.cpp index da24f33e2..f5ea529bb 100644 --- a/src/qtgui/dockaudio.cpp +++ b/src/qtgui/dockaudio.cpp @@ -37,17 +37,16 @@ DockAudio::DockAudio(QWidget *parent) : rx_freq(144000000) { ui->setupUi(this); - + printf("---Creating Audio Dock\n"); #ifdef Q_OS_LINUX // buttons can be smaller than 50x32 - ui->audioMuteButton->setMinimumSize(48, 24); - ui->audioStreamButton->setMinimumSize(48, 24); - ui->audioRecButton->setMinimumSize(48, 24); - ui->audioPlayButton->setMinimumSize(48, 24); - ui->audioConfButton->setMinimumSize(48, 24); + //ui->audioMuteButton->setMinimumSize(48, 24); + //ui->audioStreamButton->setMinimumSize(48, 24); + //ui->audioRecButton->setMinimumSize(48, 24); + //ui->audioPlayButton->setMinimumSize(48, 24); + //ui->audioConfButton->setMinimumSize(48, 24); #endif - - audioOptions = new CAudioOptions(this); + audioOptions = new CAudioOptions(this, ui); connect(audioOptions, SIGNAL(newFftSplit(int)), ui->audioSpectrum, SLOT(setPercent2DScreen(int))); connect(audioOptions, SIGNAL(newPandapterRange(int,int)), this, SLOT(setNewPandapterRange(int,int))); @@ -455,6 +454,52 @@ void DockAudio::setNewWaterfallRange(int min, int max) ui->audioSpectrum->setWaterfallRange(min, max); } +void DockAudio::on_fftSplitSlider_valueChanged(int value) +{ + audioOptions->on_fftSplitSlider_valueChanged(value); +} + +void DockAudio::on_pandRangeSlider_valuesChanged(int min, int max) +{ + audioOptions->on_pandRangeSlider_valuesChanged(min, max); +} + +void DockAudio::on_wfRangeSlider_valuesChanged(int min, int max) +{ + audioOptions->on_wfRangeSlider_valuesChanged(min, max); +} + +void DockAudio::on_recDirEdit_textChanged(const QString &dir) +{ + audioOptions->on_recDirEdit_textChanged(dir); +} + +void DockAudio::on_recDirButton_clicked() +{ + audioOptions->on_recDirButton_clicked(); +} + +void DockAudio::on_udpHost_textChanged(const QString &text) +{ + audioOptions->on_udpHost_textChanged(text); +} + +void DockAudio::on_udpPort_valueChanged(int port) +{ + audioOptions->on_udpPort_valueChanged(port); +} + +void DockAudio::on_udpStereo_stateChanged(int state) +{ + audioOptions->on_udpStereo_stateChanged(state); +} + +/** Lock button toggled */ +void DockAudio::on_audioLockButton_toggled(bool checked) +{ + audioOptions->on_audioLockButton_toggled(checked); +} + /*! \brief Slot called when a new valid recording directory has been selected * in the audio conf dialog. */ @@ -499,3 +544,7 @@ void DockAudio::increaseAudioGainShortcut() { void DockAudio::decreaseAudioGainShortcut() { ui->audioGainSlider->triggerAction(QSlider::SliderPageStepSub); } + +void DockAudio::resetAudioSpectrumZoom() { + ui->audioSpectrum->resetHorizontalZoom(); +} diff --git a/src/qtgui/dockaudio.h b/src/qtgui/dockaudio.h index 78bd28964..4d42ed588 100644 --- a/src/qtgui/dockaudio.h +++ b/src/qtgui/dockaudio.h @@ -26,6 +26,7 @@ #include #include #include + #include "audio_options.h" namespace Ui { @@ -66,6 +67,8 @@ class DockAudio : public QDockWidget void saveSettings(QSettings *settings); void readSettings(QSettings *settings); + + void resetAudioSpectrumZoom(); public slots: void startAudioRecorder(void); @@ -112,6 +115,15 @@ private slots: void setNewUdpPort(int port); void setNewUdpStereo(bool enabled); + void on_fftSplitSlider_valueChanged(int value); + void on_pandRangeSlider_valuesChanged(int min, int max); + void on_wfRangeSlider_valuesChanged(int min, int max); + void on_recDirEdit_textChanged(const QString &dir); + void on_recDirButton_clicked(); + void on_udpHost_textChanged(const QString &text); + void on_udpPort_valueChanged(int port); + void on_udpStereo_stateChanged(int state); + void on_audioLockButton_toggled(bool checked); private: Ui::DockAudio *ui; diff --git a/src/qtgui/dockaudio.ui b/src/qtgui/dockaudio.ui index 0daff7416..ef55f48da 100644 --- a/src/qtgui/dockaudio.ui +++ b/src/qtgui/dockaudio.ui @@ -6,28 +6,452 @@ 0 0 - 270 - 200 + 450 + 337 - - 0 - 0 + + 1 + 1 - 270 - 195 + 450 + 156 + + + 524287 + 360 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 247 + 247 + 247 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 247 + 247 + 247 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + :/icons/icons/signal.svg:/icons/icons/signal.svg + + QDockWidget::NoDockWidgetFeatures + - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea + Qt::LeftDockWidgetArea Audio @@ -39,332 +463,1260 @@ 0 + + + 450 + 137 + + + + + 16777215 + 360 + + + + + 0 + 0 + + + + + + + + + 48 + 140 + 198 + + + + + + + + + 48 + 140 + 198 + + + + + + + + + 145 + 145 + 145 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + - + - + 0 0 - 50 - 50 + 400 + 137 - - - 16777215 - 16777215 - - - - Audio spectrum - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - 5 - - - - - - 0 - 0 - - - - Gain: - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - Audio gain - - - Audio gain - - - -800 - - - 500 - - - -60 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - -6.0 dB - - - Qt::AlignCenter - - - 0 - - - 1 - - - - - - - - + 0 - - - - - 0 - 0 - - - - - 50 - 32 - - - - - 16777215 - 16777215 - - - - Mute audio output - - - Mute audio output - - - Mute - - - true - - - - - - - - 0 - 0 - - - - - 50 - 32 - - - - - 16777215 - 16777215 - - - - Stream raw audio over UDP - - - Stream raw audio over UDP - - - UDP - - - true - - - - - - - - 0 - 0 - + + + + 400 + 106 + + + + Spectrum + + + + 0 - - - 50 - 32 - + + 0 - - - 16777215 - 16777215 - + + 0 - - Record audio + + 0 - - Record audio + + 0 - - Rec + + + + + 1 + 1 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + Audio spectrum + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + 400 + 106 + + + + FFT + + + Audio FFT settings + + + + 0 - - - 16 - 16 - + + 0 - - true + + 0 - - - - - - false + + 0 - - - 0 - 0 - + + 0 - - - 50 - 32 - + + + + + 16777215 + 100 + + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Adjust split between pandapter and waterfall + + + Pandapter + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Adjust split between pandapter and waterfall + + + 0 + + + 100 + + + 100 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Adjust split between pandapter and waterfall + + + Waterfall + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 100 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 200 + + + + Lock panadapter and waterfall sliders together + + + Lock panadapter and waterfall sliders together + + + Lock + + + true + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Adjust dB range on the waterfall + + + -120 + + + 0 + + + -80 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Adjust dB range on the pandapter + + + -120 + + + 0 + + + -80 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 140 + 25 + + + + + 16777215 + 16777215 + + + + Adjust dB range on the pandapter + + + Pandapter dB range + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 140 + 25 + + + + + 16777215 + 16777215 + + + + Adjust dB range on the waterfall + + + Waterfall dB range + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + 400 + 106 + + + + + 16777215 + 16777215 + + + + Recording + + + Recording settings + + + + 0 - - - 16777215 - 16777215 - + + 0 - - Playback previously recorded audio + + 0 - - Playback previously recorded audio + + 0 - - Play + + 0 - - - 16 - 16 - + + + + + 16777215 + 16777215 + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 100 + 100 + + + + Select a location using a browser + + + Select + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Enter a location for recordings + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Location for recorded audio files: + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + 400 + 106 + + + + Network + + + Network streaming settings + + + + 0 - - true + + 0 - - - - - - true + + 0 - - - 0 - 0 - + + 0 - - - 50 - 32 - + + 0 - - - 16777215 - 16777215 - + + + + + 16777215 + 16777215 + + + + + 0 + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Network host to stream to + + + UDP host + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Network port to stream to + + + UDP port + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Network host to stream to + + + localhost + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Network port to stream to + + + 1 + + + 65535 + + + 7355 + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Stereo + + + true + + + + + + + + + + + 0 + 0 + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 0 + + + + + + + + + + 400 + 106 + + + + Output + + + + 0 - - Audio settings + + 0 - - Audio settings + + 0 - - ... + + 0 - - - 16 - 16 - + + 0 - - - - - - - - - 0 - 0 - - - - Current audio source (DSP or WAV file) - - - <i>DSP</i> - - - Qt::AlignCenter - + + + + + 16777215 + 16777215 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Stream raw audio over UDP + + + Stream raw audio over UDP + + + UDP + + + true + + + + + + + false + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Audio settings + + + Audio settings + + + ... + + + + 16 + 16 + + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Record audio + + + Record audio + + + Rec + + + + 16 + 16 + + + + true + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Mute audio output + + + Mute audio output + + + Mute + + + true + + + + + + + false + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Playback previously recorded audio + + + Playback previously recorded audio + + + Play + + + + 16 + 16 + + + + true + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Gain: + + + Qt::AlignCenter + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + -6.0 dB + + + Qt::AlignCenter + + + 0 + + + 1 + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Audio gain + + + Audio gain + + + -800 + + + 500 + + + -60 + + + Qt::Horizontal + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Current audio source (DSP or WAV file) + + + <i>DSP</i> + + + Qt::AlignCenter + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + @@ -377,6 +1729,11 @@
qtgui/plotter.h
1 + + ctkRangeSlider + QSlider +
qtgui/ctk/ctkRangeSlider.h
+
diff --git a/src/qtgui/dockbookmarks.cpp b/src/qtgui/dockbookmarks.cpp old mode 100644 new mode 100755 index d7378ef9d..c742d7dd0 --- a/src/qtgui/dockbookmarks.cpp +++ b/src/qtgui/dockbookmarks.cpp @@ -29,11 +29,13 @@ #include #include +#include "dockrxopt.h" +#include "qtcolorpicker.h" + #include "bookmarks.h" #include "bookmarkstaglist.h" + #include "dockbookmarks.h" -#include "dockrxopt.h" -#include "qtcolorpicker.h" #include "ui_dockbookmarks.h" DockBookmarks::DockBookmarks(QWidget *parent) : diff --git a/src/qtgui/dockbookmarks.ui b/src/qtgui/dockbookmarks.ui index 4a924bb8e..2b40b89ac 100644 --- a/src/qtgui/dockbookmarks.ui +++ b/src/qtgui/dockbookmarks.ui @@ -6,39 +6,1244 @@ 0 0 - 585 - 248 + 500 + 196 - - 200 - 0 + + 1 + 1 - 322 - 117 + 400 + 120 + + + 524287 + 360 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + QDockWidget::NoDockWidgetFeatures + - Qt::AllDockWidgetAreas + Qt::LeftDockWidgetArea Bookmarks + + + 1 + 1 + + + + + 400 + 0 + + + + + 16777215 + 360 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + 0 + 0 + + Qt::Horizontal + + 20 + - - 1 + + 3 0 @@ -48,20 +1253,432 @@ 10 + + + + + + + 0 + 0 + 0 + + + + + + + 136 + 138 + 133 + + + + + + + 204 + 207 + 200 + + + + + + + 170 + 172 + 166 + + + + + + + 68 + 69 + 67 + + + + + + + 91 + 92 + 89 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 136 + 138 + 133 + + + + + + + 0 + 0 + 0 + + + + + + + 195 + 196 + 194 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 247 + 247 + 247 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 68 + 69 + 67 + + + + + + + 136 + 138 + 133 + + + + + + + 204 + 207 + 200 + + + + + + + 170 + 172 + 166 + + + + + + + 68 + 69 + 67 + + + + + + + 91 + 92 + 89 + + + + + + + 68 + 69 + 67 + + + + + + + 255 + 255 + 255 + + + + + + + 68 + 69 + 67 + + + + + + + 136 + 138 + 133 + + + + + + + 136 + 138 + 133 + + + + + + + 177 + 177 + 177 + + + + + + + 247 + 247 + 247 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + QAbstractItemView::AnyKeyPressed|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked - - true - false - - 0 + + 1 0 @@ -83,12 +1700,424 @@ 0 + + + + + + + 0 + 0 + 0 + + + + + + + 136 + 138 + 133 + + + + + + + 204 + 207 + 200 + + + + + + + 170 + 172 + 166 + + + + + + + 68 + 69 + 67 + + + + + + + 91 + 92 + 89 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 136 + 138 + 133 + + + + + + + 0 + 0 + 0 + + + + + + + 195 + 196 + 194 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 247 + 247 + 247 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 68 + 69 + 67 + + + + + + + 136 + 138 + 133 + + + + + + + 204 + 207 + 200 + + + + + + + 170 + 172 + 166 + + + + + + + 68 + 69 + 67 + + + + + + + 91 + 92 + 89 + + + + + + + 68 + 69 + 67 + + + + + + + 255 + 255 + 255 + + + + + + + 68 + 69 + 67 + + + + + + + 136 + 138 + 133 + + + + + + + 136 + 138 + 133 + + + + + + + 177 + 177 + 177 + + + + + + + 247 + 247 + 247 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + QAbstractItemView::EditKeyPressed - - true - QAbstractItemView::SingleSelection @@ -101,12 +2130,12 @@ false - - 30 - 18 + + 30 + true diff --git a/src/qtgui/dockfft.cpp b/src/qtgui/dockfft.cpp index 690160903..52f73ad7d 100644 --- a/src/qtgui/dockfft.cpp +++ b/src/qtgui/dockfft.cpp @@ -31,7 +31,6 @@ #define DEFAULT_FFT_MIN_DB -120 #define DEFAULT_FFT_RATE 25 #define DEFAULT_FFT_SIZE 8192 -#define DEFAULT_FFT_ZOOM 1 #define DEFAULT_FFT_WINDOW 1 // Hann #define DEFAULT_WATERFALL_SPAN 0 // Auto #define DEFAULT_FFT_SPLIT 35 @@ -46,14 +45,14 @@ DockFft::DockFft(QWidget *parent) : #ifdef Q_OS_LINUX // buttons can be smaller than 50x32 - ui->peakDetectionButton->setMinimumSize(48, 24); - ui->peakHoldButton->setMinimumSize(48, 24); - ui->lockButton->setMinimumSize(48, 24); - ui->resetButton->setMinimumSize(48, 24); - ui->centerButton->setMinimumSize(48, 24); - ui->demodButton->setMinimumSize(48, 24); - ui->fillButton->setMinimumSize(48, 24); - ui->colorPicker->setMinimumSize(48, 24); + //ui->peakDetectionButton->setMinimumSize(48, 24); + //ui->peakHoldButton->setMinimumSize(48, 24); + //ui->lockButton->setMinimumSize(48, 24); + //ui->resetButton->setMinimumSize(48, 24); + //ui->centerButton->setMinimumSize(48, 24); + //ui->demodButton->setMinimumSize(48, 24); + //ui->fillButton->setMinimumSize(48, 24); + //ui->colorPicker->setMinimumSize(48, 24); #endif m_sample_rate = 0.f; @@ -269,29 +268,12 @@ void DockFft::saveSettings(QSettings *settings) settings->setValue("bandplan", true); else settings->remove("bandplan"); - - // Peak - if (ui->peakDetectionButton->isChecked()) - settings->setValue("peak_detect", true); - else - settings->remove("peak_detect"); - - if (ui->peakHoldButton->isChecked()) - settings->setValue("peak_hold", true); - else - settings->remove("peak_hold"); if (QString::compare(ui->cmapComboBox->currentData().toString(), DEFAULT_COLORMAP)) settings->setValue("waterfall_colormap", ui->cmapComboBox->currentData().toString()); else settings->remove("waterfall_colormap"); - // FFT Zoom - if (ui->fftZoomSlider->value() != DEFAULT_FFT_ZOOM) - settings->setValue("fft_zoom", ui->fftZoomSlider->value()); - else - settings->remove("fft_zoom"); - settings->endGroup(); } @@ -363,22 +345,9 @@ void DockFft::readSettings(QSettings *settings) ui->bandPlanCheckbox->setChecked(bool_val); emit bandPlanChanged(bool_val); - bool_val = settings->value("peak_detect", false).toBool(); - ui->peakDetectionButton->setChecked(bool_val); - emit peakDetectionToggled(bool_val); - - bool_val = settings->value("peak_hold", false).toBool(); - ui->peakHoldButton->setChecked(bool_val); - emit fftPeakHoldToggled(bool_val); - QString cmap = settings->value("waterfall_colormap", "gqrx").toString(); ui->cmapComboBox->setCurrentIndex(ui->cmapComboBox->findData(cmap)); - // FFT Zoom - intval = settings->value("fft_zoom", DEFAULT_FFT_ZOOM).toInt(&conv_ok); - if (conv_ok) - ui->fftZoomSlider->setValue(intval); - settings->endGroup(); } diff --git a/src/qtgui/dockfft.ui b/src/qtgui/dockfft.ui index 5b4ed7486..1450a0ed4 100644 --- a/src/qtgui/dockfft.ui +++ b/src/qtgui/dockfft.ui @@ -6,28 +6,605 @@ 0 0 - 368 - 444 + 450 + 145 - - 0 - 0 + + 1 + 1 - 327 - 200 + 450 + 145 524287 - 524287 + 360 + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + :/icons/icons/signal.svg:/icons/icons/signal.svg @@ -35,47 +612,667 @@ FFT performance and display settings + + QDockWidget::NoDockWidgetFeatures + - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea + Qt::LeftDockWidgetArea FFT Settings + + + 0 + 0 + + + + + 450 + 126 + + + + + 16777215 + 360 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + - + - - 0 + + 1 0 - - QFrame::NoFrame - - - QFrame::Sunken - - - Qt::ScrollBarAsNeeded + + + 443 + 126 + - - QAbstractScrollArea::AdjustToContentsOnFirstShow + + + 16777215 + 16777215 + - - true + + 0 - - - - 0 - 0 - 350 - 407 - + + + + 439 + 95 + - + + + 16777215 + 16777215 + + + + Peak\Range + + 0 @@ -92,1031 +1289,2345 @@ 0 - - - QLayout::SetDefaultConstraint - - - 0 - - - 0 + + + + 0 + 0 + - - 0 + + + 439 + 75 + - - 0 + + + 16777215 + 16777215 + - - 5 - - - - - Resolution bandwidth - - - RBW: 0 kHz - - - - - - - - 0 - 0 - - - - FFT averaging gain - - - Averaging - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 50 - 32 - - - - Click to select color for the FFT plot - - - Click to select color for the FFT plot - - - - - - true - - - - - - - - 0 - 0 - - - - Waterfall - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - Panadapter - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - FFT buffer overlap between two consecutive FFT calculations. - - - Overlap: 0% - - - 0 - - - - - - - Rate - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Set pandapter dB range - - - Set pandapter dB range - - - -160 - - - 0 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - Set zoom level on the frequency axis - - - Set zoom level on the frequency axis - - - 1 - - - 50 - - - 5 - - - Qt::Horizontal - - - false - - - false - - - QSlider::NoTicks - - - - - - - true - - - - 0 - 0 - - - - - 50 - 32 - - - - Lock panadapter and waterfall sliders together - - - Lock panadapter and waterfall sliders together - - - Lock - - - true - - - - - - - - 0 - 0 - - - - The vertical time span on the waterfall. - - - - Auto + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + - - - - 1 min + + + 100 + 25 + - - - - 2 min + + + 100 + 100 + - - - - 5 min + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + - - - 10 min + Peak - - - - 15 min + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - 20 min + + + + + + + 0 + 0 + - - - - 30 min + + + 100 + 25 + - - - - 1 hour + + + 100 + 100 + - - - - 2 hours + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + - - - - 5 hours + + Set pandapter dB range - - - - 10 hours + + Set pandapter dB range - - - 16 hours + Pand. dB - - - - 24 hours + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - 48 hours - - - - - - - - FFT window - - - - Hamming + + + + + + + 1 + 1 + + + + + 80 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Center FFT around original center frequency - - - Hann + Center + + + + + + + + 0 + 0 + + + + + 100 + 25 + + + + + 100 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Set waterfall dB range + + + Set waterfall dB range - - - Blackman + Wf. dB + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 1 + + + + + 80 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Enable peak detection in FFT - - - Rectangular + Detect + + + true + + + + + + + true + + + + 1 + 1 + + + + + 80 + 50 + + + + + 16777215 + 200 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Lock panadapter and waterfall sliders together + + + Lock panadapter and waterfall sliders together - - - Kaiser + Lock + + + true + + + + + + + + 1 + 1 + + + + + 80 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Reset zoom level to 1x - - - Blackman-Harris + Reset + + + + + + + + 1 + 1 + + + + + 80 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Center FFT around demodulator frequency - - - Bartlett + Demod + + + + + + + + 1 + 1 + + + + + 80 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Toggle peak hold in FFT - - - Flattop - - - - - - - - FFT size - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - Spatial distribution between pandapter and waterfall - - - 0 - - - 100 - - - 35 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - FFT refresh rate - - - 3 - - + Hold + + + true + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Set pandapter dB range + + + Set pandapter dB range + + + -160 + + + 0 + + + Qt::Horizontal + + + + + + + + 1 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Set waterfall dB range + + + Set waterfall dB range + + + -160 + + + 0 + + + Qt::Horizontal + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + 439 + 95 + + + + + 16777215 + 16777215 + + + + Colors\Bands + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 439 + 75 + + + + + 16777215 + 16777215 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Select waterfall color map + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Color for the FFT plot + - 60 fps + Color + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 50 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Fill the area below the FFT plot with a gradient + + + Fill the area below the FFT plot with a gradient - - - 50 fps + Fill + + + true + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + - - - 30 fps + Colormap + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 50 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Click to select color for the FFT plot + + + Click to select color for the FFT plot - - - 25 fps + + + + true + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + FFT window - - - 20 fps + Window + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + FFT window + + + + Hamming + + + + + Hann + + + + + Blackman + + + + + Rectangular + + + + + Kaiser + + + + + Blackman-Harris + + + + + Bartlett + + + + + Flattop + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + - - - 17 fps + Waterfall + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + + Enable Band Plan on bottom of spectrum + + + Qt::RightToLeft - - - 15 fps + Band Plan + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + 439 + 95 + + + + + 16777215 + 16777215 + + + + View + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 439 + 93 + + + + + 16777215 + 16777215 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + - - - 10 fps + FFT size + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + true + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + <html>Number of FFT points to calculate. Higher values will require more CPU time. This will not influence the number of points on the display since that parameter is adjusted automatically according to the display size.</html> + + + false + + + 7 + + + 15 + + + QComboBox::InsertAlphabetically + + + + 1048576 + + + + + 524288 + + + + + 262144 + + + + + 131072 + + + + + 65536 + + + + + 32768 + + + + + 16384 + + + + + 8192 + + + + + 4096 + + + + + 3840 + + + + + 2048 + + + + + 1024 + + + + + 768 + + + + + 512 + + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Resolution bandwidth - - - 5 fps + RBW: 0 kHz + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + FFT averaging gain - - - 1 fps + Averaging + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + FFT averaging gain + + + 100 + + + 35 + + + Qt::Horizontal + + + false + + + false + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + - - - 0 fps - - - - - - - - 2 - - - QLayout::SetDefaultConstraint - - - 1 - - - 0 - - - - - - 0 - 0 - - - - - 50 - 32 - + Rate + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + FFT refresh rate + + + 3 + + + + 60 fps - - - 16777215 - 16777215 - + + + + 50 fps - - Enable peak detection in FFT + + + + 30 fps + + - Detect + 25 fps - - true + + + + 20 fps - - - - - - - 0 - 0 - + + + + 17 fps - - - 50 - 32 - + + + + 15 fps - - - 16777215 - 16777215 - + + + + 10 fps - - Toggle peak hold in FFT + + + + 5 fps + + - Hold + 1 fps - - true + + + + 0 fps - - - - - - - - The vertical time span on the waterfall. - - - - - - Time span - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Set waterfall dB range - - - Set waterfall dB range - - - -160 - - - 0 - - - Qt::Horizontal - - - - - - - 2 - - - - - - 0 - 0 - + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + FFT buffer overlap between two consecutive FFT calculations. + + + Overlap: 0% + + + 0 + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Panadapter + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Spatial distribution between pandapter and waterfall + + + 0 + + + 100 + + + 66 + + + Qt::Horizontal + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + The vertical time span on the waterfall. + + + + + + Time span + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + The vertical time span on the waterfall. + + + + Auto - - - 50 - 32 - + + + + 1 min - - - 16777215 - 16777215 - + + + + 2 min - - Reset zoom level to 1x + + + + 5 min + + - Reset + 10 min - - - - - - - 0 - 0 - + + + + 15 min - - - 50 - 32 - + + + + 20 min - - - 16777215 - 16777215 - + + + + 30 min - - Center FFT around original center frequency + + + + 1 hour + + - Center + 2 hours - - - - - - - 0 - 0 - + + + + 5 hours - - - 50 - 32 - + + + + 10 hours - - - 16777215 - 16777215 - + + + + 16 hours - - Center FFT around demodulator frequency + + + + 24 hours + + - Demod + 48 hours - - - - - - - - Set waterfall dB range - - - Set waterfall dB range - - - Wf. dB - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Set zoom level on the frequency axis - - - Set zoom level on the frequency axis - - - Freq zoom - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 50 - 32 - - - - - 16777215 - 16777215 - - - - Fill the area below the FFT plot with a gradient - - - Fill the area below the FFT plot with a gradient - - - Fill - - - true - - - - - - - Qt::Vertical - - - - 253 - 68 - - - - - - - - FFT window - - - Window - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Peak - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - FFT averaging gain - - - 100 - - - 75 - - - Qt::Horizontal - - - false - - - false - - - - - - - true - - - - 0 - 0 - - - - - 0 - 0 - - - - <html>Number of FFT points to calculate. Higher values will require more CPU time. This will not influence the number of points on the display since that parameter is adjusted automatically according to the display size.</html> - - - false - - - 7 - - - 15 - - - QComboBox::InsertAlphabetically - - - - 1048576 + + + + + + + + 0 + 1 + - - - - 524288 + + + 0 + 25 + - - - - 262144 + + + 16777215 + 100 + - - - - 131072 + + Waterfall time resolution. - - - - 65536 + + - - - 32768 + Res: - s - - - - 16384 + + + + + + + 0 + 1 + - - - - 8192 + + + 0 + 25 + - - - - 4096 + + + 16777215 + 100 + - - - - 3840 + + Set zoom level on the frequency axis - - - - 2048 + + Set zoom level on the frequency axis - - - 1024 + Freq zoom - - - - 768 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Set zoom level on the frequency axis + + + Set zoom level on the frequency axis + + + 1 + + + 50 + + + 5 + + + Qt::Horizontal + + + false + + + false + + + QSlider::NoTicks + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Current zoom level on the frequency axis + + + Current zoom level on the frequency axis - - - 512 - - - - - - - - Color for the FFT plot - - - Color - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - Current zoom level on the frequency axis - - - Current zoom level on the frequency axis - - - 1x - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Set pandapter dB range - - - Set pandapter dB range - - - Pand. dB - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Waterfall time resolution. - - - - - - Res: - s - - - - - - - Select waterfall color map - - - - - - - Colormap - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Enable Band Plan on bottom of spectrum - - - Enable Band Plan - + 1x + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + - - + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + diff --git a/src/qtgui/dockinputctl.cpp b/src/qtgui/dockinputctl.cpp index d2518859b..f5db79d37 100644 --- a/src/qtgui/dockinputctl.cpp +++ b/src/qtgui/dockinputctl.cpp @@ -58,6 +58,9 @@ void DockInputCtl::readSettings(QSettings * settings) setDcCancel(settings->value("input/dc_cancel", false).toBool()); emit dcCancelChanged(ui->dcCancelButton->isChecked()); + setDcBlock(settings->value("input/dc_block", false).toBool()); + emit dcBlockChanged(ui->dcBlockButton->isChecked()); + setIqBalance(settings->value("input/iq_balance", false).toBool()); emit iqBalanceChanged(ui->iqBalanceButton->isChecked()); @@ -297,6 +300,18 @@ bool DockInputCtl::iqSwap(void) return ui->iqSwapButton->isChecked(); } +/** Enable automatic DC blocker. */ +void DockInputCtl::setDcBlock(bool enabled) +{ + ui->dcBlockButton->setChecked(enabled); +} + +/** Get current DC remove status. */ +bool DockInputCtl::dcBlock(void) +{ + return ui->dcBlockButton->isChecked(); +} + /** Enable automatic DC removal. */ void DockInputCtl::setDcCancel(bool enabled) { @@ -385,15 +400,15 @@ void DockInputCtl::setGainStages(gain_list_t &gain_list) gain = (int)(10.0 * gain_list[i].value); label = new QLabel(QString("%1 ").arg(gain_list[i].name.c_str()), this); - label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); + //label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); value = new QLabel(QString(" %1 dB").arg(gain_list[i].value, 0, 'f', 1), this); - value->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); + //value->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); slider = new QSlider(Qt::Horizontal, this); slider->setProperty("idx", i); slider->setProperty("name", QString(gain_list[i].name.c_str())); - slider->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); + //slider->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); slider->setRange(start, stop); slider->setSingleStep(step); slider->setValue(gain); @@ -478,6 +493,15 @@ void DockInputCtl::on_iqSwapButton_toggled(bool checked) emit iqSwapChanged(checked); } +/** + * DC block checkbox changed. + * @param checked True if DC blocker is enabled, false otherwise + */ +void DockInputCtl::on_dcBlockButton_toggled(bool checked) +{ + emit dcBlockChanged(checked); +} + /** * DC removal checkbox changed. * @param checked True if DC removal is enabled, false otherwise @@ -487,6 +511,15 @@ void DockInputCtl::on_dcCancelButton_toggled(bool checked) emit dcCancelChanged(checked); } +/** + * DC removal checkbox changed. + * @param checked True if DC tune is enabled, false otherwise + */ +void DockInputCtl::on_dcTuneButton_toggled(bool checked) +{ + emit dcTuneChanged(checked); +} + /** * IQ balance checkbox changed. * @param checked True if automatic IQ balance is enabled, false otherwise diff --git a/src/qtgui/dockinputctl.h b/src/qtgui/dockinputctl.h index c9a8fb47a..37f6ff411 100644 --- a/src/qtgui/dockinputctl.h +++ b/src/qtgui/dockinputctl.h @@ -84,9 +84,15 @@ class DockInputCtl : public QDockWidget void setIqSwap(bool reversed); bool iqSwap(void); + void setDcBlock(bool enabled); + bool dcBlock(void); + void setDcCancel(bool enabled); bool dcCancel(void); + void setDcTune(bool enabled); + bool dcTune(void); + void setIqBalance(bool enabled); bool iqBalance(void); @@ -111,7 +117,9 @@ public slots: void freqCorrChanged(double value); void lnbLoChanged(double freq_mhz); void iqSwapChanged(bool reverse); + void dcBlockChanged(bool enabled); void dcCancelChanged(bool enabled); + void dcTuneChanged(bool enabled); void iqBalanceChanged(bool enabled); void ignoreLimitsChanged(bool ignore); void antennaSelected(QString antenna); @@ -126,7 +134,9 @@ private slots: void on_agcButton_toggled(bool checked); void on_freqCorrSpinBox_valueChanged(double value); void on_iqSwapButton_toggled(bool checked); + void on_dcBlockButton_toggled(bool checked); void on_dcCancelButton_toggled(bool checked); + void on_dcTuneButton_toggled(bool checked); void on_iqBalanceButton_toggled(bool checked); void on_ignoreButton_toggled(bool checked); void on_antSelector_currentIndexChanged(int index); diff --git a/src/qtgui/dockinputctl.ui b/src/qtgui/dockinputctl.ui index ece2d7d4a..df556d7fe 100644 --- a/src/qtgui/dockinputctl.ui +++ b/src/qtgui/dockinputctl.ui @@ -6,16 +6,605 @@ 0 0 - 240 - 240 + 500 + 159 + + + 0 + 1 + + - 240 - 240 + 500 + 100 + + + + + 524287 + 360 + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + :/icons/icons/flash.svg:/icons/icons/flash.svg @@ -23,219 +612,9787 @@ false + + QDockWidget::NoDockWidgetFeatures + - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea + Qt::LeftDockWidgetArea Input controls - + + + 500 + 81 + + + + + 16777215 + 360 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + - 5 + 0 - 5 + 0 - 5 + 0 - 5 + 0 - 5 + 0 - - - - - LNB LO - - - -1 - - - - - - - - 0 - 0 - - - - Local oscillator of up or down converter - - - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - MHz - - - 6 - - - -500000.000000000000000 - - - 500000.000000000000000 - - - - - - - - - - - <html><head/><body><p>Toggle hardware-based automatic gain control.</p><p>This feature requires hardware that supports it. It is known to work with RTL-SDR devices.</p></body></html> - - - Hardware AGC - - - - - - - - - - - <html><head/><body><p>Swap the the I/Q channels. This can be useful with audio-based input or when dealing with inverted IF.</p></body></html> - - - Swap I/Q - - - false - - - - - - - <html><head/><body><p>Ignore hardware limits such as frequency range. This allows experimenting with out-of-spec settings.</p></body></html> - - - No limits - - - - - - - Enable automatic DC removal - - - DC remove - - - - - - - Enable automatic I/Q balance (requires gr-iqbal component) - - - IQ balance - - - - - - - - - - - Freq. correction - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - ppm - - - 1 - - - -500.000000000000000 - - - 500.000000000000000 - - - 0.000000000000000 - - - - - - - Select active antenna connector - - - Antenna - - - - - - - - 0 - 0 - - - - Select active antenna connector - - - - - - - - - Qt::Horizontal + + + + 0 + 0 + - - - - - - <html><head/><body><p>Reset subordinate digits in main frequency control widget</p></body></html> - - - Reset frequency controller digits + + + 500 + 78 + - - - - - - Invert scroll wheel direction + + + 16777215 + 240 + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + <html><head/><body><p>Swap the the I/Q channels. This can be useful with audio-based input or when dealing with inverted IF.</p></body></html> + + + Swap I/Q + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Select active antenna connector + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + <html><head/><body><p>Reset subordinate digits in main frequency control widget</p></body></html> + + + Reset FQ digits + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ppm + + + 1 + + + -500.000000000000000 + + + 500.000000000000000 + + + 0.000000000000000 + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Local oscillator of up or down converter + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + MHz + + + 6 + + + -500000.000000000000000 + + + 500000.000000000000000 + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + <html><head/><body><p>Toggle hardware-based automatic gain control.</p><p>This feature requires hardware that supports it. It is known to work with RTL-SDR devices.</p></body></html> + + + Hardware AGC + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Freq. correction + + + Qt::AlignCenter + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + <html><head/><body><p>Ignore hardware limits such as frequency range. This allows experimenting with out-of-spec settings.</p></body></html> + + + No limits + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + LNB LO + + + Qt::AlignCenter + + + -1 + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Enable automatic I/Q balance (requires gr-iqbal component) + + + IQ balance + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Select active antenna connector + + + Antenna + + + Qt::AlignCenter + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Enable automatic DC removal + + + DC remove + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Invert scroll + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Enable automatic DC removal + + + DC block + + + true + + + + + + + + 0 + 1 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + Enable automatic DC removal + + + DC tune + + + true + + + + @@ -245,7 +10402,7 @@ - 5 + 20 0 diff --git a/src/qtgui/dockrds.cpp b/src/qtgui/dockrds.cpp index 1ef688a7a..2624ac8c5 100644 --- a/src/qtgui/dockrds.cpp +++ b/src/qtgui/dockrds.cpp @@ -31,7 +31,7 @@ DockRDS::DockRDS(QWidget *parent) : { ui->setupUi(this); - ui->scrollArea->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow); + //ui->scrollArea->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow); } DockRDS::~DockRDS() diff --git a/src/qtgui/dockrds.h b/src/qtgui/dockrds.h index be995b5f3..f4b327452 100644 --- a/src/qtgui/dockrds.h +++ b/src/qtgui/dockrds.h @@ -7,7 +7,6 @@ namespace Ui { class DockRDS; } - class DockRDS : public QDockWidget { Q_OBJECT diff --git a/src/qtgui/dockrds.ui b/src/qtgui/dockrds.ui index 1a2e4ff9b..0be09557f 100644 --- a/src/qtgui/dockrds.ui +++ b/src/qtgui/dockrds.ui @@ -9,23 +9,1203 @@ 0 0 - 215 - 220 + 400 + 60 + + + 1 + 1 + + - 89 - 104 + 400 + 60 + + + + + 1000 + 150 + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 5 + + + + QDockWidget::NoDockWidgetFeatures + - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea + Qt::TopDockWidgetArea RDS + + + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + 5 @@ -43,278 +1223,290 @@ 0 - - - QFrame::NoFrame - - - QFrame::Sunken + + + 1 - - true + + 0 - - - - 0 - 0 - 205 - 201 - - - - - QFormLayout::ExpandingFieldsGrow - - + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + 999.9 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + 9999 + + + + + + + + 0 + 0 + + + + Alt. Frequencies: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Station Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + NineNineNineNine + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + NineNineNineNine + + + + + + + + 0 + 0 + + + + Clock Time: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + 99:99 + + + + + + + + 0 + 0 + + + + Program Type: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Program ID: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + NineNineNineNine + + + + + + + + 0 + 0 + + + + Flags: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + true + + + Qt::StrongFocus + + + Enable or disable decoding of RDS data + + + Qt::RightToLeft + + + Enable RDS + + + + 16 + 16 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + NineNineNineNine + + + + + + + + 0 + 0 + + + + Radio Text: + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - 5 - - - 5 - - - 5 - - - 5 - - - - - Station Name: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - - - - Program Type: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - - - - Program ID: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - Radio Text: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - - - - Clock Time: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - - - Alt. Frequencies: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - - - Flags: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - - - - 0 - 0 - - - - true - - - Qt::StrongFocus - - - Enable or disable decoding of RDS data - - - Enable RDS - - - - - - + + + diff --git a/src/qtgui/dockrxopt.cpp b/src/qtgui/dockrxopt.cpp index 2776936c3..f96810e2a 100644 --- a/src/qtgui/dockrxopt.cpp +++ b/src/qtgui/dockrxopt.cpp @@ -90,13 +90,13 @@ DockRxOpt::DockRxOpt(qint64 filterOffsetRange, QWidget *parent) : ui->modeSelector->addItems(ModulationStrings); #ifdef Q_OS_LINUX - ui->modeButton->setMinimumSize(32, 24); - ui->agcButton->setMinimumSize(32, 24); - ui->autoSquelchButton->setMinimumSize(32, 24); - ui->resetSquelchButton->setMinimumSize(32, 24); - ui->nbOptButton->setMinimumSize(32, 24); - ui->nb2Button->setMinimumSize(32, 24); - ui->nb1Button->setMinimumSize(32, 24); +// ui->modeButton->setMinimumSize(32, 24); +// ui->agcButton->setMinimumSize(32, 24); +// ui->autoSquelchButton->setMinimumSize(32, 24); +// ui->resetSquelchButton->setMinimumSize(32, 24); +// ui->nbOptButton->setMinimumSize(32, 24); +// ui->nb2Button->setMinimumSize(32, 24); +// ui->nb1Button->setMinimumSize(32, 24); #endif ui->filterFreq->setup(7, -filterOffsetRange/2, filterOffsetRange/2, 1, diff --git a/src/qtgui/dockrxopt.ui b/src/qtgui/dockrxopt.ui index 7d6c91e11..031c10ff0 100644 --- a/src/qtgui/dockrxopt.ui +++ b/src/qtgui/dockrxopt.ui @@ -6,746 +6,2263 @@ 0 0 - 280 - 330 + 500 + 140 - - 0 - 0 + + 1 + 1 - 280 - 330 + 500 + 140 524287 - 524287 + 360 + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + :/icons/icons/signal.svg:/icons/icons/signal.svg + + QDockWidget::NoDockWidgetFeatures + - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea + Qt::LeftDockWidgetArea Receiver Options - + + + 0 + 0 + + + + + 500 + 100 + + + + + 16777215 + 360 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + - + - + 0 - 0 + 100 - 0 - 32 + 400 + 100 - - <html><head/><body><p>Channel filter offset.<br/> -This is an offset from the hardware RF frequency.</p></body></html> - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - QLayout::SetDefaultConstraint - - - - - - 0 - 0 - - - - The frequency of the hardware (not including LNB) - - - Hardware freq: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - The frequency of the hardware (not including LNB) - - - 144.500000 MHz - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - 10 - - - 5 + + + 16777215 + 240 + - - - - - 0 - 0 - - - - Squelch level in dB below full scale - - - Squelch - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 50 - 30 - - - - - 16777215 - 16777215 - - - - AGC options - - - AGC options - - - ... - - - - 16 - 16 - - - - false - - - - - - - - 0 - 0 - - - - Demodulator type (mode) - - - Demodulator type (mode) - - - Mode - - - -1 - - - 30 - - - - - - - - 0 - 0 - - - - - 50 - 30 - - - - - 16777215 - 16777215 - - - - Noise blanker options - - - Noise blanker options - - - Noise blanker options - - - ... - - - - - - - true - - - - 0 - 0 - - - - Apply mode dependent filter preset - - - Filter width - - - 1 - - - - Wide + + + 0 + + + 0 + + + 0 + + + 2 + + + 0 + + + + + true - - - - Normal + + + 0 + 0 + - - - - Narrow + + + 0 + 25 + - - - - User - - - - - - - - - 0 - 0 - - - - Mode - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 0 - - - -1 - - - - - - - - 0 - 0 - - - - Noise blanker settings - - - Noise blanker - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - Filter shape - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 50 - 30 - - - - - 16777215 - 16777215 - - - - Demodulator options - - - Mode options - - - ... - - - - 16 - 16 - - - - false - - - - - - - - 0 - 0 - - - - Filter width - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - AGC - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - true - - - - 0 - 0 - - - - AGC presets - - - AGC - - - 1 - - - - Fast + + + 16777215 + 100 + - - - - Medium + + Apply mode dependent filter preset - - - - Slow + + Filter width + + + 1 + + + + Wide + + + + + Normal + + + + + Narrow + + + + + User + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Reset squelch to its default value + + + Auto squelch - - - User + R + + + + 16 + 16 + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Squelch level in dB below full scale - - - Off - - - - - - - - - 0 - 0 - - - - Select the filter shape - - - Filter shape - - - 1 - - + Squelch + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Set squelch to the current signal or noise level + + + Auto squelch + - Soft + A + + + + 16 + 16 + + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + + 7 + + + + Noise blanker settings - - - Normal + Noise blanker + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Qt::LeftToRight - - - Sharp - - - - - - - - 5 - - - - - true - - - - 0 - 0 - - - - - 50 - 30 - - - - - 16777215 - 16777215 - - - - Noise blanker for static type noise - - - - - - Noise blanker 1 - + Mode + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + -1 + + + + + + + true + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + AGC presets + + + AGC + + + 1 + + - NB1 - - - true - - - - - - - true - - - - 0 - 0 - - - - - 50 - 30 - - - - - 16777215 - 16777215 - - - - Noise blanker for pulse type noise - - - - - - Noise blanker 2 + Fast + + - NB2 - - - true - - - - - - - - - Frequency - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Receiver frequency - - - Frequency - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 3 - - - 24000.000000000000000 - - - 2200000.000000000000000 - - - 144500.000000000000000 - - - - - - - kHz - - - - - - - - 0 - 0 - - - - - 50 - 30 - - - - - 16777215 - 16777215 - - - - Reset squelch to its default value - - - Auto squelch - - - R - - - - 16 - 16 - - - - - - - - - - - 0 - 0 - - - - Squelch level in dB below full scale - - - Squelch - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - dB - - - 1 - - - -150.000000000000000 - - - 0.000000000000000 - - - 1.000000000000000 - - - -150.000000000000000 - - - - - - - - 0 - 0 - + Medium - - - 50 - 30 - + + + + Slow - - - 16777215 - 16777215 - + + + + User - - Set squelch to the current signal or noise level + + + + Off - - Auto squelch + + + + + + + true + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Noise blanker for pulse type noise + + + + + + Noise blanker 2 + + + NB2 + + + true + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Demodulator type (mode) + + + Demodulator type (mode) + + + Mode + + + -1 + + + 30 + + + + + + + true + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Noise blanker for static type noise + + + + + + Noise blanker 1 + + + NB1 + + + true + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Select the filter shape + + + Filter shape + + + 1 + + + + Soft + + - A + Normal - - - 16 - 16 - + + + + Sharp - - - - - + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + AGC options + + + AGC options + + + ... + + + + 16 + 16 + + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Noise blanker options + + + Noise blanker options + + + Noise blanker options + + + ... + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Qt::LeftToRight + + + Shape + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + The frequency of the hardware (not including LNB) + + + Qt::LeftToRight + + + HW freq: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + 1 + + + 1.000000000000000 + + + 20.000000000000000 + + + 0.100000000000000 + + + 3.300000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Freq (kHz) + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Qt::LeftToRight + + + Width + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Squelch level in dB below full scale + + + Squelch + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + dB + + + 1 + + + -150.000000000000000 + + + 0.000000000000000 + + + 1.000000000000000 + + + -150.000000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Demodulator options + + + Mode options + + + ... + + + + 16 + 16 + + + + false + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + AGC + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + 1 + + + 15.000000000000000 + + + 0.100000000000000 + + + 2.500000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + Receiver frequency + + + Frequency + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 3 + + + 24000.000000000000000 + + + 2200000.000000000000000 + + + 144500.000000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 400 + 100 + + + + <html><head/><body><p>Channel filter offset.<br/> +This is an offset from the hardware RF frequency.</p></body></html> + + + Qt::LeftToRight + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + The frequency of the hardware (not including LNB) + + + Offset: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 100 + + + + The frequency of the hardware (not including LNB) + + + 144.500000 MHz + + + Qt::AlignCenter + + + + + - + Qt::Vertical + + QSizePolicy::MinimumExpanding + - 10 + 20 0 @@ -762,21 +2279,6 @@ This is an offset from the hardware RF frequency.</p></body></htm 1 - - freqSpinBox - filterCombo - filterShapeCombo - modeSelector - modeButton - agcPresetCombo - agcButton - sqlSpinBox - autoSquelchButton - resetSquelchButton - nb1Button - nb2Button - nbOptButton - diff --git a/src/qtgui/docktouchcontrols.cpp b/src/qtgui/docktouchcontrols.cpp new file mode 100644 index 000000000..4b81b6ee4 --- /dev/null +++ b/src/qtgui/docktouchcontrols.cpp @@ -0,0 +1,147 @@ +/* -*- c++ -*- */ +/* + * Gqrx SDR: Software defined radio receiver powered by GNU Radio and Qt + * https://gqrx.dk/ + * + * Copyright 2011-2016 Alexandru Csete OZ9AEC. + * + * Gqrx 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; either version 3, or (at your option) + * any later version. + * + * Gqrx 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with Gqrx; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +//#include +//#include +//#include +//#include +//#include +#include +#include "docktouchcontrols.h" +#include "ui_docktouchcontrols.h" +DockTouchControls::DockTouchControls(QWidget *parent) : + QDockWidget(parent), + ui(new Ui::DockTouchControls) +{ + ui->setupUi(this); +} +DockTouchControls::~DockTouchControls() +{ + delete ui; +} +void DockTouchControls::pushButton(int key, Qt::KeyboardModifiers modifier, const QString key_str = "") +{ + /* + printf("Key\n"); + + if (QApplication::focusWidget() == nullptr) { + printf("Failed to find focus\n"); + } else { + printf("%d %s %s\n", key, QApplication::focusWidget()->objectName().toStdString().c_str(), key_str.toStdString().c_str()); + } + */ + + QKeyEvent *keyEvent1 = new QKeyEvent(QEvent::KeyPress, key, modifier, key_str); + QApplication::sendEvent(QApplication::focusWidget(), keyEvent1); + + QKeyEvent *keyEvent2 = new QKeyEvent(QEvent::KeyRelease, key, modifier, key_str); + QApplication::sendEvent(QApplication::focusWidget(), keyEvent2); + + delete keyEvent1; + delete keyEvent2; + +} + +// Digits +void DockTouchControls::on_pushButton_d_0_clicked() { DockTouchControls::pushButton(Qt::Key_0, Qt::NoModifier, "0"); } +void DockTouchControls::on_pushButton_d_1_clicked() { DockTouchControls::pushButton(Qt::Key_1, Qt::NoModifier, "1"); } +void DockTouchControls::on_pushButton_d_2_clicked() { DockTouchControls::pushButton(Qt::Key_2, Qt::NoModifier, "2"); } +void DockTouchControls::on_pushButton_d_3_clicked() { DockTouchControls::pushButton(Qt::Key_3, Qt::NoModifier, "3"); } +void DockTouchControls::on_pushButton_d_4_clicked() { DockTouchControls::pushButton(Qt::Key_4, Qt::NoModifier, "4"); } +void DockTouchControls::on_pushButton_d_5_clicked() { DockTouchControls::pushButton(Qt::Key_5, Qt::NoModifier, "5"); } +void DockTouchControls::on_pushButton_d_6_clicked() { DockTouchControls::pushButton(Qt::Key_6, Qt::NoModifier, "6"); } +void DockTouchControls::on_pushButton_d_7_clicked() { DockTouchControls::pushButton(Qt::Key_7, Qt::NoModifier, "7"); } +void DockTouchControls::on_pushButton_d_8_clicked() { DockTouchControls::pushButton(Qt::Key_8, Qt::NoModifier, "8"); } +void DockTouchControls::on_pushButton_d_9_clicked() { DockTouchControls::pushButton(Qt::Key_9, Qt::NoModifier, "9"); } +void DockTouchControls::on_pushButton_d_dec_clicked() { DockTouchControls::pushButton(Qt::Key_Period, Qt::NoModifier, "."); } +void DockTouchControls::on_pushButton_d_back_clicked() { DockTouchControls::pushButton(Qt::Key_Backspace, Qt::NoModifier); } + +// Alphabets +void DockTouchControls::on_pushButton_k_a_clicked() { DockTouchControls::pushButton(Qt::Key_A, Qt::NoModifier, "a"); } +void DockTouchControls::on_pushButton_k_b_clicked() { DockTouchControls::pushButton(Qt::Key_B, Qt::NoModifier, "b"); } +void DockTouchControls::on_pushButton_k_c_clicked() { DockTouchControls::pushButton(Qt::Key_C, Qt::NoModifier, "c"); } +void DockTouchControls::on_pushButton_k_d_clicked() { DockTouchControls::pushButton(Qt::Key_D, Qt::NoModifier, "d"); } +void DockTouchControls::on_pushButton_k_e_clicked() { DockTouchControls::pushButton(Qt::Key_E, Qt::NoModifier, "e"); } +void DockTouchControls::on_pushButton_k_f_clicked() { DockTouchControls::pushButton(Qt::Key_F, Qt::NoModifier, "f"); } +void DockTouchControls::on_pushButton_k_g_clicked() { DockTouchControls::pushButton(Qt::Key_G, Qt::NoModifier, "g"); } +void DockTouchControls::on_pushButton_k_h_clicked() { DockTouchControls::pushButton(Qt::Key_H, Qt::NoModifier, "h"); } +void DockTouchControls::on_pushButton_k_i_clicked() { DockTouchControls::pushButton(Qt::Key_I, Qt::NoModifier, "i"); } +void DockTouchControls::on_pushButton_k_j_clicked() { DockTouchControls::pushButton(Qt::Key_J, Qt::NoModifier, "j"); } +void DockTouchControls::on_pushButton_k_k_clicked() { DockTouchControls::pushButton(Qt::Key_K, Qt::NoModifier, "k"); } +void DockTouchControls::on_pushButton_k_l_clicked() { DockTouchControls::pushButton(Qt::Key_L, Qt::NoModifier, "l"); } +void DockTouchControls::on_pushButton_k_m_clicked() { DockTouchControls::pushButton(Qt::Key_M, Qt::NoModifier, "m"); } +void DockTouchControls::on_pushButton_k_n_clicked() { DockTouchControls::pushButton(Qt::Key_N, Qt::NoModifier, "n"); } +void DockTouchControls::on_pushButton_k_o_clicked() { DockTouchControls::pushButton(Qt::Key_O, Qt::NoModifier, "o"); } +void DockTouchControls::on_pushButton_k_p_clicked() { DockTouchControls::pushButton(Qt::Key_P, Qt::NoModifier, "p"); } +void DockTouchControls::on_pushButton_k_q_clicked() { DockTouchControls::pushButton(Qt::Key_Q, Qt::NoModifier, "q"); } +void DockTouchControls::on_pushButton_k_r_clicked() { DockTouchControls::pushButton(Qt::Key_R, Qt::NoModifier, "r"); } +void DockTouchControls::on_pushButton_k_s_clicked() { DockTouchControls::pushButton(Qt::Key_S, Qt::NoModifier, "s"); } +void DockTouchControls::on_pushButton_k_t_clicked() { DockTouchControls::pushButton(Qt::Key_T, Qt::NoModifier, "t"); } +void DockTouchControls::on_pushButton_k_u_clicked() { DockTouchControls::pushButton(Qt::Key_U, Qt::NoModifier, "u"); } +void DockTouchControls::on_pushButton_k_v_clicked() { DockTouchControls::pushButton(Qt::Key_V, Qt::NoModifier, "v"); } +void DockTouchControls::on_pushButton_k_w_clicked() { DockTouchControls::pushButton(Qt::Key_W, Qt::NoModifier, "w"); } +void DockTouchControls::on_pushButton_k_x_clicked() { DockTouchControls::pushButton(Qt::Key_X, Qt::NoModifier, "x"); } +void DockTouchControls::on_pushButton_k_y_clicked() { DockTouchControls::pushButton(Qt::Key_Y, Qt::NoModifier, "y"); } +void DockTouchControls::on_pushButton_k_z_clicked() { DockTouchControls::pushButton(Qt::Key_Z, Qt::NoModifier, "z"); } + +// Alphabet extra +void DockTouchControls::on_pushButton_k_back_clicked() { DockTouchControls::pushButton(Qt::Key_Backspace, Qt::NoModifier); } +void DockTouchControls::on_pushButton_k_case_clicked() { DockTouchControls::pushButton(Qt::Key_CapsLock, Qt::NoModifier); } +void DockTouchControls::on_pushButton_k_q_mark_clicked() { DockTouchControls::pushButton(Qt::Key_Question, Qt::NoModifier, "?"); } +void DockTouchControls::on_pushButton_k_space_clicked() { DockTouchControls::pushButton(Qt::Key_Space, Qt::NoModifier, " "); } +// Frequency +void DockTouchControls::on_pushButton_fq_down_clicked() { } +void DockTouchControls::on_pushButton_fq_scan_clicked() { } +void DockTouchControls::on_pushButton_fq_up_clicked() { } + +// Squelch +void DockTouchControls::on_pushButton_sq_auto_clicked() { } +void DockTouchControls::on_pushButton_sq_down_clicked() { } +void DockTouchControls::on_pushButton_sq_up_clicked() { } + +// Offset +void DockTouchControls::on_pushButton_offset_down_clicked() { } +void DockTouchControls::on_pushButton_offset_up_clicked() { } + +// Width +void DockTouchControls::on_pushButton_width_down_clicked() { } +void DockTouchControls::on_pushButton_width_up_clicked() { } + +// Up/Down/Enter +void DockTouchControls::on_pushButton_down_clicked() { DockTouchControls::pushButton(Qt::Key_Down, Qt::NoModifier); DockTouchControls::on_pushButton_enter_clicked(); } +void DockTouchControls::on_pushButton_enter_clicked() { DockTouchControls::pushButton(Qt::Key_Enter, Qt::NoModifier); } +void DockTouchControls::on_pushButton_up_clicked() { DockTouchControls::pushButton(Qt::Key_Up, Qt::NoModifier); DockTouchControls::on_pushButton_enter_clicked(); } + +// Controls +void DockTouchControls::on_pushButton_decode_clicked() { } +void DockTouchControls::on_pushButton_gain_clicked() { } +void DockTouchControls::on_pushButton_mod_clicked() { } +void DockTouchControls::on_pushButton_mute_clicked() { } +void DockTouchControls::on_pushButton_record_clicked() { } +void DockTouchControls::on_pushButton_replay_clicked() { } + +// Scan +void DockTouchControls::on_pushButton_scan_custom_clicked() { } +void DockTouchControls::on_pushButton_scan_ems_clicked() { } +void DockTouchControls::on_pushButton_scan_fdpd_clicked() { } +void DockTouchControls::on_pushButton_scan_wx_clicked() { } diff --git a/src/qtgui/docktouchcontrols.h b/src/qtgui/docktouchcontrols.h new file mode 100644 index 000000000..e44d1188b --- /dev/null +++ b/src/qtgui/docktouchcontrols.h @@ -0,0 +1,117 @@ +#ifndef DOCKTOUCHCONTROLS_H +#define DOCKTOUCHCONTROLS_H + +//#include +#include +#include + +namespace Ui { + class DockTouchControls; +} + +class DockTouchControls : public QDockWidget +{ + Q_OBJECT + +public: + explicit DockTouchControls(QWidget *parent = 0); + ~DockTouchControls(); + +signals: + +public slots: + +private slots: + + // Digits + void on_pushButton_d_0_clicked(); + void on_pushButton_d_1_clicked(); + void on_pushButton_d_2_clicked(); + void on_pushButton_d_3_clicked(); + void on_pushButton_d_4_clicked(); + void on_pushButton_d_5_clicked(); + void on_pushButton_d_6_clicked(); + void on_pushButton_d_7_clicked(); + void on_pushButton_d_8_clicked(); + void on_pushButton_d_9_clicked(); + void on_pushButton_d_dec_clicked(); + void on_pushButton_d_back_clicked(); + + // Alphabets + void on_pushButton_k_a_clicked(); + void on_pushButton_k_b_clicked(); + void on_pushButton_k_c_clicked(); + void on_pushButton_k_d_clicked(); + void on_pushButton_k_e_clicked(); + void on_pushButton_k_f_clicked(); + void on_pushButton_k_g_clicked(); + void on_pushButton_k_h_clicked(); + void on_pushButton_k_i_clicked(); + void on_pushButton_k_j_clicked(); + void on_pushButton_k_k_clicked(); + void on_pushButton_k_l_clicked(); + void on_pushButton_k_m_clicked(); + void on_pushButton_k_n_clicked(); + void on_pushButton_k_o_clicked(); + void on_pushButton_k_p_clicked(); + void on_pushButton_k_q_clicked(); + void on_pushButton_k_r_clicked(); + void on_pushButton_k_s_clicked(); + void on_pushButton_k_t_clicked(); + void on_pushButton_k_u_clicked(); + void on_pushButton_k_v_clicked(); + void on_pushButton_k_w_clicked(); + void on_pushButton_k_x_clicked(); + void on_pushButton_k_y_clicked(); + void on_pushButton_k_z_clicked(); + + // Alphabet extra + void on_pushButton_k_back_clicked(); + void on_pushButton_k_case_clicked(); + void on_pushButton_k_q_mark_clicked(); + void on_pushButton_k_space_clicked(); + + // Frequency + void on_pushButton_fq_down_clicked(); + void on_pushButton_fq_scan_clicked(); + void on_pushButton_fq_up_clicked(); + + // Squelch + void on_pushButton_sq_auto_clicked(); + void on_pushButton_sq_down_clicked(); + void on_pushButton_sq_up_clicked(); + + // Offset + void on_pushButton_offset_down_clicked(); + void on_pushButton_offset_up_clicked(); + + // Width + void on_pushButton_width_down_clicked(); + void on_pushButton_width_up_clicked(); + + // Up/Down/Enter + void on_pushButton_down_clicked(); + void on_pushButton_enter_clicked(); + void on_pushButton_up_clicked(); + + // Controls + void on_pushButton_decode_clicked(); + void on_pushButton_gain_clicked(); + void on_pushButton_mod_clicked(); + void on_pushButton_mute_clicked(); + void on_pushButton_record_clicked(); + void on_pushButton_replay_clicked(); + + // Scan + void on_pushButton_scan_custom_clicked(); + void on_pushButton_scan_ems_clicked(); + void on_pushButton_scan_fdpd_clicked(); + void on_pushButton_scan_wx_clicked(); + +private: + Ui::DockTouchControls *ui; + void pushButton(int key, Qt::KeyboardModifiers modifier, const QString key_str); + +}; + +#endif //DOCKTOUCHCONTROLS_H diff --git a/src/qtgui/docktouchcontrols.ui b/src/qtgui/docktouchcontrols.ui new file mode 100644 index 000000000..bc65d9a17 --- /dev/null +++ b/src/qtgui/docktouchcontrols.ui @@ -0,0 +1,3734 @@ + + + DockTouchControls + + + + 0 + 0 + 295 + 402 + + + + + 1 + 1 + + + + + 295 + 402 + + + + + 480 + 872 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + QDockWidget::NoDockWidgetFeatures + + + Qt::RightDockWidgetArea + + + DockWidget + + + + + 1 + 1 + + + + + 295 + 0 + + + + + 590 + 980 + + + + + + + + + 255 + 255 + 255 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 46 + 52 + 54 + + + + + + + 0 + 0 + 0 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 239 + 239 + 239 + + + + + + + 255 + 255 + 255 + + + + + + + 202 + 202 + 202 + + + + + + + 159 + 159 + 159 + + + + + + + 184 + 184 + 184 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 239 + 239 + 239 + + + + + + + 118 + 118 + 118 + + + + + + + 48 + 140 + 198 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 69 + 78 + 81 + + + + + + + 57 + 65 + 67 + + + + + + + 23 + 26 + 27 + + + + + + + 31 + 35 + 36 + + + + + + + 23 + 26 + 27 + + + + + + + 255 + 255 + 255 + + + + + + + 23 + 26 + 27 + + + + + + + 46 + 52 + 54 + + + + + + + 46 + 52 + 54 + + + + + + + 177 + 177 + 177 + + + + + + + 145 + 145 + 145 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + 295 + 0 + + + + + 590 + 980 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + 295 + 0 + + + + + 590 + 450 + + + + + 2 + + + QLayout::SetNoConstraint + + + 0 + + + 0 + + + 2 + + + 0 + + + + + + 1 + 1 + + + + + 210 + 0 + + + + + 16777215 + 16777215 + + + + 0 + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 400 + 348 + + + + Numbers + + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 2 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 3 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 5 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 6 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 4 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 1 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 7 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 8 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 9 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + 0 + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + < + + + + + + + + 1 + 1 + + + + + 30 + 43 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + . + + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + 400 + 348 + + + + Letters + + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + A + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + B + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + K + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + F + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + E + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + C + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + P + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + U + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + D + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + Z + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + G + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + H + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + I + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + J + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + O + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + T + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + Y + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + < + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + case + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + _ + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + ? + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + V + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + W + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + X + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + S + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + R + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + Q + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + L + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + M + + + false + + + + + + + + 1 + 1 + + + + + 35 + 28 + + + + + 16777215 + 16777215 + + + + PointingHandCursor + + + Qt::NoFocus + + + N + + + false + + + + + + + + + + + true + + + + 1 + 1 + + + + Qt::Vertical + + + 20 + + + + + 1 + 1 + + + + + 80 + 0 + + + + + 0 + + + QLayout::SetMaximumSize + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 120 + 16777215 + + + + Qt::NoFocus + + + FQ ↑ + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 120 + 16777215 + + + + Qt::NoFocus + + + Scan + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 120 + 16777215 + + + + Qt::NoFocus + + + FQ ↓ + + + + + + + + + 1 + 1 + + + + + 80 + 0 + + + + + 0 + + + QLayout::SetMinimumSize + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 120 + 16777215 + + + + Qt::NoFocus + + + SQ ↑ + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 120 + 16777215 + + + + Qt::NoFocus + + + Auto + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 120 + 16777215 + + + + Qt::NoFocus + + + SQ ↓ + + + + + + + + + + + + + + + 1 + 1 + + + + + 295 + 0 + + + + + 590 + 80 + + + + + 0 + + + 0 + + + 2 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Width + + + Qt::AlignCenter + + + + + + + + 1 + 1 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Offset + + + Qt::AlignCenter + + + + + + + + 1 + 1 + + + + + 70 + 20 + + + + + 16777215 + 16777215 + + + + QLCDNumber::Flat + + + + + + + + 1 + 1 + + + + + 70 + 20 + + + + + 16777215 + 16777215 + + + + QLCDNumber::Flat + + + + + + + + 1 + 1 + + + + + 30 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + + + + + + + + + 1 + 1 + + + + + 30 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + + + + + + + + + 1 + 1 + + + + + 30 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + + + + + + + + + 1 + 1 + + + + + 30 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + + + + + + + + + + + + 1 + 1 + + + + + 295 + 0 + + + + + 590 + 450 + + + + + 0 + + + 0 + + + 2 + + + 0 + + + 0 + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + Decode + + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + GAIN + + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + Replay +RAW + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + MOD + + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + Mute +DATA + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + scan +CUST + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + Rec +RAW + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + scan +FD\PD + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + scan +EMS + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + scan +WX + + + + + + + + 1 + 1 + + + + + 73 + 0 + + + + + 0 + + + 8 + + + 8 + + + 1 + + + 8 + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 140 + 120 + + + + Qt::NoFocus + + + + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 140 + 120 + + + + Qt::NoFocus + + + Enter + + + + + + + + 1 + 1 + + + + + 60 + 0 + + + + + 140 + 120 + + + + Qt::NoFocus + + + + + + + + + + + + + + + + + + + + + From ad0dd7eff16cb937dbaba2548d47f1678fcdd34c Mon Sep 17 00:00:00 2001 From: shawnj007 <50751738+shawnj007@users.noreply.github.com> Date: Wed, 16 Nov 2022 18:05:16 -0600 Subject: [PATCH 8/8] Plotter bandplan (#3) * Remove unnecessary capture * move sort logic to bandplan.h --- src/qtgui/bandplan.h | 7 +++++++ src/qtgui/plotter.cpp | 20 +++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/qtgui/bandplan.h b/src/qtgui/bandplan.h index 431754219..d40f21196 100644 --- a/src/qtgui/bandplan.h +++ b/src/qtgui/bandplan.h @@ -49,6 +49,13 @@ struct BandInfo bool operator<(const BandInfo &other) const { + if (minFrequency == other.minFrequency) + { + if (maxFrequency != other.maxFrequency) + return maxFrequency > other.maxFrequency; + else + return name < other.name; + } return minFrequency < other.minFrequency; } }; diff --git a/src/qtgui/plotter.cpp b/src/qtgui/plotter.cpp index 21f21b293..e16f211f1 100644 --- a/src/qtgui/plotter.cpp +++ b/src/qtgui/plotter.cpp @@ -751,12 +751,12 @@ void CPlotter::zoomStepX(float step, int x) qint64 new_FftCenter; if( limit_hit ) // cannot keep fixed_hz fixed { - new_FftCenter = qRound64((f_min + f_max) / 2.0) - m_CenterFreq; + new_FftCenter = qRound64((f_min + f_max) / 2.0) - m_CenterFreq; } else // calculate new FFT center frequency that really keeps fixed_hz fixed { - qint64 wouldbe_hz = (m_CenterFreq + m_FftCenter - new_span / 2) + ratio * new_span; - new_FftCenter = m_FftCenter + (fixed_hz - wouldbe_hz); + qint64 wouldbe_hz = (m_CenterFreq + m_FftCenter - new_span / 2) + ratio * new_span; + new_FftCenter = m_FftCenter + (fixed_hz - wouldbe_hz); } setFftCenterFreq(new_FftCenter); setSpanFreq(new_span); @@ -1299,6 +1299,7 @@ void CPlotter::drawOverlay() static const int slant = 5; static const int levelHeight = fontHeight + 5; int nLevels = h / (levelHeight + slant); + if (m_BookmarksEnabled) { tags = Bookmarks::Get().getBookmarksInRange(m_CenterFreq + m_FftCenter - m_Span / 2, @@ -1379,15 +1380,7 @@ void CPlotter::drawOverlay() qint64 last_max = 0; qint64 last_max_0 = 0; - std::sort(bands.begin(), bands.end(), [=]( const BandInfo& band1 , const BandInfo& band2 )->bool { - if (band1.minFrequency == band2.minFrequency) { - if (band1.maxFrequency != band2.maxFrequency) - return band1.maxFrequency > band2.maxFrequency; - else - return band1.name < band2.name; - } - return band1.minFrequency < band2.minFrequency; - }); + std::sort(bands.begin(), bands.end()); for (auto & band : bands) { @@ -1406,14 +1399,15 @@ void CPlotter::drawOverlay() int band_right = xFromFreq(band.maxFrequency); int band_width = band_right - band_left; int band_bottom = bandLevel * m_BandPlanHeight; + rect.setRect(band_left, xAxisTop - m_BandPlanHeight + band_bottom, band_width, m_BandPlanHeight); painter.fillRect(rect, band.color); + QString band_label = band.name + " (" + band.modulation + ")"; int textWidth = metrics.boundingRect(band_label).width(); if (band_left < w && band_width > textWidth + 20) { painter.setOpacity(1.0); - rect.setRect(band_left, xAxisTop - m_BandPlanHeight + band_bottom, band_width, m_BandPlanHeight); painter.setPen(QColor(PLOTTER_TEXT_COLOR)); painter.drawText(rect, Qt::AlignCenter, band_label); }