From db7ac771b183b2c64f625dcf22f1e9491d6d6e45 Mon Sep 17 00:00:00 2001 From: rouggy Date: Sun, 30 Aug 2026 02:36:46 +0200 Subject: [PATCH] feat(icom): the ATU can be taken out of line TUNE (1C 01 02) started a cycle; nothing sent the 0 that puts the tuner back through. An ATU chip beside SPLIT now toggles it, and the tuner state is read on the slow front-panel beat so the radio's own TUNER button stays in sync. --- app.go | 8 ++++++++ changelog.json | 6 ++++-- frontend/src/components/IcomPanel.tsx | 7 +++++-- frontend/wailsjs/go/main/App.d.ts | 2 ++ frontend/wailsjs/go/main/App.js | 4 ++++ frontend/wailsjs/go/models.ts | 2 ++ internal/cat/cat.go | 4 +++- internal/cat/icomserial.go | 18 ++++++++++++++++++ 8 files changed, 46 insertions(+), 5 deletions(-) diff --git a/app.go b/app.go index b63cb91..e7e2ffc 100644 --- a/app.go +++ b/app.go @@ -14533,6 +14533,14 @@ func (a *App) IcomSetSplit(on bool) error { return a.cat.IcomDo(func(ic cat.IcomController) error { return ic.SetIcomSplit(on) }) } +// IcomSetATU puts the internal tuner in or out of line. +func (a *App) IcomSetATU(on bool) error { + if a.cat == nil { + return fmt.Errorf("cat not initialized") + } + return a.cat.IcomDo(func(ic cat.IcomController) error { return ic.SetATU(on) }) +} + // IcomSetSplitOffset turns split on with a chosen TX offset (Hz) — the // console's +1/+5/+10 kHz buttons. func (a *App) IcomSetSplitOffset(hz int64) error { diff --git a/changelog.json b/changelog.json index 48e2968..d7bc2cd 100644 --- a/changelog.json +++ b/changelog.json @@ -31,7 +31,8 @@ "Icom network: a radio in standby keeps its session and the console’s ON button — the quiet-CI-V recovery was tearing the session down every 15 s, so a radio that was off when OpsLog started could never be powered on.", "Icom console: the MOX button carries your microphone on a network station, and engaging split aligns the TX VFO’s mode with the main.", "Icom console: the spectrum scope is removed. Every model streams its waveform differently — and on the IC-7760 enabling it killed the whole CI-V link, audio included. The radio’s own scope does it better.", - "Icom: any leftover waveform stream is switched off at connect — the scope flag lives in the radio and survived sessions, and its flood is what was killing the IC-7760’s CI-V link." + "Icom: any leftover waveform stream is switched off at connect — the scope flag lives in the radio and survived sessions, and its flood is what was killing the IC-7760’s CI-V link.", + "Icom console: an ATU chip beside SPLIT engages or DISENGAGES the internal tuner — TUNE started a cycle but could never take the tuner back out of line." ], "fr": [ "Console Elecraft : le S-mètre est calibré sur un vrai K3 — S9 et les +dB correspondent désormais à l’affichage de la radio (il lisait environ deux points S trop bas).", @@ -62,7 +63,8 @@ "Réseau Icom : une radio en veille garde sa session et le bouton ON de la console — la récupération du CI-V muet détruisait la session toutes les 15 s, donc une radio éteinte au lancement d’OpsLog ne pouvait jamais être allumée.", "Console Icom : le bouton MOX emporte votre micro sur une station réseau, et activer le split aligne le mode du VFO TX sur le main.", "Console Icom : le scope spectral est retiré. Chaque modèle streame sa forme d’onde différemment — et sur l’IC-7760 son activation tuait tout le lien CI-V, audio compris. Le scope de la radio fait ça mieux.", - "Icom : tout flux waveform résiduel est coupé à la connexion — le drapeau scope vit dans la radio et survivait aux sessions, et son flot est ce qui tuait le lien CI-V de l’IC-7760." + "Icom : tout flux waveform résiduel est coupé à la connexion — le drapeau scope vit dans la radio et survivait aux sessions, et son flot est ce qui tuait le lien CI-V de l’IC-7760.", + "Console Icom : une puce ATU à côté de SPLIT engage ou DÉSENGAGE le tuner interne — TUNE lançait un cycle mais ne pouvait jamais remettre le tuner hors ligne." ] }, { diff --git a/frontend/src/components/IcomPanel.tsx b/frontend/src/components/IcomPanel.tsx index 05cd022..11bc9ad 100644 --- a/frontend/src/components/IcomPanel.tsx +++ b/frontend/src/components/IcomPanel.tsx @@ -5,7 +5,7 @@ import { IcomSetAFGain, IcomSetRFGain, IcomSetNB, IcomSetNBLevel, IcomSetNR, IcomSetNRLevel, IcomSetANF, IcomSetAPF, IcomSetAGC, IcomSetPreamp, IcomSetAtt, IcomSetFilter, AudioMonitorActive, AudioStartMonitor, AudioStopMonitor, - IcomSetRFPower, IcomSetMicGain, IcomSetSplit, IcomTune, IcomConsolePTT, + IcomSetRFPower, IcomSetMicGain, IcomSetSplit, IcomTune, IcomSetATU, IcomConsolePTT, GetCATState, SetCATFrequency, SetCATMode, IcomSetRIT, IcomSetRITOn, IcomSetXITOn, IcomSetAntenna, IcomSetPBTInner, IcomSetPBTOuter, IcomSetManualNotch, IcomSetNotchPos, @@ -20,7 +20,7 @@ import { ShiftRow } from '@/components/ShiftRow'; type IcomState = { available: boolean; model?: string; mode?: string; - transmitting: boolean; split: boolean; sub_hz?: number; + transmitting: boolean; split: boolean; sub_hz?: number; atu_on?: boolean; s_meter: number; power_meter: number; swr_meter: number; rf_power: number; mic_gain: number; af_gain: number; rf_gain: number; @@ -585,6 +585,9 @@ export function IcomPanel({ onReportRST, isNetwork = false }: { onReportRST?: (r {tx ? 'TX ON' : 'MOX'} set({ split: !st.split }, () => IcomSetSplit(!st.split))} /> + {/* Tuner IN/OUT — TUNE below starts a cycle but could never take the + tuner back out of line. */} + set({ atu_on: !st.atu_on } as any, () => IcomSetATU(!st.atu_on))} />