feat(xvtr): transverter band setup (XV*) - #175
Merged
Merged
Conversation
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
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-01andFR-MSG-01blocked.The stateful-
XVNdesignXVNselects the band the other setup commands target. So every field send is prefixed withXVN<band>, and the form reloads all fields when a band is picked — keyed on theXVNthe radio confirms, so a stale value can never land in a field.Two things worth noting
.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
XV*encoders (field widths, clamps, sign) and the per-field read-back parse — by test.--demo.Branches from
main(v0.7.0).🤖 Generated with Claude Code
https://claude.ai/code/session_01KiAgfnGv746wwVBSfFkoRY