mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user