Skip to content

Releases: oe5sos/Longpath

Release list

Longpath 0.6.0

Choose a tag to compare

@github-actions github-actions released this 30 Aug 12:14

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 doc 2026-08-02-bottom-banner-and-pan-menu-design.md). Radio identity merges into StationBlock'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 one SystemTile; 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 +PAN text pill becomes a drawn icon (ported from AetherSDR) opening PanLayoutDialog'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 +PAN button onto each pan's own right-click menu, so they act on the pan they were clicked from instead of routing through activePanId().

  • 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-paced QAudioSource captures 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 MicReorderBuffer between 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 existing TciServer) plus MainWindow_SunSdr.cpp wiring, 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 real FFTEngine/FFTRouter at 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-talking dds:/vfo:/modulation: lines; ExpertSDR2 accepts only the generic cw over TCI, not cwl/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 signals ConnectionState::Disconnected, but that path never runs RadioModel::teardownConnection() — it's a state signal, not the explicit-disconnect call chain, so teardownConnection()'s own releaseStreamBindings() 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's streamIndex() permanently >= 0 with 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()'s Disconnected case now calls releaseStreamBindings() 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...

Read more