TunerModel: prefer direct TGXL autotune (port 9010) over firmware-routed command#2163
Merged
TunerModel: prefer direct TGXL autotune (port 9010) over firmware-routed command#2163
Conversation
When a direct TGXL connection (port 9010) is available, send the native `autotune` command directly to the TGXL instead of `tgxl autotune handle=<H>` over the radio's command channel. Falls back to the radio path when no direct connection is configured. Reverse-engineered from a pcap of the 4O3A management app firing autotune. Wire format: `C<seq>|autotune\n` to port 9010, ack `R<seq>|0|`, then `state ... tuning=1 ...` push during sweep, `state ... tuning=0 ...` push on completion. The TGXL drives radio PTT via its hardware interlock cable, so no client-side keying is needed and the existing tuning/SWR UI feedback path is unchanged. Motivation: SmartSDR firmware 4.2 changed the radio↔TGXL handshake; multiple users report the TUNE button no longer works on TGXL across both AetherSDR and SmartSDR. The direct-to-TGXL path bypasses the broken firmware command and restores tune for users with a direct TGXL connection configured. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
5 tasks
ten9876
added a commit
that referenced
this pull request
Apr 29, 2026
Hotfix release for SmartSDR firmware 4.2 TGXL TUNE regression. - CMakeLists.txt / README.md / CLAUDE.md: 0.9.2 → 0.9.2.1 - CHANGELOG: v0.9.2.1 entry covering the TGXL fix (#2163) and the redactPii regex tightening - WhatsNewData.cpp: regenerated from CHANGELOG - main.cpp: redactPii IPv4 regex was matching the 4-component version string `0.9.2.1` and rendering it as `*.*.*. 1` in logs and support bundles. Negative lookbehind/lookahead now skip quoted ("0.9.2.1") and v-prefixed (v0.9.2.1) version forms. Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2 tasks
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.
Summary
When a direct TGXL connection (port 9010) is configured, sends the native
autotunecommand directly to the TGXL instead of routingtgxl autotune handle=<H>through the radio's command channel. Falls back to the radio path when no direct connection is available.Why
SmartSDR firmware 4.2 changed the radio↔TGXL handshake — users on both AetherSDR and SmartSDR report the TUNE button no longer works on TGXL after the upgrade. The direct-to-TGXL channel is independent of the radio's command stream and isn't affected, so this gives affected users a working path again without waiting on a firmware fix.
Protocol
Reverse-engineered from a 4O3A management-app pcap (
reference/TGXL_TUNE.json):The TGXL drives radio PTT via its hardware interlock cable when it receives
autotune, so the client doesn't need to key the radio. The existingstateUpdated/statusUpdatedsignals already delivertuning=andswr=to TunerApplet, so the TUNING…→SWR readout UI feedback works unchanged.Changes
requestAutotune()autotunecommand on port 9010autoTune(), fall back totgxl autotune handle=<H>if no direct connection22 insertions, 1 deletion.
Test plan
TunerModel::autoTune: using direct TGXL pathtgxl autotune handle=<H>command still fires (or fails the same way it does on 4.2 today — this branch doesn't fix that case)Risks
autotunesimultaneously have no coordination (the native command takes nohandle=). Acceptable; rare edge case.autotunewhenstate.active=0, we may need to sendactivate ant=<N>first. Capture didn't include a from-cold case — worth verifying during on-air test.🤖 Generated with Claude Code