fix fft, waterfall

This commit is contained in:
2026-04-22 22:09:42 +03:00
parent ae532a33cd
commit 77d380acfd
7 changed files with 1016 additions and 396 deletions
+143 -169
View File
@@ -35,9 +35,9 @@ type
const BandCal: array of Double) of object;
TOnDisplayParamChange = procedure(FFTSize, WindowType, SpecDetector,
SpecAvgMode, SpecAvgCount: Integer; SpecBackmult: Double) of object;
TOnWaterfallParamChange = procedure(WfDetector, WfAvgMode, WfAvgCount: Integer;
WfBackmult: Double) of object;
SpecAvgMode: Integer; SpecAvgTimeMS: Double) of object;
TOnWaterfallParamChange = procedure(WfDetector, WfAvgMode: Integer;
WfAvgTimeMS, WfHigh, WfLow, WfAGCOffset: Double) of object;
TOnGridParamChange = procedure(RefLevel, Range, GridStep: Double) of object;
TOnAudioDevChange = procedure(DevIndex: Integer; const DevName: string) of object;
TOnAudioInDevChange = procedure(DevIndex: Integer; const DevName: string) of object;
@@ -79,13 +79,14 @@ type
// Spectrum group
FCmbSpecDet: TComboBox;
FCmbSpecAvg: TComboBox;
FSpinSpecCount: TSpinEdit;
FEdSpecBackmult: TEdit;
FSpecAvgTime: TFloatSpinEdit;
// Waterfall group
FCmbWfDet: TComboBox;
FCmbWfAvg: TComboBox;
FSpinWfCount: TSpinEdit;
FEdWfBackmult: TEdit;
FWfAvgTime: TFloatSpinEdit;
FWfHigh: TFloatSpinEdit;
FWfLow: TFloatSpinEdit;
FWfAGCOffset: TFloatSpinEdit;
// Grid group
FEdRefLevel: TEdit;
FEdRange: TEdit;
@@ -136,12 +137,11 @@ type
procedure OnWindowChange(Sender: TObject);
procedure OnSpecDetChange(Sender: TObject);
procedure OnSpecAvgModeChange(Sender: TObject);
procedure OnSpecCountChange(Sender: TObject);
procedure OnSpecBackmultChange(Sender: TObject);
procedure OnSpecAvgTimeChange(Sender: TObject);
procedure OnWfDetChange(Sender: TObject);
procedure OnWfAvgModeChange(Sender: TObject);
procedure OnWfCountChange(Sender: TObject);
procedure OnWfBackmultChange(Sender: TObject);
procedure OnWfAvgTimeChange(Sender: TObject);
procedure OnWfThresholdChange(Sender: TObject);
procedure OnRefLevelChange(Sender: TObject);
procedure OnRangeChange(Sender: TObject);
procedure OnGridStepChange(Sender: TObject);
@@ -157,8 +157,11 @@ type
procedure FireWaterfallChange;
procedure FireGridChange;
function GetSpecBackmult: Double;
function GetWfBackmult: Double;
function GetSpecAvgTimeMS: Double;
function GetWfAvgTimeMS: Double;
function GetWfHigh: Double;
function GetWfLow: Double;
function GetWfAGCOffset: Double;
function GetRefLevel: Double;
function GetRange: Double;
function GetGridStep: Double;
@@ -169,10 +172,10 @@ type
// Заполнить элементы управления текущими значениями (без firing events)
procedure LoadValues(
FFTSize, WinType, SpecDet, SpecAvgMode, SpecAvgCount: Integer;
SpecBackmult: Double;
WfDet, WfAvgMode, WfAvgCount: Integer;
WfBackmult: Double;
FFTSize, WinType, SpecDet, SpecAvgMode: Integer;
SpecAvgTimeMS: Double;
WfDet, WfAvgMode: Integer;
WfAvgTimeMS, WfHigh, WfLow, WfAGCOffset: Double;
RefLevel, Range, GridStep: Double;
const AudioOutDevName: string;
const AudioInDevName: string);
@@ -208,9 +211,8 @@ const
CLR_ACCENT = TColor($0040FF80);
BTN_H = 24;
// FFT sizes (index → value)
FFT_SIZES: array[0..5] of Integer = (1024, 2048, 4096, 8192, 16384, 32768);
FFT_NAMES: array[0..5] of string = ('1024','2048','4096','8192','16384','32768');
FFT_SIZES: array[0..6] of Integer = (4096, 8192, 16384, 32768, 65536, 131072, 262144);
FFT_NAMES: array[0..6] of string = ('4096','8192','16384','32768','65536','131072','262144');
WINDOW_NAMES: array[0..6] of string = (
'Rectangular', '4-term Blackman-Harris', 'Hann',
@@ -219,17 +221,19 @@ const
DETECTOR_NAMES: array[0..4] of string = (
'Peak', 'Rosenfell', 'Average', 'Sample', 'RMS');
AVGMODE_NAMES: array[0..4] of string = (
'Peak Hold', 'None', 'Recursive', 'Time Window', 'Log Recursive');
// Note: AVERAGE_PEAK_HOLD=-1, NONE=0, RECURSIVE=1, TIME_WINDOW=2, LOG_RECURSIVE=3
// Index → WDSP value mapping: 0→-1, 1→0, 2→1, 3→2, 4→3
AVGMODE_VALUES: array[0..4] of Integer = (-1, 0, 1, 2, 3);
AVGMODE_NAMES: array[0..3] of string = (
'None', 'Recursive', 'Time Window', 'Log Recursive');
AVGMODE_VALUES: array[0..3] of Integer = (0, 1, 2, 3);
WF_AVGMODE_NAMES: array[0..3] of string = (
'None', 'Recursive', 'Time Window', 'Log Recursive');
WF_AVGMODE_VALUES: array[0..3] of Integer = (0, 1, 2, 3);
GRID_STEPS: array[0..4] of Double = (5.0, 10.0, 20.0, 30.0, 40.0);
GRID_STEP_NAMES: array[0..4] of string = ('5 dB','10 dB','20 dB','30 dB','40 dB');
FPS_VALUES: array[0..5] of Integer = (5, 10, 15, 20, 25, 30);
FPS_NAMES: array[0..5] of string = ('5 fps','10 fps','15 fps','20 fps','25 fps','30 fps');
FPS_VALUES: array[0..12] of Integer = (5, 10, 15, 20, 25, 30, 40, 50, 60, 75, 80, 90, 100);
FPS_NAMES: array[0..12] of string = ('5 fps','10 fps','15 fps','20 fps','25 fps','30 fps',
'40 fps','50 fps','60 fps','75 fps','80 fps','90 fps','100 fps');
PA_BAND_NAMES: array[0..10] of string =
('160m','80m','60m','40m','30m','20m','17m','15m','12m','10m','6m');
@@ -240,8 +244,8 @@ constructor TSettingsForm.Create(AOwner: TComponent);
begin
inherited CreateNew(AOwner);
Caption := 'Settings';
Width := 700;
Height := 560;
Width := 760;
Height := 640;
Position := poScreenCenter;
BorderStyle := bsSizeable;
Color := CLR_BG;
@@ -457,31 +461,20 @@ begin
end;
procedure TSettingsForm.BuildRX1Tab;
// Layout (alTop stack in FTabDispRX1):
// 8px top padding
// FFT group — full width
// 12px separator
// PnlMid — Spectrum (alLeft) | 10px gap | Waterfall (alClient), same height
// 12px separator
// Spectrum Grid group — full width
// hint (alBottom)
//
// Row step: STEP = BTN_H + 10 = 34px. Inner padding: R1 = 10.
const
R1 = 10; // top padding inside groups
LX = 10; // left margin inside group
LW = 88; // label column width
CX = LX + LW + 4; // combo/edit column start (= 102)
STEP = BTN_H + 10; // row step (= 34)
SEP = 12; // gap between groups
COLW = 328; // left column panel width
COLGAP = 10; // horizontal gap between columns
GH2 = 100; // GroupBox height for 2-row groups
GH3 = 136; // GroupBox height for 3-row groups
R1 = 12;
LX = 12;
LW = 112;
CX = LX + LW + 8;
STEP = 34;
SEP = 12;
GH_FFT = 100;
GH_SPEC = 136;
GH_WF = 170;
GH_GRID = 100;
var
PnlFFT, PnlMid, PnlL, PnlSepH, PnlR: TPanel;
PnlFFT, PnlSpec, PnlWF: TPanel;
Grp: TGroupBox;
Lbl: TLabel;
i: Integer;
function MkGrp(AParent: TWinControl; const Cap: string; AH: Integer): TGroupBox;
@@ -508,28 +501,17 @@ var
S.Height := AH;
end;
function MkEdit(AParent: TWinControl; AX, AY, AW: Integer;
AOnExit: TNotifyEvent): TEdit;
function MkFloat(AParent: TWinControl; AX, AY, AW: Integer; AValue: Double;
AMin, AMax, AInc: Double; AOnChange: TNotifyEvent): TFloatSpinEdit;
begin
Result := TEdit.Create(Self);
Result := TFloatSpinEdit.Create(Self);
Result.Parent := AParent;
Result.SetBounds(AX, AY, AW, BTN_H);
Result.Color := CLR_PANEL;
Result.Font.Color := CLR_TEXT;
Result.Font.Name := 'Courier New';
Result.Font.Size := 8;
Result.OnExit := AOnExit;
end;
function MkSpin(AParent: TWinControl; AX, AY, AW: Integer;
AOnChange: TNotifyEvent): TSpinEdit;
begin
Result := TSpinEdit.Create(Self);
Result.Parent := AParent;
Result.SetBounds(AX, AY, AW, BTN_H);
Result.MinValue := 1;
Result.MaxValue := 256;
Result.Value := 2;
Result.Value := AValue;
Result.MinValue := AMin;
Result.MaxValue := AMax;
Result.Increment := AInc;
Result.DecimalPlaces := 1;
Result.Color := CLR_PANEL;
Result.Font.Color := CLR_TEXT;
Result.Font.Name := 'Courier New';
@@ -538,24 +520,15 @@ var
end;
begin
// Hint at bottom (added first so alBottom is honoured by later alTop panels)
Lbl := MakeLbl(FTabDispRX1,
'Backmult: higher value = slower decay (range 0.0 .. 1.0)', LX, 0, 0);
Lbl.Align := alBottom;
Lbl.Height := 22;
Lbl.Font.Color := CLR_TEXTDIM;
// ── Top padding ───────────────────────────────────────────────────────────
MkSep(FTabDispRX1, 8);
// ── FFT (full width, alTop) ───────────────────────────────────────────────
PnlFFT := TPanel.Create(Self);
PnlFFT.Parent := FTabDispRX1;
PnlFFT.BevelOuter := bvNone;
PnlFFT.Color := CLR_BG;
PnlFFT.Align := alTop;
PnlFFT.Height := GH2;
Grp := MkGrp(PnlFFT, 'FFT', GH2);
PnlFFT.Height := GH_FFT;
Grp := MkGrp(PnlFFT, 'FFT / Analyzer', GH_FFT);
MakeLbl(Grp, 'FFT Size:', LX, R1+4, LW);
FCmbFFTSize := MakeCombo(Grp, CX, R1, 130, OnFFTSizeChange);
for i := 0 to High(FFT_NAMES) do FCmbFFTSize.Items.Add(FFT_NAMES[i]);
@@ -563,75 +536,70 @@ begin
FCmbWindow := MakeCombo(Grp, CX, R1+STEP, 250, OnWindowChange);
for i := 0 to High(WINDOW_NAMES) do FCmbWindow.Items.Add(WINDOW_NAMES[i]);
// ── Separator ─────────────────────────────────────────────────────────────
MkSep(FTabDispRX1, SEP);
// ── Middle row: Spectrum (left) | Waterfall (right) at the same level ─────
PnlMid := TPanel.Create(Self);
PnlMid.Parent := FTabDispRX1;
PnlMid.BevelOuter := bvNone;
PnlMid.Color := CLR_BG;
PnlMid.Align := alTop;
PnlMid.Height := GH3;
PnlL := TPanel.Create(Self);
PnlL.Parent := PnlMid;
PnlL.BevelOuter := bvNone;
PnlL.Color := CLR_BG;
PnlL.Align := alLeft;
PnlL.Width := COLW;
PnlSepH := TPanel.Create(Self);
PnlSepH.Parent := PnlMid;
PnlSepH.BevelOuter := bvNone;
PnlSepH.Color := CLR_BG;
PnlSepH.Align := alLeft;
PnlSepH.Width := COLGAP;
PnlR := TPanel.Create(Self);
PnlR.Parent := PnlMid;
PnlR.BevelOuter := bvNone;
PnlR.Color := CLR_BG;
PnlR.Align := alClient;
// ── Spectrum (left column) ────────────────────────────────────────────────
Grp := MkGrp(PnlL, 'Spectrum', GH3);
PnlSpec := TPanel.Create(Self);
PnlSpec.Parent := FTabDispRX1;
PnlSpec.BevelOuter := bvNone;
PnlSpec.Color := CLR_BG;
PnlSpec.Align := alTop;
PnlSpec.Height := GH_SPEC;
Grp := MkGrp(PnlSpec, 'Spectrum', GH_SPEC);
MakeLbl(Grp, 'Detector:', LX, R1+4, LW);
FCmbSpecDet := MakeCombo(Grp, CX, R1, 172, OnSpecDetChange);
for i := 0 to High(DETECTOR_NAMES) do FCmbSpecDet.Items.Add(DETECTOR_NAMES[i]);
MakeLbl(Grp, 'Avg Mode:', LX, R1+STEP+4, LW);
FCmbSpecAvg := MakeCombo(Grp, CX, R1+STEP, 172, OnSpecAvgModeChange);
for i := 0 to High(AVGMODE_NAMES) do FCmbSpecAvg.Items.Add(AVGMODE_NAMES[i]);
MakeLbl(Grp, 'Avg Count:', LX, R1+2*STEP+4, LW);
FSpinSpecCount := MkSpin(Grp, CX, R1+2*STEP, 72, OnSpecCountChange);
MakeLbl(Grp, 'Backmult:', CX+78, R1+2*STEP+4, 64);
FEdSpecBackmult := MkEdit(Grp, CX+78+68, R1+2*STEP, 74, OnSpecBackmultChange);
FEdSpecBackmult.Text := '0.45';
MakeLbl(Grp, 'Avg Time (ms):', LX, R1+2*STEP+4, LW);
FSpecAvgTime := MkFloat(Grp, CX, R1+2*STEP, 92, 120.0, 0.0, 5000.0, 10.0, OnSpecAvgTimeChange);
// ── Waterfall (right column) ──────────────────────────────────────────────
Grp := MkGrp(PnlR, 'Waterfall', GH3);
MkSep(FTabDispRX1, SEP);
PnlWF := TPanel.Create(Self);
PnlWF.Parent := FTabDispRX1;
PnlWF.BevelOuter := bvNone;
PnlWF.Color := CLR_BG;
PnlWF.Align := alTop;
PnlWF.Height := GH_WF;
Grp := MkGrp(PnlWF, 'Waterfall', GH_WF);
MakeLbl(Grp, 'Detector:', LX, R1+4, LW);
FCmbWfDet := MakeCombo(Grp, CX, R1, 172, OnWfDetChange);
for i := 0 to High(DETECTOR_NAMES) do FCmbWfDet.Items.Add(DETECTOR_NAMES[i]);
MakeLbl(Grp, 'Avg Mode:', LX, R1+STEP+4, LW);
FCmbWfAvg := MakeCombo(Grp, CX, R1+STEP, 172, OnWfAvgModeChange);
for i := 0 to High(AVGMODE_NAMES) do FCmbWfAvg.Items.Add(AVGMODE_NAMES[i]);
MakeLbl(Grp, 'Avg Count:', LX, R1+2*STEP+4, LW);
FSpinWfCount := MkSpin(Grp, CX, R1+2*STEP, 72, OnWfCountChange);
MakeLbl(Grp, 'Backmult:', CX+78, R1+2*STEP+4, 64);
FEdWfBackmult := MkEdit(Grp, CX+78+68, R1+2*STEP, 74, OnWfBackmultChange);
FEdWfBackmult.Text := '0.45';
for i := 0 to High(WF_AVGMODE_NAMES) do FCmbWfAvg.Items.Add(WF_AVGMODE_NAMES[i]);
MakeLbl(Grp, 'Avg Time (ms):', LX, R1+2*STEP+4, LW);
FWfAvgTime := MkFloat(Grp, CX, R1+2*STEP, 92, 120.0, 0.0, 5000.0, 10.0, OnWfAvgTimeChange);
MakeLbl(Grp, 'High (dBm):', LX, R1+3*STEP+4, LW);
FWfHigh := MkFloat(Grp, CX, R1+3*STEP, 92, -80.0, -160.0, 20.0, 1.0, OnWfThresholdChange);
MakeLbl(Grp, 'Low (dBm):', CX+120, R1+3*STEP+4, 72);
FWfLow := MkFloat(Grp, CX+196, R1+3*STEP, 92, -130.0, -180.0, 0.0, 1.0, OnWfThresholdChange);
MakeLbl(Grp, 'AGC Offset:', LX, R1+4*STEP+4, LW);
FWfAGCOffset := MkFloat(Grp, CX, R1+4*STEP, 92, 0.0, -40.0, 40.0, 0.5, OnWfThresholdChange);
// ── Separator ─────────────────────────────────────────────────────────────
MkSep(FTabDispRX1, SEP);
// ── Spectrum Grid (full width, alTop) ─────────────────────────────────────
Grp := MkGrp(FTabDispRX1, 'Spectrum Grid', GH2);
Grp := MkGrp(FTabDispRX1, 'Spectrum Grid', GH_GRID);
MakeLbl(Grp, 'Ref Level (dBm):', LX, R1+4, 116);
FEdRefLevel := MkEdit(Grp, LX+120, R1, 80, OnRefLevelChange);
FEdRefLevel := TEdit.Create(Self);
FEdRefLevel.Parent := Grp;
FEdRefLevel.SetBounds(LX+120, R1, 80, BTN_H);
FEdRefLevel.Color := CLR_PANEL;
FEdRefLevel.Font.Color := CLR_TEXT;
FEdRefLevel.Font.Name := 'Courier New';
FEdRefLevel.Font.Size := 8;
FEdRefLevel.OnExit := OnRefLevelChange;
FEdRefLevel.Text := '-20';
MakeLbl(Grp, 'Range (dB):', LX, R1+STEP+4, LW);
FEdRange := MkEdit(Grp, CX, R1+STEP, 80, OnRangeChange);
FEdRange := TEdit.Create(Self);
FEdRange.Parent := Grp;
FEdRange.SetBounds(CX, R1+STEP, 80, BTN_H);
FEdRange.Color := CLR_PANEL;
FEdRange.Font.Color := CLR_TEXT;
FEdRange.Font.Name := 'Courier New';
FEdRange.Font.Size := 8;
FEdRange.OnExit := OnRangeChange;
FEdRange.Text := '110';
MakeLbl(Grp, 'Grid Step:', CX+90, R1+STEP+4, 72);
FCmbGridStep := MakeCombo(Grp, CX+90+76, R1+STEP, 80, OnGridStepChange);
@@ -656,10 +624,10 @@ end;
// ---------------------------------------------------------------------------
procedure TSettingsForm.LoadValues(
FFTSize, WinType, SpecDet, SpecAvgMode, SpecAvgCount: Integer;
SpecBackmult: Double;
WfDet, WfAvgMode, WfAvgCount: Integer;
WfBackmult: Double;
FFTSize, WinType, SpecDet, SpecAvgMode: Integer;
SpecAvgTimeMS: Double;
WfDet, WfAvgMode: Integer;
WfAvgTimeMS, WfHigh, WfLow, WfAGCOffset: Double;
RefLevel, Range, GridStep: Double;
const AudioOutDevName: string;
const AudioInDevName: string);
@@ -669,7 +637,7 @@ begin
FLoading := True;
try
// FFT Size
Idx := 2; // default 4096
Idx := 0; // default 4096
for i := 0 to High(FFT_SIZES) do
if FFT_SIZES[i] = FFTSize then begin Idx := i; Break; end;
FCmbFFTSize.ItemIndex := Idx;
@@ -678,7 +646,7 @@ begin
if (WinType >= 0) and (WinType < FCmbWindow.Items.Count) then
FCmbWindow.ItemIndex := WinType
else
FCmbWindow.ItemIndex := 5; // Kaiser
FCmbWindow.ItemIndex := 2; // Hann
// Spectrum Detector
if (SpecDet >= 0) and (SpecDet < FCmbSpecDet.Items.Count) then
@@ -687,13 +655,11 @@ begin
FCmbSpecDet.ItemIndex := 0;
// Spectrum Avg Mode (WDSP value → combo index)
Idx := 2; // default Recursive
Idx := 0; // default None
for i := 0 to High(AVGMODE_VALUES) do
if AVGMODE_VALUES[i] = SpecAvgMode then begin Idx := i; Break; end;
FCmbSpecAvg.ItemIndex := Idx;
FSpinSpecCount.Value := EnsureRange(SpecAvgCount, 1, 256);
FEdSpecBackmult.Text := FormatFloat('0.##', SpecBackmult);
FSpecAvgTime.Value := EnsureRange(SpecAvgTimeMS, 0.0, 5000.0);
// Waterfall Detector
if (WfDet >= 0) and (WfDet < FCmbWfDet.Items.Count) then
@@ -702,13 +668,14 @@ begin
FCmbWfDet.ItemIndex := 2; // Average
// Waterfall Avg Mode
Idx := 4; // default Log Recursive
for i := 0 to High(AVGMODE_VALUES) do
if AVGMODE_VALUES[i] = WfAvgMode then begin Idx := i; Break; end;
Idx := 1; // default Recursive
for i := 0 to High(WF_AVGMODE_VALUES) do
if WF_AVGMODE_VALUES[i] = WfAvgMode then begin Idx := i; Break; end;
FCmbWfAvg.ItemIndex := Idx;
FSpinWfCount.Value := EnsureRange(WfAvgCount, 1, 256);
FEdWfBackmult.Text := FormatFloat('0.##', WfBackmult);
FWfAvgTime.Value := EnsureRange(WfAvgTimeMS, 0.0, 5000.0);
FWfHigh.Value := EnsureRange(WfHigh, -160.0, 20.0);
FWfLow.Value := EnsureRange(WfLow, -180.0, 0.0);
FWfAGCOffset.Value := EnsureRange(WfAGCOffset, -40.0, 40.0);
// Grid
FEdRefLevel.Text := FormatFloat('0.#', RefLevel);
@@ -817,20 +784,29 @@ begin
Result := 4096;
end;
function TSettingsForm.GetSpecBackmult: Double;
var V: Double; Err: Integer;
function TSettingsForm.GetSpecAvgTimeMS: Double;
begin
Val(FEdSpecBackmult.Text, V, Err);
if Err <> 0 then V := 0.45;
Result := EnsureRange(V, 0.0, 1.0);
Result := EnsureRange(FSpecAvgTime.Value, 0.0, 5000.0);
end;
function TSettingsForm.GetWfBackmult: Double;
var V: Double; Err: Integer;
function TSettingsForm.GetWfAvgTimeMS: Double;
begin
Val(FEdWfBackmult.Text, V, Err);
if Err <> 0 then V := 0.45;
Result := EnsureRange(V, 0.0, 1.0);
Result := EnsureRange(FWfAvgTime.Value, 0.0, 5000.0);
end;
function TSettingsForm.GetWfHigh: Double;
begin
Result := EnsureRange(FWfHigh.Value, -160.0, 20.0);
end;
function TSettingsForm.GetWfLow: Double;
begin
Result := EnsureRange(FWfLow.Value, -180.0, 0.0);
end;
function TSettingsForm.GetWfAGCOffset: Double;
begin
Result := EnsureRange(FWfAGCOffset.Value, -40.0, 40.0);
end;
function TSettingsForm.GetRefLevel: Double;
@@ -880,8 +856,7 @@ begin
FCmbWindow.ItemIndex,
FCmbSpecDet.ItemIndex,
AvgVal,
FSpinSpecCount.Value,
GetSpecBackmult);
GetSpecAvgTimeMS);
end;
procedure TSettingsForm.FireWaterfallChange;
@@ -892,15 +867,17 @@ begin
if FLoading then Exit;
if not Assigned(FOnWaterfallChange) then Exit;
AvgIdx := FCmbWfAvg.ItemIndex;
if (AvgIdx >= 0) and (AvgIdx <= High(AVGMODE_VALUES)) then
AvgVal := AVGMODE_VALUES[AvgIdx]
if (AvgIdx >= 0) and (AvgIdx <= High(WF_AVGMODE_VALUES)) then
AvgVal := WF_AVGMODE_VALUES[AvgIdx]
else
AvgVal := 3;
AvgVal := 1;
FOnWaterfallChange(
FCmbWfDet.ItemIndex,
AvgVal,
FSpinWfCount.Value,
GetWfBackmult);
GetWfAvgTimeMS,
GetWfHigh,
GetWfLow,
GetWfAGCOffset);
end;
procedure TSettingsForm.FireGridChange;
@@ -926,10 +903,7 @@ begin FireDisplayChange; end;
procedure TSettingsForm.OnSpecAvgModeChange(Sender: TObject);
begin FireDisplayChange; end;
procedure TSettingsForm.OnSpecCountChange(Sender: TObject);
begin FireDisplayChange; end;
procedure TSettingsForm.OnSpecBackmultChange(Sender: TObject);
procedure TSettingsForm.OnSpecAvgTimeChange(Sender: TObject);
begin FireDisplayChange; end;
procedure TSettingsForm.OnWfDetChange(Sender: TObject);
@@ -938,10 +912,10 @@ begin FireWaterfallChange; end;
procedure TSettingsForm.OnWfAvgModeChange(Sender: TObject);
begin FireWaterfallChange; end;
procedure TSettingsForm.OnWfCountChange(Sender: TObject);
procedure TSettingsForm.OnWfAvgTimeChange(Sender: TObject);
begin FireWaterfallChange; end;
procedure TSettingsForm.OnWfBackmultChange(Sender: TObject);
procedure TSettingsForm.OnWfThresholdChange(Sender: TObject);
begin FireWaterfallChange; end;
procedure TSettingsForm.OnRefLevelChange(Sender: TObject);