From 2e4cd3cc65aba8b9fdf5334a0bdfbe638ee0ce29 Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Thu, 4 Jun 2026 15:49:18 +0300 Subject: [PATCH] Phase 3 (batch 7): route CTun toggle through controller command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Первая команда тяжёлого класса. TRadioController.SetCTun несёт логику движка/сети (band cache, при выключении — центрирование на VFO + SetShift(0) + UpdateState/SendFullHP); все нужные поля и хелперы XvtrTranslate/ ActiveTXFreqHz уже в контроллере. BtnCTunClick — тонкая обёртка (SetCTun(not FCTun)); рендер (StyleButton/SyncSpecViewFreq/перерисовка спектра+водопада) ушёл в OnControllerState(rfCTun). Прямые записи FController.FCTun в путях band restore / ActivateVfo оставлены — мигрируют со своими командами (Band/VFO). Co-Authored-By: Claude Opus 4.8 --- MainForm.pas | 37 ++++++++++++------------------------- RadioController.pas | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index b8dab68..e213000 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -1444,6 +1444,15 @@ begin FSpecView.DrawSpectrum; PbSpectrum.Invalidate; end; + rfCTun: + begin + StyleButton(BtnCTun, FController.FCTun); + SyncSpecViewFreq; + FSpecView.DrawSpectrum; + FSpecView.DrawWaterfall; + PbSpectrum.Invalidate; + PbWaterfall.Invalidate; + end; rfWfAGC: FSpecView.WfAGCEnabled := FController.FWfAGCEnabled; rfWfNF: @@ -4733,31 +4742,9 @@ end; // --------------------------------------------------------------------------- procedure TMainForm.BtnCTunClick(Sender: TObject); begin - FController.FCTun := not FController.FCTun; - StyleButton(BtnCTun, FController.FCTun); - FController.FBandCache[FController.FCurrentBand].CTun := FController.FCTun; - if not FController.FCTun then - begin - // Выключили CTUN: центрируемся на VFO, shift=0 - FController.FCenterFreq := FController.FVfoA; - if FController.FWDSPReady then - FController.FDSPEngine.SetShift(0.0); - if FController.FNetwork.Connected and FController.FNetwork.Running then - begin - FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), FController.FDriveLevel, FController.FTransmitting, True, True); - FController.FNetwork.SendFullHP; - end; - end - else - begin - // Включили CTUN: фиксируем текущее положение дисплея - // FController.FCenterFreq остаётся как есть — спектр не прыгает - end; - SyncSpecViewFreq; - FSpecView.DrawSpectrum; - FSpecView.DrawWaterfall; - PbSpectrum.Invalidate; - PbWaterfall.Invalidate; + // Логика (band cache, center/shift, сеть) — в контроллере; рендер — в + // OnControllerState(rfCTun). + FController.SetCTun(not FController.FCTun); end; // --------------------------------------------------------------------------- diff --git a/RadioController.pas b/RadioController.pas index 1f959cd..cb66eca 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -499,7 +499,24 @@ procedure TRadioController.SetSampleRate(Hz: Integer); begin FSampleRate := Hz; Changed(rfSampleRate); { TODO wiring: RecreateDSPEngine } end; procedure TRadioController.SetCTun(On_: Boolean); -begin FCTun := On_; Changed(rfCTun); { TODO wiring } end; +begin + FCTun := On_; + FBandCache[FCurrentBand].CTun := FCTun; + if not FCTun then + begin + // Выключили CTUN: центрируемся на VFO, shift=0. (Включение CTUN не трогает + // движок — FCenterFreq остаётся как есть, спектр не прыгает.) + FCenterFreq := FVfoA; + if FWDSPReady and Assigned(FDSPEngine) then FDSPEngine.SetShift(0.0); + if Assigned(FNetwork) and FNetwork.Connected and FNetwork.Running then + begin + FNetwork.UpdateState(XvtrTranslate(FCenterFreq), XvtrTranslate(ActiveTXFreqHz), + FDriveLevel, FTransmitting, True, True); + FNetwork.SendFullHP; + end; + end; + Changed(rfCTun); +end; procedure TRadioController.SetDuplex(On_: Boolean); begin FDisplayDuplex := On_; Changed(rfDuplex); { TODO wiring } end;