start work tx

This commit is contained in:
2026-03-26 22:50:55 +03:00
parent 7664907b3e
commit ae532a33cd
9 changed files with 1373 additions and 149 deletions
+173
View File
@@ -30,6 +30,10 @@ uses
FlatButton, AudioOutput, AudioInput;
type
// PA: MaxPower в Вт, BandCal[0..10] — калибровка 38.8..100.0 на диапазон
TOnPASettingsChange = procedure(MaxPower: Double;
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;
@@ -92,10 +96,15 @@ type
FChkShowWaterfall: TCheckBox;
FCmbFPS: TComboBox;
// ---- PA Settings tab controls ----
FEdMaxPower: TSpinEdit;
FEdBandCal: array[0..10] of TFloatSpinEdit;
// ---- Close button ----
FBtnClose: TFlatButton;
// ---- Callbacks ----
FOnPAChange: TOnPASettingsChange;
FOnDisplayChange: TOnDisplayParamChange;
FOnWaterfallChange: TOnWaterfallParamChange;
FOnGridChange: TOnGridParamChange;
@@ -111,6 +120,7 @@ type
procedure BuildAudioTab;
procedure BuildDisplayTab;
procedure BuildRX1Tab;
procedure BuildPATab;
procedure ApplyTheme;
// Helpers
@@ -139,6 +149,8 @@ type
procedure OnTXDevChange(Sender: TObject);
procedure OnVisibilityChkChange(Sender: TObject);
procedure OnFPSCmbChange(Sender: TObject);
procedure OnMaxPowerChange(Sender: TObject);
procedure OnBandCalChange(Sender: TObject);
procedure BtnCloseClick(Sender: TObject);
procedure FireDisplayChange;
@@ -171,7 +183,10 @@ type
procedure LoadVisibility(ShowSpectrum, ShowWaterfall: Boolean);
// Загрузить текущий FPS (без fire события)
procedure LoadFPS(FPS: Integer);
// Загрузить PA настройки (без fire событий)
procedure LoadPASettings(MaxPower: Double; const BandCal: array of Double);
property OnPAChange: TOnPASettingsChange read FOnPAChange write FOnPAChange;
property OnDisplayChange: TOnDisplayParamChange read FOnDisplayChange write FOnDisplayChange;
property OnWaterfallChange: TOnWaterfallParamChange read FOnWaterfallChange write FOnWaterfallChange;
property OnGridChange: TOnGridParamChange read FOnGridChange write FOnGridChange;
@@ -216,6 +231,9 @@ const
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');
PA_BAND_NAMES: array[0..10] of string =
('160m','80m','60m','40m','30m','20m','17m','15m','12m','10m','6m');
{ TSettingsForm }
constructor TSettingsForm.Create(AOwner: TComponent);
@@ -312,6 +330,7 @@ begin
BuildAudioTab;
BuildDisplayTab;
BuildPATab;
// Close button
FBtnClose := TFlatButton.Create(Self);
@@ -1030,6 +1049,160 @@ begin
end;
end;
// ---------------------------------------------------------------------------
// BuildPATab — вкладка PA Settings: MaxPower + per-band calibration
// ---------------------------------------------------------------------------
procedure TSettingsForm.BuildPATab;
const
LBL_W = 46; // ширина метки диапазона
ED_W = 72; // ширина SpinEdit (с кнопками)
COL_W = LBL_W + ED_W + 8; // ширина одной пары
COLS = 4; // колонок на строку
ROW_H = 32; // высота строки (spin edits чуть выше plain edit)
GRP_PAD = 12; // отступ внутри группы
GRP_TOP = 24; // высота caption группы
ROWS = 3; // строк для 11 диапазонов (ceil(11/4))
function MakeFloatSpin(AParent: TWinControl; ALeft, ATop: Integer;
AChange: TNotifyEvent): TFloatSpinEdit;
var E: TFloatSpinEdit;
begin
E := TFloatSpinEdit.Create(Self);
E.Parent := AParent;
E.SetBounds(ALeft, ATop, ED_W, BTN_H + 2);
E.Color := CLR_PANEL;
E.Font.Color := CLR_TEXT;
E.Font.Name := 'Courier New';
E.Font.Size := 8;
E.MinValue := 38.8;
E.MaxValue := 100.0;
E.Increment := 0.1;
E.DecimalPlaces := 1;
E.Value := 100.0;
E.OnChange := AChange;
Result := E;
end;
var
Grp: TGroupBox;
Sep: TPanel;
Lbl: TLabel;
Spin: TSpinEdit;
i, r, c, X, Y: Integer;
begin
// ── Top padding ───────────────────────────────────────────────────────────
Sep := TPanel.Create(Self);
Sep.Parent := FTabPA;
Sep.BevelOuter := bvNone;
Sep.Color := CLR_BG;
Sep.Align := alTop;
Sep.Height := 10;
// ── Group Power & Calibration ─────────────────────────────────────────────
Grp := TGroupBox.Create(Self);
Grp.Parent := FTabPA;
Grp.Caption := 'Power & Calibration';
Grp.Color := CLR_GROUP;
Grp.Font.Color := CLR_ACCENT;
Grp.Font.Name := 'Courier New';
Grp.Font.Size := 8;
Grp.Align := alTop;
Grp.Height := GRP_TOP + ROW_H + 20 + ROWS * ROW_H + GRP_PAD + 16;
Grp.AutoSize := False;
// Max Power строка
Lbl := TLabel.Create(Self);
Lbl.Parent := Grp;
Lbl.Caption := 'Max Power (W):';
Lbl.SetBounds(GRP_PAD, GRP_TOP + 6, 120, 18);
Lbl.Font.Color := CLR_TEXTDIM;
Lbl.Font.Name := 'Courier New';
Lbl.Font.Size := 8;
Spin := TSpinEdit.Create(Self);
Spin.Parent := Grp;
Spin.SetBounds(GRP_PAD + 124, GRP_TOP, ED_W, BTN_H + 2);
Spin.Color := CLR_PANEL;
Spin.Font.Color := CLR_TEXT;
Spin.Font.Name := 'Courier New';
Spin.Font.Size := 8;
Spin.MinValue := 5;
Spin.MaxValue := 200;
Spin.Increment := 1;
Spin.Value := 100;
Spin.OnChange := OnMaxPowerChange;
FEdMaxPower := Spin;
// Метка для калибровки
Lbl := TLabel.Create(Self);
Lbl.Parent := Grp;
Lbl.Caption := 'Calibration per band (38.8 ... 100.0):';
Lbl.SetBounds(GRP_PAD, GRP_TOP + ROW_H + 8, 280, 18);
Lbl.Font.Color := CLR_TEXTDIM;
Lbl.Font.Name := 'Courier New';
Lbl.Font.Size := 8;
// Grid 4 columns × 3 rows for 11 bands
for i := 0 to 10 do
begin
r := i div COLS;
c := i mod COLS;
X := GRP_PAD + c * (COL_W + 4);
Y := GRP_TOP + ROW_H + 26 + r * ROW_H;
Lbl := TLabel.Create(Self);
Lbl.Parent := Grp;
Lbl.Caption := PA_BAND_NAMES[i] + ':';
Lbl.SetBounds(X, Y + 5, LBL_W, 18);
Lbl.Font.Color := CLR_TEXTDIM;
Lbl.Font.Name := 'Courier New';
Lbl.Font.Size := 8;
FEdBandCal[i] := MakeFloatSpin(Grp, X + LBL_W, Y, OnBandCalChange);
FEdBandCal[i].Tag := i;
end;
end;
procedure TSettingsForm.LoadPASettings(MaxPower: Double;
const BandCal: array of Double);
var i, n: Integer;
begin
FLoading := True;
try
FEdMaxPower.Value := Round(EnsureRange(MaxPower, 5.0, 200.0));
n := Min(10, High(BandCal));
for i := 0 to n do
FEdBandCal[i].Value := EnsureRange(BandCal[i], 38.8, 100.0);
finally
FLoading := False;
end;
end;
procedure TSettingsForm.OnMaxPowerChange(Sender: TObject);
var
BandCal: array[0..10] of Double;
i: Integer;
begin
if FLoading then Exit;
if not Assigned(FOnPAChange) then Exit;
for i := 0 to 10 do
BandCal[i] := FEdBandCal[i].Value;
FOnPAChange(FEdMaxPower.Value, BandCal);
end;
procedure TSettingsForm.OnBandCalChange(Sender: TObject);
var
BandCal: array[0..10] of Double;
i: Integer;
begin
if FLoading then Exit;
if not Assigned(FOnPAChange) then Exit;
for i := 0 to 10 do
BandCal[i] := FEdBandCal[i].Value;
FOnPAChange(FEdMaxPower.Value, BandCal);
end;
procedure TSettingsForm.BtnCloseClick(Sender: TObject);
begin
Close;