diff --git a/MainForm.pas b/MainForm.pas index 9f573f1..37ddad8 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -5628,16 +5628,9 @@ begin end; procedure TMainForm.SyncWebMode; -var i: Integer; begin if (FWebSyncInt < 0) or (FWebSyncInt >= MODE_COUNT) then Exit; - FController.FMode := FWebSyncInt; - for i := 0 to MODE_COUNT - 1 do StyleButton(BtnMode[i], i = FController.FMode); - if FController.FWDSPReady then FController.FDSPEngine.SetMode(FController.FMode); - UpdateFilterButtons; - FController.ApplyModeFilter; - SyncSpecViewFreq; - FController.FBandCache[FController.FCurrentBand].Mode := FController.FMode; + FController.SetMode(FWebSyncInt); // дефолт фильтра + DSP + cache; рендер через rfMode end; procedure TMainForm.WebOnFilter(BW: Integer); @@ -5648,59 +5641,10 @@ begin end; procedure TMainForm.SyncWebFilter; -var - best, dist, i, j: Integer; - BW_arr: array[0..FILT_COUNT-1] of Integer; - Idx: Integer; begin - // Negative value = -(idx+1) means filter index was passed directly - if FWebSyncInt < 0 then - begin - Idx := (-FWebSyncInt) - 1; - if (Idx >= 0) and (Idx < FILT_COUNT) then - begin - FController.FFilter := Idx; - case FController.FMode of - 0,1: FController.FFilterBW := FILT_SSB_BW[Idx]; - 2: FController.FFilterBW := FILT_DSB_BW[Idx]; - 3,4: FController.FFilterBW := FILT_CW_BW[Idx]; - 5: if Idx < FILT_FM_COUNT then - begin - FController.FFilterBW := FILT_FM_BW[Idx]; - FController.FFMDeviation := FILT_FM_DEV[Idx]; - end; - else FController.FFilterBW := FILT_AM_BW[Idx]; - end; - for j := 0 to FILT_COUNT-1 do StyleButton(BtnFilter[j], j = FController.FFilter); - FController.ApplyModeFilter; - SyncSpecViewFreq; - FController.FBandCache[FController.FCurrentBand].FilterBW := FController.FFilterBW; - end; - Exit; - end; - // Positive value = bandwidth in Hz, find closest filter - FController.FFilterBW := FWebSyncInt; - for i := 0 to FILT_COUNT-1 do BW_arr[i] := MaxInt; - case FController.FMode of - 0,1: for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_SSB_BW[i]; - 2: for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_DSB_BW[i]; - 3,4: for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_CW_BW[i]; - 5: for i := 0 to FILT_FM_COUNT-1 do BW_arr[i] := FILT_FM_BW[i]; - else for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_AM_BW[i]; - end; - best := 0; dist := MaxInt; - for i := 0 to FILT_COUNT-1 do - if Abs(BW_arr[i] - FWebSyncInt) < dist then - begin - dist := Abs(BW_arr[i] - FWebSyncInt); - best := i; - end; - FController.FFilter := best; - if FController.FMode = 5 then FController.FFMDeviation := FILT_FM_DEV[best]; - for j := 0 to FILT_COUNT-1 do StyleButton(BtnFilter[j], j = FController.FFilter); - FController.ApplyModeFilter; - SyncSpecViewFreq; - FController.FBandCache[FController.FCurrentBand].FilterBW := FController.FFilterBW; + // Web-клиент шлёт полосу в Гц (кнопки панели фильтров = пресетные значения); + // команда применяет её и подсвечивает ближайший пресет (рендер — rfFilter). + FController.SetFilterBW(FWebSyncInt); end; procedure TMainForm.WebOnAGC(Mode: Integer); diff --git a/RadioController.pas b/RadioController.pas index c35c081..843823a 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -981,7 +981,34 @@ begin end; procedure TRadioController.SetFilterBW(BWHz: Integer); -begin FFilterBW := BWHz; Changed(rfFilterBW); { TODO wiring } end; +// Непрерывная полоса (web-ползунок): применяем запрошенный BW как есть, а +// FFilter подбираем ближайшим пресетом — только для подсветки кнопки. +var + BW_arr: array[0..FILT_COUNT-1] of Integer; + best, dist, i: Integer; +begin + FFilterBW := BWHz; + for i := 0 to FILT_COUNT-1 do BW_arr[i] := MaxInt; + case FMode of + 0, 1: for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_SSB_BW[i]; + 2: for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_DSB_BW[i]; + 3, 4: for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_CW_BW[i]; + MODE_FM: for i := 0 to FILT_FM_COUNT-1 do BW_arr[i] := FILT_FM_BW[i]; + else for i := 0 to FILT_COUNT-1 do BW_arr[i] := FILT_AM_BW[i]; + end; + best := 0; dist := MaxInt; + for i := 0 to FILT_COUNT-1 do + if Abs(BW_arr[i] - BWHz) < dist then + begin + dist := Abs(BW_arr[i] - BWHz); + best := i; + end; + FFilter := best; + if FMode = MODE_FM then FFMDeviation := FILT_FM_DEV[best]; + FBandCache[FCurrentBand].FilterBW := FFilterBW; + ApplyModeFilter; + Changed(rfFilter); +end; procedure TRadioController.ApplyAGCToEngine; const