Skip to content

FT8: don't key up deep into a TX slot - partial transmissions are wasted - #116

Open
vroOoms wants to merge 1 commit into
afarhan:mainfrom
vroOoms:fix/ft8-partial-slot-tx
Open

FT8: don't key up deep into a TX slot - partial transmissions are wasted#116
vroOoms wants to merge 1 commit into
afarhan:mainfrom
vroOoms:fix/ft8-partial-slot-tx

Conversation

@vroOoms

@vroOoms vroOoms commented Jul 22, 2026

Copy link
Copy Markdown

The bug

The FT8 transmit trigger in ft8_poll() fires anywhere inside the 15-second parity window, and ft8_start_tx(seconds % 15) starts the waveform at the current offset into the slot:

if (
    (ft8_tx1st == 1 && ((seconds >= 0  && seconds < 15) || ...
    ...
    tx_on(TX_SOFT);
    ft8_start_tx(seconds % 15);
    ft8_repeat--;

When a transmission is requested late in the window — which happens routinely with auto-sequenced replies, because an FT8 decode batch often completes a second or two before the slot boundary — the radio keys up immediately and transmits only the last one or two seconds of the message. Nothing on the receiving side can decode that fragment, ft8_repeat is consumed, and the operator sees a transmission that keys and stops right away (in our logs: a TX entry with no measurable output power).

The fix

Gate the trigger to the first 3 seconds of the window. A slightly late join still decodes fine (FT8's sync is distributed across the transmission); anything later stays pending and keys cleanly at the start of the next parity slot instead of wasting itself.

Observed / verified

On an sBITX v2 (v3.021) running auto-sequenced FT8: replies queued at second :14/:29/:44 consistently produced ~1-second phantom transmissions (PA keyed, no decodable signal, attempt lost). With this change, 8/8 consecutive transmissions keyed on exact slot boundaries and completed at full power, confirmed against the TX log.

More bugs found while building on this codebase (with fixes) are documented at vroOoms/sbitx-vu3exh — UPSTREAM-BUGS.md. Happy to send follow-up PRs for the isolated ones (SIDETONE handler, rigctl thread-safety, mid-TX abort in ft8_on_start_qso).

73, VU3EXH

🤖 Generated with Claude Code

https://claude.ai/code/session_011QxAdKpedpdffNuLUtkdse

The FT8 transmit trigger in ft8_poll() fires anywhere inside the 15s
parity window, and ft8_start_tx(seconds % 15) starts the waveform at
the current offset into the slot. When a transmission is requested late
in the window - typical for auto-sequenced replies, because a decode
batch often completes a second or two before the slot boundary - the
radio keys up and transmits only the last second or two of the message.
Nothing on the receiving side can decode that fragment, ft8_repeat is
consumed, and the operator sees a transmission that keys and stops
immediately (a TX with no measurable output in the logs).

Gate the trigger to the first 3 seconds of the window: a slightly late
join still decodes (FT8 sync is distributed across the transmission),
and anything later stays pending and keys cleanly at the start of the
next parity slot.

Observed on an sBITX v2 running auto-sequenced FT8: replies queued at
second :14/:29/:44 consistently produced 1-second phantom transmissions;
with this change, 8/8 consecutive transmissions keyed on exact slot
boundaries and completed at full power.
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