Phase 3 (batch 7): route CTun toggle through controller command

Первая команда тяжёлого класса. 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 <noreply@anthropic.com>
This commit is contained in:
Uladzimir Karpenka
2026-06-04 15:49:18 +03:00
co-authored by Claude Opus 4.8
parent d895800f62
commit 2e4cd3cc65
2 changed files with 30 additions and 26 deletions
+12 -25
View File
@@ -1444,6 +1444,15 @@ begin
FSpecView.DrawSpectrum; FSpecView.DrawSpectrum;
PbSpectrum.Invalidate; PbSpectrum.Invalidate;
end; end;
rfCTun:
begin
StyleButton(BtnCTun, FController.FCTun);
SyncSpecViewFreq;
FSpecView.DrawSpectrum;
FSpecView.DrawWaterfall;
PbSpectrum.Invalidate;
PbWaterfall.Invalidate;
end;
rfWfAGC: rfWfAGC:
FSpecView.WfAGCEnabled := FController.FWfAGCEnabled; FSpecView.WfAGCEnabled := FController.FWfAGCEnabled;
rfWfNF: rfWfNF:
@@ -4733,31 +4742,9 @@ end;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
procedure TMainForm.BtnCTunClick(Sender: TObject); procedure TMainForm.BtnCTunClick(Sender: TObject);
begin begin
FController.FCTun := not FController.FCTun; // Логика (band cache, center/shift, сеть) — в контроллере; рендер — в
StyleButton(BtnCTun, FController.FCTun); // OnControllerState(rfCTun).
FController.FBandCache[FController.FCurrentBand].CTun := FController.FCTun; FController.SetCTun(not 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;
end; end;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
+18 -1
View File
@@ -499,7 +499,24 @@ procedure TRadioController.SetSampleRate(Hz: Integer);
begin FSampleRate := Hz; Changed(rfSampleRate); { TODO wiring: RecreateDSPEngine } end; begin FSampleRate := Hz; Changed(rfSampleRate); { TODO wiring: RecreateDSPEngine } end;
procedure TRadioController.SetCTun(On_: Boolean); 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); procedure TRadioController.SetDuplex(On_: Boolean);
begin FDisplayDuplex := On_; Changed(rfDuplex); { TODO wiring } end; begin FDisplayDuplex := On_; Changed(rfDuplex); { TODO wiring } end;