1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-06-15 04:52:33 -04:00

Compare commits

...

116 Commits

Author SHA1 Message Date
Edouard Griffiths
e22688e462
Merge pull request #2186 from srcejon/freq_scanner
Frequency Scanner: Fix rounding error
2024-06-27 22:59:18 +02:00
srcejon
fd1d411bf0 Frequency Scanner: Fix rounding error that prevent some channels from being scanned, depending on sample rate. 2024-06-27 13:01:06 +01:00
Edouard Griffiths
2baea0364b
Merge pull request #2185 from srcejon/freq_scanner
Update sdrangel-windows-libraries link
2024-06-26 11:29:51 +02:00
srcejon
b4e2943298 Update sdrangel-windows-libraries link to include latest VC redistributable 2024-06-26 09:30:30 +01:00
f4exb
3e909d2016 Updated versions and changelogs 2024-06-25 22:19:14 +02:00
Edouard Griffiths
a4b78fa30e
Merge pull request #2184 from dforsi/fix/cleanup
Fix/cleanup
2024-06-24 10:48:57 +02:00
Daniele Forsi
4bef2355dd Fix more typos 2024-06-23 17:32:49 +02:00
Daniele Forsi
c6526aae49 Fix typos in .md files 2024-06-23 17:32:49 +02:00
Daniele Forsi
a45e4eab0a Fix typos in .yaml files 2024-06-23 17:32:49 +02:00
Daniele Forsi
79deb41ddb Remove resource pointing to non-existing file 2024-06-23 17:32:49 +02:00
Daniele Forsi
98fb7a58d9 Fix class name
Automatically updated by opening the .ui file in Qt Creator.
2024-06-23 17:32:49 +02:00
Daniele Forsi
d8c733cab7 Update properties related to fonts
Automatically updated by opening the .ui file in Qt Creator.
2024-06-23 17:32:49 +02:00
Daniele Forsi
685d30f15a Remove unused resources
Automatically deleted by opening the .ui file in Qt Creator.
2024-06-23 17:32:48 +02:00
Daniele Forsi
5cbc9fd834 Fix warning
Fixes:
 sdrgui/device/deviceuiset.cpp:353:36: 2nd function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage]
2024-06-23 17:32:48 +02:00
Daniele Forsi
1f9c7efcab Remove uneeded unlocks of QMutexLocker
The mutex will get unlocked anyway when falling out of scope.
2024-06-23 17:32:48 +02:00
Daniele Forsi
2b0bcb0d09 Remove duplicated lines 2024-06-23 17:32:48 +02:00
Daniele Forsi
23eae6fda9 Remove unused includes 2024-06-23 17:32:48 +02:00
Daniele Forsi
e4e2588164 Remove unused files 2024-06-23 17:32:48 +02:00
Daniele Forsi
1fd56fdb42 Remove unused files 2024-06-23 17:32:48 +02:00
Daniele Forsi
941e73c561 Add missing close parens 2024-06-23 17:32:48 +02:00
Edouard Griffiths
31c20df7bb
Merge pull request #2182 from dforsi/fix/save-settings
Do not save the settings twice
2024-06-23 02:41:12 +02:00
Daniele Forsi
8a7d1534d8 Do not save the settings twice
Settings are saved in MainWindow::closeEvent() which is called when Sdrangel
is exited by closing its main window, or when using the File/Exit menu (or
Ctrl+Q) or when pressing Alt+F4.
2024-06-22 17:27:40 +02:00
Edouard Griffiths
5070112c18
Merge pull request #2181 from srcejon/freq_scanner
Frequency scanner: Add scan results to channel report. Add run action to API. Add HF ATC.
2024-06-21 15:06:24 +02:00
srcejon
7336cda7bc FreqScanner: Add HF ATC channels preset. 2024-06-21 10:24:36 +01:00
srcejon
28cc7c3f31 FreqScanner: Add API action to run scan. Add scan results to channel report. 2024-06-21 10:24:16 +01:00
srcejon
c1d55b9af1 Add scanState to FreqScanner Report 2024-06-21 10:04:17 +01:00
srcejon
092efb3780 Update FreqScanner swagger files 2024-06-21 09:03:32 +01:00
Edouard Griffiths
4837d3aba3
Merge pull request #2180 from srcejon/freq_scanner
AIS: Validate message length. Fixes #2125
2024-06-21 01:44:44 +02:00
srcejon
5f0fc8fbf7 Configurations dialog: Fix slot names. Sort configs when dialog first opened. 2024-06-20 22:30:39 +01:00
srcejon
1625c42e38 AIS: Validate message length. Fixes #2125 2024-06-20 22:00:15 +01:00
Edouard Griffiths
9e4dc83e74
Merge pull request #2178 from srcejon/freq_scanner
ILS Demod: Save frequency when switching between LOC and G/S. Set frequency for ident when in G/S mode.
2024-06-20 17:58:10 +02:00
srcejon
0488cc622e Merge branch 'freq_scanner' of https://github.com/srcejon/sdrangel into freq_scanner 2024-06-20 10:31:44 +01:00
srcejon
306055faea ILS Demod. Save frequency when switching between LOC and G/S. Set frequency for ident when in G/S mode. Fixes #2177 2024-06-20 10:31:28 +01:00
Edouard Griffiths
fd9e9959f6
Merge pull request #2175 from srcejon/freq_scanner
Heat Map - Add settings to reduce memory requirement
2024-06-18 22:33:46 +02:00
srcejon
78e7fdc473 Fix for Qt5 2024-06-18 16:28:43 +01:00
srcejon
64d75baadf Heat Map: Handle memory allocation errors. Allow selecting which data to be saved to reduce memory requirements. 2024-06-18 16:26:08 +01:00
Edouard Griffiths
deb4feed3b
Merge pull request #2174 from srcejon/freq_scanner
ILS Demod: Add DDM/SDM/Deviation to ILS channel report
2024-06-18 17:20:51 +02:00
srcejon
c62f128ca1 Regenerate swagger API 2024-06-18 09:14:22 +01:00
srcejon
159d46ee36 ILS Demod: Add DDM/SDM/Deviation to channel report. 2024-06-18 09:06:15 +01:00
f4exb
4770e2d281 Updated versions and changelogs 2024-06-18 00:52:36 +02:00
f4exb
65a5f98d88 Github actions: upgraded actions/checkout to v4 2024-06-18 00:18:45 +02:00
Edouard Griffiths
36a33bb8ea
Merge pull request #2173 from srcejon/freq_scanner
Update sdrangel-windows-libraries to latest revision
2024-06-17 16:07:41 +02:00
srcejon
f5dc0e3d3d Update sdrangel-windows-libraries to latest revision 2024-06-17 14:06:13 +01:00
Edouard Griffiths
9aacea3d59
Merge pull request #2172 from srcejon/freq_scanner
SDRplayV3Input: Add SDRPLAY_RSPdxR2_ID support.
2024-06-17 13:59:57 +02:00
srcejon
87dba4d26e SDRplayV3Input: Add SDRPLAY_RSPdxR2_ID support. 2024-06-17 10:07:53 +01:00
Edouard Griffiths
741f1f7c87
Merge pull request #2170 from dforsi/fix/tooltips
Fix tooltips
2024-06-17 08:31:19 +02:00
f4exb
b1ef05667e Build WDSP for Linux only 2024-06-17 02:21:14 +02:00
f4exb
c81ff5060c Do not build WDSP for Apple 2024-06-17 01:16:23 +02:00
Daniele Forsi
ea04742685 Make tooltips more uniform 2024-06-16 23:38:33 +02:00
Daniele Forsi
322296f1af Add missing tooltips 2024-06-16 23:38:33 +02:00
Daniele Forsi
bf74dc53e0 Fix tooltips 2024-06-16 23:38:33 +02:00
Daniele Forsi
406bb674c5 Fix typos 2024-06-16 23:38:33 +02:00
f4exb
cd4ad2cc95 Refactored WDSP initial commit 2024-06-16 19:14:31 +02:00
Edouard Griffiths
98baa03619
Merge pull request #2169 from srcejon/mac_arm64
SDRplay 3.15 updates
2024-06-16 19:13:38 +02:00
Jon Beniston
625027c35e Update external/windows to latest sdrangel-windows-libraries 2024-06-16 10:02:28 +01:00
Jon Beniston
c7a27bfa07 Update SDRplay API to 3.15 on Mac 2024-06-16 09:56:42 +01:00
Edouard Griffiths
5821171398
Merge pull request #2168 from choumarin/patch-1
Fix typo in ILS freq
2024-06-16 07:05:53 +02:00
f4exb
ab28672c95 Fix Ubuntu build 2024-06-16 03:17:56 +02:00
Christian
8742904d7d
Fix typo in ILS freq 2024-06-15 13:50:54 -07:00
Edouard Griffiths
cc420c3c4b
Merge pull request #2160 from srcejon/freq_scanner
Remove use of deprecated QRegExp.
2024-06-10 18:58:07 +02:00
srcejon
41716632d4 Remove use of deprecated QRegExp. 2024-06-10 14:01:57 +01:00
f4exb
4f822b4daf Fixed MSVC version detection 2024-06-10 04:07:58 +02:00
Edouard Griffiths
1034e3aa99
Merge pull request #2157 from dforsi/fix/memleaks
Fix memleaks
2024-06-10 01:03:17 +02:00
Daniele Forsi
b1a460fca8 Fix memleaks
Frees memory allocated
in SpectrumMeasurements::createPeakTable(int) .../sdrgui/gui/spectrummeasurements.cpp:303
in SpectrumMeasurements::createPeakTable(int) .../sdrgui/gui/spectrummeasurements.cpp:304
2024-06-09 20:23:39 +02:00
Daniele Forsi
31ad607721 Fix memleaks
Frees memory allocated
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2126
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2128
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2129
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2130
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2131
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2132
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2133
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2134
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2135
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2136
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2137
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2138
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2139
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2140
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2141
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2142
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2143
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2144
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2145
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2146
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2147
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2148
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2149
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2150
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2153
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2154
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2155
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2156
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2157
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2158
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2159
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2160
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2161
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2190
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2191
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2192
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/radioastronomy/radioastronomygui.cpp:2193
and a comment :)
2024-06-09 20:22:33 +02:00
Daniele Forsi
2fff671a33 Add a parent pointer to TimeDeltaDelegate, HMSDelegate and DMSDelegate 2024-06-09 20:22:33 +02:00
Daniele Forsi
3849b1806f Fix memleaks
Frees memory allocated
in FreqScannerGUI::FreqScannerGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/freqscanner/freqscannergui.cpp:499
in FreqScannerGUI::FreqScannerGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/freqscanner/freqscannergui.cpp:500
in FreqScannerGUI::FreqScannerGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/freqscanner/freqscannergui.cpp:501
in FreqScannerGUI::FreqScannerGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/freqscanner/freqscannergui.cpp:502
in FreqScannerGUI::FreqScannerGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/freqscanner/freqscannergui.cpp:503
2024-06-09 00:25:13 +02:00
Daniele Forsi
055c03c2b7 Fix memleaks
Frees memory allocated in
in NoiseFigureGUI::NoiseFigureGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/noisefigure/noisefiguregui.cpp:600
in NoiseFigureGUI::NoiseFigureGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/noisefigure/noisefiguregui.cpp:660
in NoiseFigureGUI::NoiseFigureGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/noisefigure/noisefiguregui.cpp:661
in NoiseFigureGUI::NoiseFigureGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/noisefigure/noisefiguregui.cpp:662
in NoiseFigureGUI::NoiseFigureGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/noisefigure/noisefiguregui.cpp:663
in NoiseFigureGUI::NoiseFigureGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/noisefigure/noisefiguregui.cpp:664
2024-06-08 23:01:03 +02:00
Daniele Forsi
79db899dff Fix memleaks
Frees memory allocated
in NavtexDemodGUI::NavtexDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodnavtex/navtexdemodgui.cpp:528
in NavtexDemodGUI::NavtexDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodnavtex/navtexdemodgui.cpp:529
2024-06-08 22:55:08 +02:00
Daniele Forsi
df42b3019c Fix memleak
Frees memory allocated
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:650
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:651
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:652
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:653
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:654
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:655
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:656
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:657
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:658
in RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) ...sdrangel/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp:659
2024-06-08 22:32:29 +02:00
Daniele Forsi
11a672161d Fix memleak
Frees memory allocated
in DSCDemodGUI::DSCDemodGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) .../plugins/channelrx/demoddsc/dscdemodgui.cpp:571
2024-06-08 21:46:39 +02:00
Daniele Forsi
52f3618e56 Fix memleak
Frees memory allocated
in ChannelWebAPIUtils::getCenterFrequency(unsigned int, double&) .../sdrbase/channel/channelwebapiutils.cpp:340
2024-06-08 21:46:23 +02:00
f4exb
1b2a549463 Updated versions and changelogs 2024-06-06 22:10:04 +02:00
Edouard Griffiths
6989b76902
Enabled back the Morse Decoder in Windows build. For #2152 2024-06-06 11:55:14 +02:00
Edouard Griffiths
e381f0b3e4
Merge pull request #2151 from dforsi/feature/satellitetrackersettings
Add a button to reset the list of TLEs to defaults compiled in Sdrangel
2024-06-06 05:57:52 +02:00
Daniele Forsi
bbf65831f7 Satellite Tracker Settings: add missing help description of Replay tab 2024-06-05 21:38:10 +02:00
Daniele Forsi
d57fbc866b Satellite Tracker Settings: update help page for new button 2024-06-05 21:19:38 +02:00
Daniele Forsi
7281e238d9 Satellite Tracker Settings: add a button to reset the list of TLEs 2024-06-05 20:17:44 +02:00
Daniele Forsi
aeab5d9229 Move defines to the header so they can be reused elsewhere 2024-06-05 00:09:58 +02:00
Daniele Forsi
07721385f1 Factor out the code that updates the widget containing the list of TLEs 2024-06-05 00:09:58 +02:00
Daniele Forsi
e95cf97c42 Use https for all addresses 2024-06-05 00:09:11 +02:00
Edouard Griffiths
c3b7fd2784
Merge pull request #2149 from srcejon/freq_scanner
CUDAvkFFTEngine: Add required include.
2024-06-04 15:36:33 +02:00
srcejon
f49a0ec796 Set CMAKE_PREFIX_PATH to include ffmpeg@5. 2024-06-04 11:28:56 +01:00
srcejon
f5a1ef47b5 Github mac CI: Try ffmpeg@5 2024-06-04 08:58:06 +01:00
srcejon
a7969adfe9 CUDAvkFFTEngine: Add required include. 2024-06-04 08:11:34 +01:00
Edouard Griffiths
523be287ad
Merge pull request #2133 from dforsi/fix/memleaks
Fix memleaks
2024-06-03 17:58:13 +02:00
Edouard Griffiths
59fa653bd8
Merge pull request #2148 from dforsi/fix/layout
Remove extra margins from some dialogs
2024-06-03 09:43:45 +02:00
Daniele Forsi
4c32c19308 Remove extra margins from some dialogs
Makes the margins of the Configurations dialog, the Feature Presets dialog
and the Plugin Presets dialog similar to the Device Set Presets dialog,
2024-06-02 23:59:01 +02:00
f4exb
ade3eedfa5 SDRPlay v1: fix setting of hardware flavour. Fixes #2127 2024-06-02 03:27:52 +02:00
f4exb
cfc0114c87 Audio Input: list plugin as a built in device so that it can be instantiated multiple times. Fixes #2143 2024-06-02 03:27:52 +02:00
f4exb
524bfd447d Do not exit after listing available devices. Fixes #2144 2024-06-02 03:27:52 +02:00
Edouard Griffiths
209e3a9ecb
Merge pull request #2146 from godsic/bugfix/soapy-cmake
Fix and refactor FindSoapySDR.cmake
2024-06-02 02:25:53 +02:00
Edouard Griffiths
f6425af84d
Merge pull request #2145 from dforsi/fix/typos
Fix error message
2024-06-02 01:31:16 +02:00
Edouard Griffiths
e5003af211
Merge pull request #2142 from dforsi/fix/device-names
Rename some input devices for consistency
2024-06-01 22:43:41 +02:00
Mykola Dvornik
4252592045 Fix and refactor FindSoapySDR.cmake 2024-06-01 19:25:42 +02:00
Daniele Forsi
710ad0b9e3 Fix error message
All long options must be specified with two hypens.
2024-06-01 16:57:24 +02:00
Daniele Forsi
fd2959a878 Rename some input devices for consistency 2024-06-01 12:37:54 +02:00
f4exb
03bb11b869 Morse Decoder: returm to the original GGMorse library 2024-06-01 10:00:10 +02:00
Edouard Griffiths
4cf54cb9a5
Merge pull request #2138 from mxi-box/bugfix
Bugfix: ADS-B demodulate & WFM modulate
2024-05-30 16:54:09 +02:00
mxi-box
ac00e5b46b Fix WFM mod: remove feedback sink 2024-05-30 21:21:03 +08:00
mxi-box
a99082bda9 Fix ADSB demod: Message length 2024-05-30 21:18:41 +08:00
Edouard Griffiths
c913b20a27
Merge pull request #2136 from mxi-box/sigmf_fix
Fix Sigmf Record: overwriting sigmf-data or sigmf-meta
2024-05-30 00:23:24 +02:00
mxi-box
10aae9cfd4 Fix Sigmf Record: overwriting sigmf-data or sigmf-meta 2024-05-30 03:49:08 +08:00
Daniele Forsi
cf0e129165 Fix memleaks of QNetworkAccessManager()
Frees memory allocated
in AudioOutputPlugin::createSampleSinkPluginInstance(QString const&, DeviceAPI*) /home//sdrangel/plugins/samplesink/audiooutput/audiooutputplugin.cpp:136
in ChirpChatDemod::ChirpChatDemod(DeviceAPI*) /home/sdrangel/plugins/channelrx/demodchirpchat/chirpchatdemod.cpp:84
in FileOutput::FileOutput(DeviceAPI*) /home/sdrangel/plugins/samplesink/fileoutput/fileoutput.cpp:54
in RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI*, DeviceUISet*, BasebandSampleSink*, QWidget*) /home/sdrangel/plugins/channelrx/radioastronomy/radioastronomygui.cpp:2061
in SatelliteSelectionDialog::SatelliteSelectionDialog(SatelliteTrackerSettings*, QHash<QString, SatNogsSatellite*> const&, QWidget*) /home/sdrangel/plugins/feature/satellitetracker/satelliteselectiondialog.cpp:42:24
in SatelliteTracker::SatelliteTracker(WebAPIAdapterInterface*) /home/sdrangel/plugins/feature/satellitetracker/satellitetracker.cpp:61:24
2024-05-28 19:24:02 +02:00
Daniele Forsi
302f99382a Fix memleaks
Frees memory allocated
in ChannelPowerSink::applyChannelSettings(int, int, bool) /home/daniele/Programmazione/ham/sdrangel/plugins/channelrx/channelpower/channelpowersink.cpp:120
2024-05-26 22:10:32 +02:00
Daniele Forsi
8b5a5b7f70 Fix memleaks
Frees memory allocated
in TVScreenAnalog::initializeGL() /home/daniele/Programmazione/ham/sdrangel/sdrgui/gui/tvscreenanalog.cpp:232
in TVScreenAnalog::initializeTextures(TVScreenAnalogBuffer*) /home/daniele/Programmazione/ham/sdrangel/sdrgui/gui/tvscreenanalog.cpp:285
in TVScreenAnalog::initializeTextures(TVScreenAnalogBuffer*) /home/daniele/Programmazione/ham/sdrangel/sdrgui/gui/tvscreenanalog.cpp:286
2024-05-26 22:10:32 +02:00
Daniele Forsi
98abefc68b Fix memleaks
Frees memory allocated
in SkyMapGUI::SkyMapGUI(PluginAPI*, FeatureUISet*, Feature*, QWidget*) sdrangel/plugins/feature/skymap/skymapgui.cpp:215
2024-05-26 22:10:26 +02:00
Edouard Griffiths
bace0951bb
Merge pull request #2126 from dforsi/feature/highlight
Highlight the current workspace and device in their dialogs
2024-05-26 18:04:23 +00:00
Edouard Griffiths
7939197f9d
Merge pull request #2124 from dforsi/fix/webapi
Add missing .yaml files to webapi.qrc
2024-05-26 15:34:05 +00:00
Edouard Griffiths
4f9f1dc602
Merge pull request #2123 from srcejon/mac_arm64
Fix ggmorse paths on mac
2024-05-26 13:03:08 +00:00
Jon Beniston
3da44b79b5 Install subversion for Mac build 2024-05-26 13:21:36 +01:00
Daniele Forsi
af712de404 Highlight the current workspace 2024-05-26 12:31:40 +02:00
Daniele Forsi
c7c0247f81 Highlight the current device 2024-05-26 12:31:40 +02:00
Daniele Forsi
efa2f75170 [webapi] Sort some files by name in the resources file
Makes it easier to see if some file is missing.
2024-05-25 19:40:10 +02:00
Daniele Forsi
1e517a68e8 [webapi] Add missing files to resources file
Fixes:
2024-05-25 18:42:35.213 (W) StaticFileController::service: File :/webapi/doc/swagger/include/SID.yaml not found
2024-05-25 18:42:35.221 (W) StaticFileController::service: File :/webapi/doc/swagger/include/SkyMap.yaml not found
2024-05-25 18:42:35.370 (W) StaticFileController::service: File :/webapi/doc/swagger/include/ChannelPower.yaml not found
2024-05-25 18:42:35.403 (W) StaticFileController::service: File :/webapi/doc/swagger/include/FreqScanner.yaml not found
2024-05-25 18:42:35.403 (W) StaticFileController::service: File :/webapi/doc/swagger/include/EndOfTrainDemod.yaml not found
2024-05-25 18:42:35.444 (W) StaticFileController::service: File :/webapi/doc/swagger/include/FT8Demod.yaml not found
2024-05-25 18:42:35.485 (W) StaticFileController::service: File :/webapi/doc/swagger/include/M17Mod.yaml not found
2024-05-25 19:13:16.040 (W) StaticFileController::service: File :/webapi/doc/swagger/include/MorseDecoder.yaml not found
2024-05-25 19:39:32 +02:00
Jon Beniston
2d3dc836dd Fix ggmorse paths on mac 2024-05-24 16:37:27 +01:00
432 changed files with 56452 additions and 2321 deletions

View File

@ -31,7 +31,7 @@ jobs:
generators: Ninja
}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
@ -81,7 +81,7 @@ jobs:
cmd "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
choco install patch
mkdir build && cd build
cmake .. -G "${{ matrix.config.generators }}" -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DENABLE_FEATURE_MORSEDECODER=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\5.15.2\msvc2019_64;C:\Libraries\boost_1_73_0"
cmake .. -G "${{ matrix.config.generators }}" -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\5.15.2\msvc2019_64;C:\Libraries\boost_1_73_0"
cmake --build . --config Release --target package
- name: Check disk space
run: Get-PSDrive
@ -102,7 +102,7 @@ jobs:
build_mac:
runs-on: macos-13
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
@ -121,11 +121,11 @@ jobs:
rm -f /usr/local/bin/2to3
brew install opencv
- name: Install brew packages
run: brew install nasm boost hidapi libusb fftw faad2 zlib airspy airspyhf hackrf rtl-sdr libbladerf soapysdr qt
run: brew install nasm boost hidapi libusb fftw ffmpeg@5 faad2 zlib airspy airspyhf hackrf rtl-sdr libbladerf soapysdr qt subversion
- name: Configure SDRangel
run: |
mkdir build && cd build
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=nehalem -DDEBUG_OUTPUT=ON -DENABLE_CHANNELRX_DEMODDATV=OFF -DENABLE_CHANNELTX_MODDATV=OFF -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=AUTO -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DARCH_OPT=nehalem -DDEBUG_OUTPUT=ON -DENABLE_CHANNELRX_DEMODDATV=OFF -DENABLE_CHANNELTX_MODDATV=OFF -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=AUTO -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE -DCMAKE_PREFIX_PATH="/usr/local/opt/ffmpeg@5/"
- name: Get filename
id: get_filename
run: echo "filename=$(grep CPACK_PACKAGE_FILE_NAME build/CMakeCache.txt | cut -d "=" -f2)" >> $GITHUB_OUTPUT

8
.gitignore vendored
View File

@ -43,4 +43,10 @@ obj-x86_64-linux-gnu/*
/rescuesdriq/vendor/
/rescuesdriq/Godeps/
/.vs
/.vs
# WDSP
wdsp/*.o
wdsp/*.h
wdsp/*.c
wdsp/Makefile

View File

@ -1,3 +1,63 @@
sdrangel (7.21.4-1) unstable; urgency=medium
* Code fixes. PR #2184
* Do not save the settings twice. PR #2182
* FreqScanner: Add HF ATC channels preset. PR #2181
* FreqScanner: Add API action to run scan. Add scan results to channel report. PR #2181
* FreqScanner: Add scanState to FreqScanner Report. PR #2181
* Configurations dialog: Fix slot names. PR #2180
* AIS: Validate message length. Fixes #2125. PR #2180
* ILS Demod. Save frequency when switching between LOC and G/S. PR #2180
* ILS Demod. Set frequency for ident when in G/S mode. Fixes #2177. PR #2180
* Heat Map: Handle memory allocation errors. PR #2175
* Heat Map: Allow selecting which data to be saved to reduce memory requirements. PR #2175
* ILS Demod: Add DDM/SDM/Deviation to channel report. PR #2174
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Tue, 25 Jun 2024 20:17:52 +0200
sdrangel (7.21.3-1) unstable; urgency=medium
* Update sdrangel-windows-libraries to latest revision. PR #2173 fixes #2155
* SDRplayV3Input: Add SDRPLAY_RSPdxR2_ID support. PR #2172 fixes #2155
* Fix tooltips. PR #2170
* Update external/windows to latest sdrangel-windows-libraries. PR #2169
* Update SDRplay API to 3.15 on Mac. PR #2169
* Fix typo in ILS freq. PR #2168
* Remove use of deprecated QRegExp. PR #2160
* Fix memleaks. PR #2157
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mon, 17 Jun 2024 22:30:17 +0200
sdrangel (7.21.2-1) unstable; urgency=medium
* Morse Decoder feature: build for Windows. Issue #2152
* Satellite Tracker Settings: add missing help description of Replay tab, PR #2151
* Satellite Tracker Settings: update help page for new button. PR #2151
* Satellite Tracker Settings: add a button to reset the list of TLE. PR #2151
* Move defines to the header so they can be reused elsewhere. PR #2151
* Factor out the code that updates the widget containing the list of TLEs. PR #2151
* Use https for all addresses. PR #2151
* Set CMAKE_PREFIX_PATH to include ffmpeg@5. PR #2149
* Github mac CI: Try ffmpeg@5. PR #2149
* CUDAvkFFTEngine: Add required include.. PR #2149
* Fix memleaks. PR #2133
* Remove extra margins from some dialog. PR #2148
* SDRPlay v1: fix setting of hardware flavour. Fixes #2127
* Audio Input: list plugin as a built in device for multiple times instantiation. Fixes #2143
* Do not exit after listing available devices. Fixes #2144
* Fix and refactor FindSoapySDR.cmake. PR #2146
* Morse Decoder: returm to the original GGMorse library
* Fix WFM mod: remove feedback sink. PR #2138
* Fix ADSB demod: Message length. PR #2138
* Fix Sigmf Record: overwriting sigmf-data or sigmf-meta. PR #2136
* Highlight the current workspace and device. PR #2126
* Web API: Sort some files by name in the resources file. PR #2124
* Web API: Add missing files to resources file. PR #2124
* Install subversion for Mac build. PR #2123
* Fix ggmorse paths on ma. PR #2123
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Fri, 06 Jun 2024 20:09:11 +0200
sdrangel (7.21.1-1) unstable; urgency=medium
* Morse Decoder feature: Fix for Qt6 and Windows. PR #2122

View File

@ -20,7 +20,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# configure version
set(sdrangel_VERSION_MAJOR "7")
set(sdrangel_VERSION_MINOR "21")
set(sdrangel_VERSION_PATCH "1")
set(sdrangel_VERSION_PATCH "4")
set(sdrangel_VERSION_SUFFIX "")
# SDRAngel cmake options
@ -307,7 +307,7 @@ elseif(APPLE)
elseif (WIN32)
# check compiler version
message(STATUS "MSVC_VERSION is ${MSVC_VERSION}")
if(MSVC_VERSION GREATER_EQUAL 1930 AND MSVC_VERSION LESS 1940)
if(MSVC_VERSION GREATER_EQUAL 1930)
set(VS2022 ON)
elseif(MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1930)
set(VS2019 ON)
@ -859,6 +859,12 @@ if (FFTW3F_FOUND)
set(FT8_SUPPORT ON CACHE INTERNAL "")
endif()
if (FFTW3F_FOUND AND LINUX)
add_subdirectory(wdsp)
add_definitions(-DHAS_WDSP)
set(WDSP_SUPPORT ON CACHE INTERNAL "")
endif()
add_subdirectory(sdrbench)
if (BUILD_GUI)

View File

@ -199,7 +199,7 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
{
// List available physical devices and exit
RemoteTCPSinkStarter::listAvailableDevices();
exit (EXIT_SUCCESS);
return EXIT_SUCCESS;
}
if (parser.getRemoteTCPSink()) {
@ -247,7 +247,9 @@ int main(int argc, char* argv[])
int res = runQtApplication(argc, argv, logger);
delete logger;
if (logger) {
delete logger;
}
qWarning("SDRangel quit.");
return res;

View File

@ -9,44 +9,45 @@ if(NOT SOAPYSDR_FOUND)
set(${VERSION} "${CMAKE_MATCH_1}" PARENT_SCOPE)
endfunction(_SOAPY_SDR_GET_ABI_VERSION)
pkg_search_module (LIBSOAPYSDR_PKG soapysdr>=0.4.0 SoapySDR>=0.4.0)
pkg_search_module (SOAPYSDR SoapySDR>=0.4.0)
if(NOT LIBSOAPYSDR_PKG_FOUND OR (DEFINED SOAPYSDR_DIR))
if(NOT SOAPYSDR_FOUND OR (DEFINED SOAPYSDR_DIR))
find_path (SOAPYSDR_INCLUDE_DIR
find_path (SOAPYSDR_INCLUDE_DIRS
NAMES SoapySDR/Version.h
HINTS ${SOAPYSDR_DIR}/include
${LIBSOAPYSDR_PKG_INCLUDE_DIRS}
PATHS /usr/include
/usr/local/include
)
)
find_library (SOAPYSDR_LIBRARY
find_library (SOAPYSDR_LINK_LIBRARIES
NAMES SoapySDR
HINTS ${SOAPYSDR_DIR}/lib
${SOAPYSDR_DIR}/lib64
${CMAKE_INSTALL_PREFIX}/lib
${CMAKE_INSTALL_PREFIX}/lib64
${LIBSOAPYSDR_PKG_LIBRARY_DIRS}
PATHS /usr/local/lib
/usr/local/lib64
/usr/lib
/usr/lib64
)
)
if (SOAPYSDR_INCLUDE_DIR AND SOAPYSDR_LIBRARY)
if (SOAPYSDR_INCLUDE_DIRS AND SOAPYSDR_LINK_LIBRARIES)
set(SOAPYSDR_FOUND TRUE)
# get the root of SoapySDR; used on cpack
string(REGEX REPLACE "/lib/.*${CMAKE_SHARED_LIBRARY_SUFFIX}" "" SOAPYSDR_ROOT ${SOAPYSDR_LIBRARY})
# get the soapy version; to using FindPkgConfig because we can use SOAPYSDR_DIR
_SOAPY_SDR_GET_ABI_VERSION(SOAPYSDR_ABI_VERSION ${SOAPYSDR_INCLUDE_DIR})
message (STATUS "Found SoapySDR: ${SOAPYSDR_INCLUDE_DIR}, ${SOAPYSDR_LIBRARY}")
else()
message (STATUS "SoapySDR not found")
string(REGEX REPLACE "/lib/.*${CMAKE_SHARED_LIBRARY_SUFFIX}" "" SOAPYSDR_LIBDIR ${SOAPYSDR_LINK_LIBRARIES})
# get the soapy version
_SOAPY_SDR_GET_ABI_VERSION(SOAPYSDR_VERSION ${SOAPYSDR_INCLUDE_DIRS})
endif()
mark_as_advanced(SOAPYSDR_INCLUDE_DIR SOAPYSDR_LIBRARY SOAPYSDR_ROOT SOAPYSDR_ABI_VERSION)
endif(NOT SOAPYSDR_FOUND OR (DEFINED SOAPYSDR_DIR))
endif(NOT LIBSOAPYSDR_PKG_FOUND OR (DEFINED SOAPYSDR_DIR))
if (SOAPYSDR_FOUND)
message (STATUS "Found SoapySDR: version ${SOAPYSDR_VERSION}, ${SOAPYSDR_LIBDIR}, ${SOAPYSDR_INCLUDE_DIRS}, ${SOAPYSDR_LINK_LIBRARIES}")
else()
message (STATUS "SoapySDR not found")
endif()
mark_as_advanced(SOAPYSDR_INCLUDE_DIRS SOAPYSDR_LINK_LIBRARIES SOAPYSDR_LIBDIR SOAPYSDR_VERSION)
endif(NOT SOAPYSDR_FOUND)

View File

@ -4,7 +4,7 @@ cd $HOME
mkdir -p external && cd external
mkdir -p f4exb && cd f4exb
git clone https://github.com/f4exb/ggmorse.git
git clone https://github.com/ggerganov/ggmorse.git
cd ggmorse
mkdir -p build && cd build

View File

@ -4,4 +4,5 @@ mkdir -p sdrplayapi && cd sdrplayapi
git clone https://github.com/srcejon/sdrplayapi.git
cd sdrplayapi
sed -i s/more\ -d/cat/ install_lib.sh
sudo yes | bash install_lib.sh

View File

@ -43,11 +43,11 @@ if(APPLE AND BUNDLE AND BUILD_GUI)
# probably libmirsdrapi-rsp.dylib can't be re-distribuited
# we remove the file at the end of fixup_bundle
if(ENABLE_SOAPYSDR AND SOAPYSDR_FOUND)
set(SOAPY_SDR_MOD_PATH "${SOAPYSDR_ROOT}/lib/SoapySDR/modules${SOAPYSDR_ABI_VERSION}")
set(SOAPY_SDR_MOD_PATH "${SOAPYSDR_LIBDIR}/lib/SoapySDR/modules${SOAPYSDR_VERSION}")
file(GLOB SOAPY_MODS ${SOAPY_SDR_MOD_PATH}/*.so)
foreach(SOAPY_MOD_FILE ${SOAPY_MODS})
install( FILES "${SOAPY_MOD_FILE}"
DESTINATION "../Frameworks/SoapySDR/modules${SOAPYSDR_ABI_VERSION}"
DESTINATION "../Frameworks/SoapySDR/modules${SOAPYSDR_VERSION}"
COMPONENT Runtime
)
endforeach()

60
debian/changelog vendored
View File

@ -1,3 +1,63 @@
sdrangel (7.21.4-1) unstable; urgency=medium
* Code fixes. PR #2184
* Do not save the settings twice. PR #2182
* FreqScanner: Add HF ATC channels preset. PR #2181
* FreqScanner: Add API action to run scan. Add scan results to channel report. PR #2181
* FreqScanner: Add scanState to FreqScanner Report. PR #2181
* Configurations dialog: Fix slot names. PR #2180
* AIS: Validate message length. Fixes #2125. PR #2180
* ILS Demod. Save frequency when switching between LOC and G/S. PR #2180
* ILS Demod. Set frequency for ident when in G/S mode. Fixes #2177. PR #2180
* Heat Map: Handle memory allocation errors. PR #2175
* Heat Map: Allow selecting which data to be saved to reduce memory requirements. PR #2175
* ILS Demod: Add DDM/SDM/Deviation to channel report. PR #2174
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Tue, 25 Jun 2024 20:17:52 +0200
sdrangel (7.21.3-1) unstable; urgency=medium
* Update sdrangel-windows-libraries to latest revision. PR #2173 fixes #2155
* SDRplayV3Input: Add SDRPLAY_RSPdxR2_ID support. PR #2172 fixes #2155
* Fix tooltips. PR #2170
* Update external/windows to latest sdrangel-windows-libraries. PR #2169
* Update SDRplay API to 3.15 on Mac. PR #2169
* Fix typo in ILS freq. PR #2168
* Remove use of deprecated QRegExp. PR #2160
* Fix memleaks. PR #2157
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mon, 17 Jun 2024 22:30:17 +0200
sdrangel (7.21.2-1) unstable; urgency=medium
* Morse Decoder feature: build for Windows. Issue #2152
* Satellite Tracker Settings: add missing help description of Replay tab, PR #2151
* Satellite Tracker Settings: update help page for new button. PR #2151
* Satellite Tracker Settings: add a button to reset the list of TLE. PR #2151
* Move defines to the header so they can be reused elsewhere. PR #2151
* Factor out the code that updates the widget containing the list of TLEs. PR #2151
* Use https for all addresses. PR #2151
* Set CMAKE_PREFIX_PATH to include ffmpeg@5. PR #2149
* Github mac CI: Try ffmpeg@5. PR #2149
* CUDAvkFFTEngine: Add required include.. PR #2149
* Fix memleaks. PR #2133
* Remove extra margins from some dialog. PR #2148
* SDRPlay v1: fix setting of hardware flavour. Fixes #2127
* Audio Input: list plugin as a built in device for multiple times instantiation. Fixes #2143
* Do not exit after listing available devices. Fixes #2144
* Fix and refactor FindSoapySDR.cmake. PR #2146
* Morse Decoder: returm to the original GGMorse library
* Fix WFM mod: remove feedback sink. PR #2138
* Fix ADSB demod: Message length. PR #2138
* Fix Sigmf Record: overwriting sigmf-data or sigmf-meta. PR #2136
* Highlight the current workspace and device. PR #2126
* Web API: Sort some files by name in the resources file. PR #2124
* Web API: Add missing files to resources file. PR #2124
* Install subversion for Mac build. PR #2123
* Fix ggmorse paths on ma. PR #2123
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Fri, 06 Jun 2024 20:09:11 +0200
sdrangel (7.21.1-1) unstable; urgency=medium
* Morse Decoder feature: Fix for Qt6 and Windows. PR #2122

View File

@ -15,7 +15,7 @@ set(soapysdrdevice_HEADERS
)
include_directories(
${SOAPYSDR_INCLUDE_DIR}
${SOAPYSDR_INCLUDE_DIRS}
)
add_library(soapysdrdevice SHARED
@ -26,7 +26,7 @@ set_target_properties(soapysdrdevice
PROPERTIES DEFINE_SYMBOL "devices_EXPORTS")
target_link_libraries(soapysdrdevice
${SOAPYSDR_LIBRARY}
${SOAPYSDR_LINK_LIBRARIES}
sdrbase
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -167,4 +167,16 @@
# define FT8_API
#endif
/* the 'WDSP_API' controls the import/export of 'wdsp' symbols
*/
#if !defined(sdrangel_STATIC)
# ifdef wdsp_EXPORTS
# define WDSP_API __SDR_EXPORT
# else
# define WDSP_API __SDR_IMPORT
# endif
#else
# define WDSP_API
#endif
#endif /* __SDRANGEL_EXPORT_H */

View File

@ -859,7 +859,7 @@ if(ENABLE_FEATURE_MORSEDECODER)
set(GGMORSE_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/lib${LIB_SUFFIX}/libggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
endif()
ExternalProject_Add(ggmorse
GIT_REPOSITORY https://github.com/f4exb/ggmorse.git
GIT_REPOSITORY https://github.com/ggerganov/ggmorse.git
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/ggmorse"
CMAKE_ARGS ${COMMON_CMAKE_ARGS}
-DGGMORSE_BUILD_TESTS=OFF
@ -876,10 +876,10 @@ if(ENABLE_FEATURE_MORSEDECODER)
if (WIN32)
install(FILES "${SDRANGEL_BINARY_BIN_DIR}/ggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" DESTINATION "${INSTALL_LIB_DIR}")
elseif (APPLE)
set(GGMORSE_LIBRARIES "${binary_dir}/libsggmorse/libggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
install(DIRECTORY "${binary_dir}/libggmorse" DESTINATION "${INSTALL_LIB_DIR}"
set(GGMORSE_LIBRARIES "${binary_dir}/src/libggmorse${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
install(DIRECTORY "${binary_dir}/src" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "libggmorse*${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${binary_dir}/libggmorse")
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${binary_dir}/src")
endif ()
endif()
@ -1224,7 +1224,7 @@ if (WIN32 OR APPLE)
if (ENABLE_SOAPYSDR)
if (WIN32)
set(SOAPYSDR_LIBRARY "${SDRANGEL_BINARY_LIB_DIR}/SoapySDR.lib" CACHE INTERNAL "")
set(SOAPYSDR_LINK_LIBRARIES "${SDRANGEL_BINARY_LIB_DIR}/SoapySDR.lib" CACHE INTERNAL "")
endif ()
ExternalProject_Add(soapysdr
GIT_REPOSITORY https://github.com/pothosware/SoapySDR.git
@ -1235,7 +1235,7 @@ if (WIN32 OR APPLE)
-DENABLE_PYTHON=OFF
-DENABLE_PYTHON3=OFF
-DENABLE_TESTS=OFF
BUILD_BYPRODUCTS "${SOAPYSDR_LIBRARY}"
BUILD_BYPRODUCTS "${SOAPYSDR_LINK_LIBRARIES}"
BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> -- SoapySDR
INSTALL_COMMAND ""
TEST_COMMAND ""
@ -1243,12 +1243,12 @@ if (WIN32 OR APPLE)
ExternalProject_Get_Property(soapysdr source_dir binary_dir)
set_global_cache(SOAPYSDR_FOUND ON)
set(SOAPYSDR_EXTERNAL ON CACHE INTERNAL "")
set(SOAPYSDR_INCLUDE_DIR "${source_dir}/include" CACHE INTERNAL "")
set(SOAPYSDR_INCLUDE_DIRS "${source_dir}/include" CACHE INTERNAL "")
if (WIN32)
install(FILES "${SDRANGEL_BINARY_BIN_DIR}/SoapySDR${CMAKE_SHARED_LIBRARY_SUFFIX}" DESTINATION "${INSTALL_LIB_DIR}")
install(DIRECTORY "${SDRANGEL_BINARY_LIB_DIR}/SoapySDR" DESTINATION "${INSTALL_LIB_DIR}/lib")
elseif (APPLE)
set(SOAPYSDR_LIBRARY "${binary_dir}/lib/libSoapySDR${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
set(SOAPYSDR_LINK_LIBRARIES "${binary_dir}/lib/libSoapySDR${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
install(DIRECTORY "${binary_dir}/lib/" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "libSoapySDR*${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${binary_dir}/lib/")

2
external/windows vendored

@ -1 +1 @@
Subproject commit da914afa4b7f2453882953ca1bf292bb83093626
Subproject commit c55d3980808da97306e2b4feac452323854a39e4

View File

@ -34,7 +34,7 @@
const PluginDescriptor DOA2Plugin::m_pluginDescriptor = {
DOA2::m_channelId,
QStringLiteral("DOA 2 sources"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -17,7 +17,6 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <QMutexLocker>
#include <QDebug>
#include "doa2streamsink.h"

View File

@ -34,7 +34,7 @@
const PluginDescriptor InterferometerPlugin::m_pluginDescriptor = {
Interferometer::m_channelId,
QStringLiteral("Interferometer"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -17,7 +17,6 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <QMutexLocker>
#include <QDebug>
#include "interferometerstreamsink.h"

View File

@ -29,7 +29,7 @@
const PluginDescriptor ChannelPowerPlugin::m_pluginDescriptor = {
ChannelPower::m_channelId,
QStringLiteral("Channel Power"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.2"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -35,6 +35,7 @@ ChannelPowerSink::ChannelPowerSink(ChannelPower *channelPower) :
ChannelPowerSink::~ChannelPowerSink()
{
delete m_lowpassFFT;
}
void ChannelPowerSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)

View File

@ -262,7 +262,7 @@ void ADSBDemodSinkWorker::run()
if (m_sink->getMessageQueueToGUI() && ((df == 4) || (df == 5) || (df == 20) || (df == 21)))
{
ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
QByteArray((char*)data, sizeof(data)),
QByteArray((char*)data, bytes),
preambleCorrelation * m_correlationScale,
preambleCorrelationOnes / samplesPerChip,
rxDateTime(firstIdx, readBuffer),
@ -273,7 +273,7 @@ void ADSBDemodSinkWorker::run()
if (m_sink->getMessageQueueToWorker())
{
ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
QByteArray((char*)data, sizeof(data)),
QByteArray((char*)data, bytes),
preambleCorrelation * m_correlationScale,
preambleCorrelationOnes / samplesPerChip,
rxDateTime(firstIdx, readBuffer),

View File

@ -30,7 +30,7 @@
const PluginDescriptor ADSBPlugin::m_pluginDescriptor = {
ADSBDemod::m_channelId,
QStringLiteral("ADS-B Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.2"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -211,18 +211,20 @@ bool AISDemod::handleMessage(const Message& cmd)
// Decode the message
ais = AISMessage::decode(report.getMessage());
if (ais)
{
m_logStream << report.getDateTime().date().toString() << ","
<< report.getDateTime().time().toString() << ","
<< report.getMessage().toHex() << ","
<< QString("%1").arg(ais->m_mmsi, 9, 10, QChar('0')) << ","
<< ais->getType() << ","
<< "\"" << ais->toString() << "\"" << ","
<< "\"" << ais->toNMEA() << "\"" << ","
<< report.getSlot() << ","
<< report.getSlots() << "\n";
m_logStream << report.getDateTime().date().toString() << ","
<< report.getDateTime().time().toString() << ","
<< report.getMessage().toHex() << ","
<< QString("%1").arg(ais->m_mmsi, 9, 10, QChar('0')) << ","
<< ais->getType() << ","
<< "\"" << ais->toString() << "\"" << ","
<< "\"" << ais->toNMEA() << "\"" << ","
<< report.getSlot() << ","
<< report.getSlots() << "\n";
delete ais;
delete ais;
}
}
return true;

View File

@ -24,7 +24,7 @@
#include <QDesktopServices>
#include <QMessageBox>
#include <QAction>
#include <QRegExp>
#include <QRegularExpression>
#include <QClipboard>
#include <QFileDialog>
#include <QScrollBar>
@ -422,6 +422,9 @@ void AISDemodGUI::messageReceived(const QByteArray& message, const QDateTime& da
// Decode the message
ais = AISMessage::decode(message);
if (!ais) {
return;
}
// Is scroll bar at bottom
QScrollBar *sb = ui->messages->verticalScrollBar();
@ -636,9 +639,10 @@ void AISDemodGUI::filterRow(int row)
bool hidden = false;
if (m_settings.m_filterMMSI != "")
{
QRegExp re(m_settings.m_filterMMSI);
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterMMSI));
QTableWidgetItem *fromItem = ui->messages->item(row, MESSAGE_COL_MMSI);
if (!re.exactMatch(fromItem->text()))
QRegularExpressionMatch match = re.match(fromItem->text());
if (!match.hasMatch())
hidden = true;
}
ui->messages->setRowHidden(row, hidden);

View File

@ -33,7 +33,7 @@
const PluginDescriptor AISDemodPlugin::m_pluginDescriptor = {
AISDemod::m_channelId,
QStringLiteral("AIS Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -6,7 +6,7 @@ This plugin can be used to demodulate AIS (Automatic Identification System) mess
AIS is broadcast globally on 25kHz channels at 161.975MHz and 162.025MHz, with other frequencies being used regionally or for special purposes. This demodulator is single channel, so if you wish to decode multiple channels simultaneously, you will need to add one AIS demodulator per frequency. As most AIS messages are on 161.975MHz and 162.025MHz, you can set the center frequency as 162MHz, with a sample rate of 100k+Sa/s, with one AIS demod with an input offset -25kHz and another at +25kHz.
The AIS demodulators can send received messages to the [AIS feature](../../feature/ais/readme.md), which displays a table combining the latest data for vessels amalgamated from multiple demodulators and sends their positions to the [Map Feature](../../feature/map/readme.ais) for display in 2D or 3D.
The AIS demodulators can send received messages to the [AIS feature](../../feature/ais/readme.md), which displays a table combining the latest data for vessels amalgamated from multiple demodulators and sends their positions to the [Map Feature](../../feature/map/readme.md) for display in 2D or 3D.
AIS uses GMSK/FM modulation at a baud rate of 9,600, with a modulation index of 0.5. The demodulator works at a sample rate of 57,600Sa/s.

View File

@ -23,7 +23,6 @@
#include <QDebug>
#include <QMessageBox>
#include <QAction>
#include <QRegExp>
#include <QFileDialog>
#include <QFileInfo>
#include <QGraphicsScene>

View File

@ -29,7 +29,7 @@
const PluginDescriptor APTDemodPlugin::m_pluginDescriptor = {
APTDemod::m_channelId,
QStringLiteral("APT Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE and Aptdec authors"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -95,6 +95,7 @@ ChirpChatDemod::ChirpChatDemod(DeviceAPI* deviceAPI) :
ChirpChatDemod::~ChirpChatDemod()
{
delete m_networkManager;
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this);
stop();

View File

@ -29,7 +29,7 @@
const PluginDescriptor ChirpChatPlugin::m_pluginDescriptor = {
ChirpChatDemod::m_channelId,
QStringLiteral("ChirpChat Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.2"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -21,7 +21,7 @@
#include <QDebug>
#include <QAction>
#include <QRegExp>
#include <QRegularExpression>
#include "dabdemodgui.h"
@ -423,9 +423,10 @@ void DABDemodGUI::filterRow(int row)
bool hidden = false;
if (m_settings.m_filter != "")
{
QRegExp re(m_settings.m_filter);
QRegularExpression re(m_settings.m_filter);
QTableWidgetItem *fromItem = ui->programs->item(row, PROGRAMS_COL_NAME);
if (re.indexIn(fromItem->text()) == -1)
QRegularExpressionMatch match = re.match(fromItem->text());
if (!match.hasMatch())
hidden = true;
}
ui->programs->setRowHidden(row, hidden);

View File

@ -33,7 +33,7 @@
const PluginDescriptor DABDemodPlugin::m_pluginDescriptor = {
DABDemod::m_channelId,
QStringLiteral("DAB Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE. DAB library by Jvan Katwijk"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -22,7 +22,6 @@
#include <QAction>
#include <QClipboard>
#include <QFileDialog>
#include <QRegExp>
#include <QScrollBar>
#include <QMenu>
#include <QDesktopServices>
@ -467,8 +466,9 @@ void DSCDemodGUI::filterRow(int row)
if (m_settings.m_filter != "")
{
QTableWidgetItem *item = ui->messages->item(row, m_settings.m_filterColumn);
QRegExp re(m_settings.m_filter);
if (!re.exactMatch(item->text())) {
QRegularExpression re(m_settings.m_filter);
QRegularExpressionMatch match = re.match(item->text());
if (!match.hasMatch()) {
hidden = true;
}
}
@ -568,7 +568,7 @@ DSCDemodGUI::DSCDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue);
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1));
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1, ui->messages));
m_scopeVis = m_dscDemod->getScopeSink();
m_scopeVis->setGLScope(ui->glScope);

View File

@ -33,7 +33,7 @@
const PluginDescriptor DSCDemodPlugin::m_pluginDescriptor = {
DSCDemod::m_channelId,
QStringLiteral("DSC Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -31,7 +31,7 @@
const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = {
DSDDemod::m_channelId,
QStringLiteral("DSD Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -109,6 +109,7 @@
<property name="font">
<font>
<family>Liberation Mono</family>
<pointsize>9</pointsize>
</font>
</property>
<property name="toolTip">

View File

@ -20,7 +20,7 @@
#include <QDebug>
#include <QMessageBox>
#include <QAction>
#include <QRegExp>
#include <QRegularExpression>
#include <QFileDialog>
#include <QScrollBar>
@ -345,9 +345,10 @@ void EndOfTrainDemodGUI::filterRow(int row)
bool hidden = false;
if (m_settings.m_filterFrom != "")
{
QRegExp re(m_settings.m_filterFrom);
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterFrom));
QTableWidgetItem *fromItem = ui->packets->item(row, PACKETS_COL_ADDRESS);
if (!re.exactMatch(fromItem->text()))
QRegularExpressionMatch match = re.match(fromItem->text());
if (!match.hasMatch())
hidden = true;
}
ui->packets->setRowHidden(row, hidden);

View File

@ -628,7 +628,7 @@
<item>
<widget class="QTableWidget" name="packets">
<property name="toolTip">
<string/>
<string>Received packets</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>

View File

@ -33,7 +33,7 @@
const PluginDescriptor EndOfTrainDemodPlugin::m_pluginDescriptor = {
EndOfTrainDemod::m_channelId,
QStringLiteral("End-of-Train Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -255,7 +255,7 @@
</font>
</property>
<property name="toolTip">
<string>Channel power</string>
<string>Level meter (dB) top trace: average, bottom trace: instantaneous peak, tip: peak hold</string>
</property>
</widget>
</item>

View File

@ -30,7 +30,7 @@
const PluginDescriptor FreeDVPlugin::m_pluginDescriptor = {
FreeDVDemod::m_channelId,
QStringLiteral("FreeDV Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -37,6 +37,7 @@
#include "device/deviceapi.h"
#include "settings/serializable.h"
#include "util/db.h"
#include "util/morse.h"
#include "maincore.h"
MESSAGE_CLASS_DEFINITION(ILSDemod::MsgConfigureILSDemod, Message)
@ -46,11 +47,17 @@ const char * const ILSDemod::m_channelIdURI = "sdrangel.channel.ilsdemod";
const char * const ILSDemod::m_channelId = "ILSDemod";
ILSDemod::ILSDemod(DeviceAPI *deviceAPI) :
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink),
m_deviceAPI(deviceAPI),
m_running(false),
m_spectrumVis(SDR_RX_SCALEF),
m_basebandSampleRate(0)
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink),
m_deviceAPI(deviceAPI),
m_running(false),
m_spectrumVis(SDR_RX_SCALEF),
m_basebandSampleRate(0),
m_ident(""),
m_dm90(NAN),
m_dm150(NAN),
m_sdm(NAN),
m_ddm(NAN),
m_angle(NAN)
{
setObjectName(m_channelId);
@ -201,6 +208,9 @@ bool ILSDemod::handleMessage(const Message& cmd)
m_guiMessageQueue->push(msg);
}
// Save for channel report
m_ident = Morse::toString(report.getIdent());
return true;
}
else if (ILSDemod::MsgAngleEstimate::match(cmd))
@ -246,6 +256,13 @@ bool ILSDemod::handleMessage(const Message& cmd)
<< "\n";
}
// Save for channel report
m_sdm = report.getSDM();
m_ddm = report.getDDM();
m_dm90 = report.getModDepth90();
m_dm150 = report.getModDepth150();
m_angle = report.getAngle();
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
@ -736,6 +753,12 @@ void ILSDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response
response.getIlsDemodReport()->setChannelPowerDb(CalcDb::dbPower(magsqAvg));
response.getIlsDemodReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
response.getIlsDemodReport()->setIdent(new QString(m_ident));
response.getIlsDemodReport()->setDeviation(m_angle);
response.getIlsDemodReport()->setSdm(m_sdm);
response.getIlsDemodReport()->setDdm(m_ddm);
response.getIlsDemodReport()->setDm90(m_dm90);
response.getIlsDemodReport()->setDm150(m_dm150);
}
void ILSDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ILSDemodSettings& settings, bool force)

View File

@ -205,6 +205,14 @@ private:
QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest;
// Saved values from sink for channel report
QString m_ident;
Real m_dm90;
Real m_dm150;
Real m_sdm;
Real m_ddm;
Real m_angle;
virtual bool handleMessage(const Message& cmd);
void applySettings(const ILSDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();

View File

@ -63,7 +63,7 @@ MESSAGE_CLASS_DEFINITION(ILSDemodGUI::MsgGSAngle, Message)
// ICAO Anntex 10 Volume 1 - 3.1.6.1
const QStringList ILSDemodGUI::m_locFrequencies = {
"108.10", "108.15", "108.30", "108.35", "108.50", "108.55", "180.70", "108.75",
"108.10", "108.15", "108.30", "108.35", "108.50", "108.55", "108.70", "108.75",
"108.90", "108.95", "109.10", "109.15", "109.30", "109.35", "109.50", "109.55",
"109.70", "109.75", "109.90", "109.95", "110.10", "110.15", "110.30", "110.35",
"110.50", "110.55", "110.70", "110.75", "110.90", "110.95", "111.10", "111.15",
@ -93,6 +93,7 @@ const QList<ILSDemodGUI::ILS> ILSDemodGUI::m_ils = {
{"EGLC", "ILSR", "27", 111150000, 272.89, 5.5, 51.504927, 0.064960, 48, 10.7, 1580, 0.0},
{"EGSS", "ISX", "22", 110500000, 222.78, 3.0, 51.895165, 0.250051, 352, 14.9, 3430, 0.0},
{"EGSS", "ISED", "04", 110500000, 42.78, 3.0, 51.877054, 0.222887, 352, 16.2, 3130, 0.0},
{"KGYH", "IGYH", "5", 108300000, 40.00, 3.0, 34.749987, -82.384983,850, 15.84, 2750, -0.6},
};
ILSDemodGUI* ILSDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel)
@ -295,6 +296,7 @@ void ILSDemodGUI::on_rfBW_valueChanged(int value)
void ILSDemodGUI::on_mode_currentIndexChanged(int index)
{
int freqIdx = ui->frequency->currentIndex();
ui->frequency->clear();
m_settings.m_mode = (ILSDemodSettings::Mode)index;
if (m_settings.m_mode == ILSDemodSettings::LOC)
@ -317,6 +319,7 @@ void ILSDemodGUI::on_mode_currentIndexChanged(int index)
}
closePipes();
}
ui->frequency->setCurrentIndex(freqIdx);
applySettings();
}
@ -410,14 +413,8 @@ void ILSDemodGUI::on_ident_currentIndexChanged(int index)
on_runway_editingFinished();
int frequency = m_ils[index].m_frequency;
QString freqText = QString("%1").arg(frequency / 1000000.0f, 0, 'f', 2);
if (m_settings.m_mode == ILSDemodSettings::GS)
{
int index = m_locFrequencies.indexOf(freqText);
if (index >= 0) {
freqText = m_gsFrequencies[index];
}
}
ui->frequency->setCurrentText(freqText);
int freqIndex = m_locFrequencies.indexOf(freqText);
ui->frequency->setCurrentIndex(freqIndex);
m_disableDrawILS = false;
}
drawILSOnMap();

View File

@ -33,7 +33,7 @@
const PluginDescriptor ILSDemodPlugin::m_pluginDescriptor = {
ILSDemod::m_channelId,
QStringLiteral("ILS Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -841,7 +841,7 @@
</property>
<widget class="QWidget" name="settingsTab">
<property name="toolTip">
<string>Dgital Settings</string>
<string>Digital settings</string>
</property>
<attribute name="icon">
<iconset resource="../../../sdrgui/resources/res.qrc">

View File

@ -31,7 +31,7 @@
const PluginDescriptor M17DemodPlugin::m_pluginDescriptor = {
M17Demod::m_channelId,
QStringLiteral("M17 Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -525,8 +525,8 @@ NavtexDemodGUI::NavtexDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B
ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue);
ui->messages->setItemDelegateForColumn(MESSAGE_COL_ERROR_PERCENT, new DecimalDelegate(1));
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1));
ui->messages->setItemDelegateForColumn(MESSAGE_COL_ERROR_PERCENT, new DecimalDelegate(1, ui->messages));
ui->messages->setItemDelegateForColumn(MESSAGE_COL_RSSI, new DecimalDelegate(1, ui->messages));
m_scopeVis = m_navtexDemod->getScopeSink();
m_scopeVis->setGLScope(ui->glScope);

View File

@ -33,7 +33,7 @@
const PluginDescriptor NavtexDemodPlugin::m_pluginDescriptor = {
NavtexDemod::m_channelId,
QStringLiteral("Navtex Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -19,7 +19,7 @@
#include <QDebug>
#include <QMessageBox>
#include <QAction>
#include <QRegExp>
#include <QRegularExpression>
#include <QFileDialog>
#include <QScrollBar>
@ -330,16 +330,18 @@ void PacketDemodGUI::filterRow(int row)
bool hidden = false;
if (m_settings.m_filterFrom != "")
{
QRegExp re(m_settings.m_filterFrom);
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterFrom));
QTableWidgetItem *fromItem = ui->packets->item(row, PACKET_COL_FROM);
if (!re.exactMatch(fromItem->text()))
QRegularExpressionMatch match = re.match(fromItem->text());
if (!match.hasMatch())
hidden = true;
}
if (m_settings.m_filterTo != "")
{
QRegExp re(m_settings.m_filterTo);
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterTo));
QTableWidgetItem *toItem = ui->packets->item(row, PACKET_COL_TO);
if (!re.exactMatch(toItem->text()))
QRegularExpressionMatch match = re.match(toItem->text());
if (!match.hasMatch())
hidden = true;
}
if (m_settings.m_filterPID != "")

View File

@ -33,7 +33,7 @@
const PluginDescriptor PacketDemodPlugin::m_pluginDescriptor = {
PacketDemod::m_channelId,
QStringLiteral("Packet Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -20,7 +20,7 @@
#include <QDesktopServices>
#include <QMessageBox>
#include <QAction>
#include <QRegExp>
#include <QRegularExpression>
#include <QClipboard>
#include <QFileDialog>
#include <QScrollBar>
@ -473,9 +473,10 @@ void RadiosondeDemodGUI::filterRow(int row)
bool hidden = false;
if (m_settings.m_filterSerial != "")
{
QRegExp re(m_settings.m_filterSerial);
QRegularExpression re(QRegularExpression::anchoredPattern(m_settings.m_filterSerial));
QTableWidgetItem *fromItem = ui->frames->item(row, FRAME_COL_SERIAL);
if (!re.exactMatch(fromItem->text()))
QRegularExpressionMatch match = re.match(fromItem->text());
if (!match.hasMatch())
hidden = true;
}
ui->frames->setRowHidden(row, hidden);
@ -647,16 +648,16 @@ RadiosondeDemodGUI::RadiosondeDemodGUI(PluginAPI* pluginAPI, DeviceUISet *device
TableTapAndHold *tableTapAndHold = new TableTapAndHold(ui->frames);
connect(tableTapAndHold, &TableTapAndHold::tapAndHold, this, &RadiosondeDemodGUI::customContextMenuRequested);
ui->frames->setItemDelegateForColumn(FRAME_COL_DATE, new DateTimeDelegate("yyyy/MM/dd"));
ui->frames->setItemDelegateForColumn(FRAME_COL_TIME, new TimeDelegate());
ui->frames->setItemDelegateForColumn(FRAME_COL_LATITUDE, new DecimalDelegate(5));
ui->frames->setItemDelegateForColumn(FRAME_COL_LONGITUDE, new DecimalDelegate(5));
ui->frames->setItemDelegateForColumn(FRAME_COL_ALTITUDE, new DecimalDelegate(1));
ui->frames->setItemDelegateForColumn(FRAME_COL_SPEED, new DecimalDelegate(1));
ui->frames->setItemDelegateForColumn(FRAME_COL_VERTICAL_RATE, new DecimalDelegate(1));
ui->frames->setItemDelegateForColumn(FRAME_COL_HEADING, new DecimalDelegate(1));
ui->frames->setItemDelegateForColumn(FRAME_COL_GPS_TIME, new DateTimeDelegate("yyyy/MM/dd hh:mm:ss"));
ui->frames->setItemDelegateForColumn(FRAME_COL_FREQUENCY, new DecimalDelegate(3));
ui->frames->setItemDelegateForColumn(FRAME_COL_DATE, new DateTimeDelegate("yyyy/MM/dd", ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_TIME, new TimeDelegate("hh:mm:ss", ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_LATITUDE, new DecimalDelegate(5, ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_LONGITUDE, new DecimalDelegate(5, ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_ALTITUDE, new DecimalDelegate(1, ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_SPEED, new DecimalDelegate(1, ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_VERTICAL_RATE, new DecimalDelegate(1, ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_HEADING, new DecimalDelegate(1, ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_GPS_TIME, new DateTimeDelegate("yyyy/MM/dd hh:mm:ss", ui->frames));
ui->frames->setItemDelegateForColumn(FRAME_COL_FREQUENCY, new DecimalDelegate(3, ui->frames));
ui->scopeContainer->setVisible(false);

View File

@ -33,7 +33,7 @@
const PluginDescriptor RadiosondeDemodPlugin::m_pluginDescriptor = {
RadiosondeDemod::m_channelId,
QStringLiteral("Radiosonde Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -215,7 +215,7 @@
<item>
<widget class="QPushButton" name="flipSidebands">
<property name="toolTip">
<string>Flip sideband in SSB mode (LSB-&gt;USB or USB-&gt;LSB)</string>
<string>Flip sidebands in SSB mode (LSB-&gt;USB or USB-&gt;LSB)</string>
</property>
<property name="text">
<string/>

View File

@ -33,7 +33,7 @@
const PluginDescriptor SSBPlugin::m_pluginDescriptor = {
SSBDemod::m_channelId,
QStringLiteral("SSB Demodulator"),
QStringLiteral("7.21.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>VORDemodMCGUI</class>
<class>VORDemodGUI</class>
<widget class="RollupContents" name="VORDemodGUI">
<property name="geometry">
<rect>

View File

@ -200,7 +200,7 @@
</font>
</property>
<property name="toolTip">
<string>channelPowerMeterUnits</string>
<string>Level meter (dB) top trace: average, bottom trace: instantaneous peak, tip: peak hold</string>
</property>
</widget>
</item>
@ -233,7 +233,6 @@
<font>
<family>Liberation Mono</family>
<pointsize>12</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>

View File

@ -32,7 +32,7 @@
const PluginDescriptor WFMPlugin::m_pluginDescriptor = {
WFMDemod::m_channelId,
QStringLiteral("WFM Demodulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -31,6 +31,7 @@
#include "SWGWorkspaceInfo.h"
#include "SWGFreqScannerSettings.h"
#include "SWGChannelReport.h"
#include "SWGChannelActions.h"
#include "device/deviceset.h"
#include "dsp/dspengine.h"
@ -197,7 +198,9 @@ void FreqScanner::stop()
qDebug("FreqScanner::stop");
m_running = false;
m_thread->exit();
#ifndef __EMSCRIPTEN__
m_thread->wait();
#endif
}
bool FreqScanner::handleMessage(const Message& cmd)
@ -342,9 +345,9 @@ void FreqScanner::processScanResults(const QDateTime& fftStartTime, const QList<
int binsPerChannel;
calcScannerSampleRate(m_settings.m_channelBandwidth, m_basebandSampleRate, m_scannerSampleRate, fftSize, binsPerChannel);
// Align first frequency so we cover as many channels as possible, while channel guard band
// Align first frequency so we cover as many channels as possible, while skipping channel guard band (12.5% either end)
// Can we adjust this to avoid DC bin?
m_stepStartFrequency = frequencies.front() + m_scannerSampleRate / 2 - m_scannerSampleRate * 0.125f;
m_stepStartFrequency = frequencies.front() + m_scannerSampleRate / 2 - (m_scannerSampleRate / 8);
m_stepStopFrequency = frequencies.back();
// If all frequencies fit within usable bandwidth, we can have the first frequency more central
@ -373,7 +376,7 @@ void FreqScanner::processScanResults(const QDateTime& fftStartTime, const QList<
bool complete = false; // Have all frequencies been scanned?
bool freqInRange = false;
qint64 nextCenterFrequency = m_centerFrequency;
float usableBW = m_scannerSampleRate * 0.75f;
int usableBW = (m_scannerSampleRate * 3 / 4) & ~1;
do
{
if (nextCenterFrequency + usableBW / 2 > m_stepStopFrequency)
@ -550,7 +553,9 @@ void FreqScanner::processScanResults(const QDateTime& fftStartTime, const QList<
setDeviceCenterFrequency(nextCenterFrequency);
}
if (complete) {
if (complete)
{
m_scanResultsForReport = m_scanResults;
m_scanResults.clear();
}
}
@ -815,6 +820,47 @@ int FreqScanner::webapiReportGet(
return 200;
}
int FreqScanner::webapiActionsPost(
const QStringList& channelActionsKeys,
SWGSDRangel::SWGChannelActions& query,
QString& errorMessage)
{
SWGSDRangel::SWGFreqScannerActions *swgFreqScannerActions = query.getFreqScannerActions();
if (swgFreqScannerActions)
{
if (channelActionsKeys.contains("run"))
{
bool run = swgFreqScannerActions->getRun() != 0;
if (run)
{
MsgStartScan *start = MsgStartScan::create();
if (getMessageQueueToGUI()) {
getMessageQueueToGUI()->push(start);
} else {
getInputMessageQueue()->push(start);
}
}
else
{
MsgStopScan *stop = MsgStopScan::create();
if (getMessageQueueToGUI()) {
getMessageQueueToGUI()->push(stop);
} else {
getInputMessageQueue()->push(stop);
}
}
}
return 202;
}
else
{
errorMessage = "Missing FreqScannerActions in query";
return 400;
}
}
void FreqScanner::webapiUpdateChannelSettings(
FreqScannerSettings& settings,
const QStringList& channelSettingsKeys,
@ -984,6 +1030,17 @@ void FreqScanner::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& r
void FreqScanner::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
{
response.getFreqScannerReport()->setChannelSampleRate(m_basebandSink->getChannelSampleRate());
response.getFreqScannerReport()->setScanState((int) m_state);
QList<SWGSDRangel::SWGFreqScannerChannelState *> *list = response.getFreqScannerReport()->getChannelState();
for (int i = 0; i < m_scanResultsForReport.size(); i++)
{
SWGSDRangel::SWGFreqScannerChannelState *channelState = new SWGSDRangel::SWGFreqScannerChannelState();
channelState->setFrequency(m_scanResultsForReport[i].m_frequency);
channelState->setPower(m_scanResultsForReport[i].m_power);
list->append(channelState);
}
}
void FreqScanner::webapiReverseSendSettings(const QStringList& channelSettingsKeys, const FreqScannerSettings& settings, bool force)

View File

@ -341,6 +341,11 @@ public:
SWGSDRangel::SWGChannelReport& response,
QString& errorMessage);
virtual int webapiActionsPost(
const QStringList& channelActionsKeys,
SWGSDRangel::SWGChannelActions& query,
QString& errorMessage);
static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response,
const FreqScannerSettings& settings);
@ -388,6 +393,7 @@ private:
qint64 m_stepStartFrequency;
qint64 m_stepStopFrequency;
QList<MsgScanResult::ScanResult> m_scanResults;
QList<MsgScanResult::ScanResult> m_scanResultsForReport;
enum State {
IDLE,

View File

@ -91,6 +91,19 @@ void FreqScannerAddRangeDialog::accept()
};
m_frequencies.append(FRS_GMRSFreqs);
}
else if (ui->preset->currentText() == "HF ATC")
{
static const QList<qint64> hfFreqs = {
2872000, 2890000, 2899000, 2971000,
3016000, 3446000, 3476000, 3491000,
4675000, 5598000, 5616000, 5649000,
6547000, 6595000, 6622000, 6667000,
8831000, 8864000, 8879000, 8891000,
8906000, 10021000, 11336000, 13291000,
13306000, 17946000
};
m_frequencies.append(hfFreqs);
}
else
{
qint64 start = ui->start->getValue();
@ -151,6 +164,10 @@ void FreqScannerAddRangeDialog::on_preset_currentTextChanged(const QString& text
{
enableManAdjust = false;
}
else if (text == "HF ATC")
{
enableManAdjust = false;
}
ui->start->setEnabled(enableManAdjust);
ui->stop->setEnabled(enableManAdjust);
ui->step->setEnabled(enableManAdjust);

View File

@ -198,6 +198,11 @@
<string>FRS-GMRS</string>
</property>
</item>
<item>
<property name="text">
<string>HF ATC</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
@ -232,7 +237,6 @@
</customwidgets>
<resources>
<include location="../../../sdrgui/resources/res.qrc"/>
<include location="../demodapt/icons.qrc"/>
</resources>
<connections>
<connection>

View File

@ -204,6 +204,16 @@ bool FreqScannerGUI::handleMessage(const Message& message)
return true;
}
else if (FreqScanner::MsgStartScan::match(message))
{
ui->startStop->doToggle(true);
return true;
}
else if (FreqScanner::MsgStopScan::match(message))
{
ui->startStop->doToggle(false);
return true;
}
return false;
}
@ -496,11 +506,11 @@ FreqScannerGUI::FreqScannerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B
applyAllSettings();
m_resizer.enableChildMouseTracking();
ui->table->setItemDelegateForColumn(COL_FREQUENCY, new FrequencyDelegate("Auto", 3));
ui->table->setItemDelegateForColumn(COL_POWER, new DecimalDelegate(1));
ui->table->setItemDelegateForColumn(COL_CHANNEL_BW, new Int64Delegate(0, 10000000));
ui->table->setItemDelegateForColumn(COL_TH, new DecimalDelegate(1, -120.0, 0.0));
ui->table->setItemDelegateForColumn(COL_SQ, new DecimalDelegate(1, -120.0, 0.0));
ui->table->setItemDelegateForColumn(COL_FREQUENCY, new FrequencyDelegate("Auto", 3, true, ui->table));
ui->table->setItemDelegateForColumn(COL_POWER, new DecimalDelegate(1, ui->table));
ui->table->setItemDelegateForColumn(COL_CHANNEL_BW, new Int64Delegate(0, 10000000, ui->table));
ui->table->setItemDelegateForColumn(COL_TH, new DecimalDelegate(1, -120.0, 0.0, ui->table));
ui->table->setItemDelegateForColumn(COL_SQ, new DecimalDelegate(1, -120.0, 0.0, ui->table));
connect(m_deviceUISet->m_spectrum->getSpectrumView(), &GLSpectrumView::updateAnnotations, this, &FreqScannerGUI::updateAnnotations);
}
@ -609,7 +619,7 @@ void FreqScannerGUI::enterEvent(EnterEventType* event)
ChannelGUI::enterEvent(event);
}
void FreqScannerGUI::on_startStop_clicked(bool checked)
void FreqScannerGUI::on_startStop_toggled(bool checked)
{
if (checked)
{
@ -1080,7 +1090,7 @@ void FreqScannerGUI::makeUIConnections()
QObject::connect(ui->priority, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &FreqScannerGUI::on_priority_currentIndexChanged);
QObject::connect(ui->measurement, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &FreqScannerGUI::on_measurement_currentIndexChanged);
QObject::connect(ui->mode, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &FreqScannerGUI::on_mode_currentIndexChanged);
QObject::connect(ui->startStop, &ButtonSwitch::clicked, this, &FreqScannerGUI::on_startStop_clicked);
QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &FreqScannerGUI::on_startStop_toggled);
QObject::connect(ui->table, &QTableWidget::cellChanged, this, &FreqScannerGUI::on_table_cellChanged);
QObject::connect(ui->addSingle, &QToolButton::clicked, this, &FreqScannerGUI::on_addSingle_clicked);
QObject::connect(ui->addRange, &QToolButton::clicked, this, &FreqScannerGUI::on_addRange_clicked);

View File

@ -140,7 +140,7 @@ private slots:
void table_sectionResized(int logicalIndex, int oldSize, int newSize);
void columnSelectMenu(QPoint pos);
void columnSelectMenuChecked(bool checked = false);
void on_startStop_clicked(bool checked = false);
void on_startStop_toggled(bool checked = false);
void on_addSingle_clicked();
void on_addRange_clicked();
void on_remove_clicked();

View File

@ -33,7 +33,7 @@
const PluginDescriptor FreqScannerPlugin::m_pluginDescriptor = {
FreqScanner::m_channelId,
QStringLiteral("Frequency Scanner"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -117,8 +117,8 @@ void FreqScannerSink::processOneSample(Complex &ci)
qint64 diff = frequency - startFrequency;
float binBW = m_scannerSampleRate / (float)m_fftSize;
// Ignore results in uppper and lower 12.5%, as there may be aliasing here from half-band filters
if ((diff < m_scannerSampleRate * 0.875f) && (diff >= m_scannerSampleRate * 0.125f))
// Ignore results in upper and lower 12.5%, as there may be aliasing here from half-band filters
if ((diff >= m_scannerSampleRate / 8) && (diff < m_scannerSampleRate * 7 / 8))
{
int bin = std::round(diff / binBW);
int channelBins;

View File

@ -140,3 +140,15 @@ Moves the selected rows the the frequency table (14).
<h3>21: Clear Active Count</h3>
Press to reset the value in the Active Count column to 0 for all rows.
<h2>API</h2>
Full details of the API can be found in the Swagger documentation. Below are a few examples.
To run a frequency scan:
curl -X POST "http://127.0.0.1:8091/sdrangel/deviceset/0/channel/0/actions" -d '{ "channelType": "FreqScanner", "direction": 0, "originatorDeviceSetIndex": 0, "originatorChannelIndex": 0, "FreqScannerActions": { "run": 1 }}'
To get the results of the last scan:
curl -X GET "http://127.0.0.1:8091/sdrangel/deviceset/0/channel/0/report"

View File

@ -22,7 +22,6 @@
#include <QDebug>
#include <QMessageBox>
#include <QAction>
#include <QRegExp>
#include <QClipboard>
#include <QBuffer>
@ -226,9 +225,17 @@ void HeatMapGUI::on_mode_currentIndexChanged(int index)
ui->writeImage->setEnabled(!none);
ui->writeCSV->setEnabled(!none);
ui->readCSV->setEnabled(!none);
if (none) {
ui->colorMapLabel->setEnabled(!none);
ui->colorMap->setEnabled(!none);
if (none)
{
deleteFromMap();
} else {
}
else
{
if (m_image.isNull()) {
createImage(m_width, m_height);
}
plotMap();
}
applySettings();
@ -551,6 +558,12 @@ HeatMapGUI::HeatMapGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
m_heatMap = reinterpret_cast<HeatMap*>(rxChannel);
m_heatMap->setMessageQueueToGUI(getInputMessageQueue());
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
// Disable 256MB limit on image size
QImageReader::setAllocationLimit(0);
#endif
connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms
m_scopeVis = m_heatMap->getScopeSink();
@ -708,6 +721,11 @@ void HeatMapGUI::displaySettings()
ui->displayPulseAverage->setChecked(m_settings.m_displayPulseAverage);
ui->displayPathLoss->setChecked(m_settings.m_displayPathLoss);
ui->displayMins->setValue(m_settings.m_displayMins);
ui->recordAverage->setChecked(m_settings.m_recordAverage);
ui->recordMax->setChecked(m_settings.m_recordMax);
ui->recordMin->setChecked(m_settings.m_recordMin);
ui->recordPulseAverage->setChecked(m_settings.m_recordPulseAverage);
ui->recordPathLoss->setChecked(m_settings.m_recordPathLoss);
m_scopeVis->setLiveRate(m_settings.m_sampleRate);
@ -765,7 +783,9 @@ void HeatMapGUI::tick()
if (!std::isnan(magAvg))
{
powDbAvg = CalcDb::dbPower(magAvg * magAvg);
m_powerAverage[idx] = powDbAvg;
if (m_powerAverage) {
m_powerAverage[idx] = powDbAvg;
}
if (m_tickCount % 4 == 0) {
ui->average->setText(QString::number(powDbAvg, 'f', 1));
}
@ -777,7 +797,9 @@ void HeatMapGUI::tick()
if (!std::isnan(magPulseAvg))
{
powDbPulseAvg = CalcDb::dbPower(magPulseAvg * magPulseAvg);
m_powerPulseAverage[idx] = powDbPulseAvg;
if (m_powerPulseAverage) {
m_powerPulseAverage[idx] = powDbPulseAvg;
}
if (m_tickCount % 4 == 0) {
ui->pulseAverage->setText(QString::number(powDbPulseAvg, 'f', 1));
}
@ -789,7 +811,9 @@ void HeatMapGUI::tick()
if (magMaxPeak != -std::numeric_limits<double>::max())
{
powDbMaxPeak = CalcDb::dbPower(magMaxPeak * magMaxPeak);
m_powerMaxPeak[idx] = powDbMaxPeak;
if (m_powerMaxPeak) {
m_powerMaxPeak[idx] = powDbMaxPeak;
}
if (m_tickCount % 4 == 0) {
ui->maxPeak->setText(QString::number(powDbMaxPeak, 'f', 1));
}
@ -801,7 +825,9 @@ void HeatMapGUI::tick()
if (magMinPeak != std::numeric_limits<double>::max())
{
powDbMinPeak = CalcDb::dbPower(magMinPeak * magMinPeak);
m_powerMinPeak[idx] = powDbMinPeak;
if (m_powerMinPeak) {
m_powerMinPeak[idx] = powDbMinPeak;
}
if (m_tickCount % 4 == 0) {
ui->minPeak->setText(QString::number(powDbMinPeak, 'f', 1));
}
@ -814,7 +840,9 @@ void HeatMapGUI::tick()
double range = calcRange(m_latitude, m_longitude);
double frequency = m_deviceCenterFrequency + m_settings.m_inputFrequencyOffset;
powDbPathLoss = m_settings.m_txPower - calcFreeSpacePathLoss(range, frequency);
m_powerPathLoss[idx] = powDbPathLoss;
if (m_powerPathLoss) {
m_powerPathLoss[idx] = powDbPathLoss;
}
if (m_heatMap->getDeviceAPI()->state(0) == DeviceAPI::StRunning)
{
@ -823,9 +851,12 @@ void HeatMapGUI::tick()
{
// Plot newest measurement on map
float *power = getCurrentModePowerData();
double powDb = power[idx];
if (!std::isnan(powDb)) {
plotPixel(m_x, m_y, powDb);
if (power)
{
double powDb = power[idx];
if (!std::isnan(powDb)) {
plotPixel(m_x, m_y, powDb);
}
}
}
@ -882,9 +913,15 @@ void HeatMapGUI::updatePower(double latitude, double longitude, float power)
void HeatMapGUI::plotMap()
{
clearImage();
plotMap(getCurrentModePowerData());
sendToMap();
if ((m_settings.m_mode != HeatMapSettings::None) && !m_image.isNull())
{
clearImage();
float *data = getCurrentModePowerData();
if (data) {
plotMap(data);
}
sendToMap();
}
}
void HeatMapGUI::clearPower()
@ -903,7 +940,35 @@ void HeatMapGUI::clearPower(float *power)
void HeatMapGUI::clearPower(float *power, int size)
{
std::fill_n(power, size, std::numeric_limits<float>::quiet_NaN());
if (power) {
std::fill_n(power, size, std::numeric_limits<float>::quiet_NaN());
}
}
void HeatMapGUI::createImage(int width, int height)
{
if (!m_image.isNull()) {
m_painter.end();
}
try
{
if (m_settings.m_mode != HeatMapSettings::None)
{
qDebug() << "HeatMapGUI::createImage" << width << "*" << height;
m_image = QImage(width, height, QImage::Format_ARGB32);
m_painter.begin(&m_image);
}
else
{
m_image = QImage();
}
}
catch (std::bad_alloc&)
{
m_image = QImage();
QMessageBox::critical(this, "Heat Map", QString("Failed to allocate memory (width=%1 height=%2)").arg(m_width).arg(m_height));
}
}
void HeatMapGUI::clearImage()
@ -929,6 +994,10 @@ void HeatMapGUI::plotMap(float *power)
void HeatMapGUI::plotPixel(int x, int y, double power)
{
if (m_image.isNull()) {
return;
}
// Normalise to [0,1]
float powNorm = (power - m_settings.m_minPower) / (m_settings.m_maxPower - m_settings.m_minPower);
if (powNorm < 0) {
@ -1017,6 +1086,11 @@ void HeatMapGUI::makeUIConnections()
QObject::connect(ui->displayPulseAverage, &QCheckBox::clicked, this, &HeatMapGUI::on_displayPulseAverage_clicked);
QObject::connect(ui->displayPathLoss, &QCheckBox::clicked, this, &HeatMapGUI::on_displayPathLoss_clicked);
QObject::connect(ui->displayMins, QOverload<int>::of(&QSpinBox::valueChanged), this, &HeatMapGUI::on_displayMins_valueChanged);
QObject::connect(ui->recordAverage, &QCheckBox::clicked, this, &HeatMapGUI::on_recordAverage_clicked);
QObject::connect(ui->recordMax, &QCheckBox::clicked, this, &HeatMapGUI::on_recordMax_clicked);
QObject::connect(ui->recordMin, &QCheckBox::clicked, this, &HeatMapGUI::on_recordMin_clicked);
QObject::connect(ui->recordPulseAverage, &QCheckBox::clicked, this, &HeatMapGUI::on_recordPulseAverage_clicked);
QObject::connect(ui->recordPathLoss, &QCheckBox::clicked, this, &HeatMapGUI::on_recordPathLoss_clicked);
}
void HeatMapGUI::updateAbsoluteCenterFrequency()
@ -1171,21 +1245,48 @@ void HeatMapGUI::createMap()
m_degreesLonPerPixel = m_resolution / scale / (earthCircumference / 360.0);
m_degreesLatPerPixel = m_resolution / (earthCircumference / 360.0);
int size = m_width * m_height;
m_powerAverage = new float[size];
m_powerPulseAverage = new float[size];
m_powerMaxPeak = new float[size];
m_powerMinPeak = new float[size];
m_powerPathLoss = new float[size];
try
{
if (m_settings.m_recordAverage) {
m_powerAverage = new float[size];
} else {
m_powerAverage = nullptr;
}
if (m_settings.m_recordPulseAverage) {
m_powerPulseAverage = new float[size];
} else {
m_powerPulseAverage = nullptr;
}
if (m_settings.m_recordMax) {
m_powerMaxPeak = new float[size];
} else {
m_powerMaxPeak = nullptr;
}
if (m_settings.m_recordMin) {
m_powerMinPeak = new float[size];
} else {
m_powerMinPeak = nullptr;
}
if (m_settings.m_recordPathLoss) {
m_powerPathLoss = new float[size];
} else {
m_powerPathLoss = nullptr;
}
m_north = m_latitude + m_degreesLatPerPixel * m_height / 2;
m_south = m_latitude - m_degreesLatPerPixel * m_height / 2;
m_east = m_longitude + m_degreesLonPerPixel * m_width / 2;
m_west = m_longitude - m_degreesLonPerPixel * m_width / 2;
m_x = m_width / 2;
m_y = m_height / 2;
m_north = m_latitude + m_degreesLatPerPixel * m_height / 2;
m_south = m_latitude - m_degreesLatPerPixel * m_height / 2;
m_east = m_longitude + m_degreesLonPerPixel * m_width / 2;
m_west = m_longitude - m_degreesLonPerPixel * m_width / 2;
m_x = m_width / 2;
m_y = m_height / 2;
m_image = QImage(m_width, m_height, QImage::Format_ARGB32);
m_painter.begin(&m_image);
createImage(m_width, m_height);
}
catch (std::bad_alloc&)
{
deleteMap();
QMessageBox::critical(this, "Heat Map", QString("Failed to allocate memory (width=%1 height=%2)").arg(m_width).arg(m_height));
}
on_clearHeatMap_clicked();
}
@ -1203,7 +1304,9 @@ void HeatMapGUI::deleteMap()
m_powerMinPeak = nullptr;
delete[] m_powerPathLoss;
m_powerPathLoss = nullptr;
m_painter.end();
if (!m_image.isNull()) {
m_painter.end();
}
}
void HeatMapGUI::resizeMap(int x, int y)
@ -1245,47 +1348,92 @@ void HeatMapGUI::resizeMap(int x, int y)
m_south -= m_blockSize * m_degreesLatPerPixel;
}
float *powerAverage = nullptr;
float *powerPulseAverage = nullptr;
float *powerMaxPeak = nullptr;
float *powerMinPeak = nullptr;
float *powerPathLoss = nullptr;
int newSize = newWidth * newHeight;
float *powerAverage = new float[newSize];
float *powerPulseAverage = new float[newSize];
float *powerMaxPeak = new float[newSize];
float *powerMinPeak = new float[newSize];
float *powerPathLoss = new float[newSize];
clearPower(powerAverage, newSize);
clearPower(powerPulseAverage, newSize);
clearPower(powerMaxPeak, newSize);
clearPower(powerMinPeak, newSize);
clearPower(powerPathLoss, newSize);
qDebug() << "HeatMapGUI::resizeMap:" << m_width << "*" << m_height << "to" << newWidth << "*" << newHeight;
// Copy across old data
for (int j = 0; j < m_height; j++)
try
{
int srcStart = j * m_width;
int srcEnd = (j + 1) * m_width;
int destStart = j * newWidth + yOffset + xOffset;
//qDebug() << srcStart << srcEnd << destStart;
std::copy(m_powerAverage + srcStart, m_powerAverage + srcEnd, powerAverage + destStart);
std::copy(m_powerPulseAverage + srcStart, m_powerPulseAverage + srcEnd, powerPulseAverage + destStart);
std::copy(m_powerMaxPeak + srcStart, m_powerMaxPeak + srcEnd, powerMaxPeak + destStart);
std::copy(m_powerMinPeak + srcStart, m_powerMinPeak + srcEnd, powerMinPeak + destStart);
std::copy(m_powerPathLoss + srcStart, m_powerPathLoss + srcEnd, powerPathLoss + destStart);
}
// Allocate new memory
if (m_settings.m_recordAverage) {
powerAverage = new float[newSize];
}
if (m_settings.m_recordPulseAverage) {
powerPulseAverage = new float[newSize];
}
if (m_settings.m_recordMax) {
powerMaxPeak = new float[newSize];
}
if (m_settings.m_recordMin) {
powerMinPeak = new float[newSize];
}
if (m_settings.m_recordPathLoss) {
powerPathLoss = new float[newSize];
}
delete[] m_powerAverage;
delete[] m_powerPulseAverage;
delete[] m_powerMaxPeak;
delete[] m_powerMinPeak;
m_powerAverage = powerAverage;
m_powerPulseAverage = powerPulseAverage;
m_powerMaxPeak = powerMaxPeak;
m_powerMinPeak = powerMinPeak;
m_powerPathLoss = powerPathLoss;
m_width = newWidth;
m_height = newHeight;
m_painter.end();
m_image = QImage(m_width, m_height, QImage::Format_ARGB32);
m_painter.begin(&m_image);
plotMap();
clearPower(powerAverage, newSize);
clearPower(powerPulseAverage, newSize);
clearPower(powerMaxPeak, newSize);
clearPower(powerMinPeak, newSize);
clearPower(powerPathLoss, newSize);
// Copy across old data
for (int j = 0; j < m_height; j++)
{
int srcStart = j * m_width;
int srcEnd = (j + 1) * m_width;
int destStart = j * newWidth + yOffset + xOffset;
//qDebug() << srcStart << srcEnd << destStart;
if (powerAverage && m_powerAverage) {
std::copy(m_powerAverage + srcStart, m_powerAverage + srcEnd, powerAverage + destStart);
}
if (powerPulseAverage && m_powerPulseAverage) {
std::copy(m_powerPulseAverage + srcStart, m_powerPulseAverage + srcEnd, powerPulseAverage + destStart);
}
if (powerMaxPeak && m_powerMaxPeak) {
std::copy(m_powerMaxPeak + srcStart, m_powerMaxPeak + srcEnd, powerMaxPeak + destStart);
}
if (powerMinPeak && m_powerMinPeak) {
std::copy(m_powerMinPeak + srcStart, m_powerMinPeak + srcEnd, powerMinPeak + destStart);
}
if (powerPathLoss && m_powerPathLoss) {
std::copy(m_powerPathLoss + srcStart, m_powerPathLoss + srcEnd, powerPathLoss + destStart);
}
}
createImage(newWidth, newHeight);
m_width = newWidth;
m_height = newHeight;
// Delete old memory
delete[] m_powerAverage;
delete[] m_powerPulseAverage;
delete[] m_powerMaxPeak;
delete[] m_powerMinPeak;
m_powerAverage = powerAverage;
m_powerPulseAverage = powerPulseAverage;
m_powerMaxPeak = powerMaxPeak;
m_powerMinPeak = powerMinPeak;
m_powerPathLoss = powerPathLoss;
plotMap();
}
catch (std::bad_alloc&)
{
// Detete partially allocated memory
delete[] powerAverage;
delete[] powerPulseAverage;
delete[] powerMaxPeak;
delete[] powerMinPeak;
delete[] powerPathLoss;
QMessageBox::critical(this, "Heat Map", QString("Failed to allocate memory (width=%1 height=%2)").arg(newWidth).arg(newHeight));
}
}
}
@ -1462,3 +1610,37 @@ void HeatMapGUI::on_displayMins_valueChanged(int value)
applySettings();
}
void HeatMapGUI::on_recordAverage_clicked(bool checked)
{
m_settings.m_recordAverage = checked;
resizeMap(0, 0);
applySettings();
}
void HeatMapGUI::on_recordMax_clicked(bool checked)
{
m_settings.m_recordMax = checked;
resizeMap(0, 0);
applySettings();
}
void HeatMapGUI::on_recordMin_clicked(bool checked)
{
m_settings.m_recordMin = checked;
resizeMap(0, 0);
applySettings();
}
void HeatMapGUI::on_recordPulseAverage_clicked(bool checked)
{
m_settings.m_recordPulseAverage = checked;
resizeMap(0, 0);
applySettings();
}
void HeatMapGUI::on_recordPathLoss_clicked(bool checked)
{
m_settings.m_recordPathLoss = checked;
resizeMap(0, 0);
applySettings();
}

View File

@ -142,7 +142,6 @@ private:
void blockApplySettings(bool block);
void applySettings(bool force = false);
void displaySettings();
void messageReceived(const QByteArray& message, const QDateTime& dateTime);
bool handleMessage(const Message& message);
void makeUIConnections();
void updateAbsoluteCenterFrequency();
@ -158,6 +157,7 @@ private:
void clearPower();
void clearPower(float *power);
void clearPower(float *power, int size);
void createImage(int width, int height);
void clearImage();
void updatePower(double latitude, double longitude, float power);
void plotMap();
@ -209,6 +209,11 @@ private slots:
void on_displayPulseAverage_clicked(bool checked=false);
void on_displayPathLoss_clicked(bool checked=false);
void on_displayMins_valueChanged(int value);
void on_recordAverage_clicked(bool checked=false);
void on_recordMax_clicked(bool checked=false);
void on_recordMin_clicked(bool checked=false);
void on_recordPulseAverage_clicked(bool checked=false);
void on_recordPathLoss_clicked(bool checked=false);
void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void handleInputMessages();

View File

@ -40,7 +40,7 @@
<x>0</x>
<y>0</y>
<width>390</width>
<height>191</height>
<height>211</height>
</rect>
</property>
<property name="minimumSize">
@ -800,13 +800,127 @@
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_20">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="recordLayout">
<item>
<widget class="QLabel" name="recordLabel">
<property name="text">
<string>Record</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="recordAverage">
<property name="statusTip">
<string>Check to record average power</string>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="text">
<string>Avg</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="recordMax">
<property name="statusTip">
<string>Check to record max power</string>
</property>
<property name="text">
<string>Max</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="recordMin">
<property name="statusTip">
<string>Check to record min power</string>
</property>
<property name="text">
<string>Min</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="recordPulseAverage">
<property name="statusTip">
<string>Check to record pulse average power</string>
</property>
<property name="text">
<string>Pulse</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="recordPathLoss">
<property name="statusTip">
<string>Check to record path loss</string>
</property>
<property name="text">
<string>Path Loss</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="dataContainer" native="true">
<property name="geometry">
<rect>
<x>0</x>
<y>200</y>
<y>220</y>
<width>391</width>
<height>91</height>
</rect>
@ -1349,7 +1463,7 @@
<property name="geometry">
<rect>
<x>0</x>
<y>300</y>
<y>320</y>
<width>381</width>
<height>121</height>
</rect>
@ -1617,7 +1731,6 @@
</tabstops>
<resources>
<include location="../../../sdrgui/resources/res.qrc"/>
<include location="../demodadsb/icons.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -33,7 +33,7 @@
const PluginDescriptor HeatMapPlugin::m_pluginDescriptor = {
HeatMap::m_channelId,
QStringLiteral("Heat Map"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -50,6 +50,11 @@ void HeatMapSettings::resetToDefaults()
m_displayPulseAverage = true;
m_displayPathLoss = true;
m_displayMins = 2;
m_recordAverage = true;
m_recordMax = true;
m_recordMin = true;
m_recordPulseAverage = true;
m_recordPathLoss = true;
m_rgbColor = QColor(102, 40, 220).rgb();
m_title = "Heat Map";
m_streamIndex = 0;
@ -86,6 +91,11 @@ QByteArray HeatMapSettings::serialize() const
s.writeBool(18, m_displayPulseAverage);
s.writeBool(19, m_displayPathLoss);
s.writeS32(20, m_displayMins);
s.writeBool(40, m_recordAverage);
s.writeBool(41, m_recordMax);
s.writeBool(42, m_recordMin);
s.writeBool(43, m_recordPulseAverage);
s.writeBool(44, m_recordPathLoss);
s.writeU32(21, m_rgbColor);
s.writeString(22, m_title);
@ -148,6 +158,11 @@ bool HeatMapSettings::deserialize(const QByteArray& data)
d.readBool(18, &m_displayPulseAverage, true);
d.readBool(19, &m_displayPathLoss, true);
d.readS32(20, &m_displayMins, 2);
d.readBool(40, &m_recordAverage, true);
d.readBool(41, &m_recordMax, true);
d.readBool(42, &m_recordMin, true);
d.readBool(43, &m_recordPulseAverage, true);
d.readBool(44, &m_recordPathLoss, true);
d.readU32(21, &m_rgbColor, QColor(102, 40, 220).rgb());
d.readString(22, &m_title, "Heat Map");

View File

@ -57,6 +57,11 @@ struct HeatMapSettings
bool m_displayPulseAverage;
bool m_displayPathLoss;
int m_displayMins;
bool m_recordAverage;
bool m_recordMax;
bool m_recordMin;
bool m_recordPulseAverage;
bool m_recordPathLoss;
quint32 m_rgbColor;
QString m_title;

View File

@ -657,11 +657,11 @@ NoiseFigureGUI::NoiseFigureGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B
ui->results->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->results, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customContextMenuRequested(QPoint)));
ui->results->setItemDelegateForColumn(RESULTS_COL_NF, new DecimalDelegate(2));
ui->results->setItemDelegateForColumn(RESULTS_COL_TEMP, new DecimalDelegate(0));
ui->results->setItemDelegateForColumn(RESULTS_COL_Y, new DecimalDelegate(2));
ui->results->setItemDelegateForColumn(RESULTS_COL_ENR, new DecimalDelegate(2));
ui->results->setItemDelegateForColumn(RESULTS_COL_FLOOR, new DecimalDelegate(1));
ui->results->setItemDelegateForColumn(RESULTS_COL_NF, new DecimalDelegate(2, ui->results));
ui->results->setItemDelegateForColumn(RESULTS_COL_TEMP, new DecimalDelegate(0, ui->results));
ui->results->setItemDelegateForColumn(RESULTS_COL_Y, new DecimalDelegate(2, ui->results));
ui->results->setItemDelegateForColumn(RESULTS_COL_ENR, new DecimalDelegate(2, ui->results));
ui->results->setItemDelegateForColumn(RESULTS_COL_FLOOR, new DecimalDelegate(1, ui->results));
ui->startStop->setStyleSheet(QString("QToolButton{ background-color: blue; } QToolButton:checked{ background-color: green; }"));

View File

@ -887,7 +887,7 @@
</size>
</property>
<property name="toolTip">
<string/>
<string>Chart</string>
</property>
</widget>
</item>

View File

@ -33,7 +33,7 @@
const PluginDescriptor NoiseFigurePlugin::m_pluginDescriptor = {
NoiseFigure::m_channelId,
QStringLiteral("Noise Figure"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -26,7 +26,7 @@
#include <QDebug>
#include <QMessageBox>
#include <QAction>
#include <QRegExp>
#include <QRegularExpression>
#include <QClipboard>
#include <QFileDialog>
#include <QImage>
@ -66,6 +66,9 @@
class TimeDeltaDelegate : public QStyledItemDelegate {
public:
TimeDeltaDelegate(QObject *parent = nullptr) :
QStyledItemDelegate(parent) {}
virtual QString displayText(const QVariant &value, const QLocale &locale) const override
{
(void) locale;
@ -97,6 +100,9 @@ private:
class HMSDelegate : public QStyledItemDelegate {
public:
HMSDelegate(QObject *parent = nullptr) :
QStyledItemDelegate(parent) {}
virtual QString displayText(const QVariant &value, const QLocale &locale) const override
{
(void) locale;
@ -109,6 +115,9 @@ public:
class DMSDelegate : public QStyledItemDelegate {
public:
DMSDelegate(QObject *parent = nullptr) :
QStyledItemDelegate(parent) {}
virtual QString displayText(const QVariant &value, const QLocale &locale) const override
{
(void) locale;
@ -2123,42 +2132,42 @@ RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
ui->powerTable->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->powerTable, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customContextMenuRequested(QPoint)));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TIME, new TimeDelegate());
//ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER, new DecimalDelegate(6));
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DB, new DecimalDelegate(1));
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DBM, new DecimalDelegate(1));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS0, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSOURCE, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TB, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSKY, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_FLUX, new DecimalDelegate(2));
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_T, new DecimalDelegate(2));
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_S, new DecimalDelegate(1));
ui->powerTable->setItemDelegateForColumn(POWER_COL_RA, new HMSDelegate());
ui->powerTable->setItemDelegateForColumn(POWER_COL_DEC, new DMSDelegate());
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LAT, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LON, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_AZ, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_EL, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_VBCRS, new DecimalDelegate(1));
ui->powerTable->setItemDelegateForColumn(POWER_COL_VLSR, new DecimalDelegate(1));
ui->powerTable->setItemDelegateForColumn(POWER_COL_AIR_TEMP, new DecimalDelegate(1));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ_OFF, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL_OFF, new DecimalDelegate(0));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TIME, new TimeDelegate("hh:mm:ss", ui->powerTable));
//ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER, new DecimalDelegate(6, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DB, new DecimalDelegate(1, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DBM, new DecimalDelegate(1, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS0, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSOURCE, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TB, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_TSKY, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_FLUX, new DecimalDelegate(2, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_T, new DecimalDelegate(2, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_S, new DecimalDelegate(1, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_RA, new HMSDelegate(ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_DEC, new DMSDelegate(ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LAT, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LON, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_AZ, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_EL, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_VBCRS, new DecimalDelegate(1, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_VLSR, new DecimalDelegate(1, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_AIR_TEMP, new DecimalDelegate(1, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_AZ_OFF, new DecimalDelegate(0, ui->powerTable));
ui->powerTable->setItemDelegateForColumn(POWER_COL_ROT_EL_OFF, new DecimalDelegate(0, ui->powerTable));
resizeSpectrumMarkerTable();
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_FREQ, new DecimalDelegate(6));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VALUE, new DecimalDelegate(1));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_X, new DecimalDelegate(6));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_Y, new DecimalDelegate(1));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VR, new DecimalDelegate(2));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R, new DecimalDelegate(1));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_D, new DecimalDelegate(1));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R_MIN, new DecimalDelegate(1));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_V, new DecimalDelegate(1));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_FREQ, new DecimalDelegate(6, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VALUE, new DecimalDelegate(1, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_X, new DecimalDelegate(6, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_Y, new DecimalDelegate(1, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VR, new DecimalDelegate(2, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R, new DecimalDelegate(1, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_D, new DecimalDelegate(1, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R_MIN, new DecimalDelegate(1, ui->spectrumMarkerTable));
ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_V, new DecimalDelegate(1, ui->spectrumMarkerTable));
// Create blank marker table
ui->spectrumMarkerTable->setRowCount(SPECTRUM_MARKER_ROWS); // 1 peak and two markers
@ -2187,10 +2196,10 @@ RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
connect(ui->spectrumMarkerTable, &QTableWidget::itemChanged, this, &RadioAstronomyGUI::spectrumMarkerTableItemChanged);
resizePowerMarkerTable();
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_TIME, new TimeDelegate());
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_VALUE, new DecimalDelegate(1));
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_X, new TimeDeltaDelegate());
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_Y, new DecimalDelegate(1));
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_TIME, new TimeDelegate("hh:mm:ss", ui->powerMarkerTable));
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_VALUE, new DecimalDelegate(1, ui->powerMarkerTable));
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_X, new TimeDeltaDelegate(ui->powerMarkerTable));
ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_Y, new DecimalDelegate(1, ui->powerMarkerTable));
// Create blank marker table
ui->powerMarkerTable->setRowCount(POWER_MARKER_ROWS); // 1 peak and two markers
@ -2297,6 +2306,7 @@ void RadioAstronomyGUI::customContextMenuRequested(QPoint pos)
RadioAstronomyGUI::~RadioAstronomyGUI()
{
delete m_networkManager;
delete ui;
delete m_calHot;
delete m_calCold;
@ -6044,10 +6054,11 @@ void RadioAstronomyGUI::networkManagerFinished(QNetworkReply *reply)
else
{
QString answer = reply->readAll();
QRegExp re("a href=\\\"download.php([^\"]*)\"");
if (re.indexIn(answer) != -1)
QRegularExpression re("a href=\\\"download.php([^\"]*)\"");
QRegularExpressionMatch match = re.match(answer);
if (match.hasMatch())
{
QString filename = re.capturedTexts()[1];
QString filename = match.capturedTexts()[1];
qDebug() << "RadioAstronomyGUI: Downloading LAB reference data: " << filename;
m_dlm.download(QUrl("https://www.astro.uni-bonn.de/hisurvey/euhou/LABprofile/download.php" + filename), m_filenameLAB);
}

View File

@ -889,7 +889,7 @@ This should be 2.73K when pointing at the sky</string>
<item>
<widget class="QDoubleSpinBox" name="tempAir">
<property name="toolTip">
<string>Surface air temperature in degrees celsius</string>
<string>Surface air temperature in degrees Celsius</string>
</property>
<property name="decimals">
<number>0</number>
@ -2138,7 +2138,7 @@ This should be 2.73K when pointing at the sky</string>
</size>
</property>
<property name="toolTip">
<string/>
<string>Spectrum chart</string>
</property>
</widget>
</item>
@ -3768,7 +3768,7 @@ This should be close to the expected difference in power between hot and cold ca
</size>
</property>
<property name="toolTip">
<string/>
<string>Power chart</string>
</property>
</widget>
</item>
@ -4915,7 +4915,7 @@ This should be close to the expected difference in power between hot and cold ca
<item>
<widget class="QTableWidget" name="powerTable">
<property name="toolTip">
<string/>
<string>Power table</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>

View File

@ -29,7 +29,7 @@
const PluginDescriptor RadioAstronomyPlugin::m_pluginDescriptor = {
RadioAstronomy::m_channelId,
QStringLiteral("Radio Astronomy"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -593,7 +593,7 @@
</size>
</property>
<property name="toolTip">
<string>Demodulator status</string>
<string>Daylight savings time status</string>
</property>
<property name="text">
<string/>

View File

@ -33,7 +33,7 @@
const PluginDescriptor RadioClockPlugin::m_pluginDescriptor = {
RadioClock::m_channelId,
QStringLiteral("Radio Clock"),
QStringLiteral("7.20.0-"),
QStringLiteral("7.21.3-"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -541,7 +541,7 @@
<item>
<widget class="ButtonSwitch" name="playLoop">
<property name="toolTip">
<string>Play in a loop</string>
<string>Play file in a loop</string>
</property>
<property name="text">
<string/>

View File

@ -32,7 +32,7 @@
const PluginDescriptor FileSourcePlugin::m_pluginDescriptor = {
FileSource::m_channelId,
QStringLiteral("File channel source"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.3"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -20,7 +20,6 @@
#include <QTime>
#include <QDebug>
#include <QMutexLocker>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUdpSocket>

View File

@ -33,7 +33,7 @@
const PluginDescriptor IEEE_802_15_4_ModPlugin::m_pluginDescriptor = {
IEEE_802_15_4_Mod::m_channelId,
QStringLiteral("802.15.4 Modulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -49,7 +49,7 @@
<item row="0" column="1">
<widget class="QComboBox" name="modulation">
<property name="toolTip">
<string>Modulaton type.</string>
<string>Modulation type</string>
</property>
<item>
<property name="text">

View File

@ -19,7 +19,6 @@
#include <QTime>
#include <QDebug>
#include <QMutexLocker>
#include <QNetworkAccessManager>
#include <QNetworkDatagram>
#include <QNetworkReply>

View File

@ -33,7 +33,7 @@
const PluginDescriptor AISModPlugin::m_pluginDescriptor = {
AISMod::m_channelId,
QStringLiteral("AIS Modulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -20,7 +20,6 @@
#include <QTime>
#include <QDebug>
#include <QMutexLocker>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUdpSocket>

View File

@ -32,7 +32,7 @@
const PluginDescriptor ChirpChatModPlugin::m_pluginDescriptor = {
ChirpChatMod::m_channelId,
QStringLiteral("ChirpChat Modulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -24,7 +24,6 @@
#include <QTime>
#include <QDebug>
#include <QMutexLocker>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QBuffer>

View File

@ -29,7 +29,7 @@
const PluginDescriptor DATVModPlugin::m_pluginDescriptor = {
DATVMod::m_channelId,
QStringLiteral("DATV Modulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE, Edouard Griffiths, F4EXB. DVB-S2 by G4GUO"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -20,7 +20,6 @@
#include <QTime>
#include <QDebug>
#include <QMutexLocker>
#include <QNetworkAccessManager>
#include <QNetworkDatagram>
#include <QNetworkReply>

View File

@ -33,7 +33,7 @@
const PluginDescriptor PacketModPlugin::m_pluginDescriptor = {
PacketMod::m_channelId,
QStringLiteral("Packet Modulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -150,7 +150,7 @@
<item row="0" column="1">
<widget class="QComboBox" name="modulation">
<property name="toolTip">
<string>Modulaton type.</string>
<string>Modulation type</string>
</property>
<item>
<property name="text">

View File

@ -17,7 +17,6 @@
#include <QTime>
#include <QDebug>
#include <QMutexLocker>
#include <QNetworkAccessManager>
#include <QNetworkDatagram>
#include <QNetworkReply>

View File

@ -33,7 +33,7 @@
const PluginDescriptor PSK31Plugin::m_pluginDescriptor = {
PSK31::m_channelId,
QStringLiteral("PSK31 Modulator"),
QStringLiteral("7.20.0"),
QStringLiteral("7.21.4"),
QStringLiteral("(c) Jon Beniston, M7RCE"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -17,7 +17,6 @@
#include <QTime>
#include <QDebug>
#include <QMutexLocker>
#include <QNetworkAccessManager>
#include <QNetworkDatagram>
#include <QNetworkReply>

Some files were not shown because too many files have changed in this diff Show More