feat(udp): spot clicks switch the decoder's mode
Configure (message 15), mode field only, every other field sent as no-change: an FT4 spot clicked while WSJT-X sits in FT8 lands the operator ready to decode instead of staring at gibberish. Sent to every instance heard this session — one already in the right mode treats it as a no-op — and only for modes the decoder actually speaks (FT8/FT4/JT65/JT9/MSK144/ Q65/FST4); CW and SSB are none of its business. Toggle in the Connections panel, on by default.
This commit is contained in:
+37
-1
@@ -14,7 +14,43 @@ import (
|
||||
udp "hamlog/internal/integrations/udp"
|
||||
)
|
||||
|
||||
const keyWsjtHighlight = "udp.wsjt.highlight"
|
||||
const (
|
||||
keyWsjtHighlight = "udp.wsjt.highlight"
|
||||
keyWsjtFollowMode = "udp.wsjt.followmode" // spot clicks switch the decoder's mode
|
||||
)
|
||||
|
||||
// wsjtModes are the modes a Configure message can meaningfully ask for — the
|
||||
// decoder's own vocabulary. Anything else (CW, SSB, RTTY) is none of its
|
||||
// business and is not sent.
|
||||
var wsjtModes = map[string]bool{
|
||||
"FT8": true, "FT4": true, "JT65": true, "JT9": true,
|
||||
"MSK144": true, "Q65": true, "FST4": true, "JS8": false, // JS8Call speaks another protocol
|
||||
}
|
||||
|
||||
// GetWsjtFollowMode reports whether spot clicks retune the decoder's mode.
|
||||
func (a *App) GetWsjtFollowMode() bool {
|
||||
return a.settingOr(keyWsjtFollowMode, "1") == "1"
|
||||
}
|
||||
|
||||
// SetWsjtFollowMode flips it.
|
||||
func (a *App) SetWsjtFollowMode(on bool) {
|
||||
v := "0"
|
||||
if on {
|
||||
v = "1"
|
||||
}
|
||||
a.setSetting(keyWsjtFollowMode, v)
|
||||
}
|
||||
|
||||
// ConfigureDecoderMode asks the connected decoders to switch mode — called by
|
||||
// the frontend after a spot click has tuned the radio. A no-op for modes the
|
||||
// decoder does not speak, and when the option is off or nothing is connected.
|
||||
func (a *App) ConfigureDecoderMode(mode string) {
|
||||
mode = strings.ToUpper(strings.TrimSpace(mode))
|
||||
if a.udp == nil || !wsjtModes[mode] || !a.GetWsjtFollowMode() {
|
||||
return
|
||||
}
|
||||
a.udp.SendConfigureMode(mode)
|
||||
}
|
||||
|
||||
// The palette. Fixed colours, not theme tokens — they are painted into another
|
||||
// application's window, which has no idea what theme OpsLog wears.
|
||||
|
||||
Reference in New Issue
Block a user