Improve PlutoSDR device identity handling to correctly distinguish
multiple libiio backends (IP, USB, etc.) and provide stable grouping
of physically identical hardware in the UI.
- Append backend prefix to scanned device serials to ensure uniqueness
across multiple discovery paths (e.g. "<serial>_ip", "<serial>_usb").
This prevents collisions when the same device is visible through
different transports.
- Add physical serial extraction and grouping logic so that devices
discovered via multiple backends are treated as a single physical
unit for display purposes. This stabilizes UI numbering and avoids
duplicate entries for the same hardware.
- Update enumOriginDevices() to:
- group devices by physical serial rather than scan index
- assign stable per-device indices independent of backend enumeration
- include backend label in the display name to distinguish connection
paths when multiple backends are active
- Introduce helper utilities:
- createBackendSuffix(): extract backend identifier from libiio URI
- getPhysicalSerial(): strip backend suffix for grouping logic
- getBackendLabel(): format backend suffix for user-facing display
These changes ensure:
- unique internal identifiers per backend connection
- consistent grouping per physical device across discovery mechanisms
- improved UI clarity when multiple access paths exist for the same SDR
No change to RF/data path behavior; this is purely a discovery and
presentation-layer refactor.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Convert tab-based indentation to spaces to match the project's
existing coding style. No functional changes.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Fix multiple issues preventing SoapySDR output from producing RF:
- handleInputMessages() never called in DSP engine thread (Qt signal
lost without event loop) - scheduled properly
- setGain() moved to start() post-activation (pre-activation gain
silently fails on SoapyUHD)
- fullScale threshold corrected for CS16 format detection
- Timed first write pattern matching gr4-lora SoapySink
MCR pinning for SoapyUHD: inject auto_tick_rate=0 in
DeviceSoapySDR device-open path to prevent UHD from re-deriving the
master clock rate on set_tx_rate(), which breaks the decimator chain
and produces no RF. Also reads SDRANGEL_USRP_MASTER_CLOCK_RATE_HZ env
var for optional MCR override.
TX diagnostic counters: SoapySDROutputThread tracks packets,
underflows, errors. Exposed via REST as streamSettingsArgs
key-value pairs.
Ettus B210 has a maximum sampling rate of 61.44MSPS. Exceeding this limit results in unexpected behavior. Prevent this from occurring by decreasing the maximum sample rate by from 61.444MSP to 61.44MSP (-4k).
Fixes#681.
Relying on memory allocated by `std::vector` via direct pointers is dangerous,
as vectors may move buffers during resize. This fix puts the `DeviceScan`
allocation into a `str::shared_ptr`, which 1) allocates the memory on heap and
2) keeps track of the memory through reference counting. Thus it is safe to
store the `shared_ptr` across different vectors/maps.
Add LO offset support.
Only set tx/rx_bandwidth after getting tx stream, to reduce TX LO leakage for <10MHz bandwidths.
Check for reference and LO lock before getting streams.
Set bit size to be 16 for interpolators and decimators.
Match buffer size to UHD.
Don't destroy TX stream, as there appears to be a bug when recreating it.
Catch exception when checking for TX underflow.
Increase RX FIFO size, to reduce overflows at high sample rates.
Allow RX to continue streaming after receiving timeout.