Skip to content

feat(cat-tx-ptt): key the transmitter via CAT command or serial RTS/DTR#71

Merged
frank001 merged 4 commits into
mainfrom
feat/cat-tx-ptt
Jul 12, 2026
Merged

feat(cat-tx-ptt): key the transmitter via CAT command or serial RTS/DTR#71
frank001 merged 4 commits into
mainfrom
feat/cat-tx-ptt

Conversation

@frank001

Copy link
Copy Markdown
Owner

Summary

  • Adds two new PTT keying methods — ptt.method = "CatCommand" (via the existing CAT link) and "SerialRtsDtr" (via a serial port's RTS/DTR line) — alongside the existing audio-only VOX keying, backed by a shared failsafe watchdog (PttWatchdog) and a Settings-page configuration UI (FR-056/FR-057).
  • Fixes a critical caller-side defect found during hardware acceptance: QsoCallerService/QsoAnswererService never called KeyUpAsync after a normal transmission, so every real TX cycle relied on PttWatchdog's 20 s failsafe to ever release PTT instead of releasing promptly — breaking FT8 slot timing on every transmission. Full root-cause and fix in dev-tasks/2026-07-12-cat-tx-ptt-missing-keyup-after-transmit.md.
  • Verified against real hardware post-fix: two complete, correctly ADIF-logged QSOs with SerialRtsDtr, zero watchdog-forced releases across either session. Full evidence in openspec/changes/cat-tx-ptt/hardware-acceptance.md.

Test plan

  • dotnet build — 0 warnings/errors
  • dotnet test — full solution, 1174/1174 passing
  • openspec validate --strict --all — 54/54
  • Gate 16 (R3 — confirmed two-way QSO): passed, two real QSOs, see hardware-acceptance.md §16.1–16.3
  • Gate 15.1 (Serial RTS/DTR key/unkey): passed with real hardware evidence (port-distinctness half still needs operator confirmation)
  • Gate 14 (CAT-command PTT): not yet run — outstanding, tracked in tasks.md §18.6/§14. Does not block this merge; blocks archiving the change.
  • Gates 15.2–15.4 (DTR line, CAT-disabled independence, forced watchdog trip post-fix): not yet run — same as above.

🤖 Generated with Claude Code

frank001 and others added 4 commits July 12, 2026 14:15
Task 1.1 reserved FR-052, but gridtracker-udp-reporting (merged same day)
already claimed FR-052-FR-055 in REQUIREMENTS.md. Next free number is
FR-056 as of QA's pre-implementation audit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds two new PTT methods (ptt.method = CatCommand | SerialRtsDtr) alongside
the existing audio-only VOX keying, plus a shared failsafe watchdog and a
Settings-page PTT configuration UI (FR-056/FR-057).

Includes a critical caller-side fix found during hardware acceptance:
QsoCallerService/QsoAnswererService never called KeyUpAsync after a normal
transmission, so every real TX cycle relied on the 20s watchdog to release
PTT instead of releasing promptly after tailTimeMs, breaking FT8 slot timing
on every transmission (dev-tasks/2026-07-12-cat-tx-ptt-missing-keyup-after-transmit.md).
Verified against real hardware: two complete, ADIF-logged QSOs with zero
watchdog-forced releases (openspec/changes/cat-tx-ptt/hardware-acceptance.md).

Gate 16 (R3, confirmed two-way QSO) is satisfied. Gate 14 (CAT-command PTT)
and Gates 15.2-15.4 (DTR line, CAT-disabled independence, forced watchdog
trip) remain outstanding manual hardware gates - tracked in tasks.md section
18.6, not blocking this merge but blocking archival of the change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…w tests

PR #71's CI failed on ubuntu-latest only (Windows/macOS green): the two new
"cancelled mid-KeyDownAsync" regression tests asserted sut.Keying immediately
after WaitForStateAsync returned. SetStateAndNotify(TxCq/TxAnswer) runs before
TransmitAsync sets _keying = true, so the two writes have no atomicity between
them - a narrow but genuine race, reliably exposed by CI's Linux scheduling,
not present in the production KeyUpAsync fix itself (_keying is already
volatile; this was a test-timing assumption, not a visibility bug).

Fix is test-only: poll Keying to the expected value with the same 10ms-loop
pattern WaitForStateAsync already uses for State, in both
QsoCallerServiceTests and QsoAnswererServiceTests.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…r Gate G3

CI's Gate G3 (traceability check) failed after the Keying-race fix cleared
the ubuntu-latest leg: FR-057 (Settings-page PTT configuration UI, added to
REQUIREMENTS.md by this branch) had no test mapped to it. PttTestEndpointTests
already covered it in substance but its DisplayNames only carried the
"cat-tx-ptt 17.7" free-text prefix, not an "FR-057:" requirement-ID prefix the
traceability tool's regex recognises (TestAssemblyScanner.LeadingIds requires
the ID immediately before the colon, e.g. "FR-057: cat-tx-ptt 17.7, ...").

Verified locally with the exact command CI runs
(dotnet run --project tools/TraceabilityCheck ... --report traceability.md):
now reports "PASS: all requirements are mapped and all references are valid."

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@frank001 frank001 merged commit 1ab245b into main Jul 12, 2026
14 checks passed
@frank001 frank001 deleted the feat/cat-tx-ptt branch July 12, 2026 19:45
frank001 added a commit that referenced this pull request Jul 12, 2026
…#71

19.1-19.3 (commit/push/PR) were still unticked even though the branch was
already merged to main; ticked them and recorded the PR/CI evidence. §14, §15,
and §18.6 remain correctly unticked pending real hardware gates.

Co-Authored-By: Claude Sonnet 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.

1 participant