diff --git a/MainForm.pas b/MainForm.pas index b4e2523..d660abe 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -1284,6 +1284,28 @@ begin PbWaterfall.Invalidate; if PbRuler <> nil then PbRuler.Invalidate; end; + rfDuplex: + begin + // Единая точка рендера DUP — для кнопки И для авто-вкл в QO-100 (оба идут + // через SetDuplex → rfDuplex). Раньше QO-100 включал DUP, но кнопку не + // подсвечивал → визуал расходился с состоянием. + if BtnDUP <> nil then StyleButton(BtnDUP, FController.FDisplayDuplex); + // На передаче переключаем источник пикселей и сбрасываем буферы, чтобы + // старые TX/RX bin'ы не оставались на следующем кадре. + if FController.FTransmitting then + begin + if FController.FWDSPReady then + FController.FDSPEngine.SetDisplaySourceTX(not FController.FDisplayDuplex); + FSpecView.TXMode := FController.FTransmitting and not FController.FDisplayDuplex; + FSpecView.ResetSpectrumBuf; + FSpecView.ResetWfAvgBuf; + ApplySpecViewGridFromState; + FSpecView.DrawSpectrum; + FSpecView.DrawWaterfall; + PbSpectrum.Invalidate; + PbWaterfall.Invalidate; + end; + end; rfWfAGC: FSpecView.WfAGCEnabled := FController.FWfAGCEnabled; rfWfNF: @@ -3989,23 +4011,10 @@ end; // --------------------------------------------------------------------------- procedure TMainForm.ApplyDUP(Active: Boolean); begin - FController.FDisplayDuplex := Active; - StyleButton(BtnDUP, FController.FDisplayDuplex); - // Если сейчас идёт передача — переключаем источник пикселей и сбрасываем - // буферы, чтобы старые TX/RX bin'ы не оставались на следующем кадре. - if FController.FTransmitting then - begin - if FController.FWDSPReady then - FController.FDSPEngine.SetDisplaySourceTX(not FController.FDisplayDuplex); - FSpecView.TXMode := FController.FTransmitting and not FController.FDisplayDuplex; - FSpecView.ResetSpectrumBuf; - FSpecView.ResetWfAvgBuf; - ApplySpecViewGridFromState; - FSpecView.DrawSpectrum; - FSpecView.DrawWaterfall; - PbSpectrum.Invalidate; - PbWaterfall.Invalidate; - end; + // Единый путь: контроллер ставит FDisplayDuplex + KeepRXDuringTX (живьём) и шлёт + // rfDuplex → там рендер кнопки/дисплея. Так тумблер и QO-100-авто согласованы + // (раньше кнопка писала FDisplayDuplex напрямую, минуя KeepRXDuringTX и rfDuplex). + FController.SetDuplex(Active); end; procedure TMainForm.BtnDUPClick(Sender: TObject);