fix: PGXL meters/auth/fan, TCI spots+click, PTT-over-CAT, CW <LOGQSO>

- PGXL: remote AUTH password; direct-link meter fallback (VITA-first) with
  250 ms poll + peak-hold; fan mode uses bare "fanmode=" (was ignored).
- TCI: spot colour sent as decimal ARGB (ExpertSDR dropped the hex string);
  spot click handled via CLICKED_ON_SPOT / RX_CLICKED_ON_SPOT to fill the entry.
- FlexRadio: clicking an OpsLog spot on the panadapter now applies the mode too.
- Filter presets: the trash icon deletes again (Radix pointer-down intercept).
- PTT hotkey: keys over CAT when a backend is active (was hijacked by a stale
  Audio-tab RTS/DTR serial setting); AltGr keys allowed; presses logged.
- CW macro <LOGQSO>: logs after the preceding CW is sent, not on the first letter.
This commit is contained in:
2026-08-04 15:55:10 +02:00
parent b3fdd0b7fa
commit 18f9b915c5
12 changed files with 277 additions and 81 deletions
+12 -5
View File
@@ -8984,15 +8984,21 @@ func (a *App) pttUnkey() {
// configured Audio → PTT method (CAT / RTS / DTR); when that is VOX/none it
// falls back to CAT keying so the hotkey still works with a plain CAT rig.
func (a *App) PTTHotkeyDown() error {
// This hotkey lives under CAT and is meant to key the rig over CAT — so prefer
// CAT whenever a backend is active. Only a rig with no CAT link falls back to
// the Audio-tab PTT method (RTS/DTR serial). Previously it always used the
// Audio method, so a stale serial PTT setting (e.g. an RTS line on a COM port
// that is no longer present) hijacked the hotkey and it failed with a serial
// error — even though the operator only ever wanted CAT.
if a.cat != nil {
return a.pttKey(AudioSettings{PTTMethod: "cat"})
}
cfg, err := a.GetAudioSettings()
if err != nil {
return err
}
if cfg.PTTMethod == "" || cfg.PTTMethod == "none" {
if a.cat == nil {
return fmt.Errorf("no PTT method configured and CAT not active")
}
cfg.PTTMethod = "cat"
return fmt.Errorf("no PTT method configured and CAT not active")
}
return a.pttKey(cfg)
}
@@ -14783,6 +14789,7 @@ type AmpConfig struct {
Transport string `json:"transport"` // "tcp" | "serial"
Host string `json:"host"`
Port int `json:"port"`
Password string `json:"password"` // PowerGenius XL remote-access code (blank on LAN); sent as AUTH like the Tuner/Antenna Genius
ComPort string `json:"com_port"`
Baud int `json:"baud"`
@@ -14931,7 +14938,7 @@ func (a *App) startAmps() {
inst := &ampInst{cfg: c}
switch {
case isPGXL:
inst.pgxl = powergenius.New(c.Host, c.Port)
inst.pgxl = powergenius.New(c.Host, c.Port, c.Password)
_ = inst.pgxl.Start()
if a.pgxl == nil {
a.pgxl = inst.pgxl