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;