Skip to content

Add FT8 DXpedition Hound mode (work a Fox)#162

Merged
patrickrb merged 2 commits into
devfrom
feat/ft8-hound
Jun 8, 2026
Merged

Add FT8 DXpedition Hound mode (work a Fox)#162
patrickrb merged 2 commits into
devfrom
feat/ft8-hound

Conversation

@patrickrb

Copy link
Copy Markdown
Owner

FT8 DXpedition "Hound" mode

Adds the Hound side of FT8 DXpedition (Fox/Hound) mode — the high-value path that lets a phone user work a rare DXpedition "Fox." Protocol verified against K1JT's official FT8 DXpedition Mode User Guide (WSJT-X 1.9).

How it works

  1. Tune the rig to the Fox's published dial frequency, tap the new DX chip in the TX strip, enter the Fox's callsign, and Start.
  2. The app calls the Fox high (1000–4000 Hz) with a standard grid-call, locked to the odd slot.
  3. When the Fox answers (either a standard <me> <fox> -rpt or the DXpedition combo <other> RR73; <me> <hash> -rpt), the app auto-QSYs down to the frequency the Fox called us on and replies <fox> <me> R-rpt.
  4. On RR73 (the combo where our call is the acknowledged one), the QSO is logged and TX stops.

Why this is small / low-risk

A decode spike (against a WSJT-X ft8code-generated reference frame, played through the app's decoder on-device) proved the Fox combo message (i3=0/n3=1) already decodes and surfaces to Java with callsignTo / dx_call_to2 / report / Fox-hash populated. And the Hound only ever transmits standard i3=1 messages (grid-call + R+rpt), which already encode. So:

  • No native/DSP changes. No decoder work, no message-codec work, no multi-signal mixing.
  • The Hound QSO handler is gated behind houndMode — the existing standard auto-sequencer is untouched.

Changes

  • Ft8Message — fix a cosmetic double-sign (--18) in the existing i3=0/n3=1 formatter.
  • GeneralVariableshoundMode + houndFoxCall flags.
  • FT8TransmitSignalstartHound() + handleHoundCycle(); reuses getFunctionCommand orders 1/3 and the proven doComplete() logging.
  • MainViewModelstartHoundMode() / stopHoundMode() (disables Hunt; the two are mutually exclusive).
  • TxStrip — new DX chip; FT8USAppHoundSetupSheet (Fox call + call frequency).

Verification

  • ✅ Builds, installs, launches on a Pixel 8 without crash.
  • ✅ DX chip renders and opens the setup sheet; entering a Fox call + Start logs HOUND: start … slot=1.
  • ✅ Transmits the grid-call in the odd slot every cycle (QSO: TX slot=1 order=1 msg=[<fox> K1AF EM28]), with Hunt auto-disabled.
  • Full QSO sequencing (invite → auto-QSY → R+rpt → RR73 → log) reuses proven primitives and the spike-verified decode path, but awaits on-air validation against a live Fox (can't be exercised without a real DXpedition or a callsign-matched injection harness).

Follow-ups (intentionally out of scope)

  • Polish: decoding-✓-gated CALL button, auto-QSY waterfall animation, 2-min re-arm countdown chip, directed-CQ guard, ±300 Hz R+rpt retry.
  • Fox mode (run a pileup) — designed but deferred; needs the combo encoder + multi-signal mixing.

🤖 Generated with Claude Code

Implements the Hound side of FT8 DXpedition (Fox/Hound) mode: call a
DXpedition "Fox" high in the 1000-4000 Hz band, auto-QSY down to where the
Fox answers, reply with the report, and log on RR73.

The Fox combo message ("CALL RR73; CALL2 <hash> rpt", i3=0/n3=1) already
decodes and surfaces to Java on this build (verified on-device against a
WSJT-X ft8code reference frame), so no native/decoder work is needed. The
Hound only ever transmits standard i3=1 messages (grid-call + R+rpt), which
already encode, so there are no DSP changes.

- Ft8Message: fix cosmetic double-sign in the i3=0/n3=1 combo formatter.
- GeneralVariables: houndMode + houndFoxCall flags.
- FT8TransmitSignal: startHound() + handleHoundCycle(), a dedicated Hound
  QSO handler gated behind houndMode (standard sequencer untouched). Locks
  TX to the odd slot, reuses getFunctionCommand orders 1 (grid) and 3
  (R+rpt), auto-QSYs to the Fox frequency on invite, logs on RR73.
- MainViewModel: startHoundMode()/stopHoundMode() (disables Hunt, which is
  mutually exclusive).
- TxStrip: new "DX" chip; FT8USApp: HoundSetupSheet (Fox call + call freq).

Verified on-device: builds, installs, launches without crash; the DX chip
opens the setup sheet; Start enters Hound mode and transmits the grid-call
in the odd slot each cycle with Hunt auto-disabled. Full QSO sequencing
(invite -> QSY -> reply, RR73 -> log) reuses proven primitives but awaits
on-air validation against a live Fox.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecov Bot commented Jun 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 2.08333% with 141 lines in your changes missing coverage. Please review.
✅ Project coverage is 6.37%. Comparing base (cc3a1a9) to head (4d9f941).
⚠️ Report is 16 commits behind head on dev.

Files with missing lines Patch % Lines
...om/bg7yoz/ft8cn/ft8transmit/FT8TransmitSignal.java 0.00% 54 Missing ⚠️
...adio/ks3ckc/ft8us/ui/components/HoundSetupSheet.kt 0.00% 33 Missing ⚠️
...app/src/main/kotlin/radio/ks3ckc/ft8us/FT8USApp.kt 0.00% 23 Missing ⚠️
...kotlin/radio/ks3ckc/ft8us/ui/components/TxStrip.kt 0.00% 20 Missing ⚠️
.../src/main/java/com/bg7yoz/ft8cn/MainViewModel.java 0.00% 11 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##               dev    #162      +/-   ##
==========================================
+ Coverage     6.24%   6.37%   +0.12%     
- Complexity     669     681      +12     
==========================================
  Files          267     269       +2     
  Lines        30584   30979     +395     
  Branches      4763    4856      +93     
==========================================
+ Hits          1910    1974      +64     
- Misses       28533   28864     +331     
  Partials       141     141              
Files with missing lines Coverage Δ
...app/src/main/java/com/bg7yoz/ft8cn/Ft8Message.java 42.45% <100.00%> (+2.35%) ⬆️
...c/main/java/com/bg7yoz/ft8cn/GeneralVariables.java 34.52% <100.00%> (+0.47%) ⬆️
.../src/main/java/com/bg7yoz/ft8cn/MainViewModel.java 0.00% <0.00%> (ø)
...kotlin/radio/ks3ckc/ft8us/ui/components/TxStrip.kt 0.00% <0.00%> (ø)
...app/src/main/kotlin/radio/ks3ckc/ft8us/FT8USApp.kt 0.00% <0.00%> (ø)
...adio/ks3ckc/ft8us/ui/components/HoundSetupSheet.kt 0.00% <0.00%> (ø)
...om/bg7yoz/ft8cn/ft8transmit/FT8TransmitSignal.java 2.99% <0.00%> (+0.60%) ⬆️

... and 10 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces the FT8 DXpedition “Hound” mode flow (work a Fox) into the app, adding UI affordances and a dedicated transmit/decode cycle handler gated behind GeneralVariables.houndMode.

Changes:

  • Adds a new DX toggle + setup dialog to start/stop Hound mode from the Compose UI.
  • Adds houndMode / houndFoxCall globals and wiring in MainViewModel to enter/exit the mode.
  • Implements a Hound-specific per-cycle handler in FT8TransmitSignal and fixes DXpedition combo text formatting in Ft8Message.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
ft8cn/app/src/main/kotlin/radio/ks3ckc/ft8us/ui/components/TxStrip.kt Adds a DX toggle pill to the TX strip UI.
ft8cn/app/src/main/kotlin/radio/ks3ckc/ft8us/ui/components/HoundSetupSheet.kt New dialog to collect Fox callsign + initial call frequency.
ft8cn/app/src/main/kotlin/radio/ks3ckc/ft8us/FT8USApp.kt Wires DX toggle + setup sheet into the app UI flow; start/stop hooks.
ft8cn/app/src/main/java/com/bg7yoz/ft8cn/MainViewModel.java Adds startHoundMode() / stopHoundMode() entry points.
ft8cn/app/src/main/java/com/bg7yoz/ft8cn/GeneralVariables.java Adds houndMode and houndFoxCall global flags.
ft8cn/app/src/main/java/com/bg7yoz/ft8cn/ft8transmit/FT8TransmitSignal.java Routes decoding cycles to a new Hound handler and adds Hound TX logic.
ft8cn/app/src/main/java/com/bg7yoz/ft8cn/Ft8Message.java Fixes DXpedition combo message formatting to avoid double-sign reports.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread ft8cn/app/src/main/java/com/bg7yoz/ft8cn/Ft8Message.java
- startHound(): seed the Fox callsign's 22/12/10-bit hashes so DXpedition
  combo decodes resolve the Fox for display and can be attributed to it.
- handleHoundCycle(): only act on a combo whose 10-bit Fox hash matches our
  Fox; skip a combo whose hash resolves to a different known Fox. Implemented
  as a negative filter (proceed when the hash is unknown) so compound-call
  Foxes -- whose combo hashes the full call while the operator works the base
  -- still complete.
- Ft8Message: a zero combo report now renders "+0" (>= 0), not "-0".
- Add Ft8MessageTest coverage for the combo formatter (negative and zero).

Copilot's report-value comment is intentionally not changed: per the WSJT-X
DXpedition guide the Hound's R+rpt carries its own measurement of the Fox
(toCallsign.snr = msg.snr), not the report the Fox sent -- which is correct.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patrickrb patrickrb merged commit d8966e7 into dev Jun 8, 2026
4 checks passed
@patrickrb patrickrb deleted the feat/ft8-hound branch June 8, 2026 20:11
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