Releases: WD9N/Haven-FSK
Release list
HAVEN-FSK v0.6.0-beta
Beta release for on-air testing. HAVEN MFSK-16 and PSK31 over HF.
Highlights
- Open protocol. HAVEN-FSK is now published as an independently
implementable specification with a machine-readable LDPC matrix,
encoder bit mapping, and golden test vectors (seespec/and
HAVEN-FSK_Specification.md). Reference audio verified over RF. - Manual log capture. Select any text in the Received pane,
right-click, and log it as Call / Name / Grid / RS / POTA / SOTA /
State / County / FD — the likely field is offered first. Works in
any mode and corrects a wrong auto-fill. - POTA export. References normalize to the
XX-NNNNstandard on
every path, and ADIF now emitsPOTA_REF/MY_POTA_REFfor modern
loggers (POLO, HAMRS). - Interface. Flattened menu bar (Station Info, Audio, Radio, Mode,
Export Log direct on the bar); callsigns with modifiers (WD9N/P,
EA8/WD9N) recognized in untagged text. - Reliability. Fixed a bug that clipped the first character of
every received PSK31 transmission. Continuous integration now builds
on Linux (x86-64 and ARM/Raspberry-Pi-class) and Windows on every
change.
For testers: unzip anywhere and run HavenFSK.exe — no install.
Set your callsign under Station Info before transmitting. Feedback on
weak-signal decoding and sync behavior on busy bands is especially
welcome.
Full changelog: see CHANGELOG.md.
HAVEN-FSK v0.5.1-beta
Auto-logging — inline field markers (ADR-133, spec §6.1)
- Macro data tags (
<myCall><theirCall><rstSent><myGrid><myParks><mySOTA><myName><myQTH><myFD><myState><myCounty>) now wrap their visible values in invisible field markers on the air: the receiving station's log entry fills itself from sender-declared data instead of parsing prose by pattern. The message reads exactly the same on both screens; airtime cost is 0–1.5 s per over; no wire-format change (payload convention, protocol stays v2, disclosed in spec §6.1). - Values inserted by macro tags show a faint tint in the TX input. Editing inside a tinted span edits the transmitted data with it — prose and log data cannot disagree.
- Received tagged values are clickable, including state and county.
- Multi-party population rules (worked from activator, hunter, and interloper perspectives — ADR-133): signal reports only land when the message is addressed to you; broadcast facts (grid, parks, summit, name, QTH, FD, state, county) fill only empty fields; a different station can never auto-replace an in-progress entry (the old "steals the entry" takeover is gone — only Log It, Clear, or a click switches contacts); a station logged in the last 10 minutes doesn't re-seed the cleared entry with its parting "TU 73".
- Sender callsign is taken from the sender's own marker declaration when present (DE-scan fallback retained for plain-text stations).
- Bare park references (US-1234) and grid squares in plain untagged text are now clickable too — CQs from stations without markers still click-populate.
- New County log-entry field: captured, stored (automatic database migration), editable, and exported to ADIF (proper
CNTYSTATE,COUNTY form when the state is known). - Field Day:
<myFD>confirmed correct as the single combined exchange — ADIF and Cabrillo exports split class/section themselves. - PSK31 is unaffected: markers are never emitted outside HAVEN MFSK.
Both stations need v0.5.1 to benefit from marker-driven auto-logging; against older stations everything falls back to the previous text-tag and callsign-scan behavior.
HAVEN-FSK v0.5.0-beta
Receiver — weak signal & static crashes
- Adaptive preamble sync — detection threshold rests lower (0.35) and self-raises on false-sync symptoms, relaxing on verified decodes. Measured: decode threshold improves ~1.5 dB (-9 dB SNR: 0/10 -> 8/10 on the new benchmark) and heavy-storm survival doubles (480 crashes/min at -6 dB: 4/10 -> 8/10). Threshold changes are shown in the status bar. (ADR-131)
- Long messages now work — the receive window scales to the length announced in the frame header; a fixed 20 s cap previously made anything past ~150 characters undecodable. Messages up to ~900 characters (the 120 s TX watchdog bound) are supported. (ADR-132)
- New weak-signal benchmark harness (
HavenFSK.exe --bench/--bench-sync) with calibrated noise and HF-realistic lightning crashes. Four plausible DSP improvements were measured, found not to help, and documented rather than shipped (ADR-129/130).
Logging
- Critical fix: log-panel edits and deletes now reach the database (previously display-only; exports carried original data).
- Today's contacts reload on startup; new MHz/Date/Time entry fields make logging fully functional with no radio connected (blank = auto); editing a contact keeps its original frequency/date/time unless changed.
- UTC Date column + UTC time label, State field (entry, table, ADIF STATE).
- POTA park-to-park: one record per park of a multi-park station (full P2P credit); hunter records carry SIG_INFO.
- SOTA file generated on combined POTA+SOTA days, per-contact summit refs.
- Field Day: corrected ADIF exchange semantics plus a Cabrillo (.cab) file for the ARRL applet.
- RS-S auto-fills on a verified decode;
<rstSent>macro tag mirrors the RS-S field.
UI
- TX/RX level fader positions persist across sessions.
Beta testers: watch the status bar for Sync threshold notices during busy-band operation and report how often they appear — that is the one behavior that needs on-air miles. See CHANGELOG.md for details.
HAVEN-FSK v0.4.0-beta
Operating
- Tune button — steady 1000 Hz tone through the normal TX path (PTT keyed, level from the TX fader, 30 s auto-stop) for setting drive level into the radio. Read power on an average-reading meter; peak-reading meters show MFSK slightly high from TX filter ringing at symbol transitions. Replaces the Tone TX / Monitor bring-up diagnostics.
- Clear button for the Transmit input, matching the Received window.
- Mouse-wheel faders — hover anywhere over a level channel strip and scroll, 1 dB per notch.
Fixes (July 2026 audit)
- Interleaver: guarded a latent heap overflow on short input.
- Received text is HTML-escaped before display; every callsign in a message gets linked (position-based, no false matches).
- ADIF export: field lengths declared in UTF-8 bytes, so records with non-ASCII characters import correctly elsewhere.
- Log: band recomputed when a contact's frequency is edited.
- TCI: no auto-reconnect after a user-requested disconnect.
See CHANGELOG.md for details.
Known Bugs
- The log export does not keep the updates when edited. So any export uses the original data, not the edit. ----------------Important Log Information
- Editing re-writes the QSO frequency to the current dial frequency.
v0.3.0-beta
v0.3.0-beta — July 2026 (current)
External review fixes (see DECISIONS.md ADR-124 through ADR-126)
Safety / on-air behavior
- PTT release failure is now loud: txOff() verifies the unkey command,
retries up to 3 times, and raises a modal "YOUR RADIO MAY STILL BE
TRANSMITTING" alarm if the rig can't be confirmed unkeyed — including
when the rig-control connection dropped mid-TX (previously the unkey
was silently skipped). A failed key-up now aborts the transmission
instead of playing audio into an unkeyed rig. - End-of-transmission key click eliminated: one raised-cosine amplitude
envelope over the whole transmission (ramp-up at start, ramp-down at
end) — the frame previously ended mid-sine at full amplitude, which
splattered on adjacent frequencies. - rigctld replies are now framed properly: stale bytes from timed-out
commands are drained before each new command, and reads continue until
the reply is structurally complete — a stale "RPRT 0" from a frequency
poll can no longer be mistaken for a successful PTT command.
Stability
- Fixed a cross-thread use-after-free: moving the TX gain fader in the
final moments of a transmission could call into a just-deleted audio
device object. TX gain is now an atomic value owned by AudioEngine.
Logging (ADIF/QSO)
- ADIF exports use MODE=MFSK / SUBMODE=HAVEN-FSK (and MODE=PSK /
SUBMODE=PSK31) instead of the invalid MODE=DIGITAL, so LoTW/QRZ/POTA
uploads are accepted. Legacy DIGITAL rows are mapped at export time. - PSK31 contacts are now logged as PSK31, not HAVEN-FSK.
Architecture / infrastructure
- src/dsp is Qt-free again (ADR-003): new DspLog shim replaces QDebug in
Frame/MfskModem; DspPipeline (deliberately Qt-facing) moved to
src/pipeline/. - Debug self-tests actually run now — QT_DEBUG was never defined under
CMake, so every previous "Debug build" silently compiled them out. - haven_debug.log is actually written now — the log path was resolved
before QApplication existed, so the file never opened. - FEC matrices built once per Frame instead of per assemble()/parse()
call; assorted log/comment accuracy fixes.