Skip to content

feat(hl2): transmit AM, DSB and FM through TXA. Principle II. - #5977

Merged
jensenpat merged 1 commit into
aethersdr:mainfrom
on8st:hl2/tx-am-fm
Oct 17, 2026
Merged

jensenpat merged 1 commit into
aethersdr:mainfrom
on8st:hl2/tx-am-fm

Conversation

@on8st

@on8st on8st commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

Enables Hermes-Lite 2 AM, DSB and simplex FM/NFM transmit in the default WDSP TXA build, addressing row 1.2 of #5678. The TXA build uses a symmetric audio passband, explicitly sets the AM carrier level to 0.5 and FM deviation to 5000 Hz, and disables TXA's default-on CTCSS encoder on every transmit-channel open. No tone or repeater-offset control is added.

AETHER_HL2_TX_TXA=OFF retains the phasing modulator and its existing receive-only restriction for AM, DSB, FM and NFM. SAM, WBFM/WFM and DRM remain receive-only in both builds. Existing TX intent gates and TUNE generation remain intact. #5678 stays open.

The branch is rebased onto main 5813556e0709e31d5535281b3eda02da3b2338d8, with the obsolete #5906 stack and intervening merge commits consolidated into the effective change. on8st retains authorship and the existing AI co-author credit.

Validation

  • macOS arm64 / Qt 6.12.0 at c310a5aa27be0d355a69514f632e74c922f20770 (before the final clean rebase): seven selected socket-free CTests passed with QT_QPA_PLATFORM=offscreen (hl2_txdsp_test, wdsp_channel_test, hl2_family_transition_test, hl2_fm_controls_declaration_test, hl2_mode_vocabulary_test, hl2_dsp_readback_test, control_receive_test).
  • The TXA IQ test measures AM carrier/sidebands, suppressed-carrier DSB, FM envelope and deviation, and absence of the default 100 Hz CTCSS tone. It also checks USB→AM→USB mode/filter changes.
  • AETHER_HL2_TX_TXA=OFF: all six flag-sensitive CTests passed again at final head 980e5d219d5d7c4f35cb4b11f7003de34c5a34a4, including the phasing modulator's bit-identity evidence and the longer receive-only list.
  • Mutation: reversing the build-option condition in the live backend made hl2_fm_controls_declaration_test fail its FM/NFM capability assertion. The mutation was restored and is absent from this head.
  • The initial default test run found an older staged QtKeychain loading Qt 6.11 alongside 6.12. The default TXA IQ test and mutation were repeated with the matching Qt 6.12 Keychain library, and the OFF suite used that library; all expected outcomes held without the duplicate-framework warning. No repository code change was needed.
  • Measured offline IQ: AM carrier 0.50000 and equal sidebands 0.12500 (−12.04 dBc); DSB sidebands 0.25000 with carrier suppression above the test's 60 dB threshold; FM deviation 1676.4 Hz at the test's 2 kHz/0.5 tone, halved by halving either level or deviation setting, envelope spread 0.0021, and 100 Hz component 0.00 Hz.
  • The final rebase changes only the inherited KPA500 integration. HL2/WDSP production code and all seven selected test sources are byte-identical to the default-build validation head; that default DSP evidence is reused, and fresh platform CI validates the new integration.
  • Both the default focused build and npm ci && npm run build passed. Build-option, test-registration, WDSP-link, generated-reference and log-analyzer checks passed.
  • Engine boundary, touchpoint manifest, capability-record and command-plane gates passed with identical findings against current main and the rebased head. No workflow or ratchet baseline was changed.

The tests exercise real WDSP DSP channels offline and do not open a radio connection. The automation bridge's demo backend cannot exercise HL2 transmit modulation; no live hardware was contacted or keyed during this review. RF measurements from the earlier 806affbd head remain historical evidence only and are not proof of this rebased head. Sanitizers and a local full-suite run were not run in this pass. No CI lane builds the option-OFF configuration (#5796).

The user guide and capability map describe the current mode policy. The log analyzer's moved HL2 source citation is refreshed. The AM carrier and FM deviation remain fixed internal parameters; no operator control reaches them. Speech-level FM deviation can be below 5 kHz because pre-emphasis precedes modulation. AM carrier power is one quarter of PEP.

Generated with OpenAI Codex (GPT-6 Astra)

@on8st

on8st commented Oct 2, 2026

Copy link
Copy Markdown
Contributor Author

Bad news first: this PR was stacked on #5906, which is closed, so until now its diff still removed AETHER_HL2_TX_TXA. That is corrected in 1b5a2b96, a merge of main (no force-push) that restores the option and the phasing modulator and re-applies this PR's own change on main.

  • Default build (TXA): AM, DSB, FM and NFM come off receiveOnlyModes, as before.
  • -DAETHER_HL2_TX_TXA=OFF: unchanged from main. Those modes stay on the list and key-on is refused.

Tested locally at 1b5a2b96: default build, full suite, 584 of 584. With the option OFF only the six tests that read the flag were built and run, on the same tree; all passed. No radio was keyed on this head: the on-air table is from 806affbd.

The body is updated to match.

73, ON8ST

@on8st

on8st commented Oct 3, 2026

Copy link
Copy Markdown
Contributor Author

The "six tests only" limit in the body is replaced by a full-suite run. It was not green, so that first.

Built 1b5a2b96 with -DAETHER_HL2_TX_TXA=OFF and ran all of ctest: 583 of 584 pass. Control, main 732b99a9 built the same way: 610 of 610 (main has 26 newer tests).

The one failure is vkamp_connection_test, the #5254 race. Repeated alone it fails on main OFF as well: 4 of 40 there, 8 of 40 here. It does not link aethercore and this PR touches none of its sources. One of the 40 repeats on this branch failed two telemetry checks that are not among that race's two known ones; I cannot explain that run and have not seen it again.

Still true: no CI lane builds OFF (#5796), and no radio has been keyed on this head.

73, ON8ST

@on8st

on8st commented Oct 4, 2026

Copy link
Copy Markdown
Contributor Author

Merged main into this branch (781cb065, merge commit, no force-push).

Not verified: no radio keyed on this head; the OFF build was not rerun.

73, ON8ST

@on8st

on8st commented Oct 4, 2026

Copy link
Copy Markdown
Contributor Author

Not verified: no radio was keyed on this head, and the option-OFF build was not rerun (last run at 1b5a2b96); nothing main brought in sits under AETHER_HL2_TX_TXA. Merged main into this branch (7c13715c, merge commit, no conflicts, no force-push) to follow #5924, #5919, #6089, #6098 and the v26.10.1 prep. The body's update paragraph and two stale sentences are corrected to match. One follow-up commit, 59f3c5ab, corrects the AETHER_HL2_TX_TXA row of the new BUILD-OPTIONS.md: it said the option selects the SSB modulator, and on this branch ON also transmits AM, DSB and FM while OFF keeps them receive-only. This PR adds no float-to-int16 conversion, so #6089 asks nothing of it; its transmit IQ leaves through ep2WriteTxIq, which #6089 already guards. Default build, full suite at 59f3c5ab: 642 of 643, the one failure being peripheral_auth_dialog_test (#6008), which also failed when rerun alone.

73, ON8ST

@on8st

on8st commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Still a draft; this is housekeeping, nothing is keyed. Merged main (46943eb3) into the branch as 215a46d5, because it had gone CONFLICTING.

  • One file conflicted, BUILD-OPTIONS.md: main's ENABLE_RTL / REQUIRE_RTL rows (RTL: analog multi-receiver audio, meters and release packaging #6083) beside this PR's AETHER_HL2_TX_TXA row. Both kept; check_build_options passes.
  • What changed under this PR without a text conflict: the level chain is now main's Hl2TxAlc (fix(hl2): ramp the TX ALC gain inside the block. Principle VIII. #6245), so AM, DSB and FM audio also get the gain ramped inside the block. Target, release and the unity ceiling are unchanged. The AM and FM figures in the body were measured before that and are not re-measured; hl2_txdsp_test asserts them and passes on the merged build.
  • A second commit, 04ca15b2, corrects the user guide that arrived on main after this PR was opened (docs/user/docs/hermes-lite-2.md): it said AM, DSB and FM refuse to transmit, which this PR changes.

Full ctest on macOS, TXA build: 769 of 770; the one that fails is the clean-main failure #6008.

73, ON8ST

@jensenpat jensenpat self-assigned this Oct 17, 2026
jensenpat pushed a commit to on8st/AetherSDR that referenced this pull request Oct 17, 2026
Rebase the effective change from PR aethersdr#5977 onto current main, consolidating the obsolete aethersdr#5906 stack and subsequent merge resolutions. Keep AETHER_HL2_TX_TXA and its phasing fallback intact. Preserve mode-specific TXA filtering, explicit AM/FM parameters, CTCSS-off policy, offline DSP coverage and user documentation.

Refs aethersdr#5678.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@jensenpat
jensenpat marked this pull request as ready for review October 17, 2026 15:24
@jensenpat
jensenpat requested review from a team as code owners October 17, 2026 15:24
Rebase the effective change from PR aethersdr#5977 onto current main, consolidating the obsolete aethersdr#5906 stack and subsequent merge resolutions. Keep AETHER_HL2_TX_TXA and its phasing fallback intact. Preserve mode-specific TXA filtering, explicit AM/FM parameters, CTCSS-off policy, offline DSP coverage and user documentation.

Refs aethersdr#5678.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

@jensenpat jensenpat left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 980e5d219d5d7c4f35cb4b11f7003de34c5a34a4, rebased onto main 5813556e0709e31d5535281b3eda02da3b2338d8. No blockers found. This delivers AM, DSB and simplex FM/NFM from row 1.2 of #5678; that tracking issue stays open. The accepted TXA direction and compile-time fallback are preserved.

Scope Claimed Verdict
HL2 backend, mode vocabulary, TX DSP and level policy AM/DSB/FM TX with mode-specific passbands and build-shaped refusal list In scope; no new wire command, seam verb or capability boolean
WDSP channel configuration and C API declarations Explicit carrier/deviation settings and CTCSS off at every TX open In scope; finite/range validation is TX-only; HL2 is the only production WDSP TX consumer
Five existing socket-free test sources DSP spectra, transitions and capability declarations for each build In scope; no synthetic peer or new socket-owning test
CMake option text and BUILD-OPTIONS.md Keep the phasing fallback and explain its SSB-only restriction In scope; option/default unchanged
HERMES, capability map, user guide and HL2 log source citation Describe enabled modes and remaining restrictions In scope; SAM/CTCSS wording corrected and moved citation refreshed

Blockers: none. Non-blocking documentation nits were fixed in the reviewed commit: docs/user/docs/hermes-lite-2.md:139 and :201 now describe SAM as a receive-only detector choice; docs/architecture/radio-capabilities-map.md:250 accurately distinguishes TXA's existing CTCSS encoder from the absent tone-control verb. docs/user/src/components/LogAnalyzer/rules.json:893 follows the moved HL2 diagnostic. No findings remain open.

Local verification: option-OFF build and six flag-sensitive CTests passed again at the final head 980e5d219. The default TXA build and seven selected socket-free CTests passed at c310a5aa2; after the clean rebase over KPA500, HL2/WDSP production code and all seven test sources are byte-identical, so that component evidence is reused. Fresh platform CI verifies integration with the new main. All runs were headless (QT_QPA_PLATFORM=offscreen). The paced TXA test also passed again with the matching Qt 6.12 Keychain dependency, eliminating an initial local duplicate-Qt warning. That same dependency was used for the OFF suite and mutation check.

The emitted IQ checks measured AM carrier 0.50000 with equal 0.12500 sidebands (−12.04 dBc), DSB sidebands 0.25000 with carrier suppression above the asserted 60 dB threshold, and FM deviation 1676.4 Hz (half level: 838.2 Hz; half deviation setting: 838.1 Hz), envelope spread 0.0021 and 100 Hz component 0.00 Hz. USB→AM→USB mode/passband transitions passed. Reversing the capability build-option condition made the FM/NFM declaration assertion fail; restoring it left a clean tree and the expected receive-only policy in each configuration. The mutation was not committed.

I traced connect-time configuration, TX-slice mode changes, TX-slice selection and mode-before-filter ordering through Hl2Backend→Hl2TxDsp→WdspChannel→WDSP TXA. AM/DSB/FM retain the existing TX intent gates; SAM/WBFM/WFM/DRM refusals and both alias spellings remain, and the option-OFF build keeps all eight receive-only strings. TUNE's existing carrier generation is untouched. The shared WDSP changes are gated to Transmit; receive paths retain their configuration.

All four architecture gates pass and emit identical findings on main and this head. The manifest was regenerated without a diff; no ratchet baseline, GUI include, workflow, dependency or runtime switch was added. Build-option, test-registration, WDSP-link, generated-reference and log-analyzer checks pass. The docs site builds locally and in CI.

No live radio was contacted or keyed. The demo bridge cannot exercise this HL2-only transmit modulator; no bridge/UI/RF claim is made. Earlier RF measurements from 806affbd are historical evidence, not current-head RF validation. Sanitizers and a local full suite were not run. The separate automated code-review skill is unavailable here; the source pass was performed manually.

Freshness: current main is 5813556e0 (2026-10-17 15:31:49 UTC); the earliest CI run for this head was created 2026-10-17 15:32:58 UTC. All four live required checks (build, check-macos, check-windows and Static checks), Docs and sanitizer configuration are green on this head. Platform CI, Static Checks, Docs. The merge tree is clean against that current main, the commit signature is verified, and there are zero unresolved threads or blocking reviews. Approval is pinned to this exact head; post-merge main verification is separate.

@jensenpat
jensenpat merged commit 5c681e3 into aethersdr:main Oct 17, 2026
7 checks passed
jensenpat pushed a commit that referenced this pull request Oct 18, 2026
…III. (#6542)

Fixes #6235

Option 1 from #6235, in the form @NF0T and I settled on in the thread.
No ruling was given between options 1 and 2; if the envelope peak
(option 2) is wanted, close this.

## Limits, first

- **Text only. No reading changes.** The gauge still shows the same
number: on an HL2, the peak of the audio block after the ALC, before the
modulator.
- **The gap this describes was measured offline**, on synthesized speech
through the transmit DSP (figures in #6235): with limited audio the
envelope stood 5 to 6 dB above the gauge. Nothing was keyed. Real
microphone audio was not measured.
- **Flex operators read one word less.** The shared accessible
description loses "SSB" and becomes "post-software-ALC peak (dBFS)". It
stays true for the Flex firmware meter of the same name;
`docs/architecture/flex-meter-learnings.md` and
`tx-audio-signal-path.md`, which describe that Flex meter, are not
touched.
- **Since #5977 the same gauge also runs in AM, DSB and FM on an HL2**
(one audio path, `Hl2TxDsp::processAudioBlock`), so dropping "SSB" is
correct there too. Not keyed in any mode.
- No test pins these strings, before or after.

## Change

- `PhoneCwApplet.cpp` (three sites), `PhoneCwApplet.h`, `MeterModel.h`:
"post-software-ALC SSB peak (dBFS)" becomes "post-software-ALC peak
(dBFS)".
- `Hl2TxDsp.cpp`: the comment that said the value is "the signal
reaching the wire" now says it is the audio peak before the modulator,
at the ALC target while the ALC reduces.
- `Hl2Backend.cpp`: two comments, and the HL2 meter's description
"Post-ALC transmit peak" becomes "Post-ALC audio peak, before the
modulator".
- `docs/user/docs/hermes-lite-2.md`: one line saying what the ALC gauge
shows on an HL2, and that it is not the transmitted envelope.

Full ctest at `c5886fa0` (`08859e04` merged with `main` 7864ef5; macOS,
Qt 6.12.0, `-j8`): 801 tests, 799 passed.
- `vkamp_connection_test` failed and passed on the serial rerun (#5254).
- `kpa500_advanced_widget_test` timed out. It does the same on clean
`main` 94e3cd4 here, and only in our launchd test runner: it hangs in
`backupSelectionRechecksReadAvailability`. Started from a terminal it
passes 9 of 9 in 0.3 s. This PR touches no KPA500 file.

At `c5886fa0`, `check_engine_boundary`, `check_test_registration` and
`check_qsettings` (`--strict`) and `gen_touchpoint_manifest.py --check`
pass. `check_a11y` on the two `PhoneCwApplet` files at `08859e04`: 2
findings, the same 2 as on the base.

73, ON8ST

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants