fix(cat): rebuild the rig link only when the connection itself changed
Pressing Save in Preferences tore down the CAT link and the shared CAT server unconditionally. Two consequences an operator sees at once: WSJT-X and JTDX are thrown off their rig mid-QSO with an error box, and every spot disappears from a FlexRadio panadapter — a Flex reconnect clears them by design, so the wipe on save was the reconnect, not a stray command. Switching profile re-applies the same settings and did exactly the same. Two signatures decide it now. catLinkSig covers what shapes the physical link (backend, host/port, COM port and baud, CI-V address, network credentials); catShareSig covers the protocol and port of the rigctl/TCI server, which is the socket WSJT-X actually holds. Same string in, same connection out, so there is nothing to gain by rebuilding it. The poll interval, command delay, transverter offset and spot options are applied to the running manager as before — the tests pin that a spot option in particular can never trigger a reconnect, since that is the one that would wipe the panadapter. Also, two things the log would not say: - WSJT-X/JTDX report their Enable Tx state in every Status and we wrote it nowhere. When a station is called and nothing goes out, that flag is the whole answer — a Reply does what a double-click does, it cannot arm a transmitter — and the only way to see it was to watch a button in another window. Logged on change, so it costs a few lines a QSO. - The antenna log said "steppir connected" before anything had talked to it, which made an unopenable serial port look like a working link with tracking switched off. It says "configured", which is what it knows.
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
// The whole point of the signature is that pressing Save in Preferences must
|
||||
// not drop the rig — and with it every WSJT-X/JTDX client of the shared CAT
|
||||
// server, mid-QSO, with an error box. Only a change to the LINK may reconnect.
|
||||
func TestCatLinkSigIgnoresNonLinkSettings(t *testing.T) {
|
||||
base := CATSettings{
|
||||
Enabled: true, Backend: "flex", FlexHost: "192.168.1.20", FlexPort: 4992,
|
||||
PollMs: 250, DigitalDefault: "FT8",
|
||||
}
|
||||
same := base
|
||||
// Everything here is applied to the RUNNING manager; none of it justifies a
|
||||
// reconnection, and a spot option in particular must not wipe the panadapter
|
||||
// (a Flex reconnect clears every spot on it).
|
||||
same.PollMs = 500
|
||||
same.DelayMs = 20
|
||||
same.OffsetOn = true
|
||||
same.OffsetHz = 116_000_000
|
||||
same.FlexDecodeSpots = !base.FlexDecodeSpots
|
||||
same.FlexDecodeSecs = 300
|
||||
same.FlexDVKDax = !base.FlexDVKDax
|
||||
same.PTTHotkeyEnabled = true
|
||||
same.PTTHotkey = "Pause"
|
||||
if catLinkSig(base) != catLinkSig(same) {
|
||||
t.Errorf("non-link settings changed the signature:\n%s\n%s", catLinkSig(base), catLinkSig(same))
|
||||
}
|
||||
|
||||
// And the ones that DO describe the connection must still force a restart.
|
||||
for name, mutate := range map[string]func(*CATSettings){
|
||||
"backend": func(c *CATSettings) { c.Backend = "kenwood" },
|
||||
"flex host": func(c *CATSettings) { c.FlexHost = "192.168.1.21" },
|
||||
"flex port": func(c *CATSettings) { c.FlexPort = 4993 },
|
||||
"serial port": func(c *CATSettings) { c.Backend = "yaesu"; c.YaesuPort = "COM7" },
|
||||
"baud": func(c *CATSettings) { c.Backend = "yaesu"; c.YaesuBaud = 19200 },
|
||||
"civ address": func(c *CATSettings) { c.Backend = "icom"; c.IcomAddr = 152 },
|
||||
"disabled": func(c *CATSettings) { c.Enabled = false },
|
||||
} {
|
||||
c := base
|
||||
mutate(&c)
|
||||
if catLinkSig(c) == catLinkSig(base) {
|
||||
t.Errorf("%s did not change the signature — the rig would never reconnect", name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The share server is the thing WSJT-X actually holds a socket to: restarting
|
||||
// it is what produced the error box, so it has a signature of its own.
|
||||
func TestCatShareSig(t *testing.T) {
|
||||
base := CATSettings{Enabled: true, ShareEnabled: true, ShareProto: "rigctl", SharePort: 4532}
|
||||
other := base
|
||||
other.FlexHost = "10.0.0.5" // a rig-link change must not restart the server
|
||||
if catShareSig(base) != catShareSig(other) {
|
||||
t.Errorf("a rig-link change restarted the share server")
|
||||
}
|
||||
moved := base
|
||||
moved.SharePort = 4533
|
||||
if catShareSig(base) == catShareSig(moved) {
|
||||
t.Errorf("a new port must restart the server")
|
||||
}
|
||||
off := base
|
||||
off.ShareEnabled = false
|
||||
if catShareSig(off) != "off" || catShareSig(off) == catShareSig(base) {
|
||||
t.Errorf("switching sharing off must be a change")
|
||||
}
|
||||
// CAT off means the server has nothing to serve, whatever the share fields say.
|
||||
catOff := base
|
||||
catOff.Enabled = false
|
||||
if catShareSig(catOff) != "off" {
|
||||
t.Errorf("share signature with CAT off = %q, want \"off\"", catShareSig(catOff))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user