fix: a CW macro knocked the Yaesu CAT link over

Clicking a macro dropped the CAT for a few seconds, keyed nothing, then came
back.

ask() returned the first ';'-terminated frame it saw, whatever command it
belonged to. KY produces NO reply, so the next query — FA; from the poll loop —
collected a leftover frame, failed to parse it as a frequency, and ReadState
reported an error. The Manager reads that as "lost the rig": disconnect, wait,
reconnect. Hence the drop and the automatic recovery a few seconds later.

Replies are now matched to the command that asked for them: anything else is
discarded and logged, so a stray frame costs one log line instead of the link.

This also explains the silence — the send never got a clean run at the port
while the backend was being torn down under it.
This commit is contained in:
2026-07-29 13:03:09 +02:00
parent 37dc2a07e5
commit d0666581c3
2 changed files with 60 additions and 4 deletions
+27
View File
@@ -103,3 +103,30 @@ func TestYaesuModeDigit(t *testing.T) {
}
}
}
// A reply belongs to the command that asked for it.
//
// Without this, a CW macro knocked the CAT link over: KY produces no reply, so
// the poll loop's next FA; collected a leftover frame, failed to parse it as a
// frequency, and the Manager treated that as "lost the rig" and reconnected —
// the CAT dropping for a few seconds on every macro click.
func TestYaesuCmdPrefix(t *testing.T) {
cases := []struct{ cmd, want string }{
{"FA;", "FA"},
{"FB;", "FB"},
{"MD0;", "MD"},
{"KY;", "KY"},
{"KY CQ TEST;", "KY"},
{"SM0;", "SM"},
{"RM4;", "RM"},
{"AG0;", "AG"},
{"TX;", "TX"},
{"", ""},
{";", ""},
}
for _, c := range cases {
if got := cmdPrefix(c.cmd); got != c.want {
t.Errorf("cmdPrefix(%q) = %q, want %q", c.cmd, got, c.want)
}
}
}