diff --git a/changelog.json b/changelog.json index 236375b..b9513d7 100644 --- a/changelog.json +++ b/changelog.json @@ -3,12 +3,14 @@ "version": "0.20.11", "date": "2026-07-23", "en": [ + "Fixed clicking a spot / band-map entry not moving the radio on Yaesu (and other non-Icom) rigs controlled through OmniRig — e.g. the FT-891. OpsLog tuned via OmniRig's SetSimplexMode, which on these rigs returns success but silently doesn't move the VFO (mode changes worked, so it looked like a puzzle). It now also writes the VFO frequency property directly, which does move them. Icom rigs are unchanged (there SetSimplexMode is the reliable path).", "New CW keyer engine: 'Serial port (DTR=CW / RTS=PTT)'. OpsLog can now key CW by toggling a serial control line itself — the hardware-keying method N1MM/WSJT use with a Yaesu SCU-17 and generic keying interfaces — without a K1EL WinKeyer. Settings → CW Keyer → Keyer engine: pick 'Serial port', choose the keying COM port and whether CW is on DTR (PTT on RTS) or swapped. Speed, Farnsworth, lead-in/tail and PTT keying all apply; macros, auto-CQ and work exactly as with the WinKeyer. An 'Invert keying (active-LOW)' option is there for interfaces that key backwards / transmit at rest.", "Fixed the spectrum scope never displaying on the IC-7300: its CI-V waveform frames actually carry the same leading main-scope selector byte as the dual-scope IC-7610/9700, but OpsLog assumed the 7300 omitted it — so it read the frame sequence number from the wrong byte (always 0), discarded every frame, and drew nothing. The frame layout is now detected from the data itself, so the 7300 (and other single-scope Icoms) render correctly, in both center and fixed modes. The IC-7610/9700 are unaffected.", "IC-7300 scope: the center/fixed mode and edge-frequency commands now include the selector byte the rig requires, so switching the scope between center-on-VFO and fixed span from OpsLog is accepted instead of being rejected.", "Closing OpsLog no longer switches off the scope display on the radio itself: turning the scope off used to send both 'stop CI-V data' and 'display off', so quitting blanked a local IC-7300's own scope screen. It now only stops the CI-V data stream on disable and never touches the radio's display (the display-on command is sent solely when enabling)." ], "fr": [ + "Correction : cliquer un spot / une entrée de band-map ne changeait pas la fréquence sur les Yaesu (et autres radios non-Icom) pilotées via OmniRig — p. ex. le FT-891. OpsLog accordait via SetSimplexMode d'OmniRig, qui sur ces radios renvoie « OK » mais ne bouge pas le VFO (le changement de mode marchait, d'où l'énigme). Il écrit maintenant aussi directement la propriété fréquence du VFO, ce qui les fait bien QSY. Les Icom sont inchangés (là, SetSimplexMode reste la bonne méthode).", "Nouveau moteur de keyer CW : « Port série (DTR=CW / RTS=PTT) ». OpsLog peut désormais manipuler la CW en basculant lui-même une ligne de contrôle série — la méthode de keying matériel qu'utilisent N1MM/WSJT avec un Yaesu SCU-17 et les interfaces génériques — sans WinKeyer K1EL. Réglages → Keyer CW → Moteur : choisis « Port série », le port COM de keying et si la CW est sur DTR (PTT sur RTS) ou l'inverse. Vitesse, Farnsworth, lead-in/tail et PTT s'appliquent ; les macros, l'auto-CQ et fonctionnent exactement comme avec le WinKeyer. Une option « Inverser le keying (actif-BAS) » est prévue pour les interfaces qui manipulent à l'envers / émettent au repos.", "Correction du scope spectral qui ne s'affichait jamais sur l'IC-7300 : ses trames de forme d'onde CI-V portent en réalité le même octet sélecteur de scope en tête que les IC-7610/9700 (dual-scope), mais OpsLog supposait que le 7300 ne l'envoyait pas — il lisait donc le numéro de séquence de la trame sur le mauvais octet (toujours 0), jetait toutes les trames et ne dessinait rien. La disposition des trames est maintenant détectée à partir des données elles-mêmes, donc le 7300 (et les autres Icom mono-scope) s'affichent correctement, en mode centre comme en fixe. Les IC-7610/9700 ne sont pas affectés.", "Scope IC-7300 : les commandes de mode centre/fixe et de fréquences de bords incluent maintenant l'octet sélecteur requis par la radio, donc basculer le scope entre centre-sur-VFO et span fixe depuis OpsLog est accepté au lieu d'être rejeté.", diff --git a/internal/cat/omnirig.go b/internal/cat/omnirig.go index 00a55a8..29ce69f 100644 --- a/internal/cat/omnirig.go +++ b/internal/cat/omnirig.go @@ -267,12 +267,23 @@ func (o *OmniRig) SetFrequency(hz int64) error { // method (RX=TX=freq, simplex). It works on rigs — notably Icom (IC-9100) — // where direct FreqA/FreqB writes are accepted but never move the radio. // Clearing split is the right thing when tuning to a spot anyway. + simplexOK := false if _, err := oleutil.CallMethod(o.rig, "SetSimplexMode", int32(hz32)); err == nil { + simplexOK = true debugLog.Printf("OmniRig.SetFrequency: SetSimplexMode(%d) OK", hz32) } else { - debugLog.Printf("OmniRig.SetFrequency: SetSimplexMode unavailable (%v) — using property writes", err) - // Fallback: write the active VFO's property AND the generic Freq - // (always — some .ini honour only one, and split here is often misread). + debugLog.Printf("OmniRig.SetFrequency: SetSimplexMode unavailable (%v)", err) + } + + // On Yaesu / Kenwood (and anything non-Icom), SetSimplexMode frequently returns + // OK but is a SILENT NO-OP — the rig never moves. Confirmed on an FT-891 over + // OmniRig: every spot click logged "SetSimplexMode OK" yet FreqA stayed put, + // while SetMode on the same .ini worked fine (so the CAT link is healthy). + // Writing the VFO frequency PROPERTY directly DOES move them, so also do that + // here. It is skipped on Icom, where the direct write is the unreliable one and + // could nudge the wrong Main/Sub VFO — there SetSimplexMode is authoritative. + isIcom := strings.HasPrefix(strings.ToUpper(strings.TrimSpace(rigType)), "IC") + if !isIcom || !simplexOK { prop := "FreqA" switch vfo { case "B", "BB", "BA": @@ -287,7 +298,7 @@ func (o *OmniRig) SetFrequency(hz int64) error { okAny = true } } - if !okAny { + if !simplexOK && !okAny { return fmt.Errorf("OmniRig: no writable frequency property for this rig") } }