Add FT8 DXpedition Hound mode (work a Fox)#162
Merged
Merged
Conversation
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 Report❌ Patch coverage is Additional details and impacted files@@ 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
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
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/houndFoxCallglobals and wiring inMainViewModelto enter/exit the mode. - Implements a Hound-specific per-cycle handler in
FT8TransmitSignaland fixes DXpedition combo text formatting inFt8Message.
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.
- 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>
This was referenced Jun 8, 2026
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.
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
<me> <fox> -rptor 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.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 withcallsignTo/dx_call_to2/report/ Fox-hash populated. And the Hound only ever transmits standardi3=1messages (grid-call + R+rpt), which already encode. So:houndMode— the existing standard auto-sequencer is untouched.Changes
Ft8Message— fix a cosmetic double-sign (--18) in the existingi3=0/n3=1formatter.GeneralVariables—houndMode+houndFoxCallflags.FT8TransmitSignal—startHound()+handleHoundCycle(); reusesgetFunctionCommandorders 1/3 and the provendoComplete()logging.MainViewModel—startHoundMode()/stopHoundMode()(disables Hunt; the two are mutually exclusive).TxStrip— new DX chip;FT8USApp—HoundSetupSheet(Fox call + call frequency).Verification
HOUND: start … slot=1.QSO: TX slot=1 order=1 msg=[<fox> K1AF EM28]), with Hunt auto-disabled.Follow-ups (intentionally out of scope)
🤖 Generated with Claude Code