Releases: oe5sos/Longpath
Release list
Longpath 0.6.0
Windows build withdrawn (2026-08-31). The Windows installer and
portable ZIP have been removed from this release — they were only
ever tested on macOS before publishing. Use the macOS or Linux
artifacts below until a tested Windows build is re-published.
Added
-
Phase 3F multi-pan + multi-slice foundation (8 sub-epics, ~110 commits stacked on a single PR per single-PR strategy).
-
Sub-Epic A: SliceModel per-band persistence schema (sliceLetter, chainIndex, ddcIndex, sampleRateHz per-band, diversityEnabled, widebandExtensionRequested, psPaused), BoardCapabilities maxSlices + widebandAdcs per SKU, RadioModel::maxSlices accessor, AppSettings schema v5 to v6 migration, DdcAssignment shared struct.
-
Sub-Epic B: 5-slice codec chain (CodecContext SliceConfig array, IP1Codec + IP2Codec applyDdcAssignment, per-codec Thetis-faithful DDC topology including HL2 mi0bot PS rate carveout, AlexController per-ADC BPF state machine with BpfMode enum (Auto/ForceBand/ForceBypass) + BpfEffective enum (Filtered/Bypass/WidebandLocked) + recomputeBpf event matrix).
-
Sub-Epic C: TxSliceArbiter (single-TX invariant, RF-safe MOX-drop handoff, per-MAC TxBoundSliceIndex persistence) + RadioModel addSliceOnPan/removeSlice + VfoWidget TX badge click handler + MainWindow status-bar feedback + deprecated setSplit cleanup.
-
Sub-Epic D: PanadapterStack (5 layout templates: 1/2v/2h/12h/2x2) + PanadapterApplet + FFTRouter (receiver to pan fan-out) + PanFloatingWindow (multi-monitor detach) + PanLayoutDialog visual picker + +PAN bottom-bar dropdown + View menu shortcuts (Ctrl+L, Ctrl+R) + CH 0 / CH 1 BPF indicators + layout state persistence + disconnect-before-removal helper.
-
Sub-Epic E: SpectrumStatusOverlay per-pan badge (slice letter, freq, mode, CH, TX/WIDE/DIV/PS HOLD pills) + VfoWidget right-click context menu (TX/Antenna/Rate/Diversity/Filter/Remove) + FilterPolicyDialog (per-chain BPF override) + AntennaPickerMenu integration into VfoWidget right-click context menu (chain-consequence hints) + AntennaSwitchToast trigger via RadioModel::antennaAutoSwitched signal with Tools menu test entry + TxBoundConfirmDialog trigger via RadioModel signal with Tools menu test entry + HardwareDdcRoutingPage per-DDC override table (7 rows, per-MAC persistence) + Antenna Conflict Policy radio group on existing Antenna Control tab.
-
Sub-Epic F: P2 wideband data path end-to-end (P2 wideband packet decode at UDP ports 1027-1034 -> WidebandFrameAccumulator -> WidebandFftEngine 16384-pt FFTW r2c -> SpectrumWidget setWidebandBins) + CmdGeneral byte 23 wb_enable wiring per Thetis network.c:879 + SpectrumWidget extendedMode state with zoom auto-derive + click-in-wing retunes DDC, click-in-island retunes slice + per-pan Extended view right-click toggle + wideband-extension-requested auto-bypasses Alex BPF.
-
Sub-Epic G (8/25 plan tasks shipped): RxChannel WDSP setExtDivRun/Nr/Output/Rotate wrappers + SliceModel per-band diversity persistence (phase/gain/fine-null) + Slice-A WDSP wire from SliceModel signals + DiversityRadarWidget (custom QPainter polar sensitivity pattern, CalcVrms port from Thetis) + DiversityDialog (Tools > Diversity..., Ctrl+Shift+D) embeds DiversityRadarWidget for live lobe rendering + 8 per-band memory slots (M1-M8, click-recall / right-click-store) + PS HOLD overlay (MOX + Diversity active visual gate).
-
VFO flag per-slice auto-creation (multi-slice UI): RadioModel::sliceAdded now auto-spawns a VfoWidget per slice so operators can manipulate each slice flag directly when multiple slices live on the pan.
-
Bottom banner cleanup + AetherSDR-shaped pan menu. Replaces three competing status-bar responsive systems (RxDashboard's internal drop-priority ladder, MainWindow's right-strip drop priority, and Qt's own uncontrolled squeeze) with one
ChromeBarController: banner layout is now a pure function of bar width, with natural widths cached once and a single-pass fold ladder (design doc2026-08-02-bottom-banner-and-pan-menu-design.md). Radio identity merges intoStationBlock's second row; RX state pills densify into one borderless row and now follow the active slice (previously always Slice A, a correctness bug since Phase 3F landed multi-pan); PA telemetry and CPU merge into oneSystemTile; the UTC clock moves to TitleBar; the four safety indicators (INH/PA/OVL/TX) get permanently-reserved 50 px slots so an alarm never shifts its neighbours. Net: about 1740 px of required width down to about 1286 px. The+PANtext pill becomes a drawn icon (ported from AetherSDR) openingPanLayoutDialog's painted thumbnail grid: nine layouts in all (four new:2h1,3v,4v,3h2), gated per-board and hiding (not greying) layouts the connected radio cannot host, with a footer line naming why. "Add slice on this pan" / "Float this pan" move off the+PANbutton onto each pan's own right-click menu, so they act on the pan they were clicked from instead of routing throughactivePanId(). -
Rotor comfort (2026-08-11). Four teachable preset slots + Park + LP under the cardinal row: right-click teaches the current aim (or the rotator's fresh reading), left-click re-aims, the turn stays behind Rotate. Presets, names, and the park position persist. "Turn rotor to " now works from the panadapter spot menu on every pan including pan 0. The duplicate wide "Long path" button is retired in favour of LP.
-
Voice Check, rebuilt on the AetherSDR pattern (2026-08-11). Record-then-listen via a ported
ClientPuduMonitor: a device-pacedQAudioSourcecaptures the take gapless, the channel strip runs OFFLINE over the finished take, playback is automatic and RX stays muted across the cycle. Embedded in the Channel Strip window (● Record / ▶ Play). Replaces every live-monitor construction — the radio paces nothing in the loop. -
TX self-monitor path hardening (2026-08-11). MasterMixer opportunistic slots get an adaptive jitter cushion (doubles on starvation, bounded, never probed down) + seam fades; validated by an offline cadence simulation now in-tree as
tst_master_mixer_cadence(six jitter/drift profiles, zero steady-state discontinuities asserted). Full narrative:docs/architecture/2026-08-11-tx-monitor-audio-path.md. -
Network path instrumentation + repair (2026-08-11, remote bench). Socket-level sequence audits for the P2 mic stream (port 1026) and the DDC I/Q direction (5 s windows at qCInfo, clean heartbeat 1/min). New
MicReorderBufferbetween the mic decoder and the TX pump: speculative zero-latency reordering — late frames are slotted back into position (the dominant defect on routed/WLAN paths, ~0.2-0.5% of frames), true losses concealed by repeating the last 1.33 ms block. Measured live: every late frame rescued, zero out-of-order splices reach TX audio. -
SunSDR2 QRP via TCI 1.4 client (2026-08-24, bench-verified against a real SunSDR2 QRP / ExpertSDR2, OE5SOS). New
TciClient(src/core/TciClient.h, the mirror of the existingTciServer) plusMainWindow_SunSdr.cppwiring, built in four steps: Verbindung (Radio > SunSDR (TCI) menu, connect/disconnect), Ton (RX audio into the existing MasterMixer, opportunistic slot), Bild (I/Q into a realFFTEngine/FFTRouterat a reserved pseudo stream index — same panadapter pipeline a real receiver uses, not a parallel one), Steuerung (vfo:/modulation:bidirectional with SliceModel, echo-guarded). Receive-only by design; VFO channel A only (no split). Hard safety invariant enforced from every angle (audio, panadapter, and control alike, not just control): a slice with a real DDC binding is never fed or controlled from this path, and the target slice is fully relinquished the moment it is deleted or later claimed by a real radio (releaseSunSdrSlice(),SliceModel::streamIndexChanged/RadioModel::sliceRemoved) — closing four real gaps an adversarial review found after the initial cut, on top of two live-hardware quirks (the device reports two receiver slots with cross-talkingdds:/vfo:/modulation:lines; ExpertSDR2 accepts only the genericcwover TCI, notcwl/cwu). Full narrative:docs/architecture/2026-08-24-sunsdr-tci-client-design.md; measured wire protocol:docs/TCI-SunSDR-gemessen.md.
Fixed
- A failed/timed-out radio connect attempt left Slice A permanently "bound" to nothing (2026-08-24, found live on the bench chasing an unrelated SunSDR report).
P1RadioConnection/P2RadioConnection's connect-watchdog (onConnectTimeout, fires when no first frame arrives) tears the socket down and signalsConnectionState::Disconnected, but that path never runsRadioModel::teardownConnection()— it's a state signal, not the explicit-disconnect call chain, soteardownConnection()'s ownreleaseStreamBindings()call (the Sub-Epic I closeout defect F1 fix) never ran.RadioModel::connectToRadio()'s early setup, though, already placed Slice A onto a real stream before the watchdog had anything to time out on. Net effect: a native radio that's merely unreachable (auto-reconnect to a device that's off, or asleep on a flaky WLAN hop) leaves Slice A'sstreamIndex()permanently>= 0with no radio behind it, even though every visible indicator correctly says "Disconnected." Every foreign-accessory safety gate in the codebase (SunSDR, KiwiSDR) reads exactly that field to mean "a real, possibly TX-capable radio lives here" and correctly refuses to touch it — so the phantom binding silently pushed every accessory connect onto a second, invisible slice with no panadapter pan open for it, while the operator watched the one pan on screen and reasonably concluded nothing was connected.onConnectionStateChanged()'sDisconnectedcase now callsreleaseStreamBindings()directly (idempotent against the explicit-disconnect path already making the same call).
Removed (2026-08-18 — Entdoppelung der Bedienflächen)
Zwei Flächen fallen ersatzlos weg, weil sie dieselbe Bedienung ein
zweit...