Panadapter spots are now worth reading. The comment carries the spotter, the
entity and the status in DXHunter's own shape — "CQ up 2 [F4BPO] [Franz Josef
Land] [New Slot]" — which needed two things nothing documents: SmartSDR splits
its command line on SPACES, so the words ran together until every space became
non-breaking; and it truncates past ~60 characters, so the cluster's own words
are trimmed first and the three brackets always survive. RBN column padding is
collapsed on the way in, or a preserved run of spaces opened a gap wide enough
to push the rest off screen.
"Already worked" means the CALLSIGN is in the log, not the entity: saying it of
a station never contacted was simply wrong. Each status can also be kept off the
panadapter entirely, and the WSJT-X decode spots obey the same switches — the
palette governs the panadapter, not one of the two things that feed it.
And the radio is no longer hammered: a spot whose frequency, colour and comment
are unchanged is not removed and redrawn. A busy skimmer feed re-spots the same
station every few seconds; one two-minute session sent 2128 adds, 88 of them for
a single callsign, and the display did not move a pixel for any of them.
CI-V, from an IC-7850 that kept killing JTDX: a reply the rig sent to another
controller on the same bus is no longer taken for ours, and a set_ptt, set_freq
or set_mode whose acknowledgement goes missing is verified by reading the rig
back instead of being reported as a failure. WSJT-X and JTDX answer a failed
command with a Rig Control Error and drop the link mid-over — 98 keyings, 6 lost
acknowledgements, 2 dropped connections in one session. The check waits 700 ms,
not the poll's 150: the rig has just failed to answer twice because it was
retuning, and a short probe would fail for the same reason.
Auto-call is withdrawn — it duplicated DXHunter, which already answers decodes,
and two programs deciding that from one shack key over each other. The library
is kept whole and dormant; a guard in App.tsx makes sure a stored preference
cannot key a transmitter whose switch no longer exists.
Also:
- the log rotates while running, not only at startup: the CI-V trace left on
wrote 416 MB and nothing would have stopped it before the disk did. Closing
it now releases the crash file too — the runtime keeps its own duplicate.
- the interface zoom announces itself, with a badge, a click back to 100% and
a View menu; Ctrl+wheel and Ctrl+0 always worked and nothing said so.
- no more elastic bounce, and no swipe-to-navigate out of the app.
- Edit QSO: your own TX power and the contacted station's extended locator
were saved and written back with no box to set them.
- FT decodes: continents are a multiple choice; a compound MSHV message that
answers two stations in one line is recognised as addressed to you.
44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
package cat
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"hamlog/internal/cat/civ"
|
|
)
|
|
|
|
// A CI-V bus can carry a second controller, and the rig answers each of them on
|
|
// the same wire. A reply addressed to somebody else must not be taken for ours —
|
|
// on an IC-7850 one arrived between a PTT command and its acknowledgement, the
|
|
// acknowledgement was never matched, and the failure was handed to JTDX as a rig
|
|
// control error.
|
|
func TestForeignCIVRepliesAreIgnored(t *testing.T) {
|
|
const rig = 0x8E
|
|
frames, _ := civ.Scan([]byte{
|
|
0xFE, 0xFE, 0x01, rig, 0x1C, 0x00, 0x01, 0xFD, // to controller 01 — not ours
|
|
0xFE, 0xFE, civ.AddrController, rig, 0xFB, 0xFD, // to us: the acknowledgement
|
|
0xFE, 0xFE, 0x00, rig, 0x00, 0x00, 0x25, 0x09, 0x14, 0x00, 0xFD, // transceive broadcast
|
|
})
|
|
if len(frames) != 3 {
|
|
t.Fatalf("scanned %d frames, want 3", len(frames))
|
|
}
|
|
var kept []civ.Decoded
|
|
for _, f := range frames {
|
|
if f.From != rig {
|
|
continue
|
|
}
|
|
if f.To != civ.AddrController && f.To != 0x00 {
|
|
continue
|
|
}
|
|
kept = append(kept, f)
|
|
}
|
|
if len(kept) != 2 {
|
|
t.Fatalf("kept %d frames, want 2 (ours + the broadcast)", len(kept))
|
|
}
|
|
if kept[0].Cmd != 0xFB {
|
|
t.Errorf("the acknowledgement was not the first kept frame: % X", kept[0].Cmd)
|
|
}
|
|
if kept[1].To != 0x00 {
|
|
t.Errorf("the transceive broadcast was dropped")
|
|
}
|
|
}
|