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:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user