feat(pans): сетка FM-каналов и шаг тюнинга на доп. панадаптерах

Доп. паны не имеют своего FMode — режим берётся со слайсов пана:
PanHasFMSlice(PanId) = есть слайс в FM/DMR/FMRAW. По нему SyncPanZoomUI
выставляет View.FMGridStepHz = FM_STEP_HZ[FFMStepIdx], как SyncSpecViewFreq
делает для главного пана (сеттер сам гасит кэши спектра и линейки).

Тюнинг слайса привязан к той же сетке:
  • колесо над слайсом/доп. паном — было зашито 12500 и только DMR/FMRAW,
    теперь FM_STEP_HZ[FFMStepIdx] во всех трёх канальных режимах (гейт FFMStepOn);
  • PanClickTune — там была та же зашитая 12500, теперь шаг режима целевого
    слайса, как в DoSpectrumClick главного пана.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 19:22:30 +03:00
co-authored by Claude Opus 4.8
parent c857aa9d4b
commit 02288292ff
2 changed files with 48 additions and 9 deletions
+16
View File
@@ -649,6 +649,7 @@ type
procedure SetSliceMute(Id: Integer; Mute: Boolean);
procedure SetSliceRxMuteOnTx(Id: Integer; On_: Boolean); // self-monitor слайса на TX
function PanPrimarySliceId(PanId: Integer): Integer; // первый созданный слайс пана
function PanHasFMSlice(PanId: Integer): Boolean; // есть слайс в канальном режиме (FM/DMR/FMRAW)?
procedure SetSliceDSP(Id, NRMode, NBMode: Integer; SNBOn, ANFOn: Boolean);
procedure SetSliceFMSquelch(Id: Integer; On_: Boolean; Level: Integer);
function SliceSMeter(Id: Integer): Double; // dBm, из DSP-потока
@@ -2093,6 +2094,21 @@ begin
Result := FSlices[i].Id;
end;
function TRadioController.PanHasFMSlice(PanId: Integer): Boolean;
// Пан «канальный», если хотя бы один его слайс сидит в FM/DMR/FMRAW: под это
// UI рисует сетку частот по шагу FFMStepIdx (как на главном панадаптере).
var i: Integer;
begin
Result := False;
for i := 0 to MAX_SLICES - 1 do
if FSlices[i].Active and (FSlices[i].PanId = PanId) and
(FSlices[i].Mode in [MODE_FM, MODE_DMR, MODE_FMRAW]) then
begin
Result := True;
Exit;
end;
end;
procedure TRadioController.SetSliceDSP(Id, NRMode, NBMode: Integer;
SNBOn, ANFOn: Boolean);
var idx: Integer;