Skip to content

feat(xvtr): transverter band setup (XV*) - #175

Merged
dc0sk merged 3 commits into
mainfrom
feat/transverter
Jul 25, 2026
Merged

feat(xvtr): transverter band setup (XV*)#175
dc0sk merged 3 commits into
mainfrom
feat/transverter

Conversation

@dc0sk

@dc0sk dc0sk commented Jul 25, 2026

Copy link
Copy Markdown
Owner

FR-XVTR-01, the last substantial backlog item. A setup form on the BAND screen for the transverter bands: pick an XV band 1–12, then set its mode (off/external), lower edge (MHz), IF band (MHz), offset (Hz) and power (mW).

Complex and niche — it serves transverter operators — but fully documented in D12, so buildable without the hardware-guessing that keeps FR-AUD-CHAR-01 and FR-MSG-01 blocked.

The stateful-XVN design

XVN selects the band the other setup commands target. So every field send is prefixed with XVN<band>, and the form reloads all fields when a band is picked — keyed on the XVN the radio confirms, so a stale value can never land in a field.

Two things worth noting

  • The form outgrew the fixed-height config-screen slot and clipped; fixed by compacting to three rows and wrapping the BAND screen in a scrollable.
  • A gate/lint tension: R5 (no uncalled encoders) needs a real call site, clippy rejects a wrapping closure — so three fields that were .map(fn) are now explicit parse-then-call matches, satisfying both.

Deferred, and recorded

The mW power scale when operating on a transverter band (mW instead of W) needs current-band-is-XVTR state wired through — an operating-display concern separate from this setup form.

Verification

  • All six XV* encoders (field widths, clamps, sign) and the per-field read-back parse — by test.
  • The form on screen in --demo.
  • 325 tests, clippy/fmt clean, gate green.

Branches from main (v0.7.0).

🤖 Generated with Claude Code

https://claude.ai/code/session_01KiAgfnGv746wwVBSfFkoRY

dc0sk and others added 3 commits July 25, 2026 18:03
FR-XVTR-01, the last substantial backlog item. A setup form on the BAND screen
for the transverter bands: pick an XV band 1-12, then set its mode (off/
external), lower edge (MHz), IF band (MHz), offset (Hz) and power (mW).

Complex and niche - it serves transverter operators - but fully documented in
D12, so buildable without the hardware-guessing that keeps the audio-character
and message items blocked.

The design turns on XVN being stateful: it selects the band the other setup
commands target. So every field send is prefixed with XVN<band>, and the form
reloads all fields when a band is picked, keyed on the XVN the radio confirms -
a stale value can never land in a field.

The form outgrew the fixed-height config-screen slot and clipped; fixed by
compacting it to three rows and wrapping the BAND screen in a scrollable.

A tension worth noting: R5 (no uncalled encoders) needs a real call site for
each encoder, and clippy rejects a wrapping closure - so the three fields that
were .map(fn) are now explicit parse-then-call matches, satisfying both.

Deferred and recorded: the mW power scale when operating on a transverter band,
which needs the current-band-is-XVTR state wired through and is a display
concern separate from this setup form.

Verified: all six encoders and the per-field read-back parse by test; the form
on screen in --demo.

325 tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KiAgfnGv746wwVBSfFkoRY
DC0SK found the transverter setup form grew a vertical scrollbar in the
fixed-height config slot - scrolling a setup form is worse ergonomics than the
space it costs.

The BAND screen is now two columns: HF/6 m band selection on the left, the
transverter band select and setup form on the right. The half-width column
gives horizontal room, so the four numeric fields sit two per row (Lower/IF,
Offset/Power) instead of stacked. Everything fits the slot; no scrollbar.

Verified on screen in --demo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KiAgfnGv746wwVBSfFkoRY
DTMF (#174) and the DATA-lag fix (#176) landed on main; both are additive to
the transverter work. Kept both test functions (a brace was split at the
DTMF/XVTR seam), both sets of state fields, and both docs; ledger 3.x block
renumbered to remove duplicates.
@dc0sk
dc0sk merged commit 04f1a99 into main Jul 25, 2026
@dc0sk dc0sk mentioned this pull request Jul 25, 2026
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.

1 participant