feat(vfo): кнопка SQL + ползунок FM-squelch в DSP-меню флага (main + слайсы)

В fly-out DSP появляется ряд SQL (тумблер + порог 0..100) только в режиме FM.
Squelch работает per-slice: у слайсов свои WDSP-каналы, поэтому добавлены
поля/сеттеры FMSQ в TSliceChan/TCtrlSlice, ApplyFMSQToChan и восстановление
при переоткрытии канала. Роутинг события по SliceId (0=RXA, иначе слайс).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 12:51:02 +03:00
co-authored by Claude Opus 4.8
parent ce9cfd730f
commit b2b3339a2a
4 changed files with 158 additions and 2 deletions
+33
View File
@@ -169,6 +169,8 @@ type
NBMode: Integer; // 0=off,1=NB,2=NB2
SNBOn: Boolean;
ANFOn: Boolean;
FMSQOn: Boolean; // FM-шумоподавитель (squelch) включён
FMSQLevel: Integer; // порог squelch 0..100
SMeter: Double; // последнее показание S-метра канала (dBm), пишет DSP-поток
Opened: Boolean; // WDSP-канал реально открыт (после Open движка)
end;
@@ -384,6 +386,7 @@ type
procedure ApplyNBToChan(Chan, NBMode: Integer);
procedure ApplySNBToChan(Chan: Integer; On_: Boolean);
procedure ApplyANFToChan(Chan: Integer; On_: Boolean);
procedure ApplyFMSQToChan(Chan: Integer; Enable: Boolean; Level: Integer);
procedure ApplyNoiseFilterState;
procedure ProcessTXBlock; // вызывается из TTXDSPThread
procedure FeedTXDisplaySample(const I, Q: Double);
@@ -421,6 +424,7 @@ type
procedure SetSliceNBMode(Id, Mode: Integer);
procedure SetSliceSNB(Id: Integer; On_: Boolean);
procedure SetSliceANF(Id: Integer; On_: Boolean);
procedure SetSliceFMSquelch(Id: Integer; Enable: Boolean; Level: Integer);
function GetSliceSMeter(Id: Integer): Double;
function SliceCount: Integer;
function HasSlice(Id: Integer): Boolean;
@@ -1560,6 +1564,7 @@ begin
ApplyNBToChan(Chan, FSlices[Idx].NBMode);
ApplySNBToChan(Chan, FSlices[Idx].SNBOn);
ApplyANFToChan(Chan, FSlices[Idx].ANFOn);
ApplyFMSQToChan(Chan, FSlices[Idx].FMSQOn, FSlices[Idx].FMSQLevel);
SetRXAPanelGain1(Chan, FSlices[Idx].Volume);
SetRXAPanelSelect(Chan, 3);
SetRXAPanelRun(Chan, 1);
@@ -1797,6 +1802,21 @@ begin
end;
end;
procedure TWDSPEngine.SetSliceFMSquelch(Id: Integer; Enable: Boolean; Level: Integer);
var idx: Integer;
begin
FSliceLock.Enter;
try
idx := FindSliceIdx(Id); if idx < 0 then Exit;
FSlices[idx].FMSQOn := Enable;
FSlices[idx].FMSQLevel := Level;
if FSlices[idx].Opened then
ApplyFMSQToChan(FSlices[idx].Chan, Enable, Level);
finally
FSliceLock.Leave;
end;
end;
function TWDSPEngine.GetSliceSMeter(Id: Integer): Double;
var idx: Integer;
begin
@@ -1985,6 +2005,19 @@ begin
SetRXAANFRun(Chan, Ord(On_));
end;
// FM-squelch на произвольном канале (RXA или слайс). Порог 0..100 → 0.0..0.5,
// как в SetFMSquelch для главного приёмника.
procedure TWDSPEngine.ApplyFMSQToChan(Chan: Integer; Enable: Boolean; Level: Integer);
begin
if Enable then
begin
SetRXAFMSQThreshold(Chan, Level / 200.0);
SetRXAFMSQRun(Chan, 1);
end
else
SetRXAFMSQRun(Chan, 0);
end;
procedure TWDSPEngine.ApplyNRState;
begin
if not FInitialized then Exit;