feat: Pluto/AD936x SDR backend (discovery, RX, VHF band plan)

Add ADALM-Pluto / AD9361 support as a second hardware backend alongside
openHPSDR, sharing the WDSP DSP pipeline and the existing controller API
(UI stays decoupled from logic).

- RadioBackend.pas: abstract TRadioBackend + TBackendCaps + TRadioDevice
  (Kind/URI/Serial). THPSDRNetwork now derives from it (state via virtual
  getters); TRadioController.FNetwork is the base type.
- IIOBindings.pas: dynamic libiio loader (runs without libiio present).
- PlutoBackend.pas: scan/probe-by-URI, connect, LO/rate/bandwidth/gain
  control, RX streaming thread (int16->24bit BE -> OnDDCIQ), Q conjugated
  to match WDSP IQ convention. Verified on LibreSDR (AD9361) over network.
- Unified discovery: TDiscoverThread scans both backends; network Plutos
  found via direct ProbeURI (no mDNS needed). ConnectDevice dispatches by
  Dev.Kind (EnsureBackend swaps backend, preserving callbacks).
- DeviceStore/DeviceForm: persist Kind/URI/Serial; save Pluto via
  AddSavedPluto so saved/autostart devices reconnect across restarts.
- VHF/UHF band plan (BoardUtils, kind-aware): 6m..ADS-B for Pluto; fixes
  HF clamps (band detect, mouse-wheel 60 MHz cap, freq-display max).
- SampleRateOverlay: configurable presets (Pluto 576k..5760k, >520 ksps),
  auto-width to fit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 18:55:20 +03:00
co-authored by Claude Opus 4.8
parent 0d82d1d8e6
commit a988849d3e
13 changed files with 1940 additions and 164 deletions
+16 -29
View File
@@ -17,36 +17,23 @@
<UseVersionInfo Value="True"/>
<AutoIncrementBuild Value="True"/>
<MinorVersionNr Value="9"/>
<BuildNr Value="192"/>
<BuildNr Value="202"/>
</VersionInfo>
<MacroValues Count="27">
<Macro1 Name="LCLWidgetType" Value="cocoa"/>
<Macro2 Name="LCLWidgetType" Value="cocoa"/>
<Macro3 Name="LCLWidgetType" Value="cocoa"/>
<Macro4 Name="LCLWidgetType" Value="cocoa"/>
<Macro5 Name="LCLWidgetType" Value="cocoa"/>
<Macro6 Name="LCLWidgetType" Value="cocoa"/>
<Macro7 Name="LCLWidgetType" Value="cocoa"/>
<Macro8 Name="LCLWidgetType" Value="cocoa"/>
<Macro9 Name="LCLWidgetType" Value="cocoa"/>
<Macro10 Name="LCLWidgetType" Value="cocoa"/>
<Macro11 Name="LCLWidgetType" Value="cocoa"/>
<Macro12 Name="LCLWidgetType" Value="cocoa"/>
<Macro13 Name="LCLWidgetType" Value="cocoa"/>
<Macro14 Name="LCLWidgetType" Value="cocoa"/>
<Macro15 Name="LCLWidgetType" Value="cocoa"/>
<Macro16 Name="LCLWidgetType" Value="cocoa"/>
<Macro17 Name="LCLWidgetType" Value="cocoa"/>
<Macro18 Name="LCLWidgetType" Value="cocoa"/>
<Macro19 Name="LCLWidgetType" Value="cocoa"/>
<Macro20 Name="LCLWidgetType" Value="cocoa"/>
<Macro21 Name="LCLWidgetType" Value="cocoa"/>
<Macro22 Name="LCLWidgetType" Value="cocoa"/>
<Macro23 Name="LCLWidgetType" Value="cocoa"/>
<Macro24 Name="LCLWidgetType" Value="cocoa"/>
<Macro25 Name="LCLWidgetType" Value="cocoa"/>
<Macro26 Name="LCLWidgetType" Value="cocoa"/>
<Macro27 Name="LCLWidgetType" Value="cocoa"/>
<MacroValues Count="14">
<Macro1 Name="LCLWidgetType" Value="qt6"/>
<Macro2 Name="LCLWidgetType" Value="qt6"/>
<Macro3 Name="LCLWidgetType" Value="qt6"/>
<Macro4 Name="LCLWidgetType" Value="qt6"/>
<Macro5 Name="LCLWidgetType" Value="qt6"/>
<Macro6 Name="LCLWidgetType" Value="qt6"/>
<Macro7 Name="LCLWidgetType" Value="qt6"/>
<Macro8 Name="LCLWidgetType" Value="qt6"/>
<Macro9 Name="LCLWidgetType" Value="qt6"/>
<Macro10 Name="LCLWidgetType" Value="qt6"/>
<Macro11 Name="LCLWidgetType" Value="qt6"/>
<Macro12 Name="LCLWidgetType" Value="qt6"/>
<Macro13 Name="LCLWidgetType" Value="qt6"/>
<Macro14 Name="LCLWidgetType" Value="qt6"/>
</MacroValues>
<BuildModes>
<Item Name="Debug" Default="True"/>