Skip to content

feat(gui): FreeDV sync/SNR indicator in VFO widget for FDVU/FDVL slices#2776

Merged
ten9876 merged 1 commit into
aethersdr:mainfrom
NF0T:pr/fdv-sync-snr-display
May 17, 2026
Merged

feat(gui): FreeDV sync/SNR indicator in VFO widget for FDVU/FDVL slices#2776
ten9876 merged 1 commit into
aethersdr:mainfrom
NF0T:pr/fdv-sync-snr-display

Conversation

@NF0T

@NF0T NF0T commented May 16, 2026

Copy link
Copy Markdown
Collaborator

Summary

When a slice enters FDVU or FDVL mode (FreeDV Docker waveform, firmware v4.2.18+), the VFO widget now shows a live sync/SNR status panel — reusing the existing RADE sync LED and SNR display infrastructure.

  • Badge label displays "FreeDV" instead of "RADE"
  • Sync LED (green = synced, grey = not synced) driven by FreeDV_SNR meter (EXT_WVF source) using the SNR == -99 sentinel
  • SNR dB readout shown while synced (yellow <5 dB, green ≥5 dB); "---" while not synced
  • Callsign and freq-offset fields intentionally left blank (waveform does not provide them via the meter bus)
  • Activates/deactivates on mode change (FDVU/FDVL ↔ anything else), slice removal, and reconnect
  • Handles waveform restarts: re-resolves the dynamic FreeDV_SNR meter index on RadioModel::metersChanged

Implementation

VfoWidgetsetRadeActive(bool on, const QString& label = "RADE"): optional label parameter so all existing RADE callers are unaffected.

MainWindow — new private methods activateFdvDisplay, deactivateFdvDisplay, onFdvMeterUpdated, onFdvMetersChanged (all inside #ifdef HAVE_RADE). Hooked into the existing modeChanged lambda in onSliceAdded, onSliceRemoved, and after wireVfoWidget for the reconnect scenario.

Test plan

  • Connect to radio with FreeDV Docker waveform installed
  • Set a slice to FDVU — confirm "FreeDV ○" badge appears in VFO widget
  • With waveform synced to a station — confirm LED turns green and SNR dB updates
  • Verify SNR text is yellow below 5 dB and green at 5 dB and above
  • Change slice back to USB — confirm FreeDV panel hides
  • Close the FDVU slice — confirm no crash, panel gone
  • Disconnect and reconnect with a slice already in FDVU — confirm panel appears on reconnect

Draft: Opened as draft pending live FreeDV traffic test to verify sync LED and SNR meter flow end-to-end.

🤖 Generated with Claude Code

…ices

When a slice is set to FDVU or FDVL mode (FreeDV Docker waveform), activate
the existing RADE sync/SNR panel in VfoWidget with a "FreeDV" badge instead
of "RADE".  The panel tracks the FreeDV_SNR meter (EXT_WVF source) at ~100ms
resolution, shows a sync LED using the SNR == -99 sentinel, and updates the
dB readout while synced.  Callsign and freq-offset fields remain blank (the
waveform does not provide them via the meter bus).

VfoWidget.setRadeActive() gains an optional label parameter (default "RADE")
so existing RADE callers are unaffected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@ten9876 ten9876 marked this pull request as ready for review May 17, 2026 01:21
@ten9876 ten9876 requested review from jensenpat and ten9876 as code owners May 17, 2026 01:21
@ten9876 ten9876 merged commit 9e50025 into aethersdr:main May 17, 2026
5 checks passed
@ten9876

ten9876 commented May 17, 2026

Copy link
Copy Markdown
Collaborator

Claude here — landed at 01:21 UTC. Marked ready and merged on your behalf since the unchecked test items (sync LED + SNR color thresholds with live FreeDV traffic) are visual/cosmetic and easy to follow up — no point holding the merge.

Eight clean PRs in a single day, Ryan! 🎉

The cleverness here is the `setRadeActive(bool, const QString& label)` approach — adding a defaulted parameter to the existing RADE indicator API instead of building parallel "FreeDV status" widget plumbing. Five existing `setRadeActive(true/false)` callers in MainWindow + the two in VfoWidget keep working unchanged, and the new path just routes "FreeDV" through the same LED/SNR widget tree. The right kind of minimal refactor.

Also a nice payoff arc: PR #2771 (hex meter parse + M-message handler) fixed the EXT_WVF `num=0x...` parse that was silently returning 0, which means meters with hex sourceIndex finally resolve correctly via `findMeter("EXT_WVF", "FreeDV_SNR")` — which is exactly what this PR consumes. Three PRs ago you fixed the layer this PR depends on.

Today's tally: #2745, #2747, #2752, #2754, #2759, #2771, #2773, #2776. Eight PRs, eight distinct concerns, all clean. Genuinely outstanding work.

73, Jeremy KK7GWY & Claude (AI dev partner)

@NF0T NF0T deleted the pr/fdv-sync-snr-display branch May 17, 2026 15:43
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