From f76533f209aaf5f8269321e33af34b19ad4740fc Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Thu, 4 Jun 2026 11:33:45 +0300 Subject: [PATCH] Phase 3 (batch 2): route AGC mode through controller command TRadioController.SetAGCMode now owns the index->WDSP mapping, applies to the DSP engine, and updates the band cache, then fires OnStateChanged. OnControllerState restyles the AGC button group. BtnAGCModeClick, OnVfoOverlayAGCChange, and SyncWebAGC all call the command. Fixes a latent web bug: SyncWebAGC used TWDSPAGCMode(index) directly, mapping the UI index (0=FAST..4=OFF) onto the wrong enum (0=OFF...), so web AGC selections set the wrong DSP mode. The button/overlay path used the correct AGCModes[] array; unifying on the command applies that to web too. Buttons/overlay behavior unchanged. Builds clean (cocoa). Co-Authored-By: Claude Opus 4.8 --- MainForm.pas | 35 ++++++++--------------------------- RadioController.pas | 12 +++++++++++- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index 13fd1d0..77339dc 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -1420,6 +1420,8 @@ end; // маршалятся адаптерами). FSyncingFromController защищает от рекурсии, когда // программное изменение виджета триггерит его OnChange. procedure TMainForm.OnControllerState(Sender: TObject; Field: TRadioField); +var + i: Integer; begin FSyncingFromController := True; try @@ -1435,6 +1437,8 @@ begin rfNB: UpdateNBButton; rfSNB: UpdateSNBButton; rfANF: UpdateANFButton; + rfAGCMode: + for i := 0 to 4 do StyleButton(BtnAGCMode[i], i = FController.FAGCMode); end; finally FSyncingFromController := False; @@ -6086,16 +6090,8 @@ begin end; procedure TMainForm.OnVfoOverlayAGCChange(AGCMode: Integer); -const - AGCModes: array[0..4] of TWDSPAGCMode = (agcFast, agcMedium, agcSlow, agcLong, agcOff); -var - I: Integer; begin - FController.FAGCMode := AGCMode; - for I := 0 to 4 do StyleButton(BtnAGCMode[I], I = AGCMode); - if FController.FWDSPReady then - FController.FDSPEngine.SetAGC(AGCModes[AGCMode], 50.0); - FController.FBandCache[FController.FCurrentBand].AGCMode := FController.FAGCMode; + FController.SetAGCMode(AGCMode); end; procedure TMainForm.OnVfoOverlayInvalidate(Sender: TObject); @@ -6292,14 +6288,8 @@ begin end; procedure TMainForm.SyncWebAGC; -var i: Integer; begin - if (FWebSyncInt < 0) or (FWebSyncInt > 4) then Exit; - FController.FAGCMode := FWebSyncInt; - for i := 0 to 4 do StyleButton(BtnAGCMode[i], i = FController.FAGCMode); - if FController.FWDSPReady then - FController.FDSPEngine.SetAGC(TWDSPAGCMode(FController.FAGCMode), 50.0); - FController.FBandCache[FController.FCurrentBand].AGCMode := FController.FAGCMode; + FController.SetAGCMode(FWebSyncInt); // единый маппинг (исправляет старый web-баг) end; procedure TMainForm.WebOnAGCTop(DB: Integer); @@ -7296,18 +7286,9 @@ end; procedure TMainForm.BtnAGCModeClick(Sender: TObject); -const - AGCModes: array[0..4] of TWDSPAGCMode = ( - agcFast, agcMedium, agcSlow, agcLong, agcOff); -var - i, N: Integer; begin - N := (Sender as TFlatButton).Tag; - FController.FAGCMode := N; - for i := 0 to 4 do StyleButton(BtnAGCMode[i], i = N); - if FController.FWDSPReady then - FController.FDSPEngine.SetAGC(AGCModes[N], 50.0); - FController.FBandCache[FController.FCurrentBand].AGCMode := FController.FAGCMode; + if FSyncingFromController then Exit; + FController.SetAGCMode((Sender as TFlatButton).Tag); end; procedure TMainForm.TrkAGCChange(Sender: TObject); diff --git a/RadioController.pas b/RadioController.pas index 57ab600..44ac962 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -382,7 +382,17 @@ procedure TRadioController.SetFilterBW(BWHz: Integer); begin FFilterBW := BWHz; Changed(rfFilterBW); { TODO wiring } end; procedure TRadioController.SetAGCMode(M: Integer); -begin FAGCMode := M; Changed(rfAGCMode); { TODO wiring: FDSPEngine.SetAGC } end; +const + // UI-индекс 0..4 (FAST/MED/SLOW/LONG/OFF) -> WDSP enum. Единый маппинг для + // всех фронтендов (раньше web ошибочно кастовал индекс прямо в enum). + AGCModes: array[0..4] of TWDSPAGCMode = (agcFast, agcMedium, agcSlow, agcLong, agcOff); +begin + if (M < 0) or (M > 4) then Exit; + FAGCMode := M; + if FWDSPReady and Assigned(FDSPEngine) then FDSPEngine.SetAGC(AGCModes[M], 50.0); + FBandCache[FCurrentBand].AGCMode := FAGCMode; + Changed(rfAGCMode); +end; procedure TRadioController.SetAGCTop(DB: Integer); begin FAGCTop := DB; Changed(rfAGCTop); { TODO wiring } end;