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

Compare commits

...

433 Commits

Author SHA1 Message Date
Edouard Griffiths
7c738b161c
Merge pull request #2475 from srcejon/fix_2435
Radio Astronomy: Add option to auto save data to .csv.
2025-06-24 16:38:46 +02:00
Jon Beniston
4afde2a399 Radio Astronomy: Add option to auto save data to .csv. For #2435 2025-06-24 12:32:42 +01:00
Edouard Griffiths
7f5f59e510
Merge pull request #2474 from srcejon/freq_scanner
FreqScanner: Fix crash if row is selected when remove is pressed.
2025-06-24 08:10:07 +02:00
Edouard Griffiths
61608067f4
Merge pull request #2473 from srcejon/fix_2470
RemoteTCP: Add support for SDR_RX_SAMPLE_24BIT=OFF
2025-06-24 00:53:30 +02:00
srcejon
deac6017e3 FreqScanner: Fix crash if row is selected when remove is pressed. For #2391 2025-06-23 22:52:32 +01:00
Jon Beniston
d67798da56 RemoteTCP: Add support for SDR_RX_SAMPLE_24BIT=OFF 2025-06-23 22:36:09 +01:00
Edouard Griffiths
ca5898bc57
Merge pull request #2472 from srcejon/fix_2470
Fix --remote-tcp.
2025-06-23 18:18:05 +02:00
Edouard Griffiths
694c3a334d
Merge pull request #2467 from srcejon/android_fixes
A few small fixes
2025-06-23 18:17:50 +02:00
Jon Beniston
99fca7c09e Fix --remote-tcp. For #2470 2025-06-20 15:43:01 +01:00
Jon Beniston
d2470a5379 Remove obsolete GOES TLE. Remove NOAA18 as no longer active. For #2372 2025-06-17 12:20:29 +01:00
Jon Beniston
638898d3a4 Fix crash if route database not downloaded 2025-06-17 11:53:56 +01:00
Jon Beniston
e16772c154 Hide 3D only buttons if no 3D map 2025-06-17 11:53:36 +01:00
Jon Beniston
914a3af96f Fix Android compilation 2025-06-17 11:53:00 +01:00
Edouard Griffiths
e5fc6fbd81
Merge pull request #2465 from srcejon/freq_scanner
Map and ADS-B updates
2025-06-13 14:38:33 +02:00
srcejon
83bff3e847 FramelessWindowResizer: Enable child tracking for QWebEngineView. 2025-06-12 15:11:33 +01:00
srcejon
b340b92a04 Fix 2D map tracks. 2025-06-12 09:46:00 +01:00
srcejon
89a25c8a7f Fix QML warning 2025-06-12 09:21:33 +01:00
srcejon
0e93251349 Fix update of current position after filtering. 2025-06-11 10:37:45 +01:00
srcejon
65e6f89214 Restore position of 2D map after changing settings. #2458 2025-06-10 18:03:57 +01:00
srcejon
e287ac60d5 Remove debug 2025-06-10 18:03:00 +01:00
srcejon
5985a0d2e0 Fix gcc warning. 2025-06-10 15:52:30 +01:00
srcejon
9864650d9a Fix parameter injection warning. #2203 2025-06-10 15:52:09 +01:00
srcejon
0a3a455937 Fix reg exp for lat,long string. 2025-06-10 15:31:36 +01:00
srcejon
e564ac2f39 Update Kiki public URL. Add proxy support. 2025-06-10 15:30:52 +01:00
srcejon
7948561cdc Update docs. 2025-06-10 14:37:14 +01:00
srcejon
43e1e9c095 Update map docmentation. 2025-06-10 13:13:41 +01:00
srcejon
811f320536 Fix typos. 2025-06-10 11:46:58 +01:00
srcejon
290ba12c93
Merge branch 'f4exb:master' into freq_scanner 2025-06-10 11:37:54 +01:00
srcejon
6dba1f6813 Update ADS-B documentation. 2025-06-10 11:30:48 +01:00
Edouard Griffiths
05f88acf02
Merge pull request #2461 from srcejon/fix_2456
Add 384000 and maximum supported audio sample rates for Qt 6
2025-06-10 11:23:41 +02:00
srcejon
3e0375f6d5 Update docs 2025-06-09 20:07:35 +01:00
srcejon
d441dad344 Add debug 2025-06-09 20:07:22 +01:00
srcejon
55de2c724f Wait until connected before sending initial CZML 2025-06-09 20:06:58 +01:00
srcejon
cca47bbb50 Use Ellipsoid as default terrain, to minimize quota usage. 2025-06-09 16:12:13 +01:00
srcejon
8a3a246888 Add maptiler API key setting for satellite maps. Rotate default key.
Use OSM map tiles, as wikimedia tiles are no longer available.
Fix gcc warnings.
2025-06-09 15:36:01 +01:00
srcejon
b7619e1c57 Add missing return values. 2025-06-09 12:46:01 +01:00
Jon Beniston
9b714aed45 Add 384000 and maximum supported sample rates for Qt 6 AudioDeviceInfo. For #2456. 2025-06-09 11:29:16 +01:00
srcejon
c791067ea8 Fix gcc error. 2025-06-09 11:12:46 +01:00
srcejon
bc235856a8 Add Whittaker Eilers smoothing. 2025-06-09 11:01:25 +01:00
srcejon
ff3b3f4ef5 Map: Add PFD, first person view and path smoothing. Only send changes via CZML. 2025-06-09 10:44:17 +01:00
srcejon
29f7d534e5 Support wasm files in web server. 2025-06-09 10:38:53 +01:00
srcejon
395e9e0821 Use settings keys 2025-06-09 10:36:46 +01:00
srcejon
1e5257b851 Update Cesium resources 2025-06-09 10:34:57 +01:00
srcejon
d26aa35969 Map: Add support for latest Cesium graphics settings: MSAA, Terrain Lighting, Water effects, Fog and HDR, display FPS.
Add setting to select default imagery. Use Sentinel 2 as default to avoid hitting Bing Maps quota.
Add directional light strength setting.
Add ArcGIS API Key setting.
2025-06-09 10:34:41 +01:00
srcejon
24b1807a07 Map: Rotate default API keys. 2025-06-09 10:25:50 +01:00
srcejon
6c9dd36f8b Map: Add Aurora prediction and Maidenhead grid 2025-06-09 10:23:12 +01:00
srcejon
1aeac6e268 Map: Add World Magnetic Model data and show magnetic declination on map. 2025-06-09 10:18:05 +01:00
srcejon
d834c363b3 Add Cesium workaround for #1640 2025-06-09 10:14:12 +01:00
srcejon
d988aab950 Use Mode S roll data rather than estimated for map. 2025-06-09 10:13:15 +01:00
srcejon
c50097e420 Fix for Qt 5 2025-06-05 13:54:12 +01:00
srcejon
1baca797f6 Use aircraftPath 2025-06-05 13:53:34 +01:00
srcejon
6a9bba0656 Add CORS proxy for Emscripten. 2025-06-04 20:24:58 +01:00
srcejon
aa28bc700d Fix init order. 2025-06-04 20:22:43 +01:00
srcejon
96cc7a550f Remove unused variables. 2025-06-04 20:22:32 +01:00
srcejon
4678abf091 Use combined aircraft database.
Use png rather than bmp.
Add sideview images.
2025-06-04 20:22:09 +01:00
srcejon
276083d3e8 Fix for Qt5. 2025-06-04 19:28:47 +01:00
srcejon
13ecf0124e Add checklist widget 2025-06-04 18:23:53 +01:00
srcejon
db9ccd9ca8 Azel: Mark methods as const. 2025-06-04 18:15:59 +01:00
srcejon
1304926162 Add colour tracks to map. 2025-06-04 18:11:52 +01:00
srcejon
2aa2ad27da Add addtional map aircraft icons. 2025-06-04 18:11:20 +01:00
srcejon
1975c1748c Add additional demod stats.
Add analysis of Mode S frames in order to help filter out false positives.
Remove Boost. Use Profiler instead.
Fix crash if interrrupted before run.
Decode full preamble for Mode S frames.
Add support for additional Mode S downlink formats.
Allow demod stats to be reset.
Add timestamps for buffers, to ensure ordering of frames.
Add additional data columns (Aircraft Type, Sideview, Track,  Interrogator Code, TCAS, ACAS, RA, Max speed, Version, Length, Width, ADS-B/Mode S frame counts, radius, NACp, NACv, GVA, NIC, SIL, Stops).
Add PCE (Preamble Chip Errors) settings for Mode S demod.
Remove correlate full preamable setting.
Send aircraft state to Map feature for display on PFD.
Add support for airline route database.
Use combined aircraft database from sdrangel.org rather than OSN database.
Add stats table, with demod stats and breakdown of frame types received..
Add button to delete all aircraft from table.
Add display of interrogator code coverage.
Remove airport elevation setting as now calculated dynamically.
Add QNH setting.
Add coverage map.
Add chart of frame rate and aircraft count.
Add table/map orientation setting.
Add display of aircraft position uncertainty.
Add coloured flight paths with several palettes.
Add setting to favour airline livery over aircraft type in 3D model matching.
Only use 4 engine map icon for aircraft with 4 engines.
Add specialised aircraft map icons (Eurofighter, Spitfire, F35, A400M, Apache, Chinook, Glider)
Display aircraft route in labels.
Better validate local/global aircraft positions.
Add support for tc==31, aircraft operational status frames.
Add decoding of Mode S df 0, 11, 16 frames.
Add decoding of BDS 0,5 0,8, 0,9.
2025-06-04 18:05:10 +01:00
srcejon
f882747e97 Remove boost dependency and add charts and sideviews. 2025-06-04 17:01:41 +01:00
srcejon
f1aab5c97e Add additional ADS-B toolbar icons 2025-06-04 17:00:46 +01:00
srcejon
d453e164fa Add additional ADS-B map aircraft icons to better reflect aircraft categories. 2025-06-04 17:00:04 +01:00
srcejon
3b22d436ee Update flags 2025-06-04 16:59:06 +01:00
srcejon
4c1f99a7d2 Add aircraft sideviews. 2025-06-04 16:58:22 +01:00
srcejon
cd38c0d6a3 Convert airline logos from BMP to PNG to reduce size. 2025-06-04 16:56:58 +01:00
srcejon
91b83cff3b
Merge branch 'f4exb:master' into freq_scanner 2025-06-03 16:16:38 +01:00
f4exb
c333fb505c SSB Demod: clamp audio to 16 bit samples boundaries for better audio overdrive robustness. Fixes #2452 2025-06-02 22:01:21 +02:00
srcejon
b897b2176d Merge master 2025-06-02 12:10:21 +01:00
Edouard Griffiths
f7b9727ef9
Merge pull request #2450 from f4exb/fix-swagger
Fix swagger
2025-05-29 18:50:53 +02:00
f4exb
76b4623375 Upgrade Swagger UI to 5.22.0 and added WDSPRx.yaml to resources 2025-05-29 15:10:16 +02:00
f4exb
28077752a9 Swagger schema fixes 2025-05-29 12:48:11 +02:00
f4exb
3d3195489a Added Swagger schema validation container in the compose stack 2025-05-29 12:47:57 +02:00
f4exb
89d7fe736f Updated versions and changelogs 2025-05-04 20:01:51 +02:00
f4exb
2f47258605 Added Python script to control PlutoDVB2 2025-05-04 19:57:24 +02:00
f4exb
de4147b853 DATV demod: pass symbol rate in report 2025-05-04 01:44:51 +02:00
f4exb
002f5e8af3 Demod DATV: improve UDP TS output detection 2025-05-03 17:16:19 +02:00
f4exb
ce007419e8 DATV demod server plugin 2025-05-03 04:29:19 +02:00
f4exb
fc82606e6e DATV demod: completely remove LDPC external command references 2025-05-03 02:38:48 +02:00
f4exb
ab54ac7a63 DATV demod: prepare for server version 2025-05-03 01:43:35 +02:00
f4exb
379c802d39 Move datvideorender.h outside datvdemodsink.h 2025-05-02 23:57:25 +02:00
Edouard Griffiths
e6eb23d8a0
Merge pull request #2442 from srcejon/fix_2441
Try to fix Windows CI build
2025-04-23 11:43:39 +02:00
Jon Beniston
0111ce247b Try Python 3.12 for CI build as well. 2025-04-23 09:20:55 +01:00
Jon Beniston
c108f5be40 Try using Python 3.12 instead 2025-04-23 09:10:24 +01:00
Jon Beniston
1074bd0105 Try earlier versions to work around #2441 2025-04-23 08:40:40 +01:00
Jon Beniston
a5d1f48580 Try setup-python: true to fix #2441 2025-04-23 08:25:47 +01:00
f4exb
1c8d7bdaf1 AudioCATSISO: accept ttyS* serial ports for CAT. Fixes #2420 2025-04-21 14:34:53 +02:00
f4exb
77b2b815b8 Replace sprintf by snprintf wherever possible 2025-04-21 14:34:53 +02:00
Edouard Griffiths
2e1411311b
Merge pull request #2439 from srcejon/fix_qt_6_9
Fix build with Qt 6.9.0.
2025-04-21 14:34:01 +02:00
Edouard Griffiths
c8fed979d4
Merge pull request #2438 from mattsoftware/gs232_fixes
Also accept +0179+0001 as an acceptable gs232 format for reporting po…
2025-04-21 13:28:57 +02:00
Jon Beniston
60869b74f9 Fix build with Qt 6.9.0. 2025-04-21 10:59:54 +01:00
Matt Paine
88b2f29894 Comment out the debug statements 2025-04-21 19:22:21 +10:00
Matt Paine
fa6a801411 Also accept +0179+0001 as an acceptable gs232 format for reporting position 2025-04-21 10:59:09 +10:00
Edouard Griffiths
1c6b167527
Merge pull request #2433 from srcejon/fix_sat_tracker_doppler_crash
Fix sat tracker doppler crash
2025-04-17 17:38:28 +02:00
Jon Beniston
bafcb75313 Fix doppler correction. 2025-04-16 14:43:47 +01:00
Jon Beniston
e33d6e9b64 Satellite Tracker: Fix crash when doppler enabled. 2025-04-16 11:23:38 +01:00
Edouard Griffiths
7e6342624c
Merge pull request #2432 from srcejon/fix_2428
ChannelWebAPIUtils: Add double version of patchDeviceSetting.
2025-04-14 16:56:53 +02:00
Jon Beniston
90ddb54371 ChannelWebAPIUtils: Add double version of patchDeviceSetting. Fix #2428 2025-04-14 09:13:44 +01:00
f4exb
356e5e42be Use -DCMAKE_POLICY_VERSION_MINIMUM=3.5 for external packages Windows build 2025-04-05 21:59:21 +02:00
f4exb
c7e2a78903 Use SerialDV 1.1.5 2025-04-05 09:39:09 +02:00
Edouard Griffiths
8ff41d60fd
Merge pull request #2425 from lukolszewski/feature/adding-split-button
Split button added, swagger changed manually, but should be the same …
2025-04-05 01:03:37 +02:00
Łukasz Olszewski
5f74620406 Split button added, swagger changed manually, but should be the same when regenerated 2025-03-27 01:20:53 +01:00
srcejon
7a97bbfea0
Merge branch 'f4exb:master' into freq_scanner 2025-03-10 09:33:04 +00:00
Edouard Griffiths
81bae39a22
Merge pull request #2417 from srcejon/fix_2002
Update HackRF to v2024.02.1.
2025-03-09 11:41:36 +01:00
Jon Beniston
596544ade7 Update HackRF to v2024.02.1. For #2002 2025-03-08 09:33:18 +00:00
Edouard Griffiths
fed8856e1e
Merge pull request #2416 from srcejon/fix_2415
Update LimeSuite to latest version to fix Windows build
2025-03-08 00:51:48 +01:00
Jon Beniston
825c1d0759 Update LimeSuite to latest version, to fix #2415 2025-03-07 16:37:31 +00:00
srcejon
190b8c6aeb
Merge branch 'f4exb:master' into freq_scanner 2025-03-07 16:25:34 +00:00
Edouard Griffiths
0c502c59f8
Merge pull request #2414 from srcejon/fix_2283
Fix HackRF support
2025-03-07 09:33:44 +01:00
Jon Beniston
ad46defda9 Merge branch 'fix_2283' of https://github.com/srcejon/sdrangel into fix_2283 2025-03-06 17:12:01 +00:00
Jon Beniston
42a674037f HackRfInput: Call applySettings before starting thread, otherwise HackRF will not start correctly. Handle not all settingsKeys being set, when adjusting centre frequency. 2025-03-06 17:11:35 +00:00
Jon Beniston
3c9931bc59 LoadConfigurationFSM::loadDeviceSets: Wait 250ms to allow devices to initialise, as DeviceGUI::sendSettings has 100ms delay. 2025-03-06 17:09:16 +00:00
srcejon
cb5d921e68 Add altitudeDateTime to MapItem 2025-03-06 13:55:38 +00:00
srcejon
5ae5641f99
Merge branch 'f4exb:master' into freq_scanner 2025-03-06 13:46:24 +00:00
Edouard Griffiths
b3f83c33fa
Merge pull request #2410 from srcejon/fix_2324
wdsp: Remove redundant code that causes stack overflow on Mac.
2025-03-05 07:21:32 +01:00
Jon Beniston
c40da37faf wdsp: Remove redundant code that causes stack overflow on Mac. For #2324. 2025-02-27 13:20:44 +00:00
Edouard Griffiths
ba673bf3a2
Merge pull request #2402 from srcejon/fix_2401
Fix -DBUILD_SHARED_LIBS=ON for FLAC
2025-02-16 21:05:19 +01:00
Jon Beniston
082a07d39b Fix -DBUILD_SHARED_LIBS=ON for FLAC 2025-02-16 18:11:37 +00:00
Edouard Griffiths
d24c552d24
Merge pull request #2397 from srcejon/mac_ci
Mac x64 build for Mac OS 12
2025-02-10 03:29:44 +01:00
Edouard Griffiths
31ab1480d0
Merge pull request #2394 from srcejon/fix_2242
Radiosonde: Fix pressure calculation.
2025-02-09 10:14:27 +01:00
srcejon
08537b5a5a Add callsign to aircraft state 2025-02-04 16:00:04 +00:00
srcejon
4627be2e50 Add labelDateTime to MapItem 2025-02-04 13:51:52 +00:00
Jon Beniston
7f20ca0a6d Fix indent 2025-02-04 12:04:51 +00:00
Jon Beniston
310df0046c Try setting MACOSX_DEPLOYMENT_TARGET to see if it can run on older MacOSes. 2025-02-04 12:03:13 +00:00
srcejon
3c5ce69846
Merge branch 'f4exb:master' into freq_scanner 2025-02-04 11:02:29 +00:00
Jon Beniston
b653117360 Fix lint warnings. 2025-02-03 14:04:43 +00:00
Jon Beniston
a2f8428352 Radiosonde: Fix pressure calculation. #2242 2025-02-03 13:58:46 +00:00
f4exb
e6b3e50fd2 Updated version and changelog 2025-02-02 19:09:22 +01:00
Edouard Griffiths
504684c609
Merge pull request #2389 from srcejon/fix_2364
Update snap to use UHD 4.7.
2025-01-26 09:56:52 +01:00
Jon Beniston
fc64424377 Update snap to use UHD 4.7. 2025-01-25 15:57:43 +00:00
Edouard Griffiths
89e392e91f
Merge pull request #2386 from srcejon/fix_2384
Fix gcc warnings about warning options
2025-01-25 10:21:50 +01:00
srcejon
23279d2f46 Fix gcc warnings about warning options 2025-01-23 22:57:16 +00:00
Edouard Griffiths
d7863b25c6
Merge pull request #2385 from srcejon/mac_ci
Update Mac Github actions
2025-01-23 21:53:11 +01:00
Edouard Griffiths
6ded8f079b
Merge pull request #2383 from srcejon/fix_file_sink_ui
FileSink: Add minimum width constraint so widgets don't move around a…
2025-01-23 20:47:12 +01:00
srcejon
d524bf2057
Merge branch 'f4exb:master' into mac_ci 2025-01-23 14:31:04 +00:00
Jon Beniston
6df8b94637 Try to fix arm build as well. 2025-01-23 11:02:37 +00:00
Edouard Griffiths
19d8a1da0f
Merge pull request #2382 from srcejon/fix_2378
Radiosonde: Add option to display predicted paths.
2025-01-23 10:26:24 +01:00
Jon Beniston
2ea5ef220b Add set +e to allow script to continue on error 2025-01-23 08:53:01 +00:00
Jon Beniston
9ea7ade57f Try continue-on-error: true to allow make to be retried 2025-01-22 21:38:22 +00:00
Jon Beniston
c9c9febe41 Use version 4.1 of x265 as master is broken on Mac. 2025-01-22 21:38:00 +00:00
Jon Beniston
4519e512c6 Retry make package in case hdituil fails 2025-01-22 20:45:22 +00:00
srcejon
2248b42a06
Merge branch 'f4exb:master' into mac_ci 2025-01-22 20:35:49 +00:00
Jon Beniston
7af58538b6 FileSink: Add minimum width constraint so widgets don't move around as dials are changed. 2025-01-21 13:47:47 +00:00
Jon Beniston
9f61152d37 Merge branch 'fix_2378' of https://github.com/srcejon/sdrangel into fix_2378 2025-01-21 13:33:17 +00:00
Jon Beniston
52d59b8609 Radiosonde: Add option to display predicted paths. 2025-01-21 13:33:11 +00:00
Edouard Griffiths
6b30f17361
Merge pull request #2381 from srcejon/fix_2359
Add --start command line option to start all devices and features.
2025-01-21 14:33:07 +01:00
Jon Beniston
2f280ec06a Radiosonde: Fix radio type sent to SondeHub 2025-01-21 10:41:01 +00:00
Edouard Griffiths
3c7fd19f59
Merge pull request #2380 from srcejon/fix_2375
Fix SSB Mod Morse keyer
2025-01-20 22:28:59 +01:00
Edouard Griffiths
e38e2e773f
Merge pull request #2379 from srcejon/fix_2378
Radiosonde: Rate limit position updates to SondeHub.
2025-01-20 21:06:42 +01:00
Jon Beniston
f841eecab9 Add --start option to start all devices and features. For #2359. 2025-01-20 10:54:21 +00:00
Jon Beniston
b2a1dc3569 Fix SSB Mod Morse keyer 2025-01-20 09:25:33 +00:00
Jon Beniston
9c64424cec Display errors from SondeHub as warnings rather than debug. 2025-01-19 13:09:55 +00:00
Jon Beniston
a3692309c0 Radiosonde: Rate limit position updates to SondeHub. Fixes #2378. 2025-01-19 13:09:16 +00:00
Edouard Griffiths
83b36c6aab
Merge pull request #2377 from srcejon/sid_fix_read_csv
SID: Fix crash when loading data from .csv.
2025-01-19 10:43:18 +01:00
Jon Beniston
c62a25f40a Undo auto-format. 2025-01-17 13:33:53 +00:00
Jon Beniston
86ac92e63e SID: Fix crash when loading data from .csv. 2025-01-17 13:31:19 +00:00
Edouard Griffiths
aa65bd5b39
Merge pull request #2371 from das-Iro/colormap-acab
Added "All Colors Are Beautiful" colormap
2025-01-11 00:18:46 +01:00
Arne Jünemann
4203e72e12 Added All Colors Are Beautiful colormap 2025-01-10 15:53:30 +01:00
srcejon
73f345792d Add date and time for interpolatable properties 2025-01-05 20:47:19 +00:00
srcejon
5eeae7c231 Add type and onSurface fields 2025-01-05 10:24:33 +00:00
srcejon
67dec1dd83 Fix spelling 2025-01-03 11:43:18 +00:00
srcejon
4e3545cf0e Add aircraft state to MapItem 2025-01-03 11:30:35 +00:00
Edouard Griffiths
3f7e1193fa
Merge pull request #2369 from tyrylu/right_click_using_keyboard
right-click-enabler: Allow activation of the right click action by keyboard
2025-01-02 18:10:47 +01:00
Lukáš Tyrychtr
c2652d3ee5 right-click-enabler: Allow activation of the right click action by keyboard
This allows for example, selecting the audio output device for visually
impaired.
2024-12-28 18:19:54 +01:00
Edouard Griffiths
51b540cf72
Merge pull request #2365 from srcejon/usrp_gpio
Add GPIO support for USRP devices
2024-12-25 21:02:23 +01:00
Edouard Griffiths
70d090101a
Merge pull request #2363 from srcejon/freq_scanner
ADS-B: Fix OpenSky authentication to enable 4000 API calls per day.
2024-12-25 20:11:19 +01:00
Jon Beniston
d3584f6af2 RemoteTCPSink: Handle client disconnecting immediately. 2024-12-24 13:25:14 +00:00
Jon Beniston
c5efd73f6b Document GPIOs. 2024-12-24 12:56:36 +00:00
Jon Beniston
4510f40729 ChannelWebAPIUtils::patchDeviceSetting: Add support for sinks and MIMO. 2024-12-24 12:49:10 +00:00
Jon Beniston
56bd20d59b USRP: Implement GPIO settings. 2024-12-24 12:48:43 +00:00
srcejon
a4269dcd78 Add GPIO pins to USRP and regen swagger 2024-12-24 10:59:35 +00:00
srcejon
9f661aee30 ADS-B: Fix OpenSky authentication to enable 4000 API calls per day. 2024-12-20 16:34:11 +00:00
Edouard Griffiths
35088962fe
Merge pull request #2362 from srcejon/freq_scanner
Fix Win32 plugin directory for Qt6 build
2024-12-18 15:50:07 +01:00
srcejon
930e4d7e50 Fix Win32 plugin directory for Qt6 build 2024-12-18 09:33:15 +00:00
Edouard Griffiths
f4e2d10055
Merge pull request #2357 from srcejon/fix_2336
Fix audio modulators when channel sample rate is greater than audio sample rate
2024-12-10 21:46:39 +01:00
Jon Beniston
68126592ad Fix naming of Kazakhstan flag 2024-12-10 14:05:19 +00:00
Jon Beniston
5ea872fe30 Add additional DSC coast stations. 2024-12-10 14:04:47 +00:00
Jon Beniston
7dec953ade DSC: Use coast stations of rmessage source as well. 2024-12-10 10:46:12 +00:00
Jon Beniston
1462890a77 Fix modulators when channel sample rate is greater than audio sample rate. 2024-12-10 10:45:48 +00:00
Edouard Griffiths
d696dd66a0
Merge pull request #2355 from srcejon/dsc_coast_station_names
DSC Demod: Add coast station names.
2024-12-09 21:03:04 +01:00
Jon Beniston
107d1ee6c8 Fix lint warnings. 2024-12-09 12:03:34 +00:00
Jon Beniston
4a8adc4a42 DSC: Add coast station names. 2024-12-09 11:58:17 +00:00
Jon Beniston
a9385cb91c macos-14 is arm only 2024-12-05 14:40:08 +00:00
Jon Beniston
ec0ffa005a Try macos-14, as 13 fails due to https://github.com/actions/runner-images/issues/7522 2024-12-05 13:11:08 +00:00
Jon Beniston
405073d198 Install svn needed to build lame 2024-12-05 10:15:18 +00:00
Jon Beniston
88c5554970 Update mac_x64 build to macos-13, as github no longer supports 12. 2024-12-05 09:08:02 +00:00
f4exb
c4e57a1696 Updated versions and changelogs 2024-12-05 02:10:24 +01:00
Edouard Griffiths
99011d8bbc
Merge pull request #2347 from srcejon/win_code_sign
Upload signed releases rather than unsigned releases to Github
2024-12-03 15:11:01 +01:00
Jon Beniston
d86dbbade9 Upload signed releases rather than unsigned releases to Github releases page.
Only sign releases, not all pull requests.
2024-12-02 22:41:18 +00:00
Edouard Griffiths
87a3d9dea7
Merge pull request #2344 from srcejon/win_code_sign
Windows code signing update
2024-12-02 20:11:39 +01:00
Jon Beniston
c0b8620baa Increase timeout to 1 hour 2024-12-02 13:50:24 +00:00
Jon Beniston
4b714dfaa5 Remove unzip step, as it appears we get a .exe 2024-12-02 13:46:56 +00:00
f4exb
ec4d14be3f FT8 Demod: limit upper bandwidth to 5.8 kHz 2024-12-02 13:01:22 +01:00
Edouard Griffiths
1f0a8e3690
Merge pull request #2342 from srcejon/fix_2332
Stop device while loading device set.
2024-11-26 23:09:14 +01:00
Edouard Griffiths
5ba42f1866
Merge pull request #2341 from srcejon/fix_aircraft_db
ADSB: Update URL of OpenSkyNetwork Aircraft database.
2024-11-26 17:57:57 +01:00
Jon Beniston
3c3e5cf3df Stop device while changing channel set. Fixes #2332 2024-11-26 11:52:30 +00:00
Jon Beniston
943a1fb56c ADSB: Update URL of OpenSkyNetwork Aircraft database. 2024-11-26 10:41:48 +00:00
Edouard Griffiths
460ebfbeb2
Merge pull request #2340 from srcejon/fix_2315
Fix crash and audio mod
2024-11-26 09:47:11 +01:00
srcejon
a91fa3b760 Don't stop source if being deleted. For #2315. Send DSPSignalNotification in audio mods for #2336. 2024-11-25 17:16:08 +00:00
Edouard Griffiths
d0cae88ba8
Merge pull request #2338 from srcejon/fix_2337
RadioSonde: Limit precision of floating point numbers sent to SondeHub.
2024-11-19 16:27:50 +01:00
Edouard Griffiths
30a0198862
Merge pull request #2335 from srcejon/win_code_sign
Code Signing: Use relative path. Increase approval timeout to 30 minutes.
2024-11-19 10:11:14 +01:00
Jon Beniston
7b7f9e2c06 Limit precision of floating point numbers sent to SondeHub. 2024-11-18 09:48:50 +00:00
Jon Beniston
a12d664055 Use relative path. Increase timeout to 30 minutes. 2024-11-16 10:48:26 +00:00
Edouard Griffiths
5cc7b3ac33
Merge pull request #2334 from srcejon/fix_2333
ADSB: Include adsbdemodsettings.h
2024-11-16 10:38:53 +01:00
Jon Beniston
4465e1e8b8 ADSB: Include adsbdemodsettings.h 2024-11-15 13:00:39 +00:00
Edouard Griffiths
4da9a34c87
Merge pull request #2331 from srcejon/win_code_sign
Use release signing certificate for Windows installer.
2024-11-14 15:18:19 +01:00
Edouard Griffiths
7bc6210b64
Merge pull request #2330 from srcejon/fix_2315
Fix a few memory leaks and race conditions
2024-11-14 14:31:09 +01:00
Jon Beniston
f8a991e4a3 Use release signing certificate for Windows installer. 2024-11-14 12:40:01 +00:00
srcejon
6dcc342c10 Fix memory leak and race condition relating to DSP*Engines. Part of #2159 2024-11-14 11:42:53 +00:00
srcejon
7c7a7d7c1e FreeDV: Fix memory allocation/free issues. Part of #2315. 2024-11-14 11:40:46 +00:00
Edouard Griffiths
0a94970a70
Merge pull request #2328 from srcejon/freq_scanner
DemodAnalyzer: Ensure sample rate is set in worker.
2024-11-12 23:16:04 +01:00
srcejon
875f16f12a Wav Files: Add support for meta-data. 2024-11-12 20:36:33 +00:00
srcejon
c4733a3645 DemodAnalyzer: Ensure sample rate is set in worker. Fixes #2309. 2024-11-12 20:36:10 +00:00
Edouard Griffiths
585841e787
Merge pull request #2327 from srcejon/fix_2322
SDRplayv3: Patch path to libsdrplay_api.so.3
2024-11-12 21:16:46 +01:00
Edouard Griffiths
bba9d0b421
Merge pull request #2326 from srcejon/fix_1734
ADS-B: Fix memory use after delete.
2024-11-12 20:23:35 +01:00
Jon Beniston
600e338bab SDRplayv3: Mac now appears to link with libsdrplay_api.so.3 rather than libsdrplay_api.so.3.15. 2024-11-12 15:38:34 +00:00
srcejon
f03499a9a3 ADS-B: Fix memory use after delete. For #1734 and part of #2315 2024-11-12 12:39:14 +00:00
f4exb
73533231a5 Fixed Appveyor Docker image build 2024-11-12 11:01:48 +01:00
Edouard Griffiths
d52179dbe2
Merge pull request #2323 from srcejon/win_code_sign
Windows Signing: Fix output-artifact-directory and unzip file.
2024-11-12 10:58:44 +01:00
Jon Beniston
a7c67a8540 Fix output-artifact-directory and unzip file. 2024-11-11 16:53:52 +00:00
f4exb
cb4651af0b Fixed Appveyor Docker image build 2024-11-11 17:15:20 +01:00
f4exb
ba6a3cc665 Updated versions and changelogs 2024-11-11 09:46:29 +01:00
Edouard Griffiths
9f95769608
Merge pull request #2321 from srcejon/mac_ci
Use macos-12 for Mac x86 build
2024-11-10 20:58:31 +01:00
Edouard Griffiths
ca76d5fbae
Merge pull request #2320 from srcejon/fix_2319
Pager: Add Add notifications based on alpha and numeric columns.
2024-11-10 18:05:51 +01:00
Jon Beniston
d7547e2d25 Pager: Add alpha and numeric columns. Implements #2319 2024-11-10 15:48:36 +00:00
Jon Beniston
d53aa60112 Merge branch 'mac_ci' of https://github.com/srcejon/sdrangel into mac_ci 2024-11-10 14:09:53 +00:00
Jon Beniston
8284388862 nasm and subversion already installed in brew - and upgrade fails. 2024-11-10 14:09:47 +00:00
srcejon
d69ca4d1f6
Merge branch 'f4exb:master' into mac_ci 2024-11-10 12:53:53 +00:00
Jon Beniston
43077fc549 Add mac into dmg filename 2024-11-10 10:13:03 +00:00
Jon Beniston
1ca63912b6 Try macos-12 2024-11-10 10:04:51 +00:00
Edouard Griffiths
86f4a5bc69
Merge pull request #2316 from srcejon/win_qt6
Fix missing 3D map and Sky Map from latest Windows release.
2024-11-10 09:47:02 +01:00
Jon Beniston
b96b4b60b4 Workaround for "hdiutil: create failed - Resource busy" 2024-11-09 22:32:18 +00:00
Jon Beniston
3da2074d9d Add qtwebchannel needed by qtwebengine. 2024-11-09 21:50:13 +00:00
f4exb
ae5dc866c7 Updated versions and changelogs 2024-11-09 18:46:38 +01:00
Edouard Griffiths
bf837e0e02
Merge pull request #2314 from gl-bars/AddDebDependencies
Add deb dependencies
2024-11-08 20:12:36 +01:00
Gleb Baryshev
b6816fe886 Add deb dependencies 2024-11-08 14:04:58 +02:00
Edouard Griffiths
f09a1259e4
Merge pull request #2313 from srcejon/freq_scanner
Support more Qt configurations
2024-11-07 08:31:05 +01:00
srcejon
5bffac3eaa Merge branch 'freq_scanner' of https://github.com/srcejon/sdrangel into freq_scanner 2024-11-06 13:14:55 +00:00
srcejon
197ac366e2 Support compilation when QT_NO_NETWORKINTERFACE is defined (E.g. WebAssembly) 2024-11-06 12:27:06 +00:00
srcejon
14063a80e9 Support compilation without SSL support. 2024-11-06 12:12:46 +00:00
srcejon
8ed7972dce Support compilation on Qt platforms that don't support processes (i.e. WebAssembly). 2024-11-06 12:11:49 +00:00
srcejon
2abe88368b Use ENABLE_METIS option 2024-11-06 11:58:44 +00:00
Edouard Griffiths
06678a5978
Merge pull request #2311 from srcejon/win_code_sign
Windows code signing: Use test certificate
2024-11-05 23:13:45 +01:00
Edouard Griffiths
29bac274d6
Merge pull request #2310 from srcejon/freq_scanner
Frequency scanner: Add multiplex mode
2024-11-05 13:34:32 +01:00
Jon Beniston
eceedd5db8 Windows code signing: Use test certificate until release certificate is available. 2024-11-05 11:12:14 +00:00
srcejon
98481a96e9 Fix path to resources. 2024-11-05 10:38:13 +00:00
srcejon
28faddea1d ADS-B: Use settings keys. 2024-11-05 10:31:32 +00:00
srcejon
a9f25b3642 AIS Demod: Remove spacing around messages, to make better use of available space. 2024-11-05 10:09:34 +00:00
srcejon
1235f71388 Freuqency Scanner: Add multiplex mode. 2024-11-05 10:09:09 +00:00
f4exb
e277e4fc1f Github actions: use upload-artifact v4 to comply with nodejs requirements 2024-11-03 19:57:55 +01:00
Edouard Griffiths
fcc1bca5a0
Merge pull request #2307 from srcejon/win_code_sign
Add github action to test code signing on Windows using SignPath.
2024-11-03 09:16:19 +01:00
Jon Beniston
b8fc311997 Add github action to test code signing on windows using SignPath. 2024-11-02 16:16:09 +00:00
Edouard Griffiths
9161fc1c05
Merge pull request #2306 from srcejon/snap
Don't build Snaps on pull requests
2024-11-02 16:44:20 +01:00
Edouard Griffiths
fd168e881a
Merge pull request #2305 from srcejon/linux_github_release
github action to build ubuntu 22.04 and 24.04 release .debs
2024-11-02 15:31:07 +01:00
Jon Beniston
df6cefbd69 Merge branch 'snap' of https://github.com/srcejon/sdrangel into snap 2024-11-02 10:07:52 +00:00
Jon Beniston
23a8fdeb86 Don't build snap on pull requests. 2024-11-02 10:07:41 +00:00
Jon Beniston
feabcef336 libgl1-mesa-glx replaced by libgl1 and libglx-mesa0, 2024-11-02 08:56:21 +00:00
Edouard Griffiths
b122d40bce
Merge pull request #2304 from srcejon/freq_scanner
Server: Use Sink/MIMO signals rather than Source.
2024-11-02 08:53:11 +01:00
Edouard Griffiths
8346cc4988
Merge pull request #2303 from srcejon/mac_ci
Add github action to build releases for Mac
2024-11-02 05:18:58 +01:00
Edouard Griffiths
067324edd9
Merge pull request #2302 from srcejon/snap
Add github action to build and publish Snap
2024-11-01 23:16:02 +01:00
Jon Beniston
c72a72b3f8 ubuntu-20.04 doesn't support required version of cmake 2024-11-01 22:01:42 +00:00
Jon Beniston
763438c7e5 Use short sha 2024-11-01 21:33:38 +00:00
Jon Beniston
00df25ff63 Try ubuntu-20.04 2024-11-01 21:31:45 +00:00
Jon Beniston
8f030d9ea5 Upload artifact doesn't like relative paths. 2024-11-01 19:57:29 +00:00
Jon Beniston
bd8853f2e9 Build for both ubuntu-22.04 and ubuntu-24.04 2024-11-01 18:58:26 +00:00
Jon Beniston
8c7e650f8f Update limesuite to v23.11.0 to see if it builds on ubuntu-24.04 2024-11-01 18:57:37 +00:00
Jon Beniston
e6e6084e1c Try ubuntu-22.04 2024-11-01 18:01:19 +00:00
Jon Beniston
dc330b7d5b Remove libclang1-11 2024-11-01 17:47:33 +00:00
Jon Beniston
1ecaa22721 Trial .deb build 2024-11-01 17:42:11 +00:00
srcejon
d516e9529d
Merge branch 'f4exb:master' into freq_scanner 2024-11-01 16:32:59 +00:00
srcejon
9afab2af89 Server: Use Sink/MIMO signals rather than Source. 2024-11-01 16:32:39 +00:00
Jon Beniston
4f36b21d2e Use macos-14 image to build on ARM which is twice as fast. 2024-11-01 16:28:23 +00:00
Edouard Griffiths
e8041308b1
Merge pull request #2301 from srcejon/freq_scanner
RemoteTCPSink: Disable IQ compression for RTL0 protocol.
2024-11-01 17:24:55 +01:00
srcejon
b04d7eb10a RemoteTCPSink: Does use IQ only setting for RTL0. 2024-11-01 13:42:23 +00:00
Jon Beniston
441c47c35f Install python manually. 2024-11-01 13:30:36 +00:00
Jon Beniston
9bd001c9ed Update to github releases 2024-11-01 12:49:39 +00:00
Jon Beniston
4ba1340e8e Merge branch 'mac_ci' of https://github.com/srcejon/sdrangel into mac_ci 2024-11-01 12:47:02 +00:00
Jon Beniston
1094874321 Remove test code. 2024-11-01 12:46:53 +00:00
srcejon
84251abda7
Merge branch 'f4exb:master' into mac_ci 2024-11-01 12:46:23 +00:00
Jon Beniston
fa4f9c2d82 Update snap to github releases and snap store. 2024-11-01 12:21:59 +00:00
srcejon
7f275f2a3e
Merge branch 'f4exb:master' into snap 2024-11-01 12:05:46 +00:00
Jon Beniston
ff56523865 Try Python3_FIND_FRAMEWORK=NEVER 2024-11-01 11:43:28 +00:00
Jon Beniston
1653698f99 Try -DPYTHON_EXECUTABLE again 2024-11-01 11:37:55 +00:00
Jon Beniston
a9dbfea8d1 Try bin 2024-11-01 11:16:00 +00:00
Jon Beniston
7a9b5ee068 Try Python3_ROOT_DIR 2024-11-01 10:48:36 +00:00
Jon Beniston
8e81d3825a Update boost to latest release. 1.78 fails to build using c++17
Update UHD to 4.7 and set -DENABLE_PYTHON_API=OFF to try to remove runtime python requirement.
2024-11-01 10:10:31 +00:00
f4exb
bd67d553ea Main server: wait for set sample source/sink/MIMO to complete before loading the device settings. For #2294 2024-11-01 10:32:39 +01:00
Jon Beniston
03f4dfe2e1 Add target option 2024-11-01 09:11:32 +00:00
Jon Beniston
28d0b73bc5 Install SDRplay API 2024-11-01 09:08:25 +00:00
Jon Beniston
0bfef9de14 Add x64 build. Try to build DATV. 2024-11-01 08:08:19 +00:00
Jon Beniston
622958bdb5 Use hash for ci builds 2024-10-31 21:16:19 +00:00
Jon Beniston
5c41fe8342 Build in one step, as faster 2024-10-31 21:12:36 +00:00
Jon Beniston
32a9144f55 Don't use absolute path, as build directory may be somewhere else. 2024-10-31 21:12:15 +00:00
Jon Beniston
e707d75624 Update OpenCV as fails to compile with c++17 2024-10-31 18:57:08 +00:00
Jon Beniston
868bfea65e Disble USRP for now. 2024-10-31 18:10:27 +00:00
Jon Beniston
9d3fe6e86e Try DPYTHON_EXECUTABLE 2024-10-31 17:13:19 +00:00
Jon Beniston
d9f36dc508 Try venv 2024-10-31 16:41:05 +00:00
Jon Beniston
e35133b741 Try pipx 2024-10-31 16:28:29 +00:00
Jon Beniston
3df03768d2 Is pip3 already installed? 2024-10-31 16:22:50 +00:00
Jon Beniston
4d6d97538c Fix syntax 2024-10-31 16:07:48 +00:00
Jon Beniston
ede06e2ca8 Fix version name. 2024-10-31 16:05:50 +00:00
Jon Beniston
f124186366 Add python packages for UHD 2024-10-31 15:33:00 +00:00
Edouard Griffiths
618e234d6c
Merge pull request #2299 from srcejon/fix_2282
Fix spectrum peak measurement for SSB spectra.
2024-10-31 16:25:14 +01:00
Jon Beniston
7bab142af1 usrpoutput: add_dependencies needs to follow add_library 2024-10-31 15:16:08 +00:00
Jon Beniston
11614b417b Add brew subversion and nasm.
Add qtwebchannel as appears to be needed by qtwebengine.
2024-10-31 14:50:06 +00:00
Jon Beniston
729d663832 Add id to try to fix "Input required and not supplied: path" in upload-artifact 2024-10-31 14:38:52 +00:00
Jon Beniston
e5fa27ba96 Try removing setup-python 2024-10-31 14:34:48 +00:00
Edouard Griffiths
4b37779e9e
Merge pull request #2298 from srcejon/fix_2297
Update some example scripts to python3
2024-10-31 15:14:00 +01:00
Jon Beniston
46e8688de2 Install Qt 6 2024-10-31 14:03:21 +00:00
Jon Beniston
fceee07486 Remove nehalem for arm build 2024-10-31 13:56:29 +00:00
Jon Beniston
a108d0b986 Merge branch 'mac_ci' of https://github.com/srcejon/sdrangel into mac_ci 2024-10-31 13:53:56 +00:00
Jon Beniston
362e23bea0 Add github action to build Mac release 2024-10-31 13:53:45 +00:00
Jon Beniston
5ac77fca98 Try snapcore/action-build instead 2024-10-31 13:31:05 +00:00
Jon Beniston
ab13f94cf0 Add github action to build snap. 2024-10-31 13:21:34 +00:00
Jon Beniston
764bce52fe Fix spectrum peak measurement for SSB spectra. Fixes #2282. 2024-10-31 12:42:46 +00:00
srcejon
b37c7f6cb9 Update some example scripts to python3 2024-10-31 11:50:40 +00:00
f4exb
35aa393f11 Upgrade C++ standard to c++17 2024-10-23 21:32:13 +02:00
Edouard Griffiths
ed89eea72c
Merge pull request #2288 from srcejon/android_fixes
Fix Android build
2024-10-22 17:01:58 +02:00
Edouard Griffiths
f6f2d9bee7
Merge pull request #2287 from srcejon/win_qt6
Use Qt 6 for Windows github build
2024-10-22 01:45:01 +02:00
Jon Beniston
66247ec6fd Fix for Qt5 2024-10-21 18:28:21 +01:00
Jon Beniston
dbbf1918ab Fix Android build 2024-10-21 17:15:27 +01:00
Jon Beniston
77895090dc Fix Android build 2024-10-21 17:13:11 +01:00
Jon Beniston
2538662c9b Fixes for Android 2024-10-21 17:11:55 +01:00
Jon Beniston
89134729cc Don't build aaroniartsainput on Android 2024-10-21 17:10:51 +01:00
Jon Beniston
2132ac8ed2 Fix Qt5 Android build 2024-10-21 17:10:22 +01:00
Jon Beniston
7ed543ec35 Initialise m_displayRailways 2024-10-21 17:10:03 +01:00
Jon Beniston
907fe25d3c Fix plugin names for Qt6 Android 2024-10-21 17:09:32 +01:00
Jon Beniston
427d17351d Remove use of obsolete QRegExp 2024-10-21 17:08:41 +01:00
Jon Beniston
b6146caf36 Fix for Android Qt6 2024-10-21 17:05:19 +01:00
Jon Beniston
de37c031b5 Remove unused obsolete header 2024-10-21 17:03:54 +01:00
Jon Beniston
ac49a480f4 Remove test code 2024-10-20 13:05:29 +01:00
Jon Beniston
31cbe96b4c Add qtshadertools 2024-10-20 12:09:11 +01:00
Jon Beniston
5b9e61d839 WebEngine install not supported for 6.8 yet. 2024-10-20 11:19:29 +01:00
Jon Beniston
e3af72febb Add qtwebview - Is this the only way to include web engine? 2024-10-20 10:51:07 +01:00
Jon Beniston
aaf9f53571 Add qtwebsockets 2024-10-20 10:41:48 +01:00
Jon Beniston
9171ae9cd7 Add more Qt modules and set ENABLE_QT6=ON 2024-10-20 10:35:24 +01:00
Jon Beniston
0b84a572d6 Update Qt optional packages for 6.8 2024-10-20 10:23:56 +01:00
Jon Beniston
ec2f62fa5c Allow build test. Remove later. 2024-10-20 09:58:24 +01:00
Jon Beniston
a47c0913b5 Use Qt 6.8 for Windows build 2024-10-20 09:53:25 +01:00
f4exb
ed410d039a Updated versions and changelogs 2024-10-20 10:53:00 +02:00
f4exb
6c617be7db ChirpChat: increased preamble symbols limit from 20 to 32. Fixes #2284 2024-10-17 22:40:35 +02:00
Edouard Griffiths
afffee4755
Merge pull request #2281 from srcejon/freq_scanner
RTLSDR: Apply driver settings in RTLSDRThread
2024-10-16 23:00:07 +02:00
srcejon
98aa40424d Fix lint warnings. 2024-10-15 09:21:08 +01:00
srcejon
5d1478d047 Formatting 2024-10-15 09:02:30 +01:00
srcejon
240c3d502e Formatting 2024-10-15 08:56:54 +01:00
srcejon
4ac29d2052 Remove debug. 2024-10-15 08:49:21 +01:00
srcejon
acb278bbff RTLSDR: Apply driver settings in RTLSDRThread, to avoid blocking main thread. Add sync read for WebAssembly. 2024-10-15 08:40:08 +01:00
f4exb
4a9b1c3bbe SSB demod: fixed GUI and returned to previous threading model. Fixes #2273 2024-10-12 18:47:27 +02:00
Edouard Griffiths
141d0c1e6f
Merge pull request #2277 from srcejon/fix_2083
HeatMap: Fix crash when out of memory
2024-10-12 09:57:44 +02:00
Edouard Griffiths
f169cb5159
Merge pull request #2276 from srcejon/pager_notifications
Pager notifications
2024-10-12 08:32:21 +02:00
Edouard Griffiths
4dcf050534
Merge pull request #2274 from srcejon/freq_scanner
MainWindow: Add FSMs to avoid blocking on GUI Thread
2024-10-12 03:33:57 +02:00
Jon Beniston
91be77909d Add default-qt6-windows cmake config. 2024-10-11 15:23:39 +01:00
Jon Beniston
558730eb74 Fix Qt6 compilation 2024-10-11 15:23:16 +01:00
Jon Beniston
1654642fdb HeatMap: Catch memory allocation failures when adding data to the chart and disable it. For #2083 2024-10-11 13:16:04 +01:00
Jon Beniston
c4003533f4 Lint fit 2024-10-11 12:26:35 +01:00
Jon Beniston
7e9a3b5d58 Fix links in docs. 2024-10-11 11:19:59 +01:00
Jon Beniston
944803a276 Fix server compilation. Update docs. 2024-10-11 11:15:34 +01:00
Jon Beniston
4455ac0c55 Add pager notifications.
Add option to ignore duplicates.
Support plotting pager messages on the map.
2024-10-11 11:01:43 +01:00
srcejon
e3ec8759ed Remove unused variable 2024-10-10 15:57:08 +01:00
srcejon
d5dc848830 Don't load defaults if loading a preset 2024-10-10 15:56:27 +01:00
srcejon
41f2b0457a Cleanup 2024-10-10 15:21:53 +01:00
srcejon
a04f84fcc3 Adds comment 2024-10-10 15:11:23 +01:00
srcejon
5ac2081195 DeviceGUI::closeEvent - Don't automatically delete the GUI, as MainWindow::RemoveDeviceSetFSM::removeUI will do it 2024-10-10 15:03:24 +01:00
srcejon
3df1ce20ae Fix warnings, 2024-10-10 14:36:06 +01:00
srcejon
78d0160514 MainWindow: Add FSMs to avoid blocking on the GUI thread.
DSPDevice*Engine: Add signals to indicate when commands have been processed.
DSPDeviceSourceEngine: Fix small memory leak.
DSPEngine::removeDeviceEngineAt: Remove wait to avoid blocking thread. Return QThread to get finished signal.
DSPEngine::addDevice*Engine: Don't call deleteLater for device*Engine, as these objects are deleted manually in MainWindow, which will crash if deleteLater called first.
2024-10-10 13:57:11 +01:00
Edouard Griffiths
f24600b909
Merge pull request #2270 from srcejon/freq_scanner
Remote TCP updates
2024-10-09 20:20:14 +02:00
srcejon
5362c34698 Fix replay buffer when FixReal is qint16 2024-10-09 14:39:29 +01:00
srcejon
64461171ac snap: Try to get version number from latest tag. 2024-10-09 09:25:06 +01:00
srcejon
bb5c7447db Add libflac to snap. Set ARCH_OPT to nehalem. 2024-10-09 09:08:48 +01:00
srcejon
3dc0ac7f91 Lint fixes 2024-10-09 08:49:23 +01:00
srcejon
b83d514c3b Lint fixes 2024-10-08 22:19:29 +01:00
srcejon
b0a476735d Fix flac on Mac 2024-10-08 22:00:19 +01:00
srcejon
ffdcf89f7c Fix lint warnings 2024-10-08 20:55:31 +01:00
srcejon
56c162fd7d Fix FLAC library name on Mac. 2024-10-08 20:30:37 +01:00
srcejon
70cf86d68a Update docs. 2024-10-08 19:05:18 +01:00
srcejon
9372efe6d2 RemoteTCP: Update docs. 2024-10-08 18:56:17 +01:00
srcejon
7ed73e6272 Map: Fix Kiwi list. Add SDRangel wss support. 2024-10-08 18:15:52 +01:00
srcejon
256b01dda4 Fix gcc errors. 2024-10-08 17:30:24 +01:00
srcejon
96422ff19f RemoteTCPSink: Report server init errors via GUI. Send protocol to public list.
RemoteTCPInput: Add wss protocol support.
2024-10-08 17:20:18 +01:00
srcejon
04524505dd
Merge branch 'f4exb:master' into freq_scanner 2024-10-08 16:32:49 +01:00
Edouard Griffiths
6e01114ba8
Merge pull request #2267 from srcejon/fix_2266
Fix DeviceAPI::deserialize.
2024-10-07 18:52:11 +02:00
Jon Beniston
227eb55365 Fix DeviceAPI::deserialize. Fixes #2266. 2024-10-07 09:34:23 +01:00
srcejon
c270873a7c
Merge branch 'f4exb:master' into freq_scanner 2024-10-06 13:29:03 +01:00
f4exb
8f2ac70621 Updated plugin versions 2024-10-06 10:53:38 +02:00
f4exb
93a35ff1ab Updated version adn changelogs 2024-10-06 10:49:47 +02:00
f4exb
22a8f160f0 Update channel list upon Morse Decoder and Demod Analyzer GUI creation. Fixes #2263 2024-10-05 17:13:03 +02:00
f4exb
9d1160e7cd Frequency Scanner: initialize pointer to FrequencyScanner. Fixes #2262 2024-10-04 20:50:36 +02:00
srcejon
851a811f0f
Merge branch 'f4exb:master' into freq_scanner 2024-09-24 09:21:10 +01:00
Edouard Griffiths
1a55e32865
Merge pull request #2257 from srcejon/opencv_update
Update external/windows to latest version of sdrangel-windows-libraries
2024-09-23 16:41:34 +02:00
Jon Beniston
5a38bdf0b5 Use opencv4 with VS2022 2024-09-23 11:55:54 +01:00
Jon Beniston
48a69892ef Update external/windows to latest version 2024-09-23 11:04:03 +01:00
srcejon
3a6baf0d1d Fix gcc warning 2024-09-22 15:22:07 +01:00
srcejon
420e8147fa Fix gcc warnings. 2024-09-22 15:11:58 +01:00
srcejon
29bf92135d Add wrapping dial and spin box widgets. 2024-09-22 14:53:57 +01:00
srcejon
3743e7d831 Fix gcc errors 2024-09-22 12:24:19 +01:00
srcejon
83f27ac2e2 Add period dial. 2024-09-22 12:23:06 +01:00
srcejon
5ff0b74b43 Add additional type rsion. 2024-09-22 12:20:43 +01:00
srcejon
8bf1a2f803 Remote TCP updates:
Add support for public list of SDRangel servers that can be displayed on Map.
Add FLAC and zlib IQ compression.
Add IQ squelch for compression.
Add remote device/antenna position and direction reporting.
Add text messaging.
2024-09-22 10:44:30 +01:00
Edouard Griffiths
7d1beb9eff
Merge pull request #2254 from srcejon/freq_scanner
Allow plugins to be compiled as static libs, part 2.
2024-09-20 15:31:24 +02:00
srcejon
24d80f8ab0 ADS-B: Allow plugin to be compiled as static lib. Allow building without texttospeech, location or process.
VOR localizer: Allow plugin to be compiled as static lib.
SID feature: Allow plugin to be compiled as static lib.
Satellite Tracker: Allow building without texttospeech or timezone.
Map: Allow plugin to be compiled as static lib. Allow building without SSL.
APT: Allow plugin to be compiled as static lib.
Radio Astronomy: Allow plugin to be compiled as static lib. Allow building without process.
ChannelWebAPIUtils: Fix memory leaks.
DeviceSampleSource: Add signals that indicate when the position or direction of a device (or it's antenna) has changed. This is to support per device position, which is useful for remote devices not at My Position.
2024-09-17 09:47:45 +01:00
Edouard Griffiths
f522d88fc5
Merge pull request #2252 from srcejon/freq_scanner
Update CMakeLists.txt to allow static libraries to be built
2024-09-13 21:07:04 +02:00
Edouard Griffiths
c03f8dcbac
Merge pull request #2250 from GlassOnTin/CUDAToolkit
Use new find_package(CUDA Toolkit)
2024-09-13 17:22:38 +02:00
f4exb
41608cf804 Bump Cmake minimal version to 3.17 2024-09-13 08:50:50 +02:00
Edouard Griffiths
d6773eafb3
Merge pull request #2245 from DreamNik/fix_warnings_and_android_issues
Fix warnings and android issues
2024-09-12 14:33:32 +02:00
srcejon
626a939d3c Fix missing endif 2024-09-12 08:44:38 +01:00
srcejon
1df07b21ae Update CMakeLists.txt to allow static libraries to be built, as well as shared.
Add BUILD_BENCH, BUILD_SHARED_LIBS, ENABLE_AARONIARTSA and ENABLE_METIS options.
2024-09-11 20:16:40 +01:00
GlassOnTin
64e13f92e6 Use new find_package(CUDA Toolkit) 2024-09-10 20:11:10 +01:00
DreamNik
d2e89b7337 Fix PR comments 2024-09-09 19:17:30 +03:00
f4exb
37e06de0ed DeviceGUI: removed destroy method. Part of #2159 2024-09-07 21:50:42 +02:00
DreamNik
60e1d1cd9e Fix compilation for Android with Qt6 2024-09-05 13:37:51 +03:00
DreamNik
5103b27091 Fix compilation with newer ffmpeg libavutil 2024-09-05 13:37:51 +03:00
DreamNik
202fc96de6 Append prefix to plugin name when running on Android.
Android libraries can't be placed inside subdirectory, so to
distinguish plugins from regular libraries the new prefix is used.
2024-09-05 13:37:51 +03:00
DreamNik
f694ba04b8 Fix compilation warnings and errors 2024-09-05 13:37:46 +03:00
DreamNik
027d6af6bb Fix SopaySDR library search when system cmake package present 2024-09-03 23:44:46 +03:00
f4exb
5d0fa7fa67 Removed destroy method leftovers and Sonar lint 2024-08-27 09:54:09 +02:00
f4exb
704eb403d1 Removed the destroy method from ChannelGUI interface 2024-08-27 09:54:09 +02:00
f4exb
b85419c56a Sonar fixes 2024-08-27 09:54:09 +02:00
f4exb
585d806ef8 All device plugins: make sure start and stop are effective once only. PArt of #2159 2024-08-27 09:54:09 +02:00
f4exb
1b37a4f504 BladeRF2Output: removed applySettings from stop method 2024-08-27 09:54:09 +02:00
f4exb
7b4e751ba1 DeviceSet and DeviceUISet: use delete channel API instead of destroy method so that the virtual destructor of the channel is called appropriately 2024-08-27 09:54:09 +02:00
f4exb
aca4a53513 Fixed threading model for DSPDeviceSinkEngine plus other fixes. Part of #2159 2024-08-27 09:54:09 +02:00
f4exb
75d40c8b68 SSBMod: revised thread processing 2024-08-27 09:54:09 +02:00
f4exb
d553834adf Removed SyncMessenger from DSPDeviceSinkEngine. Part of #2159 2024-08-27 09:54:09 +02:00
f4exb
2b26f15463 AMMod: revised thread processing 2024-08-27 09:54:09 +02:00
f4exb
2219fcd809 NFMMod: revised thread processing 2024-08-27 09:54:09 +02:00
f4exb
290023183c Fixed threading model for DSPDeviceMIMOEngine plus other fixes. Part of #2159 2024-08-27 09:54:09 +02:00
f4exb
beaf2932ba RTLSDR: make sure start and stop are effective once only. PArt of #2159 2024-08-27 09:54:09 +02:00
f4exb
f6b3b22e4f Removed SyncMessenger from DSPDeviceMIMOEngine. Part of #2159 2024-08-27 09:54:09 +02:00
f4exb
d2066495a9 Fixed threading model for DSPDeviceSourceEngine. Part of #2159 2024-08-27 09:54:09 +02:00
f4exb
9fa1974ba3 Removed SyncMessenger from DSPDeviceSourceEngine. Part of #2159 2024-08-27 09:54:09 +02:00
Daniele Forsi
6b2573d955 [wdsprx] Fix path to help file 2024-08-21 09:30:35 +02:00
Daniele Forsi
72683aea57 Fix typo 2024-08-21 09:30:35 +02:00
13650 changed files with 88868 additions and 14399 deletions

View File

@ -20,118 +20,118 @@ environment:
# -DBUILD_SERVER=OFF \
# -DCMAKE_PREFIX_PATH=C:\\Qt\\5.15.2\\msvc2019_64;C:\\Libraries\\boost_1_73_0"
# CMAKE_GENERATOR: Ninja
- TARGET: ubuntu2204prod
APPVEYOR_BUILD_WORKER_CLOUD: nasrock Docker
APPVEYOR_BUILD_WORKER_IMAGE: Linux
CC: "gcc-11"
CXX: "g++-11"
CMAKE_CUSTOM_OPTIONS: "-DCMAKE_BUILD_TYPE=Release \
-DARCH_OPT=nehalem \
-DDEBUG_OUTPUT=ON \
-DENABLE_EXTERNAL_LIBRARIES=AUTO \
-DBUILD_SERVER=OFF"
# - TARGET: ubuntu2204prod
# APPVEYOR_BUILD_WORKER_CLOUD: nasrock Docker
# APPVEYOR_BUILD_WORKER_IMAGE: Linux
# CC: "gcc-11"
# CXX: "g++-11"
# CMAKE_CUSTOM_OPTIONS: "-DCMAKE_BUILD_TYPE=Release \
# -DARCH_OPT=nehalem \
# -DDEBUG_OUTPUT=ON \
# -DENABLE_EXTERNAL_LIBRARIES=AUTO \
# -DBUILD_SERVER=OFF"
- TARGET: ubuntu2204docker
APPVEYOR_BUILD_WORKER_CLOUD: nasrock
APPVEYOR_BUILD_WORKER_IMAGE: Linux
APPVEYOR_CONSOLE_DISABLE_PTY: true
for:
# - matrix:
# only:
# - TARGET: 'vs2019gui'
# cache:
# - C:\ProgramData\chocolatey\bin
# - C:\ProgramData\chocolatey\lib
# build_script:
# - call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
# # Install GNU patch as applying patches with git fails in BladeRF tree
# - choco install patch
# - git submodule update --init --recursive
# - mkdir build && cd build
# - cmake .. -G "%CMAKE_GENERATOR%" %CMAKE_CUSTOM_OPTIONS%
# - cmake --build . --config Release --target package
# artifacts: # push installer executable
# path: build\*.exe
# name: installer
# deploy:
# release: sdrangel-v$(appveyor_build_version)
# description: 'SDRangel Windows'
# provider: GitHub
# auth_token:
# secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod
# artifact: installer, portable
# draft: false
# prerelease: false
# tag: $(APPVEYOR_REPO_TAG_NAME) # will not work until tag is pushed
# on:
# APPVEYOR_REPO_TAG: true # deploy on tag push only
# branch: master # release from master branch only
- matrix:
only:
- TARGET: ubuntu2204prod
clone_folder: /home/appveyor/projects
cache:
- $HOME/external/
install:
- sh: sudo apt-get update
- sh: echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
# not sdrplay with soapysdr; libairspyhf-dev is too old (no lna)
- sh: |
sudo apt-get -y install build-essential cmake git xxd \
devscripts fakeroot debhelper libfftw3-dev qtbase5-dev libopengl-dev libqt5opengl5-dev \
qttools5-dev qttools5-dev-tools qtmultimedia5-dev libqt5multimedia5-plugins libqt5websockets5-dev \
libqt5quick5 qtwebengine5-dev qtbase5-private-dev \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtgraphicaleffects \
libqt5serialport5-dev qtdeclarative5-dev qtpositioning5-dev qtlocation5-dev \
libqt5charts5-dev libqt5texttospeech5-dev libqt5gamepad5-dev libqt5svg5-dev libfaad-dev zlib1g-dev \
libusb-1.0-0-dev libhidapi-dev libboost-all-dev libasound2-dev libopencv-dev libopencv-imgcodecs-dev \
libxml2-dev bison flex ffmpeg libpostproc-dev libavcodec-dev libavformat-dev \
libopus-dev libcodec2-dev libairspy-dev libhackrf-dev \
libbladerf-dev libsoapysdr-dev libiio-dev libuhd-dev libhamlib-dev \
python3-mako python3-cheetah python3-numpy \
autoconf automake libtool ninja-build libclang1-11
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_cm256cc.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_mbelib.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_serialdv.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_dsdcc.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_perseus-sdr.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_xtrx-sdr.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_airspyhf.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_rtlsdr.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_limesuite.sh; fi
- sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_ggmorse.sh; fi
- sh: bash cmake/ci/build_sdrplay.sh
before_build:
- sh: bash -c export
- sh: bash -c pwd
build_script:
- sh: ./cmake/ci/build_sdrangel.sh
test_script:
# debian build path
- sh: ./obj-x86_64-linux-gnu/sdrangelbench
after_build:
- sh: mkdir sdrangel-${APPVEYOR_BUILD_VERSION}
- sh: cp ../*.deb ../*.build ../*.buildinfo ../*.changes sdrangel-${APPVEYOR_BUILD_VERSION}
- sh: tar -czf sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz sdrangel-${APPVEYOR_BUILD_VERSION}
artifacts:
- path: sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz
name: package2204
# deploy:
# release: sdrangel-v$(appveyor_build_version)
# description: 'SDRangel Ubuntu 22.04'
# provider: GitHub
# auth_token:
# secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod
# artifact: archive
# draft: false
# prerelease: false
# on:
# APPVEYOR_REPO_TAG: true # deploy on tag push only
# branch: master # release from master branch only
deploy:
provider: Environment
name: f4exb
# # - matrix:
# # only:
# # - TARGET: 'vs2019gui'
# # cache:
# # - C:\ProgramData\chocolatey\bin
# # - C:\ProgramData\chocolatey\lib
# # build_script:
# # - call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
# # # Install GNU patch as applying patches with git fails in BladeRF tree
# # - choco install patch
# # - git submodule update --init --recursive
# # - mkdir build && cd build
# # - cmake .. -G "%CMAKE_GENERATOR%" %CMAKE_CUSTOM_OPTIONS%
# # - cmake --build . --config Release --target package
# # artifacts: # push installer executable
# # path: build\*.exe
# # name: installer
# # deploy:
# # release: sdrangel-v$(appveyor_build_version)
# # description: 'SDRangel Windows'
# # provider: GitHub
# # auth_token:
# # secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod
# # artifact: installer, portable
# # draft: false
# # prerelease: false
# # tag: $(APPVEYOR_REPO_TAG_NAME) # will not work until tag is pushed
# # on:
# # APPVEYOR_REPO_TAG: true # deploy on tag push only
# # branch: master # release from master branch only
# - matrix:
# only:
# - TARGET: ubuntu2204prod
# clone_folder: /home/appveyor/projects
# cache:
# - $HOME/external/
# install:
# - sh: sudo apt-get update
# - sh: echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
# # not sdrplay with soapysdr; libairspyhf-dev is too old (no lna)
# - sh: |
# sudo apt-get -y install build-essential cmake git xxd \
# devscripts fakeroot debhelper libfftw3-dev qtbase5-dev libopengl-dev libqt5opengl5-dev \
# qttools5-dev qttools5-dev-tools qtmultimedia5-dev libqt5multimedia5-plugins libqt5websockets5-dev \
# libqt5quick5 qtwebengine5-dev qtbase5-private-dev \
# qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-window2 qml-module-qtquick-dialogs \
# qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtgraphicaleffects \
# libqt5serialport5-dev qtdeclarative5-dev qtpositioning5-dev qtlocation5-dev \
# libqt5charts5-dev libqt5texttospeech5-dev libqt5gamepad5-dev libqt5svg5-dev libfaad-dev libflac-dev zlib1g-dev \
# libusb-1.0-0-dev libhidapi-dev libboost-all-dev libasound2-dev libopencv-dev libopencv-imgcodecs-dev \
# libxml2-dev bison flex ffmpeg libpostproc-dev libavcodec-dev libavformat-dev \
# libopus-dev libcodec2-dev libairspy-dev libhackrf-dev \
# libbladerf-dev libsoapysdr-dev libiio-dev libuhd-dev libhamlib-dev \
# python3-mako python3-cheetah python3-numpy \
# autoconf automake libtool ninja-build libclang1-11
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_cm256cc.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_mbelib.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_serialdv.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_dsdcc.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_perseus-sdr.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_xtrx-sdr.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_airspyhf.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_rtlsdr.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_limesuite.sh; fi
# - sh: if [[ ! "${CMAKE_CUSTOM_OPTIONS}" =~ "ENABLE_EXTERNAL_LIBRARIES" ]]; then bash cmake/ci/build_ggmorse.sh; fi
# - sh: bash cmake/ci/build_sdrplay.sh
# before_build:
# - sh: bash -c export
# - sh: bash -c pwd
# build_script:
# - sh: ./cmake/ci/build_sdrangel.sh
# test_script:
# # debian build path
# - sh: ./obj-x86_64-linux-gnu/sdrangelbench
# after_build:
# - sh: mkdir sdrangel-${APPVEYOR_BUILD_VERSION}
# - sh: cp ../*.deb ../*.build ../*.buildinfo ../*.changes sdrangel-${APPVEYOR_BUILD_VERSION}
# - sh: tar -czf sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz sdrangel-${APPVEYOR_BUILD_VERSION}
# artifacts:
# - path: sdrangel-${APPVEYOR_BUILD_VERSION}.tar.gz
# name: package2204
# # deploy:
# # release: sdrangel-v$(appveyor_build_version)
# # description: 'SDRangel Ubuntu 22.04'
# # provider: GitHub
# # auth_token:
# # secure: kyU5TaXRoily6q/QLRLqal2xCFGWEdnb8AJIu7FknsUQyj1wjRGmqC2My+Wfszod
# # artifact: archive
# # draft: false
# # prerelease: false
# # on:
# # APPVEYOR_REPO_TAG: true # deploy on tag push only
# # branch: master # release from master branch only
# deploy:
# provider: Environment
# name: f4exb
- matrix:
only:
- TARGET: ubuntu2204docker

62
.github/workflows/linux.yml vendored Normal file
View File

@ -0,0 +1,62 @@
name: SDRangel Linux release build
on:
push:
branches:
- linux_github_release
tags:
- 'v*'
jobs:
build_deb:
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, ubuntu-24.04]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get -y install build-essential cmake git xxd \
devscripts fakeroot debhelper libfftw3-dev qtbase5-dev libopengl-dev libqt5opengl5-dev \
qttools5-dev qttools5-dev-tools qtmultimedia5-dev libqt5multimedia5-plugins libqt5websockets5-dev \
libqt5quick5 qtwebengine5-dev qtbase5-private-dev \
qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-window2 qml-module-qtquick-dialogs \
qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtgraphicaleffects \
libqt5serialport5-dev qtdeclarative5-dev qtpositioning5-dev qtlocation5-dev \
libqt5charts5-dev libqt5texttospeech5-dev libqt5gamepad5-dev libqt5svg5-dev libfaad-dev libflac-dev zlib1g-dev \
libusb-1.0-0-dev libhidapi-dev libboost-all-dev libasound2-dev libopencv-dev libopencv-imgcodecs-dev \
libxml2-dev bison flex ffmpeg libpostproc-dev libavcodec-dev libavformat-dev \
libopus-dev libcodec2-dev libairspy-dev libhackrf-dev \
libbladerf-dev libsoapysdr-dev libiio-dev libuhd-dev libhamlib-dev \
python3-mako python3-cheetah python3-numpy \
autoconf automake libtool ninja-build
bash cmake/ci/build_sdrplay.sh
- name: Build SDRangel
run: |
debuild -i -us -uc -b
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "linux_github_release" ]]; then
echo "version=$(echo ${{github.sha}} | cut -c1-7)" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- name: Rename
run: mv ../sdrangel_*_amd64.deb sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb
path: sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: sdrangel_${{ steps.get_version.outputs.version }}_${{ matrix.os }}_amd64.deb

161
.github/workflows/mac.yml vendored Normal file
View File

@ -0,0 +1,161 @@
name: SDRangel Mac release build
on:
push:
branches:
- mac_ci
tags:
- 'v*'
jobs:
build_mac_x64:
runs-on: macos-13
env:
MACOSX_DEPLOYMENT_TARGET: 12.0
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Update brew
run: brew update
- name: Install brew packages
run: brew install nasm subversion
- name: Install SDRplay API
run: |
wget https://www.sdrplay.com/software/SDRplayAPI-macos-installer-universal-3.15.0.pkg
sudo installer -pkg SDRplayAPI-macos-installer-universal-3.15.0.pkg -target /
- name: Install python
run: |
wget https://www.python.org/ftp/python/3.12.7/python-3.12.7-macos11.pkg
sudo installer -pkg python-3.12.7-macos11.pkg -target /
- name: Install python packages for UHD
run: |
/usr/local/bin/python3.12 -m pip install numpy mako requests Cheetah3 setuptools
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.7.3'
host: 'mac'
arch: 'clang_64'
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel'
- 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_USRP=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=ON -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE -DPYTHON_EXECUTABLE=/usr/local/bin/python3.12
- name: Build SDRangel on Mac
run: |
cd build
make -j4
- name: Create dmg
run: |
cd build
RETRIES=5
COUNT=1
set +e
while [ $COUNT -lt $RETRIES ]; do
make package
if [ $? -eq 0 ]; then
RETRIES=0
break
fi
let COUNT=$COUNT+1
done
shell: bash
continue-on-error: true
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "mac_ci" ]]; then
echo "version=$(echo ${{github.sha}} | cut -c1-7)" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- name: Get filename
id: get_filename
run: echo "filename=$(grep CPACK_PACKAGE_FILE_NAME build/CMakeCache.txt | cut -d "=" -f2)" >> $GITHUB_OUTPUT
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-macx64.dmg
path: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg
build_mac_arm64:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Update brew
run: brew update
- name: Install brew packages
run: brew install nasm subversion
- name: Install SDRplay API
run: |
wget https://www.sdrplay.com/software/SDRplayAPI-macos-installer-universal-3.15.0.pkg
sudo installer -pkg SDRplayAPI-macos-installer-universal-3.15.0.pkg -target /
- name: Install python
run: |
wget https://www.python.org/ftp/python/3.12.7/python-3.12.7-macos11.pkg
sudo installer -pkg python-3.12.7-macos11.pkg -target /
- name: Install python packages for UHD
run: |
/usr/local/bin/python3.12 -m pip install numpy mako requests Cheetah3 setuptools
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.7.3'
host: 'mac'
arch: 'clang_64'
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel'
- name: Configure SDRangel
run: |
mkdir build && cd build
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -DDEBUG_OUTPUT=ON -DENABLE_USRP=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DENABLE_EXTERNAL_LIBRARIES=ON -DBUNDLE=ON -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=TRUE -DPYTHON_EXECUTABLE=/usr/local/bin/python3.12
- name: Build SDRangel on Mac
run: |
cd build
make -j3
- name: Create dmg
run: |
cd build
RETRIES=5
COUNT=1
set +e
while [ $COUNT -lt $RETRIES ]; do
make package
if [ $? -eq 0 ]; then
RETRIES=0
break
fi
let COUNT=$COUNT+1
done
shell: bash
continue-on-error: true
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "mac_ci" ]]; then
echo "version=$(echo ${{github.sha}} | cut -c1-7)" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- name: Get filename
id: get_filename
run: echo "filename=$(grep CPACK_PACKAGE_FILE_NAME build/CMakeCache.txt | cut -d "=" -f2)" >> $GITHUB_OUTPUT
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-macarm64.dmg
path: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg

View File

@ -24,7 +24,7 @@ jobs:
WIN_ARCH: "x64",
os: windows-latest,
QT_INST_DIR: "C:/",
QTDIR: "C:/Qt/5.15.2/msvc2019_64",
QTDIR: "C:/Qt/6.7.3/msvc2019_64",
QT_ARCH: win64_msvc2019_64,
boost_dl: "${{ github.workspace }}\\downloads\\boost",
lib_dir: "C:\\Libraries",
@ -41,6 +41,9 @@ jobs:
echo github.event_name: ${{ github.event_name }}
echo github.ref: ${{ github.ref }}
echo github.workspace: ${{ github.workspace }}
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install basic dependencies on Windows
if: startsWith(matrix.config.os, 'windows')
run: |
@ -69,19 +72,20 @@ jobs:
rm -rf boost_*/* download.tar.bz2 download.tar
shell: bash
- name: Install Qt
uses: jurplel/install-qt-action@v3
uses: jurplel/install-qt-action@v4
with:
version: '6.7.3'
dir: ${{matrix.config.QT_INST_DIR}}
arch: ${{matrix.config.QT_ARCH}}
setup-python: false
modules: 'qtcharts qtwebengine'
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel'
- name: build sdrangel on Windows
if: startsWith(matrix.config.os, 'windows')
run: |
cmd "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
cmd "C:\Program Files\Microsoft Visual Studio\2022\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 -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 -DENABLE_QT6=ON -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\6.7.3\msvc2019_64;C:\Libraries\boost_1_73_0"
cmake --build . --config Release --target package
- name: Check disk space
run: Get-PSDrive
@ -89,18 +93,13 @@ jobs:
id: get_version
run: echo "version=$(grep sdrangel_VERSION build/CMakeCache.txt | cut -d "=" -f2)" >> $env:GITHUB_OUTPUT
- name: Upload artifact
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
path: ${{ github.workspace }}/build/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v0.1.13
with:
files: ${{ github.workspace }}/build/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
build_mac:
runs-on: macos-13
runs-on: macos-14
steps:
- uses: actions/checkout@v4
with:
@ -125,10 +124,7 @@ jobs:
- 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 -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
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_QT6=ON -DCMAKE_BUILD_TYPE=Release -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: Build SDRangel on Mac
run: |
cd build

44
.github/workflows/snap.yml vendored Normal file
View File

@ -0,0 +1,44 @@
# See: https://github.com/snapcore/action-build
name: SDRangel snap release build
on:
push:
branches:
- snap
tags:
- 'v*'
jobs:
build_snap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Get version
id: get_version
run: |
if [[ "${{github.ref_name}}" == "snap" ]]; then
echo "version=${{github.sha}}" >> $GITHUB_OUTPUT
else
echo "version=$(echo ${{github.ref_name}} | cut -c2-)" >> $GITHUB_OUTPUT
fi
- uses: snapcore/action-build@v1
id: build
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-amd64.snap
path: ${{ steps.build.outputs.snap }}
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ steps.build.outputs.snap }}
- uses: snapcore/action-publish@v1
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
with:
snap: ${{ steps.build.outputs.snap }}
release: stable

119
.github/workflows/windows.yml vendored Normal file
View File

@ -0,0 +1,119 @@
name: SDRangel Windows release build and signing
on:
push:
branches:
- master
tags:
- 'v*'
jobs:
build:
name: ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix:
config:
- {
name: "Windows-x64",
WIN_ARCH: "x64",
os: windows-latest,
QT_INST_DIR: "C:/",
QTDIR: "C:/Qt/6.7.3/msvc2019_64",
QT_ARCH: win64_msvc2019_64,
boost_dl: "${{ github.workspace }}\\downloads\\boost",
lib_dir: "C:\\Libraries",
generators: Ninja
}
steps:
- uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0
- name: Print env
run: |
echo github.event.action: ${{ github.event.action }}
echo github.event_name: ${{ github.event_name }}
echo github.ref: ${{ github.ref }}
echo github.workspace: ${{ github.workspace }}
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install basic dependencies on Windows
if: startsWith(matrix.config.os, 'windows')
run: |
choco install ninja cmake
ninja --version
cmake --version
- name: Install MSVC on Windows
if: startsWith(matrix.config.os, 'windows')
uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Install Boost
env:
BOOST_ROOT: ${{ matrix.config.boost_dl }}
BOOST_DEST: ${{ matrix.config.lib_dir }}
BOOST_URL: https://archives.boost.io/release/1.73.0/source/boost_1_73_0.tar.bz2
run: |
mkdir -p $BOOST_ROOT
mkdir -p $BOOST_DEST
curl --progress-bar --location --output $BOOST_ROOT/download.tar.bz2 $BOOST_URL
7z -o$BOOST_ROOT x $BOOST_ROOT/download.tar.bz2 -y -bd
7z -o$BOOST_ROOT x $BOOST_ROOT/download.tar -y -bd
cd $BOOST_ROOT && cp -r boost_* $BOOST_DEST
ls -l $BOOST_DEST
ls -l "C:\\"
rm -rf boost_*/* download.tar.bz2 download.tar
shell: bash
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: '6.7.3'
dir: ${{matrix.config.QT_INST_DIR}}
arch: ${{matrix.config.QT_ARCH}}
setup-python: 'false'
modules: 'qtcharts qtscxml qt5compat qtlocation qtmultimedia qtpositioning qtserialport qtspeech qtwebsockets qtwebengine qtshadertools qtwebchannel'
- name: build sdrangel on Windows
if: startsWith(matrix.config.os, 'windows')
run: |
cmd "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
choco install patch
mkdir build && cd build
cmake .. -G "${{ matrix.config.generators }}" -DCMAKE_BUILD_TYPE=Release -DENABLE_QT6=ON -DARCH_OPT=SSE4_2 -DDEBUG_OUTPUT=ON -DENABLE_MIRISDR=OFF -DBUILD_SERVER=OFF -DCMAKE_PREFIX_PATH="C:\Qt\6.7.3\msvc2019_64;C:\Libraries\boost_1_73_0"
cmake --build . --config Release --target package
- name: Check disk space
run: Get-PSDrive
- name: Get version
id: get_version
run: echo "version=$(grep sdrangel_VERSION build/CMakeCache.txt | cut -d "=" -f2)" >> $env:GITHUB_OUTPUT
- name: Upload unsigned artifact
id: upload-unsigned-artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
path: ${{ github.workspace }}/build/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
- name: Sign Code
id: sign_code
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: '553b8f53-adf0-4fe5-be3d-283504a21a51'
project-slug: 'sdrangel'
signing-policy-slug: 'release-signing'
github-artifact-id: '${{ steps.upload-unsigned-artifact.outputs.artifact-id }}'
wait-for-completion: true
output-artifact-directory: 'build\signed'
wait-for-completion-timeout-in-seconds: 3600
- name: Upload signed artifact
id: upload-signed-artifact
uses: actions/upload-artifact@v4
with:
name: sdrangel-${{ steps.get_version.outputs.version }}-win64-signed.exe
path: ${{ github.workspace }}/build/signed/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe
- name: Upload release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ${{ github.workspace }}/build/signed/sdrangel-${{ steps.get_version.outputs.version }}-win64.exe

121
CHANGELOG
View File

@ -1,3 +1,124 @@
sdrangel (7.22.7-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 04 May 2025 17:58:14 +0200
sdrangel (7.22.6-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 02 Feb 2025 18:08:11 +0100
sdrangel (7.22.5-1) unstable; urgency=medium
* Windows: upload signed releases rather than unsigned releases to Github releases page. PR #2347
* Windows: fixed signed releases. PR #2344
* FT8 Demod: limit upper bandwidth to 5.8 kHz. Fixes #2339
* Stop device while changing channel set. Fixes #2332. PR #2342
* ADSB: Update URL of OpenSkyNetwork Aircraft database. PR #2341
* Don't stop source if being deleted. For #2315. PR #2340
* Send DSPSignalNotification in audio mods for #2336. PR #2340
* Radiosonde: limit precision of floating point numbers sent to SondeHub. PR #2338
* Windows signed releases: use relative path. Increase timeout to 30 minutes. PR #2335
* ADSB: Include adsbdemodsettings.h PR #2334
* Use release signing certificate for Windows installer. PR #2331
* Fix memory leak and race condition relating to DSP*Engines. Part of #2159 PR #2330
* FreeDV: Fix memory allocation/free issues. Part of #2315. PR #2330
* Wav Files: Add support for meta-data. PR #2328
* DemodAnalyzer: Ensure sample rate is set in worker. Fixes #2309. PR #2328
^ SDRplayv3: Mac: link with libsdrplay_api.so.3 rather than libsdrplay_api.so.3.15. PR #2327
* ADS-B: Fix memory use after delete. For #1734 and part of #2315 PR #2326
* Fixed Appveyor Docker image build
* Fix output-artifact-directory and unzip file. PR #2323
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Thu, 05 Dec 2024 01:07:27 +0100
sdrangel (7.22.4-1) unstable; urgency=medium
* Use macos-12 for Mac x86 build. PR #2321
* Workaround for "hdiutil: create failed - Resource busy"
* Pager: Add alpha and numeric columns. Implements #2319. PR #2320
* Added qtwebchannel dependecy to fix missing 3d Map and Sky Map from Windows release. PR #2316
* Removed .deb package build from Appveyor
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mom, 11 Nov 2024 08:42:03 +0100
sdrangel (7.22.3-1) unstable; urgency=medium
* Add deb dependencies for pipewire. PR #2314
* Added compilation options for WebAssembly. PR #2313
* ADS-B: Use settings keys. PR #2310
* AIS Demod: Remove spacing around messages. PR #2310
* Freuqency Scanner: Add multiplex mode. PR #2310
* Build snap, MAC, Windows and Ubuntu .deb with Github actions. Various PRs
* Server: Use Sink/MIMO signals rather than Source. Part of #2294. PR #2304
* Updated some Python scripts to Python3. PR #2298
* RemoteTCPSink: Does use IQ only setting for RTL0. PR #2301
* Server: wait for set sample source/sink/MIMO to complete before loading the device settings. Fixes #2294
* Fix spectrum peak measurement for SSB spectra. Fixes #2282. PR #2299
* Upgrade C++ standard to c++17
* Fixes for Android . PR #2288
* Add qtshadertools. PR #2287
* Add more Qt modules and set ENABLE_QT6=ON. PR #2287
* Update Qt optional packages for 6.8 , PR #2287
* Use Qt 6.8 for Windows build. PR #2287
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sat, 09 Nov 2024 17:30:44 +0100
sdrangel (7.22.2-1) unstable; urgency=medium
* ChirpChat: increased preamble symbols limit from 20 to 32. Fixes #2284
* RTLSDR: Apply driver settings in RTLSDRThread Add sync read for WebAssembly. PR #2281
* SSB demod: fixed GUI and returned to previous threading model. Fixes #2273
* HeatMap: Catch memory allocation failures... For #2083 PR #2277
* Add default-qt6-windows cmake config. PR #2276
* Add pager notifications. Add option to ignore duplicates. Support plotting pager messages on the map. PR #2276
* Don't load defaults if loading a preset. PR #2274
* DeviceGUI::closeEvent - Don't automatically delete the GUI,.. PR #2274
* MainWindow: Add FSMs to avoid blocking on the GUI thread... PR #2274
* Fix replay buffer when FixReal is qint16. PR #2270
* snap: Try to get version number from latest tag. PR #2270
* Add libflac to snap. Set ARCH_OPT to nehalem. PR #2270
* Fix flac on Mac. PR #2270
* RemoteTCP: Update docs. PR #2270
* Map: Fix Kiwi list. Add SDRangel wss support. PR #2270
* RemoteTCPSink: Report server init errors via GUI. Send protocol to public list. PR #2270
* RemoteTCPInput: Add wss protocol support. PR #2270
* Fix DeviceAPI::deserialize. Fixes #2266. PR #2267
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 20 Oct 2024 08:26:38 +0200
sdrangel (7.22.1-1) unstable; urgency=medium
* wdsprx: Fix path to help file.
* Removed SyncMessenger from DSPDeviceSourceEngine. Part of #2159
* Fixed threading model for DSPDeviceSourceEngine. Part of #2159
* Removed SyncMessenger from DSPDeviceMIMOEngine. Part of #2159
* RTLSDR: make sure start and stop are effective once only. PArt of #2159
* Fixed threading model for DSPDeviceMIMOEngine plus other fixes. Part of #2159
* Removed SyncMessenger from DSPDeviceSinkEngine. Part of #2159
* SSBMod, AMMod, NFMMod: revised thread processing
* Fixed threading model for DSPDeviceSinkEngine plus other fixes. Part of #2159
* DeviceSet and DeviceUISet: use delete channel API instead of destroy method...
* BladeRF2Output: removed applySettings from stop method
* All device plugins: make sure start and stop are effective once only. PArt of #2159
* Removed the destroy method from ChannelGUI interface
* DeviceGUI: removed destroy method. Part of #2159
* Fix SopaySDR library search when system cmake package present. PR #2245
* Append prefix to plugin name when running on Android. PR #2245
* Fix compilation with newer ffmpeg libavutil. PR #2245
* Fix compilation for Android with Qt6. PR #2245
* Bump Cmake minimal version to 3.17
* Use new find_package(CUDA Toolkit). PR #2250
* Update CMakeLists.txt to allow static libraries to be built, as well as shared... PR #2252
* Allow plugins to be compiled as static libs, part 2. PR #2254
* Use opencv4 with VS2022. PR #2257
* Frequency Scanner: initialize pointer to FrequencyScanner. Fixes #2262
* Update channel list upon Morse Decoder and Demod Analyzer GUI creation. Fixes #2263
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 06 Oct 2024 08:39:11 +0200
sdrangel (7.22.0-1) unstable; urgency=medium
* New Rx channel based on WDSP. Issue #2156

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.13.0)
cmake_minimum_required(VERSION 3.17.0)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
@ -11,7 +11,7 @@ endif()
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
# disable only when needed
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
@ -20,7 +20,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# configure version
set(sdrangel_VERSION_MAJOR "7")
set(sdrangel_VERSION_MINOR "22")
set(sdrangel_VERSION_PATCH "0")
set(sdrangel_VERSION_PATCH "7")
set(sdrangel_VERSION_SUFFIX "")
# SDRAngel cmake options
@ -30,6 +30,7 @@ option(SANITIZE_MEMORY "Activate detection of leaked memory (LeakSanitizer)" OFF
option(RX_SAMPLE_24BIT "Internal 24 bit Rx DSP" ON)
option(BUILD_SERVER "Build Server" ON)
option(BUILD_GUI "Build GUI" ON)
option(BUILD_BENCH "Build benchmark" ON)
option(HIDE_CONSOLE "Hide console when running GUI on Windows" ON)
option(BUNDLE "Enable distribution bundle" OFF)
set(ARCH_OPT "native" CACHE STRING "Specify instruction set to use. Will be passed directly as `-march` or `/arch:` argument on supported compilers. \
@ -37,8 +38,10 @@ set(ARCH_OPT "native" CACHE STRING "Specify instruction set to use. Will be pass
option(ENABLE_QT6 "Build with Qt6 rather than Qt5" OFF)
option(ENABLE_PROFILER "Enable runtime profiler" OFF)
set(VKFFT_BACKEND 1 CACHE STRING "vkFFT Backend: 0 - Vulkan, 1 - CUDA")
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
# Sampling devices enablers
option(ENABLE_AARONIARTSA "Enable AaroniaRTSA support" ON)
option(ENABLE_AIRSPY "Enable AirSpy support" ON)
option(ENABLE_AIRSPYHF "Enable AirSpyHF support" ON)
option(ENABLE_BLADERF "Enable bladeRF support" ON)
@ -46,6 +49,7 @@ option(ENABLE_FUNCUBE "Enable FUNcube support" ON)
option(ENABLE_HACKRF "Enable HackRF support" ON)
option(ENABLE_IIO "Enable liniio support like PlutoSDR" ON)
option(ENABLE_LIMESUITE "Enable limesuite support" ON)
option(ENABLE_METIS "Enable Metis support" ON)
option(ENABLE_MIRISDR "Enable LibMiri for old SDRPlay" ON)
option(ENABLE_PERSEUS "Enable perseus support" ON)
option(ENABLE_RTLSDR "Enable rtl-sdr support" ON)
@ -182,7 +186,7 @@ if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git/")
endif()
find_program(CCACHE "ccache")
if(CCACHE)
if(CCACHE AND NOT EMSCRIPTEN)
message(STATUS "Using ccache ${CCACHE}")
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
@ -190,7 +194,7 @@ if(CCACHE)
set(CMAKE_OBJCXX_COMPILER_LAUNCHER ${CCACHE})
endif()
set(ENV{CCACHE_SLOPPINESS} pch_defines,time_macros)
endif(CCACHE)
endif()
set(sdrangel_VERSION "${sdrangel_VERSION_MAJOR}.${sdrangel_VERSION_MINOR}.${sdrangel_VERSION_PATCH}${sdrangel_VERSION_SUFFIX}" CACHE INTERNAL "")
message(STATUS "${APPLICATION_NAME} Version: ${sdrangel_VERSION}")
@ -269,6 +273,15 @@ else()
endif()
set(INSTALL_PLUGINS_DIR "${INSTALL_LIB_DIR}/plugins")
set(INSTALL_PLUGINSSRV_DIR "${INSTALL_LIB_DIR}/pluginssrv")
if(ANDROID)
set(PLUGINS_PREFIX "sdrangel_plugins_")
set(PLUGINSSRV_PREFIX "sdrangel_pluginssrv_")
set(ANDROID_PACKAGE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/android/qt6 CACHE INTERNAL "")
else()
set(PLUGINS_PREFIX "")
set(PLUGINSSRV_PREFIX "")
endif()
set(EXTERNAL_BUILD_LIBRARIES "${CMAKE_BINARY_DIR}/external")
# custom libraries
@ -335,7 +348,7 @@ elseif (WIN32)
set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/libusb/MS64/dll/libusb-1.0.lib" CACHE INTERNAL "")
set(LIBUSB_DLL_DIR "${EXTERNAL_LIBRARY_FOLDER}/libusb/MS64/dll" CACHE INTERNAL "")
if(VS2019)
if(VS2022 OR VS2019)
set(OpenCV_DIR "${EXTERNAL_LIBRARY_FOLDER}/opencv4" CACHE INTERNAL "")
else()
set(OpenCV_DIR "${EXTERNAL_LIBRARY_FOLDER}/opencv" CACHE INTERNAL "")
@ -416,7 +429,7 @@ if(VS2019)
elseif(ANDROID)
set(EXTERNAL_LIBRARY_FOLDER "${CMAKE_SOURCE_DIR}/external/android")
set(Boost_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/ndk_21_boost_1.72.0/include" CACHE INTERNAL "")
set(Boost_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/ndk_26b_boost_1.83.0/include" CACHE INTERNAL "")
set(FFTW3F_FOUND ON CACHE INTERNAL "")
set(FFTW3F_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/fftw-3/include" CACHE INTERNAL "")
@ -473,6 +486,14 @@ elseif(ANDROID)
set(SWSCALE_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/include" CACHE INTERNAL "")
set(SWSCALE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libswscale.so" CACHE INTERNAL "")
set(GGMORSE_FOUND ON CACHE INTERNAL "")
set(GGMORSE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ggmorse/include/" CACHE INTERNAL "")
set(GGMORSE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ggmorse/lib/static/libggmorse.a" CACHE INTERNAL "")
set(FLAC_FOUND ON CACHE INTERNAL "")
set(FLAC_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/include/" CACHE INTERNAL "")
set(FLAC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/lib/libFLAC.so" CACHE INTERNAL "")
set(LIBUSB_FOUND ON CACHE INTERNAL "")
set(LIBUSB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/include/" CACHE INTERNAL "")
set(LIBUSB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so" CACHE INTERNAL "")
@ -495,11 +516,6 @@ elseif(ANDROID)
if (ENABLE_QT6)
set(ANDROID_EXTRA_LIBS
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Charts_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6Concurrent_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6MultimediaWidgets_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6SerialPort_arm64-v8a.so
${Qt6_DIR}/../../../android_arm64_v8a/lib/libQt6TextToSpeech_arm64-v8a.so
${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libssl_1_1.so
${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libcrypto_1_1.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavcodec.so
@ -514,6 +530,7 @@ elseif(ANDROID)
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/dsdcc/lib/libdsdcc.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libunrooted_android.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so
${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/lib/libFLAC.so
CACHE INTERNAL ""
)
else()
@ -564,6 +581,7 @@ elseif(ANDROID)
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/dsdcc/lib/libdsdcc.so
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libunrooted_android.so
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/libusb/lib/libusb1.0.so
${EXTERNAL_LIBRARY_FOLDER}/arm64-v8a/flac/lib/libFLAC.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavcodec.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavdevice.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/ffmpeg/lib/libavfilter.so
@ -576,9 +594,11 @@ elseif(ANDROID)
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/dsdcc/lib/libdsdcc.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libunrooted_android.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/libusb/lib/libusb1.0.so
${EXTERNAL_LIBRARY_FOLDER}/armeabi-v7a/flac/lib/libFLAC.so
CACHE INTERNAL ""
)
endif()
add_compile_definitions(ANDROID)
endif()
# When building a bundle on MacOS, we want to keep build paths in the library
@ -637,8 +657,7 @@ if(ENABLE_QT6)
MultimediaWidgets
Positioning
Charts
SerialPort
Core5Compat)
SerialPort)
else()
find_package(Qt5 5.15
REQUIRED COMPONENTS
@ -659,13 +678,15 @@ if (BUILD_GUI)
if (ENABLE_QT6)
find_package(Qt6
REQUIRED COMPONENTS
Location
OpenGL
OpenGLWidgets
Quick
QuickWidgets
TextToSpeech
Svg
SvgWidgets)
SvgWidgets
StateMachine)
else()
find_package(Qt5
REQUIRED COMPONENTS
@ -690,6 +711,7 @@ if (BUILD_GUI)
QuickWidgets
Svg
SvgWidgets
StateMachine
OPTIONAL_COMPONENTS
WebEngineQuick
WebEngineCore
@ -714,8 +736,27 @@ if (BUILD_GUI)
endif()
endif()
# List of static plugins to link with - This is appended to by each pluging CMakeLists.txt
set_property(GLOBAL PROPERTY STATIC_PLUGINS_PROPERTY "")
if(Qt${QT_DEFAULT_MAJOR_VERSION}Positioning_FOUND)
add_compile_definitions(QT_POSITIONING_FOUND)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}Location_FOUND)
add_compile_definitions(QT_LOCATION_FOUND)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}Charts_FOUND)
add_compile_definitions(QT_CHARTS_FOUND)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}TextToSpeech_FOUND)
add_compile_definitions(QT_TEXTTOSPEECH_FOUND)
endif()
if(BUILD_SHARED_LIBS)
add_compile_definitions(BUILD_SHARED_LIBS)
endif()
# other requirements
if(NOT ANDROID)
if(NOT ANDROID AND NOT EMSCRIPTEN)
find_package(PkgConfig REQUIRED)
endif()
@ -866,7 +907,9 @@ if (FFTW3F_FOUND)
set(WDSP_SUPPORT ON CACHE INTERNAL "")
endif()
if (BUILD_BENCH)
add_subdirectory(sdrbench)
endif()
if (BUILD_GUI)
add_subdirectory(sdrgui)
@ -937,6 +980,7 @@ else()
endif()
############ build sdrangel benchmark ################
if (BUILD_BENCH)
set(sdrangelbench_SOURCES
appbench/main.cpp
)
@ -950,6 +994,7 @@ target_link_libraries(sdrangelbench
sdrbench
logging
)
endif()
############ build sdrangel gui ################
if (BUILD_GUI)
@ -1043,7 +1088,9 @@ if (BUILD_SERVER)
endif()
############ install ##################
if (BUILD_BENCH)
install(TARGETS sdrangelbench DESTINATION ${INSTALL_BIN_DIR})
endif()
if (BUILD_GUI)
install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION ${INSTALL_BIN_DIR})
endif()

View File

@ -80,6 +80,15 @@
"cacheVariables": {
"ENABLE_QT6": "ON"
}
},
{
"name": "default-qt6-windows",
"inherits": "default-windows",
"binaryDir": "${sourceDir}/build-qt6",
"cacheVariables": {
"ENABLE_QT6": "ON",
"CMAKE_PREFIX_PATH": "C:/Qt/6.7.3/msvc2022_64;C:/Applications/boost_1_81_0"
}
}
],
"buildPresets": [
@ -94,6 +103,10 @@
{
"name": "default-qt6",
"configurePreset": "default-qt6"
},
{
"name": "default-qt6-windows",
"configurePreset": "default-qt6-windows"
}
]
}

View File

@ -22,7 +22,6 @@
///////////////////////////////////////////////////////////////////////////////////
#include <QApplication>
#include <QTextCodec>
#include <QProxyStyle>
#include <QStyleFactory>
#include <QFontDatabase>
@ -48,10 +47,6 @@
static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *logger)
{
/*
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
*/
QCoreApplication::setOrganizationName(COMPANY);
QCoreApplication::setApplicationName(APPLICATION_NAME);
QCoreApplication::setApplicationVersion(SDRANGEL_VERSION);
@ -193,7 +188,9 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
logger = nullptr;
}
MainWindow w(logger, parser);
MainWindow w(logger, parser);
w.show();
if (parser.getListDevices())
{
@ -202,12 +199,6 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo
return EXIT_SUCCESS;
}
if (parser.getRemoteTCPSink()) {
RemoteTCPSinkStarter::start(parser);
}
w.show();
return a.exec();
}

View File

@ -19,7 +19,11 @@ if(WIN32)
endif()
if(NOT MSVC)
add_compile_options(-Wall -Wextra -Wvla -Woverloaded-virtual -Wno-inconsistent-missing-override -ffast-math -fno-finite-math-only -ftree-vectorize)
add_compile_options(-Wall -Wextra -Wvla -ffast-math -fno-finite-math-only -ftree-vectorize)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_compile_options(-Wno-inconsistent-missing-override)
endif()
else()
# Disable some warnings, so more useful warnings aren't hidden in the noise
# 4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.

View File

@ -0,0 +1,31 @@
IF(NOT FLAC_FOUND)
INCLUDE(FindPkgConfig)
PKG_CHECK_MODULES(PC_FLAC flac)
FIND_PATH(
FLAC_INCLUDE_DIR
NAMES FLAC/stream_encoder.h
HINTS ${PC_FLAC_INCLUDE_DIRS}
PATHS /usr/local/include
/usr/include
)
FIND_LIBRARY(
FLAC_LIBRARY
NAMES FLAC
libFLAC
HINTS ${FLAC_DIR}/lib
${PC_FLAC_LIBRARY_DIRS}
PATHS /usr/local/lib
/usr/lib
/usr/lib64
)
message(STATUS "FLAC LIBRARY " ${FLAC_LIBRARY})
message(STATUS "FLAC INCLUDE DIR " ${FLAC_INCLUDE_DIR})
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(FLAC DEFAULT_MSG FLAC_LIBRARY FLAC_INCLUDE_DIR)
MARK_AS_ADVANCED(FLAC_LIBRARY FLAC_INCLUDE_DIR)
ENDIF(NOT FLAC_FOUND)

View File

@ -36,7 +36,7 @@ if(APPLE AND BUNDLE AND BUILD_GUI)
set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.icns")
set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist")
set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/cmake/cpack/sdrangel_icon.icns")
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_MACOS_PACKAGE_ARCHITECTURE}_${CMAKE_SYSTEM_PROCESSOR}" CACHE INTERNAL "")
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_mac-${CPACK_MACOS_PACKAGE_ARCHITECTURE}_${CMAKE_SYSTEM_PROCESSOR}" CACHE INTERNAL "")
set(CPACK_PRE_BUILD_SCRIPTS "${PROJECT_BINARY_DIR}/deploy_mac.cmake")
# copy SoapySDR Modules
@ -175,7 +175,7 @@ elseif(WIN32 OR MINGW)
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${fftw3f_dll}" "${SDRANGEL_BINARY_BIN_DIR}/"
)
endforeach(fftw3f_dll)
file(GLOB LIBUSB_DLLS "${LIBUSB_DLL_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
foreach(libusb_dll ${LIBUSB_DLLS})
get_filename_component(libusb_dll_name "${libusb_dll}" NAME)

View File

@ -1,14 +1,15 @@
# This CPACK_PRE_BUILD_SCRIPTS script is used to copy all required Qt and other 3rd party libraries (SDR drivers and codecs) in to the .app bundle
# It is run in a staging area (${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app) after all targets have been installed (E.g. sdrangel exe and plugins)
# The copying of frameworks and libraries is mostly done by 'macdeployqt', however, in order for 'macdeployqt' to copy libraries built by external/CMakeLists.txt,
# we first need to add RPATHs into the libraries giving the locations of any libraries they might depend on.
# we first need to add RPATHs into the libraries giving the locations of any libraries they might depend on.
# These paths are in the variable MACOS_EXTERNAL_LIBS_FIXUP set in externals/CMakeLists.txt
# Is there an easier way to this?
# Copy executable that will be run when icon in /Applications is clicked
message ("Copying default executable to SDRangel.app/Contents/MacOS/SDRangel")
execute_process (COMMAND mkdir ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app/Contents/MacOS/)
execute_process (COMMAND cp /opt/build/sdrangel/build/sdrangel ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app/Contents/MacOS/SDRangel)
execute_process (COMMAND pwd)
execute_process (COMMAND cp sdrangel ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/SDRangel.app/Contents/MacOS/SDRangel)
# Add RPATHS to libraries so macdeployqt can find out and copy all dependencies

121
debian/changelog vendored
View File

@ -1,3 +1,124 @@
sdrangel (7.22.7-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 04 May 2025 17:58:14 +0200
sdrangel (7.22.6-1) unstable; urgency=medium
* See Github release
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 02 Feb 2025 18:08:11 +0100
sdrangel (7.22.5-1) unstable; urgency=medium
* Windows: upload signed releases rather than unsigned releases to Github releases page. PR #2347
* Windows: fixed signed releases. PR #2344
* FT8 Demod: limit upper bandwidth to 5.8 kHz. Fixes #2339
* Stop device while changing channel set. Fixes #2332. PR #2342
* ADSB: Update URL of OpenSkyNetwork Aircraft database. PR #2341
* Don't stop source if being deleted. For #2315. PR #2340
* Send DSPSignalNotification in audio mods for #2336. PR #2340
* Radiosonde: limit precision of floating point numbers sent to SondeHub. PR #2338
* Windows signed releases: use relative path. Increase timeout to 30 minutes. PR #2335
* ADSB: Include adsbdemodsettings.h PR #2334
* Use release signing certificate for Windows installer. PR #2331
* Fix memory leak and race condition relating to DSP*Engines. Part of #2159 PR #2330
* FreeDV: Fix memory allocation/free issues. Part of #2315. PR #2330
* Wav Files: Add support for meta-data. PR #2328
* DemodAnalyzer: Ensure sample rate is set in worker. Fixes #2309. PR #2328
^ SDRplayv3: Mac: link with libsdrplay_api.so.3 rather than libsdrplay_api.so.3.15. PR #2327
* ADS-B: Fix memory use after delete. For #1734 and part of #2315 PR #2326
* Fixed Appveyor Docker image build
* Fix output-artifact-directory and unzip file. PR #2323
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Thu, 05 Dec 2024 01:07:27 +0100
sdrangel (7.22.4-1) unstable; urgency=medium
* Use macos-12 for Mac x86 build. PR #2321
* Workaround for "hdiutil: create failed - Resource busy"
* Pager: Add alpha and numeric columns. Implements #2319. PR #2320
* Added qtwebchannel dependecy to fix missing 3d Map and Sky Map from Windows release. PR #2316
* Removed .deb package build from Appveyor
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Mom, 11 Nov 2024 08:42:03 +0100
sdrangel (7.22.3-1) unstable; urgency=medium
* Add deb dependencies for pipewire. PR #2314
* Added compilation options for WebAssembly. PR #2313
* ADS-B: Use settings keys. PR #2310
* AIS Demod: Remove spacing around messages. PR #2310
* Freuqency Scanner: Add multiplex mode. PR #2310
* Build snap, MAC, Windows and Ubuntu .deb with Github actions. Various PRs
* Server: Use Sink/MIMO signals rather than Source. Part of #2294. PR #2304
* Updated some Python scripts to Python3. PR #2298
* RemoteTCPSink: Does use IQ only setting for RTL0. PR #2301
* Server: wait for set sample source/sink/MIMO to complete before loading the device settings. Fixes #2294
* Fix spectrum peak measurement for SSB spectra. Fixes #2282. PR #2299
* Upgrade C++ standard to c++17
* Fixes for Android . PR #2288
* Add qtshadertools. PR #2287
* Add more Qt modules and set ENABLE_QT6=ON. PR #2287
* Update Qt optional packages for 6.8 , PR #2287
* Use Qt 6.8 for Windows build. PR #2287
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sat, 09 Nov 2024 17:30:44 +0100
sdrangel (7.22.2-1) unstable; urgency=medium
* ChirpChat: increased preamble symbols limit from 20 to 32. Fixes #2284
* RTLSDR: Apply driver settings in RTLSDRThread Add sync read for WebAssembly. PR #2281
* SSB demod: fixed GUI and returned to previous threading model. Fixes #2273
* HeatMap: Catch memory allocation failures... For #2083 PR #2277
* Add default-qt6-windows cmake config. PR #2276
* Add pager notifications. Add option to ignore duplicates. Support plotting pager messages on the map. PR #2276
* Don't load defaults if loading a preset. PR #2274
* DeviceGUI::closeEvent - Don't automatically delete the GUI,.. PR #2274
* MainWindow: Add FSMs to avoid blocking on the GUI thread... PR #2274
* Fix replay buffer when FixReal is qint16. PR #2270
* snap: Try to get version number from latest tag. PR #2270
* Add libflac to snap. Set ARCH_OPT to nehalem. PR #2270
* Fix flac on Mac. PR #2270
* RemoteTCP: Update docs. PR #2270
* Map: Fix Kiwi list. Add SDRangel wss support. PR #2270
* RemoteTCPSink: Report server init errors via GUI. Send protocol to public list. PR #2270
* RemoteTCPInput: Add wss protocol support. PR #2270
* Fix DeviceAPI::deserialize. Fixes #2266. PR #2267
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 20 Oct 2024 08:26:38 +0200
sdrangel (7.22.1-1) unstable; urgency=medium
* wdsprx: Fix path to help file.
* Removed SyncMessenger from DSPDeviceSourceEngine. Part of #2159
* Fixed threading model for DSPDeviceSourceEngine. Part of #2159
* Removed SyncMessenger from DSPDeviceMIMOEngine. Part of #2159
* RTLSDR: make sure start and stop are effective once only. PArt of #2159
* Fixed threading model for DSPDeviceMIMOEngine plus other fixes. Part of #2159
* Removed SyncMessenger from DSPDeviceSinkEngine. Part of #2159
* SSBMod, AMMod, NFMMod: revised thread processing
* Fixed threading model for DSPDeviceSinkEngine plus other fixes. Part of #2159
* DeviceSet and DeviceUISet: use delete channel API instead of destroy method...
* BladeRF2Output: removed applySettings from stop method
* All device plugins: make sure start and stop are effective once only. PArt of #2159
* Removed the destroy method from ChannelGUI interface
* DeviceGUI: removed destroy method. Part of #2159
* Fix SopaySDR library search when system cmake package present. PR #2245
* Append prefix to plugin name when running on Android. PR #2245
* Fix compilation with newer ffmpeg libavutil. PR #2245
* Fix compilation for Android with Qt6. PR #2245
* Bump Cmake minimal version to 3.17
* Use new find_package(CUDA Toolkit). PR #2250
* Update CMakeLists.txt to allow static libraries to be built, as well as shared... PR #2252
* Allow plugins to be compiled as static libs, part 2. PR #2254
* Use opencv4 with VS2022. PR #2257
* Frequency Scanner: initialize pointer to FrequencyScanner. Fixes #2262
* Update channel list upon Morse Decoder and Demod Analyzer GUI creation. Fixes #2263
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 06 Oct 2024 08:39:11 +0200
sdrangel (7.22.0-1) unstable; urgency=medium
* New Rx channel based on WDSP. Issue #2156

8
debian/control vendored
View File

@ -42,9 +42,12 @@ Build-Depends: debhelper (>= 9),
libopencv-imgcodecs-dev,
libxml2-dev,
bison,
cmake,
flex,
ffmpeg,
ninja-build,
libfaad-dev,
libflac-dev,
libavcodec-dev,
libavformat-dev,
libopus-dev,
@ -62,12 +65,13 @@ Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
libasound2,
libgl1-mesa-glx,
libgl1,
libglx-mesa0,
libqt5multimedia5-plugins,
libqt5gamepad5,
libqt5svg5,
qtspeech5-speechd-plugin,
pulseaudio,
pulseaudio | pipewire-pulse,
ffmpeg,
gstreamer1.0-libav,
qml-module-qtlocation,

View File

@ -40,4 +40,6 @@ if(ENABLE_USRP AND UHD_FOUND)
add_subdirectory(usrp)
endif()
add_subdirectory(metis)
if(ENABLE_METIS)
add_subdirectory(metis)
endif()

View File

@ -27,9 +27,14 @@ set_target_properties(soapysdrdevice
target_link_libraries(soapysdrdevice
${SOAPYSDR_LINK_LIBRARIES}
${SOAPYSDR_LIBRARIES}
sdrbase
)
target_link_directories(soapysdrdevice PRIVATE
${SOAPYSDR_LIBRARY_DIRS}
)
if(SOAPYSDR_EXTERNAL AND NOT LINUX)
add_dependencies(soapysdrdevice soapysdr)
endif()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 640 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

After

Width:  |  Height:  |  Size: 844 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 570 KiB

After

Width:  |  Height:  |  Size: 819 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 KiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 351 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 603 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 859 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 547 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

BIN
doc/img/Map_plugin_pfd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -11,9 +11,9 @@
set(CODEC2_TAG "v1.0.3")
set(CM256CC_TAG c0e92b92aca3d1d36c990b642b937c64d363c559)
set(MBELIB_TAG fe83b32c6a60cdd7bce8cecf3c7a0b9ec87a7667)
set(SERIALDV_TAG "v1.1.4")
set(SERIALDV_TAG "v1.1.5")
set(DSDCC_TAG "v1.9.5")
set(LIMESUITE_TAG 70e3859a55d8d5353963a5318013c8454594769f)
set(LIMESUITE_TAG b39cb61ed03d74c35a2de757d495e901acbb6404)
set(BLADERF_TAG "2021.02")
set(LIBIIO_TAG 826563e41b5ce9890b75506f672017de8d76d52d)
set(AIRSPYHF_TAG "1af81c0ca18944b8c9897c3c98dc0a991815b686")
@ -29,17 +29,11 @@ set(SOAPYSDR_SDRPLAY_TAG "soapy-sdrplay-0.2.0")
set(SOAPYSDR_AUDIO_TAG "soapy-audio-0.1.1")
set(SOAPYSDR_REMOTE_TAG "soapy-remote-0.5.1")
set(AIRSPY_TAG "37c768ce9997b32e7328eb48972a7fda0a1f8554")
set(HACKRF_TAG "v2022.09.1")
set(HACKRF_TAG "v2024.02.1")
set(LIBXML2_TAG "v2.10.4")
set(UHD_TAG "v4.6.0.0")
if (APPLE AND (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64))
# UHD fails to load with 1.80+
set(BOOST_TAG "1.78.0")
set(BOOST_TAG2 "1_78_0")
else()
set(BOOST_TAG "1.83.0")
set(BOOST_TAG2 "1_83_0")
endif()
set(UHD_TAG "v4.7.0.0")
set(BOOST_TAG "1.86.0")
set(BOOST_TAG2 "1_86_0")
# For some external project macros
include(ExternalProject)
@ -60,6 +54,7 @@ if (WIN32)
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG=${SDRANGEL_BINARY_LIB_DIR}
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE=${SDRANGEL_BINARY_LIB_DIR}
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO=${SDRANGEL_BINARY_LIB_DIR}
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
)
elseif (LINUX)
set(COMMON_CMAKE_ARGS
@ -426,6 +421,7 @@ if (NOT FFMPEG_FOUND AND NOT USE_PRECOMPILED_LIBS)
if (NOT X265_FOUND OR X265_EXTERNAL)
ExternalProject_Add(x265
GIT_REPOSITORY https://bitbucket.org/multicoreware/x265_git.git
GIT_TAG 4.1
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/x265"
SOURCE_SUBDIR "source"
CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
@ -546,7 +542,7 @@ endif (NOT FFMPEG_FOUND AND NOT USE_PRECOMPILED_LIBS)
if (NOT OpenCV_FOUND AND NOT USE_PRECOMPILED_LIBS AND ENABLE_CHANNELTX_MODATV)
ExternalProject_Add(opencv
GIT_REPOSITORY https://github.com/opencv/opencv.git
GIT_TAG 4.5.5
GIT_TAG 4.10.0
DEPENDS "${FFMPEG_DEPENDS}"
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/opencv"
CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DWITH_FFMPEG=ON -DCMAKE_PREFIX_PATH=${FFMPEG_INSTALL_DIR}
@ -851,6 +847,38 @@ if(ENABLE_FEATURE_SATELLITETRACKER OR ENABLE_CHANNELRX_DEMODAPT)
endif ()
endif ()
if(ENABLE_CHANNELRX_REMOTETCPSINK)
if (WIN32)
set(FLAC_LIBRARIES "${SDRANGEL_BINARY_LIB_DIR}/FLAC.lib" CACHE INTERNAL "")
elseif (LINUX)
set(FLAC_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC/libFLAC${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
elseif (APPLE)
set(FLAC_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC/libFLAC${CMAKE_SHARED_LIBRARY_SUFFIX}" CACHE INTERNAL "")
elseif (EMSCRIPTEN)
set(FLAC_LIBRARIES "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC/libFLAC.a" CACHE INTERNAL "")
endif()
ExternalProject_Add(flac
GIT_REPOSITORY https://github.com/xiph/flac.git
PREFIX "${EXTERNAL_BUILD_LIBRARIES}/flac"
CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DINSTALL_MANPAGES=OFF -DBUILD_SHARED_LIBS=ON -DWITH_FORTIFY_SOURCE=OFF -DWITH_STACK_PROTECTOR=PFF -DBUILD_PROGRAMS=OFF -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF -DWITH_OGG=OFF -DBUILD_DOCS=OFF
BUILD_BYPRODUCTS "${FLAC_LIBRARIES}"
INSTALL_COMMAND ""
TEST_COMMAND ""
)
ExternalProject_Get_Property(flac source_dir binary_dir)
set_global(FLAC_DEPENDS flac)
set_global_cache(FLAC_FOUND ON)
set(FLAC_EXTERNAL ON CACHE INTERNAL "")
set(FLAC_INCLUDE_DIR "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac/include" CACHE INTERNAL "")
if (WIN32)
install(FILES "${SDRANGEL_BINARY_BIN_DIR}/FLAC${CMAKE_SHARED_LIBRARY_SUFFIX}" DESTINATION "${INSTALL_LIB_DIR}")
elseif (APPLE)
install(DIRECTORY "${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC" DESTINATION "${INSTALL_LIB_DIR}"
FILES_MATCHING PATTERN "libFLAC*${CMAKE_SHARED_LIBRARY_SUFFIX}")
set(MACOS_EXTERNAL_LIBS_FIXUP "${MACOS_EXTERNAL_LIBS_FIXUP};${EXTERNAL_BUILD_LIBRARIES}/flac/src/flac-build/src/libFLAC")
endif ()
endif ()
# For Morse Decoder feature
if(ENABLE_FEATURE_MORSEDECODER)
if (WIN32)
@ -1546,6 +1574,8 @@ if (WIN32 OR APPLE)
-DLIBUSB_LIBRARIES=${LIBUSB_LIBRARIES}
-DLIBUSB_INCLUDE_DIR=${LIBUSB_INCLUDE_DIR}
${UHD_PYTHON_ARGS}
-DPython3_FIND_FRAMEWORK=NEVER
-DENABLE_PYTHON_API=OFF
-DCMAKE_INSTALL_NAME_DIR=<INSTALL_DIR>/lib
TEST_COMMAND ""
)

2
external/windows vendored

@ -1 +1 @@
Subproject commit c55d3980808da97306e2b4feac452323854a39e4
Subproject commit eddef8183524e5aaef978088427d4b22a5afb393

View File

@ -39,10 +39,14 @@ include_directories(
${CMAKE_SOURCE_DIR}/sdrbase
)
add_library(ft8 SHARED
add_library(ft8
${ft8_SOURCES}
)
if(DEFINED FFTW3F_DEPENDS)
add_dependencies(ft8 "${FFTW3F_DEPENDS}")
endif()
target_link_libraries(ft8
Boost::disable_autolinking
${FFTW3F_LIBRARIES}

View File

@ -85,8 +85,9 @@ struct FT8_API cdecode
// total transmission time is 12.64 seconds
// tunable parameters
struct FT8_API FT8Params
class FT8_API FT8Params
{
public:
int nthreads; // number of parallel threads, for multi-core
int npasses_one; // number of spectral subtraction passes
int npasses_two; // number of spectral subtraction passes

View File

@ -82,7 +82,7 @@ std::string Packing::unpackcall(int x)
if (x <= 1002)
{
sprintf(tmp, "CQ %d", x - 3);
snprintf(tmp, sizeof(tmp), "CQ %d", x - 3);
return std::string(tmp);
}
@ -96,7 +96,7 @@ std::string Packing::unpackcall(int x)
int ci3 = x / 27;
x %= 27;
int ci4 = x;
sprintf(tmp, "CQ %c%c%c%c", c4[ci1], c4[ci2], c4[ci3], c4[ci4]);
snprintf(tmp, sizeof(tmp), "CQ %c%c%c%c", c4[ci1], c4[ci2], c4[ci3], c4[ci4]);
return std::string(tmp);
}
@ -193,9 +193,9 @@ std::string Packing::unpackgrid15(int ng, int ir)
char tmp[16];
if (db >= 0) {
sprintf(tmp, "%s+%02d", ir ? "R" : "", db);
snprintf(tmp, sizeof(tmp), "%s+%02d", ir ? "R" : "", db);
} else {
sprintf(tmp, "%s-%02d", ir ? "R" : "", 0 - db);
snprintf(tmp, sizeof(tmp), "%s-%02d", ir ? "R" : "", 0 - db);
}
return std::string(tmp);
@ -396,7 +396,7 @@ std::string Packing::unpack_5(int a77[], std::string& call1str, std::string& cal
i += 3;
int qsonb = un64(a77, i, 11);
char report[16];
sprintf(report, "%d%04d", rst, qsonb);
snprintf(report, sizeof(report), "%d%04d", rst, qsonb);
i += 11;
// g25
int ng = un64(a77, i, 25);
@ -467,9 +467,9 @@ std::string Packing::unpack_0_1(int a77[], std::string& call1str, std::string& c
char tmp[32];
if (r >= 0) {
sprintf(tmp, "+%02d", r);
snprintf(tmp, sizeof(tmp), "+%02d", r);
} else {
sprintf(tmp, "-%02d", -r);
snprintf(tmp, sizeof(tmp), "-%02d", -r);
}
locstr = std::string(tmp);
@ -553,7 +553,7 @@ std::string Packing::unpack_3(int a77[], std::string& call1str, std::string& cal
else
{
char tmp[32];
sprintf(tmp, "%04d", serial);
snprintf(tmp, sizeof(tmp), "%04d", serial);
serialstr = std::string(tmp);
}
@ -571,7 +571,7 @@ std::string Packing::unpack_3(int a77[], std::string& call1str, std::string& cal
}
{
char tmp[16];
sprintf(tmp, "%d ", rst);
snprintf(tmp, sizeof(tmp), "%d ", rst);
msg += std::string(tmp);
}
@ -634,7 +634,7 @@ std::string Packing::unpack_0_3(int a77[], int n3, std::string& call1str, std::s
{
char tmp[16];
sprintf(tmp, "%d%c ", n_transmitters + 1, clss + 'A');
snprintf(tmp, sizeof(tmp), "%d%c ", n_transmitters + 1, clss + 'A');
msg += std::string(tmp);
}
@ -658,9 +658,9 @@ std::string Packing::unpack(int a77[], std::string& call1, std::string& call2, s
char tmp[64];
if (i3 == 0) {
sprintf(tmp, "%d.%d", i3, n3);
snprintf(tmp, sizeof(tmp), "%d.%d", i3, n3);
} else {
sprintf(tmp, "%d", i3);
snprintf(tmp, sizeof(tmp), "%d", i3);
}
type = std::string(tmp);
@ -714,7 +714,7 @@ std::string Packing::unpack(int a77[], std::string& call1, std::string& call2, s
}
call1 = "UNK";
sprintf(tmp, "UNK i3=%d n3=%d", i3, n3);
snprintf(tmp, sizeof(tmp), "UNK i3=%d n3=%d", i3, n3);
return std::string(tmp);
}

View File

@ -4,6 +4,6 @@ PLUGINS=$(git diff --name-only ${1}..${2} | grep plugins/ | cut -d'/' -f2,3 | so
for plugin in $PLUGINS
do
FILE=$(find $BASEDIR/plugins/$plugin -name "*plugin.cpp")
sed -i -E "s/QStringLiteral\(\"7\.(.*)\"\)/QStringLiteral\(\"7\.22\.0\"\)/" $FILE
echo $FILE
sed -i -E "s/QStringLiteral\(\"7\.(.*)\"\)/QStringLiteral\(\"7\.22\.7\"\)/" $FILE
done

View File

@ -35,7 +35,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/exports
)
add_library(httpserver SHARED
add_library(httpserver
${httpserver_SOURCES}
)

View File

@ -94,7 +94,7 @@ void HttpConnectionHandlerPool::cleanup()
if (++idleCounter > maxIdleHandlers)
{
pool.removeOne(handler);
qDebug("HttpConnectionHandlerPool: Removed connection handler (%p), pool size is now %i",handler,pool.size());
qDebug("HttpConnectionHandlerPool: Removed connection handler (%p), pool size is now %i",handler,(int)pool.size());
delete handler;
break; // remove only one handler in each interval
}

View File

@ -35,7 +35,7 @@ StaticFileController::StaticFileController(QSettings* settings, QObject* parent)
maxCachedFileSize=settings->value("maxCachedFileSize","65536").toInt();
cache.setMaxCost(settings->value("cacheSize","1000000").toInt());
cacheTimeout=settings->value("cacheTime","60000").toInt();
qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,cache.maxCost());
qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,(int)cache.maxCost());
}
StaticFileController::StaticFileController(const HttpDocrootSettings& settings, QObject* parent)
@ -56,7 +56,7 @@ StaticFileController::StaticFileController(const HttpDocrootSettings& settings,
maxCachedFileSize=settings.maxCachedFileSize;
cache.setMaxCost(settings.cacheSize);
cacheTimeout=settings.cacheTime;
qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,cache.maxCost());
qDebug("StaticFileController: cache timeout=%i, size=%i",cacheTimeout,(int)cache.maxCost());
}
void StaticFileController::service(HttpRequest& request, HttpResponse& response)

View File

@ -21,7 +21,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/exports
)
add_library(logging SHARED
add_library(logging
${logging_SOURCES}
)

View File

@ -47,7 +47,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/exports
)
add_library(modemm17 SHARED
add_library(modemm17
${modemm17_SOURCES}
)

View File

@ -239,7 +239,7 @@ constexpr T to_int(uint8_t v)
{
constexpr auto MAX_LOCAL_INPUT = (1 << (n - 1));
constexpr auto NEGATIVE_OFFSET = std::numeric_limits<typename std::make_unsigned<T>::type>::max() - (MAX_LOCAL_INPUT - 1);
T r = v & (1 << (n - 1)) ? NEGATIVE_OFFSET : 0;
T r = v & (1 << (n - 1)) ? (T)NEGATIVE_OFFSET : 0;
return r + (v & (MAX_LOCAL_INPUT - 1));
}

View File

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

View File

@ -34,22 +34,28 @@ if (NOT SERVER_MODE)
beamsteeringcwmodgui.h
)
set(TARGET_NAME beamsteeringcwmod)
set(TARGET_NAME ${PLUGINS_PREFIX}beamsteeringcwmod)
set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else()
set(TARGET_NAME beamsteeringcwmodsrv)
set(TARGET_NAME ${PLUGINSSRV_PREFIX}beamsteeringcwmodsrv)
set(TARGET_LIB "")
set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif()
add_library(${TARGET_NAME} SHARED
${beamsteeringcwmod_SOURCES}
)
if(NOT Qt6_FOUND)
add_library(${TARGET_NAME} ${beamsteeringcwmod_SOURCES})
else()
qt_add_plugin(${TARGET_NAME} CLASS_NAME BeamSteeringCWModPlugin ${beamsteeringcwmod_SOURCES})
endif()
target_link_libraries(${TARGET_NAME}
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core
${TARGET_LIB}
sdrbase

View File

@ -46,7 +46,6 @@ BeamSteeringCWMod::BeamSteeringCWMod(DeviceAPI *deviceAPI) :
m_thread(nullptr),
m_basebandSource(nullptr),
m_running(false),
m_guiMessageQueue(nullptr),
m_frequencyOffset(0),
m_basebandSampleRate(48000)
{
@ -62,7 +61,7 @@ BeamSteeringCWMod::BeamSteeringCWMod(DeviceAPI *deviceAPI) :
this,
&BeamSteeringCWMod::networkManagerFinished
);
startSources();
BeamSteeringCWMod::startSources();
}
BeamSteeringCWMod::~BeamSteeringCWMod()
@ -77,7 +76,7 @@ BeamSteeringCWMod::~BeamSteeringCWMod()
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeMIMOChannel(this);
stopSources();
BeamSteeringCWMod::stopSources();
}
void BeamSteeringCWMod::setDeviceAPI(DeviceAPI *deviceAPI)
@ -194,7 +193,7 @@ void BeamSteeringCWMod::applySettings(const BeamSteeringCWModSettings& settings,
QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (pipes.size() > 0) {
if (!pipes.empty()) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
}
@ -205,7 +204,7 @@ void BeamSteeringCWMod::handleInputMessages()
{
Message* message;
while ((message = m_inputMessageQueue.pop()) != 0)
while ((message = m_inputMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message))
{
@ -218,14 +217,14 @@ bool BeamSteeringCWMod::handleMessage(const Message& cmd)
{
if (MsgConfigureBeamSteeringCWMod::match(cmd))
{
MsgConfigureBeamSteeringCWMod& cfg = (MsgConfigureBeamSteeringCWMod&) cmd;
auto& cfg = (const MsgConfigureBeamSteeringCWMod&) cmd;
qDebug() << "BeamSteeringCWMod::handleMessage: MsgConfigureBeamSteeringCWMod";
applySettings(cfg.getSettings(), cfg.getForce());
return true;
}
else if (DSPMIMOSignalNotification::match(cmd))
{
DSPMIMOSignalNotification& notif = (DSPMIMOSignalNotification&) cmd;
auto& notif = (const DSPMIMOSignalNotification&) cmd;
qDebug() << "BeamSteeringCWMod::handleMessage: DSPMIMOSignalNotification:"
<< " basebandSampleRate: " << notif.getSampleRate()
@ -301,7 +300,7 @@ void BeamSteeringCWMod::validateFilterChainHash(BeamSteeringCWModSettings& setti
void BeamSteeringCWMod::calculateFrequencyOffset()
{
double shiftFactor = HBFilterChainConverter::getShiftFactor(m_settings.m_log2Interp, m_settings.m_filterChainHash);
m_frequencyOffset = m_basebandSampleRate * shiftFactor;
m_frequencyOffset = (int64_t) (m_basebandSampleRate * shiftFactor);
}
int BeamSteeringCWMod::webapiSettingsGet(
@ -380,13 +379,13 @@ void BeamSteeringCWMod::webapiUpdateChannelSettings(
settings.m_reverseAPIAddress = *response.getBeamSteeringCwModSettings()->getReverseApiAddress();
}
if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = response.getBeamSteeringCwModSettings()->getReverseApiPort();
settings.m_reverseAPIPort = (uint16_t) response.getBeamSteeringCwModSettings()->getReverseApiPort();
}
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = response.getBeamSteeringCwModSettings()->getReverseApiDeviceIndex();
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getBeamSteeringCwModSettings()->getReverseApiDeviceIndex();
}
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
settings.m_reverseAPIChannelIndex = response.getBeamSteeringCwModSettings()->getReverseApiChannelIndex();
settings.m_reverseAPIChannelIndex = (uint16_t) response.getBeamSteeringCwModSettings()->getReverseApiChannelIndex();
}
if (settings.m_channelMarker && channelSettingsKeys.contains("channelMarker")) {
settings.m_channelMarker->updateFrom(channelSettingsKeys, response.getBeamSteeringCwModSettings()->getChannelMarker());
@ -429,7 +428,7 @@ void BeamSteeringCWMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSetti
}
else
{
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker);
response.getBeamSteeringCwModSettings()->setChannelMarker(swgChannelMarker);
}
@ -443,16 +442,16 @@ void BeamSteeringCWMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSetti
}
else
{
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState);
response.getBeamSteeringCwModSettings()->setRollupState(swgRollupState);
}
}
}
void BeamSteeringCWMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force)
void BeamSteeringCWMod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
@ -463,8 +462,8 @@ void BeamSteeringCWMod::webapiReverseSendSettings(QList<QString>& channelSetting
m_networkRequest.setUrl(QUrl(channelSettingsURL));
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QBuffer *buffer = new QBuffer();
buffer->open((QBuffer::ReadWrite));
auto *buffer = new QBuffer();
buffer->open(QBuffer::ReadWrite);
buffer->write(swgChannelSettings->asJson().toUtf8());
buffer->seek(0);
@ -477,9 +476,9 @@ void BeamSteeringCWMod::webapiReverseSendSettings(QList<QString>& channelSetting
void BeamSteeringCWMod::sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const BeamSteeringCWModSettings& settings,
bool force)
bool force) const
{
for (const auto& pipe : pipes)
{
@ -487,7 +486,7 @@ void BeamSteeringCWMod::sendChannelSettings(
if (messageQueue)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
this,
@ -501,11 +500,11 @@ void BeamSteeringCWMod::sendChannelSettings(
}
void BeamSteeringCWMod::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const BeamSteeringCWModSettings& settings,
bool force
)
) const
{
swgChannelSettings->setDirection(2); // MIMO sink
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
@ -534,20 +533,20 @@ void BeamSteeringCWMod::webapiFormatChannelSettings(
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
{
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker);
swgBeamSteeringCWSettings->setChannelMarker(swgChannelMarker);
}
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
{
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState);
swgBeamSteeringCWSettings->setRollupState(swgRollupState);
}
}
void BeamSteeringCWMod::networkManagerFinished(QNetworkReply *reply)
void BeamSteeringCWMod::networkManagerFinished(QNetworkReply *reply) const
{
QNetworkReply::NetworkError replyError = reply->error();

View File

@ -86,67 +86,64 @@ public:
qint64 m_centerFrequency;
};
BeamSteeringCWMod(DeviceAPI *deviceAPI);
virtual ~BeamSteeringCWMod();
virtual void destroy() { delete this; }
virtual void setDeviceAPI(DeviceAPI *deviceAPI);
virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
explicit BeamSteeringCWMod(DeviceAPI *deviceAPI);
~BeamSteeringCWMod() final;
void destroy() final { delete this; }
void setDeviceAPI(DeviceAPI *deviceAPI) final;
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; }
virtual void startSinks() {}
virtual void stopSinks() {}
virtual void startSources(); //!< thread start()
virtual void stopSources(); //!< thread exit() and wait()
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex);
virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex);
virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
virtual QString getMIMOName() { return objectName(); }
void startSinks() final { /* Not used for MIMO */ }
void stopSinks() final { /* Not used for MIMO */ }
void startSources( /* Not used for MIMO */ ) final; //!< thread start()
void stopSources( /* Not used for MIMO */ ) final; //!< thread exit() and wait()
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) final;
void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) final;
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); }
QString getMIMOName() final { return objectName(); }
virtual void getIdentifier(QString& id) { id = objectName(); }
virtual QString getIdentifier() const { return objectName(); }
virtual void getTitle(QString& title) { title = "BeamSteeringCWMod"; }
virtual qint64 getCenterFrequency() const { return m_frequencyOffset; }
virtual void setCenterFrequency(qint64) {}
void getIdentifier(QString& id) final { id = objectName(); }
QString getIdentifier() const final { return objectName(); }
void getTitle(QString& title) final { title = "BeamSteeringCWMod"; }
qint64 getCenterFrequency() const final { return m_frequencyOffset; }
void setCenterFrequency(qint64) final { /* Not used for MIMO */ }
uint32_t getBasebandSampleRate() const { return m_basebandSampleRate; }
virtual QByteArray serialize() const;
virtual bool deserialize(const QByteArray& data);
QByteArray serialize() const final;
bool deserialize(const QByteArray& data) final;
virtual int getNbSinkStreams() const { return 0; }
virtual int getNbSourceStreams() const { return 2; }
virtual int getStreamIndex() const { return -1; }
int getNbSinkStreams() const final { return 0; }
int getNbSourceStreams() const final { return 2; }
int getStreamIndex() const final { return -1; }
virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final
{
(void) streamIndex;
(void) sinkElseSource;
return m_frequencyOffset;
}
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final;
virtual int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
int webapiSettingsPutPatch(
bool force,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final;
virtual int webapiSettingsPutPatch(
bool force,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
virtual int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage);
int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage) final;
static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response,
const BeamSteeringCWModSettings& settings);
static void webapiUpdateChannelSettings(
BeamSteeringCWModSettings& settings,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response);
BeamSteeringCWModSettings& settings,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response);
static const char* const m_channelIdURI;
static const char* const m_channelId;
@ -158,39 +155,35 @@ private:
BeamSteeringCWModBaseband* m_basebandSource;
QMutex m_mutex;
bool m_running;
BasebandSampleSink* m_spectrumSink;
BasebandSampleSink* m_scopeSink;
BeamSteeringCWModSettings m_settings;
MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI
QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest;
int64_t m_frequencyOffset;
uint32_t m_basebandSampleRate;
int m_count0, m_count1;
virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const BeamSteeringCWModSettings& settings, bool force = false);
static void validateFilterChainHash(BeamSteeringCWModSettings& settings);
void calculateFrequencyOffset();
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const BeamSteeringCWModSettings& settings, bool force);
void sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const BeamSteeringCWModSettings& settings,
bool force
);
) const;
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const BeamSteeringCWModSettings& settings,
bool force
);
) const;
private slots:
void handleInputMessages();
void networkManagerFinished(QNetworkReply *reply);
void networkManagerFinished(QNetworkReply *reply) const;
};
#endif // INCLUDE_BEAMSTEERINGCWSOURCE_H

View File

@ -30,15 +30,10 @@
BeamSteeringCWModGUI* BeamSteeringCWModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel)
{
BeamSteeringCWModGUI* gui = new BeamSteeringCWModGUI(pluginAPI, deviceUISet, mimoChannel);
auto* gui = new BeamSteeringCWModGUI(pluginAPI, deviceUISet, mimoChannel);
return gui;
}
void BeamSteeringCWModGUI::destroy()
{
delete this;
}
void BeamSteeringCWModGUI::resetToDefaults()
{
m_settings.resetToDefaults();
@ -67,7 +62,7 @@ bool BeamSteeringCWModGUI::handleMessage(const Message& message)
{
if (BeamSteeringCWMod::MsgBasebandNotification::match(message))
{
BeamSteeringCWMod::MsgBasebandNotification& notif = (BeamSteeringCWMod::MsgBasebandNotification&) message;
auto& notif = (const BeamSteeringCWMod::MsgBasebandNotification&) message;
m_basebandSampleRate = notif.getSampleRate();
m_centerFrequency = notif.getCenterFrequency();
displayRateAndShift();
@ -76,7 +71,7 @@ bool BeamSteeringCWModGUI::handleMessage(const Message& message)
}
else if (BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod::match(message))
{
const BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod& cfg = (BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod&) message;
auto& cfg = (const BeamSteeringCWMod::MsgConfigureBeamSteeringCWMod&) message;
m_settings = cfg.getSettings();
blockApplySettings(true);
m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker));
@ -109,7 +104,7 @@ BeamSteeringCWModGUI::BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *de
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
m_bsCWSource = (BeamSteeringCWMod*) mimoChannel;
m_bsCWSource->setMessageQueueToGUI(getInputMessageQueue());
m_bsCWSource->setMessageQueueToGUI(BeamSteeringCWModGUI::getInputMessageQueue());
m_basebandSampleRate = m_bsCWSource->getBasebandSampleRate();
connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
@ -128,7 +123,7 @@ BeamSteeringCWModGUI::BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *de
m_deviceUISet->addChannelMarker(&m_channelMarker);
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
connect(BeamSteeringCWModGUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
displaySettings();
makeUIConnections();
@ -183,13 +178,13 @@ void BeamSteeringCWModGUI::displaySettings()
void BeamSteeringCWModGUI::displayRateAndShift()
{
int shift = m_shiftFrequencyFactor * m_basebandSampleRate;
auto shift = (int) (m_shiftFrequencyFactor * m_basebandSampleRate);
double channelSampleRate = ((double) m_basebandSampleRate) / (1<<m_settings.m_log2Interp);
QLocale loc;
ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift)));
ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5)));
m_channelMarker.setCenterFrequency(shift);
m_channelMarker.setBandwidth(channelSampleRate);
m_channelMarker.setBandwidth((int) channelSampleRate);
}
void BeamSteeringCWModGUI::leaveEvent(QEvent*)
@ -206,7 +201,7 @@ void BeamSteeringCWModGUI::handleSourceMessages()
{
Message* message;
while ((message = getInputMessageQueue()->pop()) != 0)
while ((message = getInputMessageQueue()->pop()) != nullptr)
{
if (handleMessage(*message))
{
@ -215,7 +210,7 @@ void BeamSteeringCWModGUI::handleSourceMessages()
}
}
void BeamSteeringCWModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void BeamSteeringCWModGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
{
(void) widget;
(void) rollDown;
@ -226,7 +221,7 @@ void BeamSteeringCWModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void BeamSteeringCWModGUI::onMenuDialogCalled(const QPoint &p)
{
if (m_contextMenuType == ContextMenuChannelSettings)
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings)
{
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
@ -316,7 +311,7 @@ void BeamSteeringCWModGUI::tick()
}
}
void BeamSteeringCWModGUI::makeUIConnections()
void BeamSteeringCWModGUI::makeUIConnections() const
{
QObject::connect(ui->channelOutput, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BeamSteeringCWModGUI::on_channelOutput_currentIndexChanged);
QObject::connect(ui->interpolationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BeamSteeringCWModGUI::on_interpolationFactor_currentIndexChanged);
@ -326,5 +321,5 @@ void BeamSteeringCWModGUI::makeUIConnections()
void BeamSteeringCWModGUI::updateAbsoluteCenterFrequency()
{
setStatusFrequency(m_centerFrequency + m_shiftFrequencyFactor * m_basebandSampleRate);
setStatusFrequency(m_centerFrequency + (qint64) (m_shiftFrequencyFactor * m_basebandSampleRate));
}

View File

@ -47,22 +47,21 @@ class BeamSteeringCWModGUI : public ChannelGUI {
public:
static BeamSteeringCWModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel);
virtual void destroy();
virtual void resetToDefaults();
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
virtual QString getTitle() const { return m_settings.m_title; };
virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
virtual bool getHidden() const { return m_settings.m_hidden; }
virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
virtual int getStreamIndex() const { return -1; }
virtual void setStreamIndex(int streamIndex) { (void) streamIndex; }
void resetToDefaults() final;
QByteArray serialize() const final;
bool deserialize(const QByteArray& data) final;
MessageQueue *getInputMessageQueue() final { return &m_inputMessageQueue; }
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; };
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; };
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; };
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; };
QString getTitle() const final { return m_settings.m_title; };
QColor getTitleColor() const final { return m_settings.m_rgbColor; };
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; }
bool getHidden() const final { return m_settings.m_hidden; }
ChannelMarker& getChannelMarker() final { return m_channelMarker; }
int getStreamIndex() const final { return -1; }
void setStreamIndex(int streamIndex) final { (void) streamIndex; }
private:
Ui::BeamSteeringCWModGUI* ui;
@ -82,18 +81,18 @@ private:
uint32_t m_tickCount;
explicit BeamSteeringCWModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel, QWidget* parent = nullptr);
virtual ~BeamSteeringCWModGUI();
~BeamSteeringCWModGUI() final;
void blockApplySettings(bool block);
void applySettings(bool force = false);
void displaySettings();
void displayRateAndShift();
bool handleMessage(const Message& message);
void makeUIConnections();
void makeUIConnections() const;
void updateAbsoluteCenterFrequency();
void leaveEvent(QEvent*);
void enterEvent(EnterEventType*);
void leaveEvent(QEvent*) final;
void enterEvent(EnterEventType*) final;
void applyInterpolation();
void applyPosition();
@ -104,7 +103,7 @@ private slots:
void on_interpolationFactor_currentIndexChanged(int index);
void on_position_valueChanged(int value);
void on_steeringDegrees_valueChanged(int value);
void onWidgetRolled(QWidget* widget, bool rollDown);
void onWidgetRolled(const QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void tick();
};

View File

@ -33,7 +33,7 @@
const PluginDescriptor BeamSteeringCWModPlugin::m_pluginDescriptor = {
BeamSteeringCWMod::m_channelId,
QStringLiteral("BeamSteeringCWMod"),
QStringLiteral("7.20.0"),
QStringLiteral("7.22.1"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -38,22 +38,28 @@ if (NOT SERVER_MODE)
doa2compass.cpp
)
set(TARGET_NAME doa2)
set(TARGET_NAME ${PLUGINS_PREFIX}doa2)
set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else()
set(TARGET_NAME doa2srv)
set(TARGET_NAME ${PLUGINSSRV_PREFIX}doa2srv)
set(TARGET_LIB "")
set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif()
add_library(${TARGET_NAME} SHARED
${doa2_SOURCES}
)
if(NOT Qt6_FOUND)
add_library(${TARGET_NAME} ${doa2_SOURCES})
else()
qt_add_plugin(${TARGET_NAME} CLASS_NAME DOA2Plugin ${doa2_SOURCES})
endif()
target_link_libraries(${TARGET_NAME}
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core
${TARGET_LIB}
sdrbase

View File

@ -48,7 +48,6 @@ DOA2::DOA2(DeviceAPI *deviceAPI) :
m_thread(nullptr),
m_basebandSink(nullptr),
m_running(false),
m_guiMessageQueue(nullptr),
m_frequencyOffset(0),
m_deviceSampleRate(48000),
m_deviceCenterFrequency(435000000)
@ -65,7 +64,7 @@ DOA2::DOA2(DeviceAPI *deviceAPI) :
this,
&DOA2::networkManagerFinished
);
startSinks();
DOA2::startSinks();
}
DOA2::~DOA2()
@ -80,7 +79,7 @@ DOA2::~DOA2()
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeMIMOChannel(this);
stopSinks();
DOA2::stopSinks();
}
void DOA2::setDeviceAPI(DeviceAPI *deviceAPI)
@ -203,7 +202,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
reverseAPIKeys.append("squelchdB");
if (m_running) {
m_basebandSink->setMagThreshold(CalcDb::powerFromdB(settings.m_squelchdB));
m_basebandSink->setMagThreshold((float) CalcDb::powerFromdB(settings.m_squelchdB));
}
}
@ -217,7 +216,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
}
if (m_running && ((m_settings.m_log2Decim != settings.m_log2Decim)
|| (m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
|| (m_settings.m_filterChainHash != settings.m_filterChainHash) || force))
{
DOA2Baseband::MsgConfigureChannelizer *msg = DOA2Baseband::MsgConfigureChannelizer::create(
settings.m_log2Decim, settings.m_filterChainHash);
@ -238,7 +237,7 @@ void DOA2::applySettings(const DOA2Settings& settings, bool force)
QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (pipes.size() > 0) {
if (!pipes.empty()) {
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
}
@ -249,7 +248,7 @@ void DOA2::handleInputMessages()
{
Message* message;
while ((message = m_inputMessageQueue.pop()) != 0)
while ((message = m_inputMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message))
{
@ -262,14 +261,14 @@ bool DOA2::handleMessage(const Message& cmd)
{
if (MsgConfigureDOA2::match(cmd))
{
MsgConfigureDOA2& cfg = (MsgConfigureDOA2&) cmd;
auto& cfg = (const MsgConfigureDOA2&) cmd;
qDebug() << "DOA2::handleMessage: MsgConfigureDOA2";
applySettings(cfg.getSettings(), cfg.getForce());
return true;
}
else if (DSPMIMOSignalNotification::match(cmd))
{
DSPMIMOSignalNotification& notif = (DSPMIMOSignalNotification&) cmd;
auto& notif = (const DSPMIMOSignalNotification&) cmd;
qDebug() << "DOA2::handleMessage: DSPMIMOSignalNotification:"
<< " inputSampleRate: " << notif.getSampleRate()
@ -347,7 +346,7 @@ void DOA2::validateFilterChainHash(DOA2Settings& settings)
void DOA2::calculateFrequencyOffset()
{
double shiftFactor = HBFilterChainConverter::getShiftFactor(m_settings.m_log2Decim, m_settings.m_filterChainHash);
m_frequencyOffset = m_deviceSampleRate * shiftFactor;
m_frequencyOffset = (int64_t) (m_deviceSampleRate * shiftFactor);
}
void DOA2::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash)
@ -360,12 +359,12 @@ void DOA2::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash)
m_basebandSink->getInputMessageQueue()->push(msg);
}
float DOA2::getPhi() const
double DOA2::getPhi() const
{
return m_basebandSink ? m_basebandSink->getPhi() : 0.0f;
return m_basebandSink ? m_basebandSink->getPhi() : 0.0;
}
float DOA2::getPositiveDOA() const
double DOA2::getPositiveDOA() const
{
return std::acos(getPhi()/M_PI)*(180/M_PI);
}
@ -469,13 +468,13 @@ void DOA2::webapiUpdateChannelSettings(
settings.m_reverseAPIAddress = *response.getDoa2Settings()->getReverseApiAddress();
}
if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = response.getDoa2Settings()->getReverseApiPort();
settings.m_reverseAPIPort = (uint16_t) response.getDoa2Settings()->getReverseApiPort();
}
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = response.getDoa2Settings()->getReverseApiDeviceIndex();
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getDoa2Settings()->getReverseApiDeviceIndex();
}
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
settings.m_reverseAPIChannelIndex = response.getDoa2Settings()->getReverseApiChannelIndex();
settings.m_reverseAPIChannelIndex = (uint16_t) response.getDoa2Settings()->getReverseApiChannelIndex();
}
if (settings.m_scopeGUI && channelSettingsKeys.contains("scopeConfig")) {
settings.m_scopeGUI->updateFrom(channelSettingsKeys, response.getDoa2Settings()->getScopeConfig());
@ -525,7 +524,7 @@ void DOA2::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response
}
else
{
SWGSDRangel::SWGGLScope *swgGLScope = new SWGSDRangel::SWGGLScope();
auto *swgGLScope = new SWGSDRangel::SWGGLScope();
settings.m_scopeGUI->formatTo(swgGLScope);
response.getDoa2Settings()->setScopeConfig(swgGLScope);
}
@ -539,7 +538,7 @@ void DOA2::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response
}
else
{
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker);
response.getDoa2Settings()->setChannelMarker(swgChannelMarker);
}
@ -553,39 +552,39 @@ void DOA2::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response
}
else
{
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState);
response.getDoa2Settings()->setRollupState(swgRollupState);
}
}
}
void DOA2::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
void DOA2::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const
{
float phi = normalizeAngle(getPhi() * (180/M_PI), 180.0f);
response.getDoa2Report()->setPhi(phi);
double phi = normalizeAngle(getPhi() * (180.0/M_PI), 180.0);
response.getDoa2Report()->setPhi((qint32) phi);
float hwl = 1.5e8 / (m_deviceCenterFrequency + m_frequencyOffset);
float cosTheta = (getPhi()/M_PI) * ((hwl * 1000.0) / m_settings.m_basebandDistance);
float blindAngle = (m_settings.m_basebandDistance > hwl * 1000.0) ?
double hwl = 1.5e8 / (double) (m_deviceCenterFrequency + m_frequencyOffset);
double cosTheta = (getPhi()/M_PI) * ((hwl * 1000.0) / m_settings.m_basebandDistance);
double blindAngle = (m_settings.m_basebandDistance > hwl * 1000.0) ?
std::acos((hwl * 1000.0) / m_settings.m_basebandDistance) * (180/M_PI) :
0;
response.getDoa2Report()->setBlindAngle((int) blindAngle);
float doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180/M_PI);
double doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180.0/M_PI);
qDebug("DOA2::webapiFormatChannelReport: phi: %f cosT: %f DOAngle: %f", getPhi(), cosTheta, doaAngle);
float posAngle = normalizeAngle(m_settings.m_antennaAz - doaAngle, 360.0f); // DOA angles are trigonometric but displayed angles are clockwise
float negAngle = normalizeAngle(m_settings.m_antennaAz + doaAngle, 360.0f);
response.getDoa2Report()->setPosAz(posAngle);
response.getDoa2Report()->setNegAz(negAngle);
double posAngle = normalizeAngle(m_settings.m_antennaAz - doaAngle, 360.0); // DOA angles are trigonometric but displayed angles are clockwise
double negAngle = normalizeAngle(m_settings.m_antennaAz + doaAngle, 360.0);
response.getDoa2Report()->setPosAz((qint32) posAngle);
response.getDoa2Report()->setNegAz((qint32) negAngle);
response.getDoa2Report()->setFftSize(m_fftSize);
int channelSampleRate = m_deviceSampleRate / (1<<m_settings.m_log2Decim);
response.getDoa2Report()->setChannelSampleRate(channelSampleRate);
}
void DOA2::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force)
void DOA2::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
@ -596,8 +595,8 @@ void DOA2::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const
m_networkRequest.setUrl(QUrl(channelSettingsURL));
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QBuffer *buffer = new QBuffer();
buffer->open((QBuffer::ReadWrite));
auto *buffer = new QBuffer();
buffer->open(QBuffer::ReadWrite);
buffer->write(swgChannelSettings->asJson().toUtf8());
buffer->seek(0);
@ -610,9 +609,9 @@ void DOA2::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const
void DOA2::sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const DOA2Settings& settings,
bool force)
bool force) const
{
for (const auto& pipe : pipes)
{
@ -620,7 +619,7 @@ void DOA2::sendChannelSettings(
if (messageQueue)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
this,
@ -634,11 +633,11 @@ void DOA2::sendChannelSettings(
}
void DOA2::webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DOA2Settings& settings,
bool force
)
) const
{
swgChannelSettings->setDirection(2); // MIMO sink
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
@ -677,29 +676,26 @@ void DOA2::webapiFormatChannelSettings(
swgDOA2Settings->setFftAveragingValue(DOA2Settings::getAveragingValue(settings.m_fftAveragingIndex));
}
if (settings.m_scopeGUI)
{
if (channelSettingsKeys.contains("scopeConfig") || force) {
settings.m_scopeGUI->formatTo(swgDOA2Settings->getScopeConfig());
}
if ((settings.m_scopeGUI) && (channelSettingsKeys.contains("scopeConfig") || force)) {
settings.m_scopeGUI->formatTo(swgDOA2Settings->getScopeConfig());
}
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
{
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker);
swgDOA2Settings->setChannelMarker(swgChannelMarker);
}
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
{
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState);
swgDOA2Settings->setRollupState(swgRollupState);
}
}
void DOA2::networkManagerFinished(QNetworkReply *reply)
void DOA2::networkManagerFinished(QNetworkReply *reply) const
{
QNetworkReply::NetworkError replyError = reply->error();
@ -720,7 +716,7 @@ void DOA2::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
float DOA2::normalizeAngle(float angle, float max)
double DOA2::normalizeAngle(double angle, double max)
{
if (angle < 0) { return max + angle; }
if (angle > max) { return angle - max; }

View File

@ -86,76 +86,73 @@ public:
qint64 m_centerFrequency;
};
DOA2(DeviceAPI *deviceAPI);
virtual ~DOA2();
virtual void destroy() { delete this; }
virtual void setDeviceAPI(DeviceAPI *deviceAPI);
virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
explicit DOA2(DeviceAPI *deviceAPI);
~DOA2() final;
void destroy() final { delete this; }
void setDeviceAPI(DeviceAPI *deviceAPI) final;
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; }
virtual void startSinks(); //!< thread start()
virtual void stopSinks(); //!< thread exit() and wait()
virtual void startSources() {}
virtual void stopSources() {}
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex);
virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex);
virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
virtual QString getMIMOName() { return objectName(); }
void startSinks() final; //!< thread start()
void stopSinks() final; //!< thread exit() and wait()
void startSources() final { /* Not for MIMO */ }
void stopSources() final { /* Not for MIMO */ }
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) final;
void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) final;
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); }
QString getMIMOName() final { return objectName(); }
virtual void getIdentifier(QString& id) { id = objectName(); }
virtual QString getIdentifier() const { return objectName(); }
virtual void getTitle(QString& title) { title = "DOA 2 sources"; }
virtual qint64 getCenterFrequency() const { return m_frequencyOffset; }
virtual void setCenterFrequency(qint64) {}
void getIdentifier(QString& id) final { id = objectName(); }
QString getIdentifier() const final { return objectName(); }
void getTitle(QString& title) final { title = "DOA 2 sources"; }
qint64 getCenterFrequency() const final { return m_frequencyOffset; }
void setCenterFrequency(qint64) final { /* Not for MIMO */ }
uint32_t getDeviceSampleRate() const { return m_deviceSampleRate; }
virtual QByteArray serialize() const;
virtual bool deserialize(const QByteArray& data);
QByteArray serialize() const final;
bool deserialize(const QByteArray& data) final;
virtual int getNbSinkStreams() const { return 2; }
virtual int getNbSourceStreams() const { return 0; }
virtual int getStreamIndex() const { return -1; }
int getNbSinkStreams() const final { return 2; }
int getNbSourceStreams() const final { return 0; }
int getStreamIndex() const final { return -1; }
virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final
{
(void) streamIndex;
(void) sinkElseSource;
return m_frequencyOffset;
}
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
ScopeVis *getScopeVis() { return &m_scopeSink; }
void applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash);
float getPhi() const;
float getPositiveDOA() const;
double getPhi() const;
double getPositiveDOA() const;
virtual int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final;
virtual int webapiSettingsPutPatch(
bool force,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
int webapiSettingsPutPatch(
bool force,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final;
virtual int webapiReportGet(
SWGSDRangel::SWGChannelReport& response,
QString& errorMessage);
int webapiReportGet(
SWGSDRangel::SWGChannelReport& response,
QString& errorMessage) final;
virtual int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage);
int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage) final;
static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response,
const DOA2Settings& settings);
static void webapiUpdateChannelSettings(
DOA2Settings& settings,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response);
DOA2Settings& settings,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response);
static const char* const m_channelIdURI;
static const char* const m_channelId;
@ -169,7 +166,6 @@ private:
QMutex m_mutex;
bool m_running;
DOA2Settings m_settings;
MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI
QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest;
@ -177,31 +173,30 @@ private:
int64_t m_frequencyOffset;
uint32_t m_deviceSampleRate;
qint64 m_deviceCenterFrequency;
int m_count0, m_count1;
virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const DOA2Settings& settings, bool force = false);
static void validateFilterChainHash(DOA2Settings& settings);
void calculateFrequencyOffset();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force);
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const;
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const DOA2Settings& settings, bool force);
void sendChannelSettings(
const QList<ObjectPipe*>& pipes,
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
const DOA2Settings& settings,
bool force
);
) const;
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const DOA2Settings& settings,
bool force
);
static float normalizeAngle(float angle, float max);
) const;
static double normalizeAngle(double angle, double max);
private slots:
void handleInputMessages();
void networkManagerFinished(QNetworkReply *reply);
void networkManagerFinished(QNetworkReply *reply) const;
};
#endif // INCLUDE_DOA2_H

View File

@ -73,7 +73,7 @@ public:
private:
DOA2Settings::CorrelationType m_correlationType;
MsgConfigureCorrelation(DOA2Settings::CorrelationType correlationType) :
explicit MsgConfigureCorrelation(DOA2Settings::CorrelationType correlationType) :
Message(),
m_correlationType(correlationType)
{}
@ -103,8 +103,8 @@ public:
{ }
};
DOA2Baseband(int fftSize);
~DOA2Baseband();
explicit DOA2Baseband(int fftSize);
~DOA2Baseband() final;
void reset();
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
@ -114,7 +114,7 @@ public:
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int streamIndex);
void setBasebandSampleRate(unsigned int sampleRate);
float getPhi() const { return m_phi; }
double getPhi() const { return m_phi; }
void setMagThreshold(float threshold) { m_magThreshold = threshold * SDR_RX_SCALED * SDR_RX_SCALED; }
void setFFTAveraging(int nbFFT);
@ -128,9 +128,9 @@ private:
DOA2Settings::CorrelationType m_correlationType;
int m_fftSize;
int m_samplesCount; //!< Number of samples processed by DOA
float m_magSum; //!< Squared magnitudes accumulator
float m_wphSum; //!< Phase difference accumulator (averaging weighted by squared magnitude)
float m_phi; //!< Resulting calculated phase difference
double m_magSum; //!< Squared magnitudes accumulator
double m_wphSum; //!< Phase difference accumulator (averaging weighted by squared magnitude)
double m_phi; //!< Resulting calculated phase difference
double m_magThreshold; //!< Squared magnitude scaled threshold
int m_fftAvg; //!< Average over a certain number of FFTs
int m_fftAvgCount; //!< FFT averaging counter

View File

@ -264,7 +264,7 @@ bool DOA2Correlator::performFFTProd(
m_fft[0]->out() + m_fftSize,
m_dataj,
m_invFFT->in(),
[this](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> {
[](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> {
return (a*b);
}
);

View File

@ -33,15 +33,10 @@
DOA2GUI* DOA2GUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *channelMIMO)
{
DOA2GUI* gui = new DOA2GUI(pluginAPI, deviceUISet, channelMIMO);
auto* gui = new DOA2GUI(pluginAPI, deviceUISet, channelMIMO);
return gui;
}
void DOA2GUI::destroy()
{
delete this;
}
void DOA2GUI::resetToDefaults()
{
m_settings.resetToDefaults();
@ -78,7 +73,7 @@ bool DOA2GUI::handleMessage(const Message& message)
{
if (DOA2::MsgBasebandNotification::match(message))
{
DOA2::MsgBasebandNotification& notif = (DOA2::MsgBasebandNotification&) message;
auto& notif = (const DOA2::MsgBasebandNotification&) message;
m_sampleRate = notif.getSampleRate();
m_centerFrequency = notif.getCenterFrequency();
displayRateAndShift();
@ -88,7 +83,7 @@ bool DOA2GUI::handleMessage(const Message& message)
}
else if (DOA2::MsgConfigureDOA2::match(message))
{
const DOA2::MsgConfigureDOA2& notif = (const DOA2::MsgConfigureDOA2&) message;
auto& notif = (const DOA2::MsgConfigureDOA2&) message;
m_settings = notif.getSettings();
ui->scopeGUI->updateSettings();
m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker));
@ -122,7 +117,7 @@ DOA2GUI::DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *ch
m_doa2 = (DOA2*) channelMIMO;
m_scopeVis = m_doa2->getScopeVis();
m_scopeVis->setGLScope(ui->glScope);
m_doa2->setMessageQueueToGUI(getInputMessageQueue());
m_doa2->setMessageQueueToGUI(DOA2GUI::getInputMessageQueue());
m_sampleRate = m_doa2->getDeviceSampleRate();
ui->glScope->setTraceModulo(DOA2::m_fftSize);
@ -150,7 +145,7 @@ DOA2GUI::DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *ch
ui->scopeGUI->traceLengthChange();
ui->compass->setBlindAngleBorder(true);
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
connect(DOA2GUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
displaySettings();
makeUIConnections();
@ -221,20 +216,20 @@ void DOA2GUI::displaySettings()
void DOA2GUI::displayRateAndShift()
{
int shift = m_shiftFrequencyFactor * m_sampleRate;
auto shift = (int) (m_shiftFrequencyFactor * m_sampleRate);
double channelSampleRate = ((double) m_sampleRate) / (1<<m_settings.m_log2Decim);
QLocale loc;
ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift)));
ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5)));
m_channelMarker.setCenterFrequency(shift);
m_channelMarker.setBandwidth(channelSampleRate);
m_scopeVis->setLiveRate(channelSampleRate);
m_channelMarker.setBandwidth((int) channelSampleRate);
m_scopeVis->setLiveRate((int) channelSampleRate);
}
void DOA2GUI::setFFTAveragingTooltip()
{
float channelSampleRate = ((float) m_sampleRate) / (1<<m_settings.m_log2Decim);
float averagingTime = (DOA2::m_fftSize * DOA2Settings::getAveragingValue(m_settings.m_fftAveragingIndex)) /
float channelSampleRate = ((float) m_sampleRate) / ((float) (1<<m_settings.m_log2Decim));
float averagingTime = ((float) DOA2::m_fftSize * (float) DOA2Settings::getAveragingValue(m_settings.m_fftAveragingIndex)) /
channelSampleRate;
QString s;
setNumberStr(averagingTime, 2, s);
@ -274,7 +269,7 @@ void DOA2GUI::handleSourceMessages()
{
Message* message;
while ((message = getInputMessageQueue()->pop()) != 0)
while ((message = getInputMessageQueue()->pop()) != nullptr)
{
if (handleMessage(*message))
{
@ -283,7 +278,7 @@ void DOA2GUI::handleSourceMessages()
}
}
void DOA2GUI::onWidgetRolled(QWidget* widget, bool rollDown)
void DOA2GUI::onWidgetRolled(const QWidget* widget, bool rollDown)
{
(void) widget;
(void) rollDown;
@ -294,7 +289,7 @@ void DOA2GUI::onWidgetRolled(QWidget* widget, bool rollDown)
void DOA2GUI::onMenuDialogCalled(const QPoint &p)
{
if (m_contextMenuType == ContextMenuChannelSettings)
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings)
{
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
@ -434,7 +429,7 @@ void DOA2GUI::tick()
}
}
void DOA2GUI::makeUIConnections()
void DOA2GUI::makeUIConnections() const
{
QObject::connect(ui->decimationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DOA2GUI::on_decimationFactor_currentIndexChanged);
QObject::connect(ui->position, &QSlider::valueChanged, this, &DOA2GUI::on_position_valueChanged);
@ -449,9 +444,9 @@ void DOA2GUI::makeUIConnections()
void DOA2GUI::updateAbsoluteCenterFrequency()
{
qint64 cf = m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate;
auto cf = (qint64) ((double) m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate);
setStatusFrequency(cf);
m_hwl = 1.5e+8 / cf;
m_hwl = 1.5e+8 / (double) cf;
ui->halfWLText->setText(tr("%1").arg(m_hwl*1000, 5, 'f', 0));
updateScopeFScale();
}
@ -470,14 +465,14 @@ void DOA2GUI::updateScopeFScale()
void DOA2GUI::updateDOA()
{
float cosTheta = (m_doa2->getPhi()/M_PI) * ((m_hwl * 1000.0) / m_settings.m_basebandDistance);
float blindAngle = (m_settings.m_basebandDistance > m_hwl * 1000.0) ?
double cosTheta = (m_doa2->getPhi()/M_PI) * ((m_hwl * 1000.0) / m_settings.m_basebandDistance);
double blindAngle = (m_settings.m_basebandDistance > m_hwl * 1000.0) ?
std::acos((m_hwl * 1000.0) / m_settings.m_basebandDistance) * (180/M_PI) :
0;
ui->compass->setBlindAngle(blindAngle);
float doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180/M_PI);
float posAngle = ui->antAz->value() - doaAngle; // DOA angles are trigonometric but displayed angles are clockwise
float negAngle = ui->antAz->value() + doaAngle;
double doaAngle = std::acos(cosTheta < -1.0 ? -1.0 : cosTheta > 1.0 ? 1.0 : cosTheta) * (180/M_PI);
double posAngle = ui->antAz->value() - doaAngle; // DOA angles are trigonometric but displayed angles are clockwise
double negAngle = ui->antAz->value() + doaAngle;
ui->compass->setAzPos(posAngle);
ui->compass->setAzNeg(negAngle);
ui->posText->setText(tr("%1").arg(ui->compass->getAzPos(), 3, 'f', 0, QLatin1Char('0')));

View File

@ -46,22 +46,21 @@ class DOA2GUI : public ChannelGUI {
public:
static DOA2GUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel);
virtual void destroy();
virtual void resetToDefaults();
virtual QByteArray serialize() const;
virtual bool deserialize(const QByteArray& data);
virtual MessageQueue* getInputMessageQueue();
virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
virtual QString getTitle() const { return m_settings.m_title; };
virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
virtual bool getHidden() const { return m_settings.m_hidden; }
virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
virtual int getStreamIndex() const { return -1; }
virtual void setStreamIndex(int streamIndex) { (void) streamIndex; }
void resetToDefaults() final;
QByteArray serialize() const final;
bool deserialize(const QByteArray& data) final;
MessageQueue* getInputMessageQueue() final;
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; };
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; };
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; };
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; };
QString getTitle() const final { return m_settings.m_title; };
QColor getTitleColor() const final { return m_settings.m_rgbColor; };
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; }
bool getHidden() const final { return m_settings.m_hidden; }
ChannelMarker& getChannelMarker() final { return m_channelMarker; }
int getStreamIndex() const final { return -1; }
void setStreamIndex(int streamIndex) final { (void) streamIndex; }
private:
Ui::DOA2GUI* ui;
@ -82,7 +81,7 @@ private:
double m_hwl; //!< Half wavelength at center frequency
explicit DOA2GUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *rxChannel, QWidget* parent = nullptr);
virtual ~DOA2GUI();
~DOA2GUI() final;
void blockApplySettings(bool block);
void applySettings(bool force = false);
@ -93,13 +92,13 @@ private:
void setFFTAveragingTooltip();
static void setNumberStr(float v, int decimalPlaces, QString& s);
bool handleMessage(const Message& message);
void makeUIConnections();
void makeUIConnections() const;
void updateAbsoluteCenterFrequency();
void updateScopeFScale();
void updateDOA();
void leaveEvent(QEvent*);
void enterEvent(EnterEventType*);
void leaveEvent(QEvent*) final;
void enterEvent(EnterEventType*) final;
private slots:
void handleSourceMessages();
@ -112,7 +111,7 @@ private slots:
void on_squelch_valueChanged(int value);
void on_fftAveraging_currentIndexChanged(int index);
void on_centerPosition_clicked();
void onWidgetRolled(QWidget* widget, bool rollDown);
void onWidgetRolled(const QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void tick();
};

View File

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

View File

@ -44,9 +44,6 @@ private:
int m_dataSize;
int m_bufferSize;
int m_dataStart;
uint32_t m_log2Decim;
uint32_t m_filterChainHash;
};

View File

@ -36,22 +36,28 @@ if (NOT SERVER_MODE)
interferometergui.h
)
set(TARGET_NAME interferometer)
set(TARGET_NAME ${PLUGINS_PREFIX}interferometer)
set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else()
set(TARGET_NAME interferometersrv)
set(TARGET_NAME ${PLUGINSSRV_PREFIX}interferometersrv)
set(TARGET_LIB "")
set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif()
add_library(${TARGET_NAME} SHARED
${interferometer_SOURCES}
)
if(NOT Qt6_FOUND)
add_library(${TARGET_NAME} ${interferometer_SOURCES})
else()
qt_add_plugin(${TARGET_NAME} CLASS_NAME InterferometerPlugin ${interferometer_SOURCES})
endif()
target_link_libraries(${TARGET_NAME}
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core
${TARGET_LIB}
sdrbase

View File

@ -83,7 +83,7 @@ Interferometer::Interferometer(DeviceAPI *deviceAPI) :
&Interferometer::updateDeviceSetList
);
updateDeviceSetList();
startSinks();
Interferometer::startSinks();
}
Interferometer::~Interferometer()
@ -98,7 +98,7 @@ Interferometer::~Interferometer()
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeMIMOChannel(this);
stopSinks();
Interferometer::stopSinks();
}
void Interferometer::setDeviceAPI(DeviceAPI *deviceAPI)
@ -229,7 +229,7 @@ void Interferometer::applySettings(const InterferometerSettings& settings, const
QList<ObjectPipe*> pipes;
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
if (pipes.size() > 0) {
if (!pipes.empty()) {
sendChannelSettings(pipes, settingsKeys, settings, force);
}
@ -254,7 +254,7 @@ void Interferometer::handleInputMessages()
{
Message* message;
while ((message = m_inputMessageQueue.pop()) != 0)
while ((message = m_inputMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message))
{
@ -267,14 +267,14 @@ bool Interferometer::handleMessage(const Message& cmd)
{
if (MsgConfigureInterferometer::match(cmd))
{
MsgConfigureInterferometer& cfg = (MsgConfigureInterferometer&) cmd;
auto& cfg = (const MsgConfigureInterferometer&) cmd;
qDebug() << "Interferometer::handleMessage: MsgConfigureInterferometer";
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true;
}
else if (DSPMIMOSignalNotification::match(cmd))
{
DSPMIMOSignalNotification& notif = (DSPMIMOSignalNotification&) cmd;
auto& notif = (const DSPMIMOSignalNotification&) cmd;
qDebug() << "Interferometer::handleMessage: DSPMIMOSignalNotification:"
<< " inputSampleRate: " << notif.getSampleRate()
@ -355,7 +355,7 @@ void Interferometer::validateFilterChainHash(InterferometerSettings& settings)
void Interferometer::calculateFrequencyOffset(uint32_t log2Decim, uint32_t filterChainHash)
{
double shiftFactor = HBFilterChainConverter::getShiftFactor(log2Decim, filterChainHash);
m_frequencyOffset = m_deviceSampleRate * shiftFactor;
m_frequencyOffset = (int64_t) (m_deviceSampleRate * shiftFactor);
}
void Interferometer::applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash)
@ -383,7 +383,7 @@ void Interferometer::updateDeviceSetList()
if (deviceSourceEngine)
{
DeviceSampleSource *deviceSource = deviceSourceEngine->getSource();
const DeviceSampleSource *deviceSource = deviceSourceEngine->getSource();
if (deviceSource->getDeviceDescription() == "LocalInput") {
m_localInputDeviceIndexes.append(deviceSetIndex);
@ -401,7 +401,7 @@ void Interferometer::updateDeviceSetList()
InterferometerSettings settings = m_settings;
int newIndexInList;
if (m_localInputDeviceIndexes.size() != 0) // there are some local input devices
if (!m_localInputDeviceIndexes.empty()) // there are some local input devices
{
if (m_settings.m_localDeviceIndex < 0) { // not set before
newIndexInList = 0; // set to first device in list
@ -574,13 +574,13 @@ void Interferometer::webapiUpdateChannelSettings(
settings.m_reverseAPIAddress = *response.getInterferometerSettings()->getReverseApiAddress();
}
if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = response.getInterferometerSettings()->getReverseApiPort();
settings.m_reverseAPIPort = (uint16_t) response.getInterferometerSettings()->getReverseApiPort();
}
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = response.getInterferometerSettings()->getReverseApiDeviceIndex();
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getInterferometerSettings()->getReverseApiDeviceIndex();
}
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
settings.m_reverseAPIChannelIndex = response.getInterferometerSettings()->getReverseApiChannelIndex();
settings.m_reverseAPIChannelIndex = (uint16_t) response.getInterferometerSettings()->getReverseApiChannelIndex();
}
if (settings.m_spectrumGUI && channelSettingsKeys.contains("spectrumConfig")) {
settings.m_spectrumGUI->updateFrom(channelSettingsKeys, response.getInterferometerSettings()->getSpectrumConfig());
@ -632,7 +632,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
}
else
{
SWGSDRangel::SWGGLSpectrum *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
auto *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
settings.m_spectrumGUI->formatTo(swgGLSpectrum);
response.getInterferometerSettings()->setSpectrumConfig(swgGLSpectrum);
}
@ -646,7 +646,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
}
else
{
SWGSDRangel::SWGGLScope *swgGLScope = new SWGSDRangel::SWGGLScope();
auto *swgGLScope = new SWGSDRangel::SWGGLScope();
settings.m_scopeGUI->formatTo(swgGLScope);
response.getInterferometerSettings()->setScopeConfig(swgGLScope);
}
@ -660,7 +660,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
}
else
{
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker);
response.getInterferometerSettings()->setChannelMarker(swgChannelMarker);
}
@ -674,7 +674,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
}
else
{
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState);
response.getInterferometerSettings()->setRollupState(swgRollupState);
}
@ -683,7 +683,7 @@ void Interferometer::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings
void Interferometer::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const InterferometerSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
@ -694,8 +694,8 @@ void Interferometer::webapiReverseSendSettings(const QList<QString>& channelSett
m_networkRequest.setUrl(QUrl(channelSettingsURL));
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QBuffer *buffer = new QBuffer();
buffer->open((QBuffer::ReadWrite));
auto *buffer = new QBuffer();
buffer->open(QBuffer::ReadWrite);
buffer->write(swgChannelSettings->asJson().toUtf8());
buffer->seek(0);
@ -710,7 +710,7 @@ void Interferometer::sendChannelSettings(
const QList<ObjectPipe*>& pipes,
const QList<QString>& channelSettingsKeys,
const InterferometerSettings& settings,
bool force)
bool force) const
{
for (const auto& pipe : pipes)
{
@ -718,7 +718,7 @@ void Interferometer::sendChannelSettings(
if (messageQueue)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
this,
@ -736,7 +736,7 @@ void Interferometer::webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const InterferometerSettings& settings,
bool force
)
) const
{
swgChannelSettings->setDirection(2); // MIMO sink
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
@ -774,34 +774,34 @@ void Interferometer::webapiFormatChannelSettings(
if (settings.m_spectrumGUI && (channelSettingsKeys.contains("spectrumConfig") || force))
{
SWGSDRangel::SWGGLSpectrum *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
auto *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
settings.m_spectrumGUI->formatTo(swgGLSpectrum);
swgInterferometerSettings->setSpectrumConfig(swgGLSpectrum);
}
if (settings.m_scopeGUI && (channelSettingsKeys.contains("scopeConfig") || force))
{
SWGSDRangel::SWGGLScope *swgGLScope = new SWGSDRangel::SWGGLScope();
auto *swgGLScope = new SWGSDRangel::SWGGLScope();
settings.m_scopeGUI->formatTo(swgGLScope);
swgInterferometerSettings->setScopeConfig(swgGLScope);
}
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
{
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
settings.m_channelMarker->formatTo(swgChannelMarker);
swgInterferometerSettings->setChannelMarker(swgChannelMarker);
}
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
{
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
settings.m_rollupState->formatTo(swgRollupState);
swgInterferometerSettings->setRollupState(swgRollupState);
}
}
void Interferometer::networkManagerFinished(QNetworkReply *reply)
void Interferometer::networkManagerFinished(QNetworkReply *reply) const
{
QNetworkReply::NetworkError replyError = reply->error();

View File

@ -108,72 +108,69 @@ public:
{ }
};
Interferometer(DeviceAPI *deviceAPI);
virtual ~Interferometer();
virtual void destroy() { delete this; }
virtual void setDeviceAPI(DeviceAPI *deviceAPI);
virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
explicit Interferometer(DeviceAPI *deviceAPI);
~Interferometer() final;
void destroy() final { delete this; }
void setDeviceAPI(DeviceAPI *deviceAPI) final;
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; }
virtual void startSinks(); //!< thread start()
virtual void stopSinks(); //!< thread exit() and wait()
virtual void startSources() {}
virtual void stopSources() {}
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex);
virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex);
virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
virtual QString getMIMOName() { return objectName(); }
void startSinks() final; //!< thread start()
void stopSinks() final; //!< thread exit() and wait()
void startSources() final { /* not for MIMMO*/ }
void stopSources() final { /* not for MIMMO*/ }
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) final;
void pull(SampleVector::iterator& begin, unsigned int nbSamples, unsigned int sourceIndex) final;
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); }
QString getMIMOName() final { return objectName(); }
virtual void getIdentifier(QString& id) { id = objectName(); }
virtual QString getIdentifier() const { return objectName(); }
virtual void getTitle(QString& title) { title = "Interferometer"; }
virtual qint64 getCenterFrequency() const { return m_frequencyOffset; }
virtual void setCenterFrequency(qint64) {}
void getIdentifier(QString& id) final { id = objectName(); }
QString getIdentifier() const final { return objectName(); }
void getTitle(QString& title) final { title = "Interferometer"; }
qint64 getCenterFrequency() const final { return m_frequencyOffset; }
void setCenterFrequency(qint64) final { /* not for MIMMO*/ }
uint32_t getDeviceSampleRate() const { return m_deviceSampleRate; }
virtual QByteArray serialize() const;
virtual bool deserialize(const QByteArray& data);
QByteArray serialize() const final;
bool deserialize(const QByteArray& data) final;
virtual int getNbSinkStreams() const { return 2; }
virtual int getNbSourceStreams() const { return 0; }
virtual int getStreamIndex() const { return -1; }
int getNbSinkStreams() const final { return 2; }
int getNbSourceStreams() const final { return 0; }
int getStreamIndex() const final { return -1; }
virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final
{
(void) streamIndex;
(void) sinkElseSource;
return m_frequencyOffset;
}
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
SpectrumVis *getSpectrumVis() { return &m_spectrumVis; }
ScopeVis *getScopeVis() { return &m_scopeSink; }
void applyChannelSettings(uint32_t log2Decim, uint32_t filterChainHash);
const QList<int>& getDeviceSetList() { return m_localInputDeviceIndexes; }
virtual int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
int webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final;
virtual int webapiSettingsPutPatch(
bool force,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage);
int webapiSettingsPutPatch(
bool force,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage) final;
virtual int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage);
int webapiWorkspaceGet(
SWGSDRangel::SWGWorkspaceInfo& query,
QString& errorMessage) final;
static void webapiFormatChannelSettings(
SWGSDRangel::SWGChannelSettings& response,
const InterferometerSettings& settings);
static void webapiUpdateChannelSettings(
InterferometerSettings& settings,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response);
InterferometerSettings& settings,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response);
static const char* const m_channelIdURI;
static const char* const m_channelId;
@ -196,11 +193,10 @@ private:
uint64_t m_centerFrequency;
int64_t m_frequencyOffset;
uint32_t m_deviceSampleRate;
int m_count0, m_count1;
QList<int> m_localInputDeviceIndexes;
virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
bool handleMessage(const Message& cmd) final; //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const InterferometerSettings& settings, const QList<QString>& settingsKeys, bool force = false);
static void validateFilterChainHash(InterferometerSettings& settings);
void calculateFrequencyOffset(uint32_t log2Decim, uint32_t filterChainHash);
@ -213,17 +209,17 @@ private:
const QList<QString>& channelSettingsKeys,
const InterferometerSettings& settings,
bool force
);
) const;
void webapiFormatChannelSettings(
const QList<QString>& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
const InterferometerSettings& settings,
bool force
);
) const;
private slots:
void handleInputMessages();
void networkManagerFinished(QNetworkReply *reply);
void networkManagerFinished(QNetworkReply *reply) const;
};
#endif // INCLUDE_INTERFEROMETER_H

View File

@ -555,7 +555,7 @@ bool InterferometerCorrelator::performFFTProd(
m_fft2[0]->out() + m_fftSize,
m_dataj,
m_invFFT2->in(),
[this](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> {
[](std::complex<float>& a, const std::complex<float>& b) -> std::complex<float> {
return (a*b);
}
);

View File

@ -32,15 +32,10 @@
InterferometerGUI* InterferometerGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *channelMIMO)
{
InterferometerGUI* gui = new InterferometerGUI(pluginAPI, deviceUISet, channelMIMO);
auto* gui = new InterferometerGUI(pluginAPI, deviceUISet, channelMIMO);
return gui;
}
void InterferometerGUI::destroy()
{
delete this;
}
void InterferometerGUI::resetToDefaults()
{
m_settings.resetToDefaults();
@ -77,7 +72,7 @@ bool InterferometerGUI::handleMessage(const Message& message)
{
if (Interferometer::MsgBasebandNotification::match(message))
{
Interferometer::MsgBasebandNotification& notif = (Interferometer::MsgBasebandNotification&) message;
auto& notif = (const Interferometer::MsgBasebandNotification&) message;
m_sampleRate = notif.getSampleRate();
m_centerFrequency = notif.getCenterFrequency();
displayRateAndShift();
@ -86,7 +81,7 @@ bool InterferometerGUI::handleMessage(const Message& message)
}
else if (Interferometer::MsgConfigureInterferometer::match(message))
{
const Interferometer::MsgConfigureInterferometer& cfg = (const Interferometer::MsgConfigureInterferometer&) message;
auto& cfg = (const Interferometer::MsgConfigureInterferometer&) message;
if (cfg.getForce()) {
m_settings = cfg.getSettings();
@ -102,7 +97,8 @@ bool InterferometerGUI::handleMessage(const Message& message)
}
else if (Interferometer::MsgReportDevices::match(message))
{
Interferometer::MsgReportDevices& report = (Interferometer::MsgReportDevices&) message;
auto& msg = const_cast<Message&>(message);
auto& report = (Interferometer::MsgReportDevices&) msg;
updateDeviceSetList(report.getDeviceSetIndexes());
return true;
}
@ -135,7 +131,7 @@ InterferometerGUI::InterferometerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
m_spectrumVis->setGLSpectrum(ui->glSpectrum);
m_scopeVis = m_interferometer->getScopeVis();
m_scopeVis->setGLScope(ui->glScope);
m_interferometer->setMessageQueueToGUI(getInputMessageQueue());
m_interferometer->setMessageQueueToGUI(InterferometerGUI::getInputMessageQueue());
m_sampleRate = m_interferometer->getDeviceSampleRate();
ui->spectrumGUI->setBuddies(m_spectrumVis, ui->glSpectrum);
@ -175,7 +171,7 @@ InterferometerGUI::InterferometerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUI
m_scopeVis->setTraceChunkSize(Interferometer::m_fftSize); // Set scope trace length unit to FFT size
ui->scopeGUI->traceLengthChange();
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
connect(InterferometerGUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
updateDeviceSetList(m_interferometer->getDeviceSetList());
displaySettings();
@ -243,15 +239,15 @@ void InterferometerGUI::displaySettings()
void InterferometerGUI::displayRateAndShift()
{
int shift = m_shiftFrequencyFactor * m_sampleRate;
auto shift = (int) (m_shiftFrequencyFactor * m_sampleRate);
double channelSampleRate = ((double) m_sampleRate) / (1<<m_settings.m_log2Decim);
QLocale loc;
ui->offsetFrequencyText->setText(tr("%1 Hz").arg(loc.toString(shift)));
ui->channelRateText->setText(tr("%1k").arg(QString::number(channelSampleRate / 1000.0, 'g', 5)));
m_channelMarker.setCenterFrequency(shift);
m_channelMarker.setBandwidth(channelSampleRate);
ui->glSpectrum->setSampleRate(channelSampleRate);
m_scopeVis->setLiveRate(channelSampleRate);
m_channelMarker.setBandwidth((int) channelSampleRate);
ui->glSpectrum->setSampleRate((int) channelSampleRate);
m_scopeVis->setLiveRate((int) channelSampleRate);
}
void InterferometerGUI::leaveEvent(QEvent*)
@ -268,7 +264,7 @@ void InterferometerGUI::handleSourceMessages()
{
Message* message;
while ((message = getInputMessageQueue()->pop()) != 0)
while ((message = getInputMessageQueue()->pop()) != nullptr)
{
if (handleMessage(*message))
{
@ -277,7 +273,7 @@ void InterferometerGUI::handleSourceMessages()
}
}
void InterferometerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void InterferometerGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
{
(void) widget;
(void) rollDown;
@ -288,7 +284,7 @@ void InterferometerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void InterferometerGUI::onMenuDialogCalled(const QPoint &p)
{
if (m_contextMenuType == ContextMenuChannelSettings)
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings)
{
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
@ -330,7 +326,7 @@ void InterferometerGUI::onMenuDialogCalled(const QPoint &p)
void InterferometerGUI::updateDeviceSetList(const QList<int>& deviceSetIndexes)
{
QList<int>::const_iterator it = deviceSetIndexes.begin();
auto it = deviceSetIndexes.begin();
ui->localDevice->blockSignals(true);
@ -343,7 +339,7 @@ void InterferometerGUI::updateDeviceSetList(const QList<int>& deviceSetIndexes)
ui->localDevice->blockSignals(false);
}
int InterferometerGUI::getLocalDeviceIndexInCombo(int localDeviceIndex)
int InterferometerGUI::getLocalDeviceIndexInCombo(int localDeviceIndex) const
{
int index = 0;
@ -457,7 +453,7 @@ void InterferometerGUI::tick()
}
}
void InterferometerGUI::makeUIConnections()
void InterferometerGUI::makeUIConnections() const
{
QObject::connect(ui->decimationFactor, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &InterferometerGUI::on_decimationFactor_currentIndexChanged);
QObject::connect(ui->position, &QSlider::valueChanged, this, &InterferometerGUI::on_position_valueChanged);
@ -472,5 +468,5 @@ void InterferometerGUI::makeUIConnections()
void InterferometerGUI::updateAbsoluteCenterFrequency()
{
setStatusFrequency(m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate);
setStatusFrequency((qint64) ((double) m_centerFrequency + m_shiftFrequencyFactor * m_sampleRate));
}

View File

@ -46,22 +46,21 @@ class InterferometerGUI : public ChannelGUI {
public:
static InterferometerGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *mimoChannel);
virtual void destroy();
virtual void resetToDefaults();
virtual QByteArray serialize() const;
virtual bool deserialize(const QByteArray& data);
virtual MessageQueue* getInputMessageQueue();
virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
virtual QString getTitle() const { return m_settings.m_title; };
virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
virtual bool getHidden() const { return m_settings.m_hidden; }
virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
virtual int getStreamIndex() const { return -1; }
virtual void setStreamIndex(int streamIndex) { (void) streamIndex; }
void resetToDefaults() final;
QByteArray serialize() const final;
bool deserialize(const QByteArray& data) final;
MessageQueue* getInputMessageQueue() final;
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; };
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; };
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; };
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; };
QString getTitle() const final { return m_settings.m_title; };
QColor getTitleColor() const final { return m_settings.m_rgbColor; };
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; }
bool getHidden() const final { return m_settings.m_hidden; }
ChannelMarker& getChannelMarker() final { return m_channelMarker; }
int getStreamIndex() const final { return -1; }
void setStreamIndex(int streamIndex) final { (void) streamIndex; }
private:
Ui::InterferometerGUI* ui;
@ -83,7 +82,7 @@ private:
uint32_t m_tickCount;
explicit InterferometerGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, MIMOChannel *rxChannel, QWidget* parent = nullptr);
virtual ~InterferometerGUI();
~InterferometerGUI() final;
void blockApplySettings(bool block);
void applySettings(bool force = false);
@ -92,13 +91,13 @@ private:
void displaySettings();
void displayRateAndShift();
bool handleMessage(const Message& message);
void makeUIConnections();
void makeUIConnections() const;
void updateAbsoluteCenterFrequency();
void updateDeviceSetList(const QList<int>& deviceSetIndexes);
int getLocalDeviceIndexInCombo(int localDeviceIndex);
int getLocalDeviceIndexInCombo(int localDeviceIndex) const;
void leaveEvent(QEvent*);
void enterEvent(EnterEventType*);
void leaveEvent(QEvent*) final;
void enterEvent(EnterEventType*) final;
private slots:
void handleSourceMessages();
@ -111,7 +110,7 @@ private slots:
void on_correlationType_currentIndexChanged(int index);
void on_localDevice_currentIndexChanged(int index);
void on_localDevicePlay_toggled(bool checked);
void onWidgetRolled(QWidget* widget, bool rollDown);
void onWidgetRolled(const QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void tick();
};

View File

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

View File

@ -44,9 +44,6 @@ private:
int m_dataSize;
int m_bufferSize;
int m_dataStart;
uint32_t m_log2Decim;
uint32_t m_filterChainHash;
};

View File

@ -211,6 +211,26 @@ else()
message(STATUS "Not building wdsprx (ENABLE_CHANNELRX_WDSPRX=${ENABLE_CHANNELRX_WDSPRX} WDSP_SUPPORT=${WDSP_SUPPORT})")
endif()
# need ffmpeg 3.1 that correstonds to
# libavutil 55.27.100
# libavcodec 57.48.101
# libavformat 57.40.101
find_package(FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE)
if (ENABLE_CHANNELRX_DEMODDATV AND FFMPEG_FOUND)
if(WIN32)
add_subdirectory(demoddatv)
else()
if(((AVUTIL_VERSION VERSION_GREATER "55.27.99") AND (AVCODEC_VERSION VERSION_GREATER "57.48.101")) OR FFMPEG_EXTERNAL OR FFMPEG_SKIP_CHECK)
message(STATUS "Include demoddatv")
add_subdirectory(demoddatv)
else()
message(STATUS "FFmpeg too old to compile demoddatv; needs at least avutil: 55.27.100, avcodec/avformat: 57.48.101")
endif()
endif()
else()
message(STATUS "Not building demoddatv (ENABLE_CHANNELRX_DEMODDATV=${ENABLE_CHANNELRX_DEMODDATV} FFMPEG_FOUND=${FFMPEG_FOUND})")
endif()
if(NOT SERVER_MODE)
if (ENABLE_CHANNELRX_HEATMAP)
@ -230,25 +250,4 @@ if(NOT SERVER_MODE)
else()
message(STATUS "Not building demodatv (ENABLE_CHANNELRX_DEMODATV=${ENABLE_CHANNELRX_DEMODATV})")
endif()
# need ffmpeg 3.1 that correstonds to
# libavutil 55.27.100
# libavcodec 57.48.101
# libavformat 57.40.101
find_package(FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE)
if (ENABLE_CHANNELRX_DEMODDATV AND FFMPEG_FOUND)
if(WIN32)
add_subdirectory(demoddatv)
else()
if(((AVUTIL_VERSION VERSION_GREATER "55.27.99") AND (AVCODEC_VERSION VERSION_GREATER "57.48.101")) OR FFMPEG_EXTERNAL OR FFMPEG_SKIP_CHECK)
message(STATUS "Include demoddatv")
add_subdirectory(demoddatv)
else()
message(STATUS "FFmpeg too old to compile demoddatv; needs at least avutil: 55.27.100, avcodec/avformat: 57.48.101")
endif()
endif()
else()
message(STATUS "Not building demoddatv (ENABLE_CHANNELRX_DEMODDATV=${ENABLE_CHANNELRX_DEMODDATV} FFMPEG_FOUND=${FFMPEG_FOUND})")
endif()
endif()

View File

@ -26,14 +26,20 @@ include_directories(
${Boost_INCLUDE_DIRS}
)
set(TARGET_NAME chanalyzer)
set(TARGET_NAME ${PLUGINS_PREFIX}chanalyzer)
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
add_library(${TARGET_NAME} SHARED
${chanalyzer_SOURCES}
)
if(NOT Qt6_FOUND)
add_library(${TARGET_NAME} ${chanalyzer_SOURCES})
else()
qt_add_plugin(${TARGET_NAME} CLASS_NAME ChannelAnalyzerPlugin ${chanalyzer_SOURCES})
endif()
target_link_libraries(${TARGET_NAME}
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core
Qt::Widgets
sdrbase

View File

@ -88,7 +88,7 @@ ChannelAnalyzer::~ChannelAnalyzer()
delete m_networkManager;
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this);
m_deviceAPI->removeChannelSink(this, true);
if (m_basebandSink->isRunning()) {
stop();
@ -103,7 +103,7 @@ void ChannelAnalyzer::setDeviceAPI(DeviceAPI *deviceAPI)
if (deviceAPI != m_deviceAPI)
{
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this);
m_deviceAPI->removeChannelSink(this, false);
m_deviceAPI = deviceAPI;
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);

View File

@ -474,7 +474,7 @@ void ChannelAnalyzerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void ChannelAnalyzerGUI::onMenuDialogCalled(const QPoint& p)
{
if (m_contextMenuType == ContextMenuChannelSettings)
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings)
{
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);

View File

@ -27,7 +27,7 @@
const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = {
ChannelAnalyzer::m_channelId,
QStringLiteral("Channel Analyzer"),
QStringLiteral("7.20.0"),
QStringLiteral("7.22.5"),
QStringLiteral("(c) Edouard Griffiths, F4EXB"),
QStringLiteral("https://github.com/f4exb/sdrangel"),
true,

View File

@ -33,22 +33,28 @@ if(NOT SERVER_MODE)
channelpowergui.h
)
set(TARGET_NAME channelpower)
set(TARGET_NAME ${PLUGINS_PREFIX}channelpower)
set(TARGET_LIB "Qt::Widgets")
set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else()
set(TARGET_NAME channelpowersrv)
set(TARGET_NAME ${PLUGINSSRV_PREFIX}channelpowersrv)
set(TARGET_LIB "")
set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif()
add_library(${TARGET_NAME} SHARED
${channelpower_SOURCES}
)
if(NOT Qt6_FOUND)
add_library(${TARGET_NAME} ${channelpower_SOURCES})
else()
qt_add_plugin(${TARGET_NAME} CLASS_NAME ChannelPowerPlugin ${channelpower_SOURCES})
endif()
target_link_libraries(${TARGET_NAME}
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core
${TARGET_LIB}
sdrbase

View File

@ -49,7 +49,7 @@ ChannelPower::ChannelPower(DeviceAPI *deviceAPI) :
{
setObjectName(m_channelId);
m_basebandSink = new ChannelPowerBaseband(this);
m_basebandSink = new ChannelPowerBaseband();
m_basebandSink->setChannel(this);
m_basebandSink->moveToThread(&m_thread);
@ -84,7 +84,7 @@ ChannelPower::~ChannelPower()
);
delete m_networkManager;
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this);
m_deviceAPI->removeChannelSink(this, true);
if (m_basebandSink->isRunning()) {
stop();
@ -98,7 +98,7 @@ void ChannelPower::setDeviceAPI(DeviceAPI *deviceAPI)
if (deviceAPI != m_deviceAPI)
{
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this);
m_deviceAPI->removeChannelSink(this, false);
m_deviceAPI = deviceAPI;
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);

View File

@ -138,11 +138,6 @@ public:
m_basebandSink->resetMagLevels();
}
/* void setMessageQueueToGUI(MessageQueue* queue) override {
ChannelAPI::setMessageQueueToGUI(queue);
m_basebandSink->setMessageQueueToGUI(queue);
}*/
uint32_t getNumberOfDeviceStreams() const;
static const char * const m_channelIdURI;

View File

@ -25,8 +25,7 @@
MESSAGE_CLASS_DEFINITION(ChannelPowerBaseband::MsgConfigureChannelPowerBaseband, Message)
ChannelPowerBaseband::ChannelPowerBaseband(ChannelPower *channelPower) :
m_sink(channelPower),
ChannelPowerBaseband::ChannelPowerBaseband() :
m_running(false)
{
qDebug("ChannelPowerBaseband::ChannelPowerBaseband");

View File

@ -62,7 +62,7 @@ public:
{ }
};
ChannelPowerBaseband(ChannelPower *channelPower);
ChannelPowerBaseband();
~ChannelPowerBaseband();
void reset();
void startWork();

View File

@ -200,7 +200,7 @@ void ChannelPowerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
void ChannelPowerGUI::onMenuDialogCalled(const QPoint &p)
{
if (m_contextMenuType == ContextMenuChannelSettings)
if (m_contextMenuType == ContextMenuType::ContextMenuChannelSettings)
{
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);

View File

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

View File

@ -20,8 +20,7 @@
#include "channelpowersink.h"
ChannelPowerSink::ChannelPowerSink(ChannelPower *channelPower) :
m_channelPower(channelPower),
ChannelPowerSink::ChannelPowerSink() :
m_channelSampleRate(10000),
m_channelFrequencyOffset(0),
m_lowpassFFT(nullptr),
@ -41,7 +40,6 @@ ChannelPowerSink::~ChannelPowerSink()
void ChannelPowerSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
{
QMutexLocker mutexLocker(&m_mutex);
Complex ci;
for (SampleVector::const_iterator it = begin; it != end; ++it)
{

View File

@ -32,7 +32,7 @@ class ChannelPower;
class ChannelPowerSink : public ChannelSampleSink {
public:
ChannelPowerSink(ChannelPower *channelPower);
ChannelPowerSink();
~ChannelPowerSink();
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
@ -65,7 +65,6 @@ public:
private:
ChannelPower *m_channelPower;
ChannelPowerSettings m_settings;
ChannelAPI *m_channel;
int m_channelSampleRate;

View File

@ -28,7 +28,6 @@ set(adsb_HEADERS
include_directories(
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
${Boost_INCLUDE_DIRS}
)
if(NOT SERVER_MODE)
@ -43,10 +42,11 @@ if(NOT SERVER_MODE)
adsbdemodnotificationdialog.cpp
adsbdemodnotificationdialog.ui
adsbosmtemplateserver.cpp
adsbdemodmap.qrc
adsbdemodicons.qrc
airlinelogos.qrc
flags.qrc
map.qrc
icons.qrc
sideviews.qrc
)
set(adsb_HEADERS
${adsb_HEADERS}
@ -59,27 +59,34 @@ if(NOT SERVER_MODE)
osndb.h
)
set(TARGET_NAME demodadsb)
set(TARGET_LIB Qt::Widgets Qt::Quick Qt::QuickWidgets Qt::Positioning Qt::Location Qt::TextToSpeech)
set(TARGET_NAME ${PLUGINS_PREFIX}demodadsb)
set(TARGET_LIB Qt::Widgets Qt::Quick Qt::QuickWidgets Qt::Positioning Qt::Charts)
if(Qt${QT_DEFAULT_MAJOR_VERSION}Location_FOUND)
list(APPEND TARGET_LIB Qt::Location)
endif()
if(Qt${QT_DEFAULT_MAJOR_VERSION}TextToSpeech_FOUND)
list(APPEND TARGET_LIB Qt::TextToSpeech)
endif()
set(TARGET_LIB_GUI "sdrgui")
set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
else()
set(TARGET_NAME demodadsbsrv)
set(TARGET_NAME ${PLUGINSSRV_PREFIX}demodadsbsrv)
set(TARGET_LIB "")
set(TARGET_LIB_GUI "")
set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
endif()
add_library(${TARGET_NAME} SHARED
${adsb_SOURCES}
)
if (NOT WIN32)
link_directories(${Boost_LIBRARY_DIRS})
if(NOT Qt6_FOUND)
add_library(${TARGET_NAME} ${adsb_SOURCES})
else()
qt_add_plugin(${TARGET_NAME} CLASS_NAME ADSBPlugin ${adsb_SOURCES})
endif()
target_link_libraries(${TARGET_NAME}
Boost::disable_autolinking
if(NOT BUILD_SHARED_LIBS)
set_property(GLOBAL APPEND PROPERTY STATIC_PLUGINS_PROPERTY ${TARGET_NAME})
endif()
target_link_libraries(${TARGET_NAME} PRIVATE
Qt::Core
${TARGET_LIB}
sdrbase

View File

@ -17,10 +17,6 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#define BOOST_CHRONO_HEADER_ONLY
#include <boost/chrono/chrono.hpp>
#include <stdio.h>
#include <complex.h>
#include <QTime>
@ -49,6 +45,7 @@
MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgConfigureADSBDemod, Message)
MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgAircraftReport, Message)
MESSAGE_CLASS_DEFINITION(ADSBDemod::MsgResetStats, Message)
const char* const ADSBDemod::m_channelIdURI = "sdrangel.channel.adsbdemod";
const char* const ADSBDemod::m_channelId = "ADSBDemod";
@ -71,7 +68,7 @@ ADSBDemod::ADSBDemod(DeviceAPI *devieAPI) :
m_worker = new ADSBDemodWorker();
m_basebandSink->setMessageQueueToWorker(m_worker->getInputMessageQueue());
applySettings(m_settings, true);
applySettings(m_settings, QStringList(), true);
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -104,9 +101,9 @@ ADSBDemod::~ADSBDemod()
);
delete m_networkManager;
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this);
m_deviceAPI->removeChannelSink(this, true);
delete m_basebandSink; // This results in a call to ADSBDemod::stop(), so need to delete before worker and thread
delete m_worker;
delete m_basebandSink;
delete m_thread;
}
@ -115,7 +112,7 @@ void ADSBDemod::setDeviceAPI(DeviceAPI *deviceAPI)
if (deviceAPI != m_deviceAPI)
{
m_deviceAPI->removeChannelSinkAPI(this);
m_deviceAPI->removeChannelSink(this);
m_deviceAPI->removeChannelSink(this, false);
m_deviceAPI = deviceAPI;
m_deviceAPI->addChannelSink(this);
m_deviceAPI->addChannelSinkAPI(this);
@ -147,7 +144,7 @@ void ADSBDemod::start()
m_basebandSink->startWork();
m_thread->start();
ADSBDemodWorker::MsgConfigureADSBDemodWorker *msg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(m_settings, true);
ADSBDemodWorker::MsgConfigureADSBDemodWorker *msg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(m_settings, QStringList(), true);
m_worker->getInputMessageQueue()->push(msg);
}
@ -157,7 +154,9 @@ void ADSBDemod::stop()
m_basebandSink->stopWork();
m_worker->stopWork();
m_thread->exit();
#ifndef __EMSCRIPTEN__
m_thread->wait();
#endif
}
bool ADSBDemod::handleMessage(const Message& cmd)
@ -167,7 +166,7 @@ bool ADSBDemod::handleMessage(const Message& cmd)
MsgConfigureADSBDemod& cfg = (MsgConfigureADSBDemod&) cmd;
qDebug() << "ADSBDemod::handleMessage: MsgConfigureADSBDemod";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true;
}
@ -192,118 +191,25 @@ bool ADSBDemod::handleMessage(const Message& cmd)
m_aircraftReport = msg.getReport();
return true;
}
else if (MsgResetStats::match(cmd))
{
MsgResetStats& msg = (MsgResetStats&) cmd;
MsgResetStats* rep = new MsgResetStats(msg);
m_basebandSink->getInputMessageQueue()->push(rep);
return true;
}
else
{
return false;
}
}
void ADSBDemod::applySettings(const ADSBDemodSettings& settings, bool force)
void ADSBDemod::applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
qDebug() << "ADSBDemod::applySettings:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_streamIndex: " << settings.m_streamIndex
<< " m_useReverseAPI: " << settings.m_useReverseAPI
<< " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
<< " m_reverseAPIPort: " << settings.m_reverseAPIPort
<< " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex
<< " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex
<< settings.getDebugString(settingsKeys, force)
<< " force: " << force;
QList<QString> reverseAPIKeys;
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) {
reverseAPIKeys.append("inputFrequencyOffset");
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if ((settings.m_correlationThreshold != m_settings.m_correlationThreshold) || force) {
reverseAPIKeys.append("correlationThreshold");
}
if ((settings.m_samplesPerBit != m_settings.m_samplesPerBit) || force) {
reverseAPIKeys.append("samplesPerBit");
}
if ((settings.m_correlateFullPreamble != m_settings.m_correlateFullPreamble) || force) {
reverseAPIKeys.append("correlateFullPreamble");
}
if ((settings.m_demodModeS != m_settings.m_demodModeS) || force) {
reverseAPIKeys.append("demodModeS");
}
if ((settings.m_interpolatorPhaseSteps != m_settings.m_interpolatorPhaseSteps) || force) {
reverseAPIKeys.append("interpolatorPhaseSteps");
}
if ((settings.m_interpolatorTapsPerPhase != m_settings.m_interpolatorTapsPerPhase) || force) {
reverseAPIKeys.append("interpolatorTapsPerPhase");
}
if ((settings.m_removeTimeout != m_settings.m_removeTimeout) || force) {
reverseAPIKeys.append("removeTimeout");
}
if ((settings.m_feedEnabled != m_settings.m_feedEnabled) || force) {
reverseAPIKeys.append("feedEnabled");
}
if ((settings.m_exportClientEnabled != m_settings.m_exportClientEnabled) || force) {
reverseAPIKeys.append("exportClientEnabled");
}
if ((settings.m_exportClientHost != m_settings.m_exportClientHost) || force) {
reverseAPIKeys.append("exportClientHost");
}
if ((settings.m_exportClientPort != m_settings.m_exportClientPort) || force) {
reverseAPIKeys.append("exportClientPort");
}
if ((settings.m_exportClientFormat != m_settings.m_exportClientFormat) || force) {
reverseAPIKeys.append("exportClientFormat");
}
if ((settings.m_exportServerEnabled != m_settings.m_exportServerEnabled) || force) {
reverseAPIKeys.append("exportServerEnabled");
}
if ((settings.m_exportServerPort != m_settings.m_exportServerPort) || force) {
reverseAPIKeys.append("exportServerPort");
}
if ((settings.m_importEnabled != m_settings.m_importEnabled) || force) {
reverseAPIKeys.append("importEnabled");
}
if ((settings.m_importHost != m_settings.m_importHost) || force) {
reverseAPIKeys.append("importHost");
}
if ((settings.m_importUsername != m_settings.m_importUsername) || force) {
reverseAPIKeys.append("importUsername");
}
if ((settings.m_importPassword != m_settings.m_importPassword) || force) {
reverseAPIKeys.append("importPassword");
}
if ((settings.m_importParameters != m_settings.m_importParameters) || force) {
reverseAPIKeys.append("importParameters");
}
if ((settings.m_importPeriod != m_settings.m_importPeriod) || force) {
reverseAPIKeys.append("importPeriod");
}
if ((settings.m_importMinLatitude != m_settings.m_importMinLatitude) || force) {
reverseAPIKeys.append("importMinLatitude");
}
if ((settings.m_importMaxLatitude != m_settings.m_importMaxLatitude) || force) {
reverseAPIKeys.append("importMaxLatitude");
}
if ((settings.m_importMinLongitude != m_settings.m_importMinLongitude) || force) {
reverseAPIKeys.append("importMinLongitude");
}
if ((settings.m_importMaxLongitude != m_settings.m_importMaxLongitude) || force) {
reverseAPIKeys.append("importMaxLongitude");
}
if ((settings.m_logFilename != m_settings.m_logFilename) || force) {
reverseAPIKeys.append("logFilename");
}
if ((settings.m_logEnabled != m_settings.m_logEnabled) || force) {
reverseAPIKeys.append("logEnabled");
}
if ((settings.m_title != m_settings.m_title) || force) {
reverseAPIKeys.append("title");
}
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) {
reverseAPIKeys.append("rfBandwidth");
}
if (m_settings.m_streamIndex != settings.m_streamIndex)
{
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
@ -315,38 +221,40 @@ void ADSBDemod::applySettings(const ADSBDemodSettings& settings, bool force)
m_settings.m_streamIndex = settings.m_streamIndex; // make sure ChannelAPI::getStreamIndex() is consistent
emit streamIndexChanged(settings.m_streamIndex);
}
reverseAPIKeys.append("streamIndex");
}
ADSBDemodBaseband::MsgConfigureADSBDemodBaseband *msg = ADSBDemodBaseband::MsgConfigureADSBDemodBaseband::create(settings, force);
ADSBDemodBaseband::MsgConfigureADSBDemodBaseband *msg = ADSBDemodBaseband::MsgConfigureADSBDemodBaseband::create(settings, settingsKeys, force);
m_basebandSink->getInputMessageQueue()->push(msg);
ADSBDemodWorker::MsgConfigureADSBDemodWorker *workerMsg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(settings, force);
ADSBDemodWorker::MsgConfigureADSBDemodWorker *workerMsg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(settings, settingsKeys, force);
m_worker->getInputMessageQueue()->push(workerMsg);
if (settings.m_useReverseAPI)
{
bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
(m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
(m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
(m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) ||
(m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex);
webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force);
bool fullUpdate = (settingsKeys.contains("useReverseAPI") && settings.m_useReverseAPI) ||
settingsKeys.contains("reverseAPIAddress") ||
settingsKeys.contains("reverseAPIPort") ||
settingsKeys.contains("reverseAPIDeviceIndex") ||
settingsKeys.contains("reverseAPIChannelIndex");
webapiReverseSendSettings(settingsKeys, settings, fullUpdate || force);
}
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
void ADSBDemod::setCenterFrequency(qint64 frequency)
{
ADSBDemodSettings settings = m_settings;
settings.m_inputFrequencyOffset = frequency;
applySettings(settings);
applySettings(settings, {"inputFrequencyOffset"}, false);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, false);
MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, {"inputFrequencyOffset"}, false);
m_guiMessageQueue->push(msgToGUI);
}
}
@ -366,7 +274,7 @@ bool ADSBDemod::deserialize(const QByteArray& data)
success = false;
}
MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(m_settings, true);
MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(m_settings, QStringList(), true);
m_inputMessageQueue.push(msg);
return success;
@ -402,12 +310,12 @@ int ADSBDemod::webapiSettingsPutPatch(
ADSBDemodSettings settings = m_settings;
webapiUpdateChannelSettings(settings, channelSettingsKeys, response);
MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(settings, force);
MsgConfigureADSBDemod *msg = MsgConfigureADSBDemod::create(settings, channelSettingsKeys, force);
m_inputMessageQueue.push(msg);
if (m_guiMessageQueue) // forward to GUI if any
{
MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, force);
MsgConfigureADSBDemod *msgToGUI = MsgConfigureADSBDemod::create(settings, channelSettingsKeys, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -433,9 +341,6 @@ void ADSBDemod::webapiUpdateChannelSettings(
if (channelSettingsKeys.contains("samplesPerBit")) {
settings.m_samplesPerBit = response.getAdsbDemodSettings()->getSamplesPerBit();
}
if (channelSettingsKeys.contains("correlateFullPreamble")) {
settings.m_correlateFullPreamble = response.getAdsbDemodSettings()->getCorrelateFullPreamble() != 0;
}
if (channelSettingsKeys.contains("demodModeS")) {
settings.m_demodModeS = response.getAdsbDemodSettings()->getDemodModeS() != 0;
}
@ -554,7 +459,6 @@ void ADSBDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& res
response.getAdsbDemodSettings()->setRfBandwidth(settings.m_rfBandwidth);
response.getAdsbDemodSettings()->setCorrelationThreshold(settings.m_correlationThreshold);
response.getAdsbDemodSettings()->setSamplesPerBit(settings.m_samplesPerBit);
response.getAdsbDemodSettings()->setCorrelateFullPreamble(settings.m_correlateFullPreamble ? 1 : 0);
response.getAdsbDemodSettings()->setDemodModeS(settings.m_demodModeS ? 1 : 0);
response.getAdsbDemodSettings()->setInterpolatorPhaseSteps(settings.m_interpolatorPhaseSteps);
response.getAdsbDemodSettings()->setInterpolatorTapsPerPhase(settings.m_interpolatorTapsPerPhase);
@ -659,7 +563,7 @@ void ADSBDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respons
}
}
void ADSBDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force)
void ADSBDemod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force)
{
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
swgChannelSettings->setDirection(0); // single sink (Rx)
@ -683,9 +587,6 @@ void ADSBDemod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, c
if (channelSettingsKeys.contains("samplesPerBit") || force) {
swgADSBDemodSettings->setSamplesPerBit(settings.m_samplesPerBit);
}
if (channelSettingsKeys.contains("correlateFullPreamble") || force) {
swgADSBDemodSettings->setCorrelateFullPreamble(settings.m_correlateFullPreamble ? 1 : 0);
}
if (channelSettingsKeys.contains("demodModeS") || force) {
swgADSBDemodSettings->setDemodModeS(settings.m_demodModeS ? 1 : 0);
}

View File

@ -20,8 +20,6 @@
#ifndef INCLUDE_ADSBDEMOD_H
#define INCLUDE_ADSBDEMOD_H
#include <vector>
#include <QNetworkRequest>
#include "dsp/basebandsamplesink.h"
@ -44,20 +42,23 @@ public:
public:
const ADSBDemodSettings& getSettings() const { return m_settings; }
const QStringList& getSettingsKeys() const { return m_settingsKeys; }
bool getForce() const { return m_force; }
static MsgConfigureADSBDemod* create(const ADSBDemodSettings& settings, bool force)
static MsgConfigureADSBDemod* create(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
return new MsgConfigureADSBDemod(settings, force);
return new MsgConfigureADSBDemod(settings, settingsKeys, force);
}
private:
ADSBDemodSettings m_settings;
QStringList m_settingsKeys;
bool m_force;
MsgConfigureADSBDemod(const ADSBDemodSettings& settings, bool force) :
MsgConfigureADSBDemod(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force) :
Message(),
m_settings(settings),
m_settingsKeys(settingsKeys),
m_force(force)
{ }
};
@ -91,6 +92,21 @@ public:
{ }
};
class MsgResetStats : public Message {
MESSAGE_CLASS_DECLARATION
public:
static MsgResetStats* create()
{
return new MsgResetStats();
}
private:
MsgResetStats() :
Message()
{ }
};
ADSBDemod(DeviceAPI *deviceAPI);
virtual ~ADSBDemod();
virtual void destroy() { delete this; }
@ -152,7 +168,7 @@ public:
SWGSDRangel::SWGChannelSettings& response);
void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_basebandSink->getMagSqLevels(avg, peak, nbSamples); }
void setMessageQueueToGUI(MessageQueue* queue) override {
void setMessageQueueToGUI(MessageQueue* queue) final {
ChannelAPI::setMessageQueueToGUI(queue);
m_basebandSink->setMessageQueueToGUI(queue);
}
@ -184,9 +200,9 @@ private:
QNetworkRequest m_networkRequest;
virtual bool handleMessage(const Message& cmd); //!< Processing of a message. Returns true if message has actually been processed
void applySettings(const ADSBDemodSettings& settings, bool force = false);
void applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force = false);
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force);
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const ADSBDemodSettings& settings, bool force);
private slots:
void networkManagerFinished(QNetworkReply *reply);

View File

@ -23,6 +23,7 @@
#include "dsp/downchannelizer.h"
#include "adsbdemodbaseband.h"
#include "adsbdemod.h"
#include "adsb.h"
MESSAGE_CLASS_DEFINITION(ADSBDemodBaseband::MsgConfigureADSBDemodBaseband, Message)
@ -117,7 +118,7 @@ bool ADSBDemodBaseband::handleMessage(const Message& cmd)
MsgConfigureADSBDemodBaseband& cfg = (MsgConfigureADSBDemodBaseband&) cmd;
qDebug() << "ADSBDemodBaseband::handleMessage: MsgConfigureADSBDemodBaseband";
applySettings(cfg.getSettings(), cfg.getForce());
applySettings(cfg.getSettings(), cfg.getSettingsKeys(), cfg.getForce());
return true;
}
@ -132,25 +133,35 @@ bool ADSBDemodBaseband::handleMessage(const Message& cmd)
return true;
}
else if (ADSBDemod::MsgResetStats::match(cmd))
{
m_sink.resetStats();
return true;
}
else
{
return false;
}
}
void ADSBDemodBaseband::applySettings(const ADSBDemodSettings& settings, bool force)
void ADSBDemodBaseband::applySettings(const ADSBDemodSettings& settings, const QStringList& settingsKeys, bool force)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)
|| (settings.m_samplesPerBit != m_settings.m_samplesPerBit) || force)
if ( (settingsKeys.contains("inputFrequencyOffset") && (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset))
|| (settingsKeys.contains("samplesPerBit") && (settings.m_samplesPerBit != m_settings.m_samplesPerBit))
|| force)
{
int requestedRate = ADS_B_BITS_PER_SECOND * settings.m_samplesPerBit;
m_channelizer->setChannelization(requestedRate, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
m_sink.applySettings(settings, force);
m_sink.applySettings(settings, settingsKeys, force);
m_settings = settings;
if (force) {
m_settings = settings;
} else {
m_settings.applySettings(settingsKeys, settings);
}
}
int ADSBDemodBaseband::getChannelSampleRate() const

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