[modem] AetherModem: Phase 0 bring-up#2753
Conversation
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
|
Claude here — landed at 22:31 UTC. Massive contribution, jensenpat — thank you. 🎉 Phase-0 scoping is the right call: RX-only, single 300 baud HF profile, vertical slice through the audio tap → demod → HDLC → AX.25 → UI pipeline. The non-destructive audio tap pattern ( 13/13 tests passing including the synthetic loopback + the real over-the-air Filed two minor follow-ups (cosmetic only, not blockers):
Looking forward to Phase 1 (improved HDLC gating + 1200 baud VHF profile + the next set of items from your Next Steps list). 73, Jeremy KK7GWY & Claude (AI dev partner) |
). Principle III. PR #2753 introduced two local Q_LOGGING_CATEGORY("aether.ax25") declarations alongside the centralized lcAx25 in LogManager. Both lcAetherAx25Shim and lcAetherAx25Dialog resolved to the same underlying QLoggingCategory at runtime, so behavior was identical, but the duplication sat outside the LogManager registry and would silently drift if the central category's metadata (default level, toggle hook) ever changed. Replace both local declarations with #include "core/LogManager.h" and update all qCDebug callsites to use lcAx25 directly. The <QLoggingCategory> include is dropped from both files since LogManager.h pulls it in. Logging behavior is unchanged: same messages at same levels, same single "aether.ax25" toggle in Help → Support — which is the user-visible label this consolidation protects (Principle III: user-facing names match the visible UI labels, and the Help → Support toggle is the authoritative surface for this category). Blast radius: risk_score=0.228, 7 high-risk affected (top: MainWindow, MainWindow::wirePanadapter, MainWindow::registerShortcutActions). The dialog is structurally central to MainWindow, but the edit only swaps include directives and renames a local logging-category symbol — the dialog's public API (constructor, signals, slots) is untouched. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Summary
This adds a Phase 0 receive-only vertical slice for native AX.25 packet decoding in AetherSDR. The feature is intentionally scoped to an experimental packet decoder window and a small internal libmodem-core subset/shim. It does not add TX, KISS, APRS-IS, maps, beaconing, digipeating, connected mode, Smart Beaconing or a new audio backend.
The decoder can be opened from
ViewasPacket Decoder..., underPropagation Conditions. It attaches to the active AetherSDR RX slice/audio stream, taps the existing 24 kHz post-demod PC RX audio non-destructively, and displays accepted AX.25 UI frames in an AetherModem-style terminal/log window.What Changed
third_party/libmodem_coresubset with MIT license preservation and AetherSDR refresh notes.AetherAx25LibmodemShim, which owns the modem config, demodulator, HDLC/AX.25 bitstream decode path, diagnostics, and Aether-owned frame conversion.AetherModem - Packet Decoderwindow with 300/1200 baud radio buttons, polarity persistence, enable/clear controls, hidden future Terminal/Mailbox/send scaffolding, a packet activity graph, and a persisted click-to-toggle diagnostics debug mode./tmplogs.Third-Party Scope
Copied into
third_party/libmodem_core:LICENSE.libmodemREADME.aethersdr.mdbitstream.hbitstream.cppdemodulator.hdemodulator.cppIntentionally avoided:
Radio Settings Used During Field Test
The first successful over-the-air decodes were observed with Dire Wolf transmitting APRS AX.25 AFSK at
1600/1800 Hz,A+,300 baud.Recommended starting receive setup for this branch:
USBfor the current testing path.DIGUcan work conceptually, but USB made the slice squelch and post-demod path easier to reason about during the field tests.14.241.000.3 kHz, with an audio passband covering1600 Hzand1800 Hz.300 baud.Normalfor Dire WolfAFSK 1600 & 1800 Hz, A+. UseReverseif sideband/audio inversion is suspected.Slowworked well in testing.95was the successful field-test setting.70was the successful field-test setting.-22.6 dBFS RMS,-10.5 dBFS peak,0.00%clipping.Field Test Notes
Successful live decodes were observed in the packet window from the fixed Dire Wolf packet:
KI6BCJ-1>APDW18:!3644.00N\11947.00W-KI6BCJ HF APRS test via Direwolf 300 baudThe latest 30-second capture replay decoded one valid frame on Normal polarity and zero on Reverse polarity. Bad-FCS candidates were not displayed as valid frames.
Observed diagnostics at the end of one live run were intentionally noisy but useful:
hdlc=842,ok=8,reject=834,badFcs=28,malformed=375. That means the first vertical slice is successfully accepting real frames while still producing many rejected HDLC candidates from noisy HF audio.Current Limitations
Next Steps
Validation
maininto this branch before PR creation.cmake --build build --target AetherSDR -j22cmake --build build -j22ctest --test-dir build --output-on-failure -j2213/13tests passed.👨🏼💻 Generated with OpenAI Codex (GPT-5.5 Pro 4/23) and tested by @jensenpat