Phase 2: move widget-stored state into TRadioController

NR/NB modes, SNB/ANF flags, and drive % were stored only in the widgets
themselves (Btn*.Tag, TrkDrive.Position) — the last hard blocker to a
headless/daemon mode, since without those controls the state had nowhere
to live and CAT/Web read them directly.

- NR/NB: BtnNR.Tag/BtnNB.Tag -> FController.FNRMode/FNBMode (Integer).
- SNB/ANF: BtnSNB.Tag/BtnANF.Tag (0/1) -> FController.FSNB/FANF (Boolean).
- Drive %: TrkDrive.Position -> new FController.FDrivePercent; the slider
  is now pure input (TrkDriveChange pushes its value into the controller),
  while FDriveLevel stays the derived hardware byte.

Buttons/sliders become pure view+input: click handlers and UpdateXButton
read/write the controller field; CAT getters, the web snapshot, and
GetSnapshot all source state from the controller, not the widgets.

No behavioral change. Builds clean (cocoa).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Uladzimir Karpenka
2026-06-04 10:48:51 +03:00
co-authored by Claude Opus 4.8
parent 63eb2c701f
commit 2cf01036a3
2 changed files with 62 additions and 60 deletions
+56 -55
View File
@@ -841,17 +841,17 @@ function TMainForm.MakeGlobalSettings: TGlobalSettings;
var i: Integer; var i: Integer;
begin begin
Result.Volume := FController.FVolume; Result.Volume := FController.FVolume;
Result.DriveLevel := TrkDrive.Position; Result.DriveLevel := FController.FDrivePercent;
Result.PAMaxPower := FController.FPAMaxPower; Result.PAMaxPower := FController.FPAMaxPower;
for i := 0 to BAND_COUNT - 1 do for i := 0 to BAND_COUNT - 1 do
Result.PABandCal[i] := FController.FPABandCal[i]; Result.PABandCal[i] := FController.FPABandCal[i];
for i := 0 to CFG_XVTR_COUNT - 1 do for i := 0 to CFG_XVTR_COUNT - 1 do
Result.VHFBandCal[i] := FController.FVHFBandCal[i]; Result.VHFBandCal[i] := FController.FVHFBandCal[i];
Result.ActiveVfo := FController.FActiveVfo; Result.ActiveVfo := FController.FActiveVfo;
Result.NRMode := BtnNR.Tag; Result.NRMode := FController.FNRMode;
Result.NBMode := BtnNB.Tag; Result.NBMode := FController.FNBMode;
Result.SNBEnabled := BtnSNB.Tag <> 0; Result.SNBEnabled := FController.FSNB;
Result.ANFEnabled := BtnANF.Tag <> 0; Result.ANFEnabled := FController.FANF;
Result.AGCSlope := 0; Result.AGCSlope := 0;
Result.AGCHangThreshold := 100; Result.AGCHangThreshold := 100;
Result.WfAGCEnabled := FController.FWfAGCEnabled; Result.WfAGCEnabled := FController.FWfAGCEnabled;
@@ -3191,10 +3191,10 @@ begin
FController.FCurrentBand, FController.FCurrentBand,
FController.FRunning and FController.FNetwork.Connected, FController.FRunning and FController.FNetwork.Connected,
FController.FRunning, FController.FMuted, FController.FCTun, FController.FRunning, FController.FMuted, FController.FCTun,
BtnNR.Tag, BtnNB.Tag, BtnSNB.Tag <> 0, BtnANF.Tag <> 0, FController.FNRMode, FController.FNBMode, FController.FSNB, FController.FANF,
FController.FCenterFreq, FController.FFilter, FController.FCenterFreq, FController.FFilter,
FController.FVfoB, FController.FActiveVfo, FController.FVfoB, FController.FActiveVfo,
FController.FTransmitting, TrkDrive.Position, FController.FTransmitting, FController.FDrivePercent,
FController.FAtten, FController.FTuning, FController.FDisplayDuplex, FController.FAtten, FController.FTuning, FController.FDisplayDuplex,
FLastFwdW, FLastSWR, FController.FPAMaxPower, FLastFwdW, FLastSWR, FController.FPAMaxPower,
WebStatusText, WebBoardText, WebIPText, WebSupplyText, WebStatusText, WebBoardText, WebIPText, WebSupplyText,
@@ -4041,10 +4041,10 @@ begin
if Assigned(FSampleRateOverlay) then if Assigned(FSampleRateOverlay) then
FSampleRateOverlay.SetCurrentRate(FController.FSampleRate); FSampleRateOverlay.SetCurrentRate(FController.FSampleRate);
end; end;
BtnNR.Tag := EnsureRange(G_Settings.NRMode, 0, 4); UpdateNRButton; FController.FNRMode := EnsureRange(G_Settings.NRMode, 0, 4); UpdateNRButton;
BtnNB.Tag := EnsureRange(G_Settings.NBMode, 0, 2); UpdateNBButton; FController.FNBMode := EnsureRange(G_Settings.NBMode, 0, 2); UpdateNBButton;
BtnSNB.Tag := Ord(G_Settings.SNBEnabled); UpdateSNBButton; FController.FSNB := G_Settings.SNBEnabled; UpdateSNBButton;
BtnANF.Tag := Ord(G_Settings.ANFEnabled); UpdateANFButton; FController.FANF := G_Settings.ANFEnabled; UpdateANFButton;
FController.FWfAGCEnabled := G_Settings.WfAGCEnabled; FController.FWfAGCEnabled := G_Settings.WfAGCEnabled;
FController.FWfNFEnabled := G_Settings.WfNFEnabled; FController.FWfNFEnabled := G_Settings.WfNFEnabled;
FController.FDitherEnabled := G_Settings.DitherEnabled; FController.FDitherEnabled := G_Settings.DitherEnabled;
@@ -4632,7 +4632,7 @@ begin
FPreChannelPower := -1; FPreChannelPower := -1;
FController.FDriveLevel := CalcDriveByte; FController.FDriveLevel := CalcDriveByte;
if FController.FWDSPReady then if FController.FWDSPReady then
FController.FDSPEngine.SetDriveLevel(TrkDrive.Position / 100.0); FController.FDSPEngine.SetDriveLevel(FController.FDrivePercent / 100.0);
end; end;
end; end;
@@ -4758,7 +4758,7 @@ begin
StyleButton(BtnTUN, False); StyleButton(BtnTUN, False);
FController.FDriveLevel := CalcDriveByte; FController.FDriveLevel := CalcDriveByte;
if FController.FWDSPReady then if FController.FWDSPReady then
FController.FDSPEngine.SetDriveLevel(TrkDrive.Position / 100.0); FController.FDSPEngine.SetDriveLevel(FController.FDrivePercent / 100.0);
if FController.FNetwork.Connected and FController.FNetwork.Running then if FController.FNetwork.Connected and FController.FNetwork.Running then
begin begin
FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), FController.FDriveLevel, FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), FController.FDriveLevel,
@@ -5531,7 +5531,7 @@ begin
// поэтому сохраняем оригинал в локальную переменную и восстанавливаем после. // поэтому сохраняем оригинал в локальную переменную и восстанавливаем после.
if Ch.Power >= 0 then if Ch.Power >= 0 then
begin begin
i := TrkDrive.Position; // запомнить до срабатывания OnChange i := FController.FDrivePercent; // запомнить до срабатывания OnChange
TrkDrive.Position := EnsureRange(Ch.Power, 0, 100); // TrkDriveChange обновит FController.FDriveLevel и WDSP TrkDrive.Position := EnsureRange(Ch.Power, 0, 100); // TrkDriveChange обновит FController.FDriveLevel и WDSP
if FPreChannelPower < 0 then if FPreChannelPower < 0 then
FPreChannelPower := i; // установить после (TrkDriveChange уже сбросил в -1) FPreChannelPower := i; // установить после (TrkDriveChange уже сбросил в -1)
@@ -5596,7 +5596,7 @@ begin
FPreChannelPower := -1; FPreChannelPower := -1;
FController.FDriveLevel := CalcDriveByte; FController.FDriveLevel := CalcDriveByte;
if FController.FWDSPReady then if FController.FWDSPReady then
FController.FDSPEngine.SetDriveLevel(TrkDrive.Position / 100.0); FController.FDSPEngine.SetDriveLevel(FController.FDrivePercent / 100.0);
end; end;
end; end;
end; end;
@@ -5839,7 +5839,7 @@ end;
procedure TMainForm.UpdateNRButton; procedure TMainForm.UpdateNRButton;
begin begin
case BtnNR.Tag of case FController.FNRMode of
1: BtnNR.Caption := 'NR'; 1: BtnNR.Caption := 'NR';
2: BtnNR.Caption := 'NR2'; 2: BtnNR.Caption := 'NR2';
3: BtnNR.Caption := 'NR3'; 3: BtnNR.Caption := 'NR3';
@@ -5847,71 +5847,71 @@ begin
else else
BtnNR.Caption := 'NR'; BtnNR.Caption := 'NR';
end; end;
StyleButton(BtnNR, BtnNR.Tag <> 0); StyleButton(BtnNR, FController.FNRMode <> 0);
BtnNR.Invalidate; BtnNR.Invalidate;
end; end;
procedure TMainForm.UpdateNBButton; procedure TMainForm.UpdateNBButton;
begin begin
case BtnNB.Tag of case FController.FNBMode of
1: BtnNB.Caption := 'NB'; 1: BtnNB.Caption := 'NB';
2: BtnNB.Caption := 'NB2'; 2: BtnNB.Caption := 'NB2';
else else
BtnNB.Caption := 'NB'; BtnNB.Caption := 'NB';
end; end;
StyleButton(BtnNB, BtnNB.Tag <> 0); StyleButton(BtnNB, FController.FNBMode <> 0);
BtnNB.Invalidate; BtnNB.Invalidate;
end; end;
procedure TMainForm.UpdateSNBButton; procedure TMainForm.UpdateSNBButton;
begin begin
BtnSNB.Caption := 'SNB'; BtnSNB.Caption := 'SNB';
StyleButton(BtnSNB, BtnSNB.Tag <> 0); StyleButton(BtnSNB, FController.FSNB);
BtnSNB.Invalidate; BtnSNB.Invalidate;
end; end;
procedure TMainForm.UpdateANFButton; procedure TMainForm.UpdateANFButton;
begin begin
BtnANF.Caption := 'ANF'; BtnANF.Caption := 'ANF';
StyleButton(BtnANF, BtnANF.Tag <> 0); StyleButton(BtnANF, FController.FANF);
BtnANF.Invalidate; BtnANF.Invalidate;
end; end;
procedure TMainForm.ApplyNoiseFilterButtonsToDSP; procedure TMainForm.ApplyNoiseFilterButtonsToDSP;
begin begin
if not FController.FWDSPReady then Exit; if not FController.FWDSPReady then Exit;
FController.FDSPEngine.SetNRMode(BtnNR.Tag); FController.FDSPEngine.SetNRMode(FController.FNRMode);
FController.FDSPEngine.SetNBMode(BtnNB.Tag); FController.FDSPEngine.SetNBMode(FController.FNBMode);
FController.FDSPEngine.SetSNB(BtnSNB.Tag <> 0); FController.FDSPEngine.SetSNB(FController.FSNB);
FController.FDSPEngine.SetANF(BtnANF.Tag <> 0); FController.FDSPEngine.SetANF(FController.FANF);
end; end;
procedure TMainForm.BtnNRClick(Sender: TObject); procedure TMainForm.BtnNRClick(Sender: TObject);
begin begin
BtnNR.Tag := (BtnNR.Tag + 1) mod 5; FController.FNRMode := (FController.FNRMode + 1) mod 5;
UpdateNRButton; UpdateNRButton;
if FController.FWDSPReady then FController.FDSPEngine.SetNRMode(BtnNR.Tag); if FController.FWDSPReady then FController.FDSPEngine.SetNRMode(FController.FNRMode);
end; end;
procedure TMainForm.BtnNBClick(Sender: TObject); procedure TMainForm.BtnNBClick(Sender: TObject);
begin begin
BtnNB.Tag := (BtnNB.Tag + 1) mod 3; FController.FNBMode := (FController.FNBMode + 1) mod 3;
UpdateNBButton; UpdateNBButton;
if FController.FWDSPReady then FController.FDSPEngine.SetNBMode(BtnNB.Tag); if FController.FWDSPReady then FController.FDSPEngine.SetNBMode(FController.FNBMode);
end; end;
procedure TMainForm.BtnSNBClick(Sender: TObject); procedure TMainForm.BtnSNBClick(Sender: TObject);
begin begin
BtnSNB.Tag := 1 - BtnSNB.Tag; FController.FSNB := not FController.FSNB;
UpdateSNBButton; UpdateSNBButton;
if FController.FWDSPReady then FController.FDSPEngine.SetSNB(BtnSNB.Tag <> 0); if FController.FWDSPReady then FController.FDSPEngine.SetSNB(FController.FSNB);
end; end;
procedure TMainForm.BtnANFClick(Sender: TObject); procedure TMainForm.BtnANFClick(Sender: TObject);
begin begin
BtnANF.Tag := 1 - BtnANF.Tag; FController.FANF := not FController.FANF;
UpdateANFButton; UpdateANFButton;
if FController.FWDSPReady then FController.FDSPEngine.SetANF(BtnANF.Tag <> 0); if FController.FWDSPReady then FController.FDSPEngine.SetANF(FController.FANF);
end; end;
@@ -5962,7 +5962,7 @@ begin
FVfoOverlay.Width := 260; FVfoOverlay.Width := 260;
FVfoOverlay.Height := 136; // OVL_H_NORM — расширяется сам при открытии AGC-пикера FVfoOverlay.Height := 136; // OVL_H_NORM — расширяется сам при открытии AGC-пикера
FVfoOverlay.SetState(FController.FMode, FController.FFilterBW, FController.FVfoA, FLastSMeter); FVfoOverlay.SetState(FController.FMode, FController.FFilterBW, FController.FVfoA, FLastSMeter);
FVfoOverlay.SetDSPState(BtnNR.Tag, BtnNB.Tag, BtnSNB.Tag <> 0, BtnANF.Tag <> 0, FController.FAGCMode); FVfoOverlay.SetDSPState(FController.FNRMode, FController.FNBMode, FController.FSNB, FController.FANF, FController.FAGCMode);
FVfoOverlay.Visible := True; FVfoOverlay.Visible := True;
PositionVfoOverlay; PositionVfoOverlay;
end end
@@ -6047,17 +6047,17 @@ begin
if Assigned(FVfoOverlay) and FVfoOverlay.Visible then if Assigned(FVfoOverlay) and FVfoOverlay.Visible then
begin begin
FVfoOverlay.SetState(FController.FMode, FController.FFilterBW, FController.FVfoA, FLastSMeter); FVfoOverlay.SetState(FController.FMode, FController.FFilterBW, FController.FVfoA, FLastSMeter);
FVfoOverlay.SetDSPState(BtnNR.Tag, BtnNB.Tag, BtnSNB.Tag <> 0, BtnANF.Tag <> 0, FController.FAGCMode); FVfoOverlay.SetDSPState(FController.FNRMode, FController.FNBMode, FController.FSNB, FController.FANF, FController.FAGCMode);
PositionVfoOverlay; // перепозиционируем при смене LSB↔USB PositionVfoOverlay; // перепозиционируем при смене LSB↔USB
end; end;
end; end;
procedure TMainForm.OnVfoOverlayDSPChange(NRMode, NBMode: Integer; SNBOn, ANFOn: Boolean); procedure TMainForm.OnVfoOverlayDSPChange(NRMode, NBMode: Integer; SNBOn, ANFOn: Boolean);
begin begin
BtnNR.Tag := NRMode; UpdateNRButton; FController.FNRMode := NRMode; UpdateNRButton;
BtnNB.Tag := NBMode; UpdateNBButton; FController.FNBMode := NBMode; UpdateNBButton;
BtnSNB.Tag := Ord(SNBOn); UpdateSNBButton; FController.FSNB := SNBOn; UpdateSNBButton;
BtnANF.Tag := Ord(ANFOn); UpdateANFButton; FController.FANF := ANFOn; UpdateANFButton;
ApplyNoiseFilterButtonsToDSP; ApplyNoiseFilterButtonsToDSP;
end; end;
@@ -6462,11 +6462,11 @@ procedure TMainForm.SyncWebNR;
begin begin
if FWebSyncInt < 0 then FWebSyncInt := 0; if FWebSyncInt < 0 then FWebSyncInt := 0;
if FWebSyncInt > 4 then FWebSyncInt := 4; if FWebSyncInt > 4 then FWebSyncInt := 4;
if BtnNR.Tag <> FWebSyncInt then if FController.FNRMode <> FWebSyncInt then
begin begin
BtnNR.Tag := FWebSyncInt; FController.FNRMode := FWebSyncInt;
UpdateNRButton; UpdateNRButton;
if FController.FWDSPReady then FController.FDSPEngine.SetNRMode(BtnNR.Tag); if FController.FWDSPReady then FController.FDSPEngine.SetNRMode(FController.FNRMode);
end; end;
end; end;
@@ -6483,11 +6483,11 @@ procedure TMainForm.SyncWebNB;
begin begin
if FWebSyncInt < 0 then FWebSyncInt := 0; if FWebSyncInt < 0 then FWebSyncInt := 0;
if FWebSyncInt > 2 then FWebSyncInt := 2; if FWebSyncInt > 2 then FWebSyncInt := 2;
if BtnNB.Tag <> FWebSyncInt then if FController.FNBMode <> FWebSyncInt then
begin begin
BtnNB.Tag := FWebSyncInt; FController.FNBMode := FWebSyncInt;
UpdateNBButton; UpdateNBButton;
if FController.FWDSPReady then FController.FDSPEngine.SetNBMode(BtnNB.Tag); if FController.FWDSPReady then FController.FDSPEngine.SetNBMode(FController.FNBMode);
end; end;
end; end;
@@ -6500,7 +6500,7 @@ end;
procedure TMainForm.SyncWebSNB; procedure TMainForm.SyncWebSNB;
begin begin
if FWebSyncBool <> (BtnSNB.Tag <> 0) then if FWebSyncBool <> (FController.FSNB) then
BtnSNBClick(BtnSNB); BtnSNBClick(BtnSNB);
end; end;
@@ -6515,7 +6515,7 @@ end;
procedure TMainForm.SyncWebANF; procedure TMainForm.SyncWebANF;
begin begin
if FWebSyncBool <> (BtnANF.Tag <> 0) then if FWebSyncBool <> (FController.FANF) then
BtnANFClick(BtnANF); BtnANFClick(BtnANF);
end; end;
@@ -6690,10 +6690,11 @@ end;
procedure TMainForm.TrkDriveChange(Sender: TObject); procedure TMainForm.TrkDriveChange(Sender: TObject);
begin begin
FController.FDrivePercent := TrkDrive.Position; // слайдер — ввод; контроллер — истина
FPreChannelPower := -1; // ручное изменение снимает сохранённую мощность канала FPreChannelPower := -1; // ручное изменение снимает сохранённую мощность канала
FController.FDriveLevel := CalcDriveByte; FController.FDriveLevel := CalcDriveByte;
if FController.FWDSPReady then if FController.FWDSPReady then
FController.FDSPEngine.SetDriveLevel(TrkDrive.Position / 100.0); FController.FDSPEngine.SetDriveLevel(FController.FDrivePercent / 100.0);
if FController.FNetwork.Connected and FController.FNetwork.Running then if FController.FNetwork.Connected and FController.FNetwork.Running then
begin begin
FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), FController.FDriveLevel, FController.FTransmitting, True, True); FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), FController.FDriveLevel, FController.FTransmitting, True, True);
@@ -6739,9 +6740,9 @@ begin
else else
begin begin
if XvtrActive then if XvtrActive then
Pos := Round(TrkDrive.Position * FController.FXvtrSettings.Entries[FController.FCurrentXvtr].TXPower / 100.0) Pos := Round(FController.FDrivePercent * FController.FXvtrSettings.Entries[FController.FCurrentXvtr].TXPower / 100.0)
else else
Pos := TrkDrive.Position; Pos := FController.FDrivePercent;
end; end;
if Pos <= 0 then begin Result := 0; Exit; end; if Pos <= 0 then begin Result := 0; Exit; end;
@@ -7750,13 +7751,13 @@ function TMainForm.CATGetMode: Integer; begin Result := FController.FMode;
function TMainForm.CATGetActiveVfo: Integer; begin Result := FController.FActiveVfo; end; function TMainForm.CATGetActiveVfo: Integer; begin Result := FController.FActiveVfo; end;
function TMainForm.CATGetAGCMode: Integer; begin Result := FController.FAGCMode; end; function TMainForm.CATGetAGCMode: Integer; begin Result := FController.FAGCMode; end;
function TMainForm.CATGetVolume: Integer; begin Result := FController.FVolume; end; function TMainForm.CATGetVolume: Integer; begin Result := FController.FVolume; end;
function TMainForm.CATGetDriveLevel: Integer;begin Result := TrkDrive.Position; end; function TMainForm.CATGetDriveLevel: Integer;begin Result := FController.FDrivePercent; end;
function TMainForm.CATGetFilterIdx: Integer; begin Result := FController.FFilter; end; function TMainForm.CATGetFilterIdx: Integer; begin Result := FController.FFilter; end;
function TMainForm.CATGetFilterBW: Integer; begin Result := FController.FFilterBW; end; function TMainForm.CATGetFilterBW: Integer; begin Result := FController.FFilterBW; end;
function TMainForm.CATGetNRMode: Integer; begin Result := BtnNR.Tag; end; function TMainForm.CATGetNRMode: Integer; begin Result := FController.FNRMode; end;
function TMainForm.CATGetNBMode: Integer; begin Result := BtnNB.Tag; end; function TMainForm.CATGetNBMode: Integer; begin Result := FController.FNBMode; end;
function TMainForm.CATGetSNB: Boolean; begin Result := BtnSNB.Tag <> 0; end; function TMainForm.CATGetSNB: Boolean; begin Result := FController.FSNB; end;
function TMainForm.CATGetANF: Boolean; begin Result := BtnANF.Tag <> 0; end; function TMainForm.CATGetANF: Boolean; begin Result := FController.FANF; end;
function TMainForm.CATGetTX: Boolean; begin Result := FController.FTransmitting; end; function TMainForm.CATGetTX: Boolean; begin Result := FController.FTransmitting; end;
function TMainForm.CATGetRunning: Boolean; begin Result := FController.FRunning; end; function TMainForm.CATGetRunning: Boolean; begin Result := FController.FRunning; end;
function TMainForm.CATGetSMeter: Double; begin Result := FLastSMeter; end; function TMainForm.CATGetSMeter: Double; begin Result := FLastSMeter; end;
+6 -5
View File
@@ -142,7 +142,8 @@ type
// ---- Аудио / TX ---- // ---- Аудио / TX ----
FVolume: Integer; FVolume: Integer;
FMuted: Boolean; FMuted: Boolean;
FDriveLevel: Byte; FDrivePercent: Integer; // драйв 0..100 % (UI-уровень, источник истины)
FDriveLevel: Byte; // вычисляемый hardware-байт (CalcDriveByte)
FAtten: Integer; FAtten: Integer;
FPAMaxPower: Double; FPAMaxPower: Double;
FRunning: Boolean; FRunning: Boolean;
@@ -287,7 +288,7 @@ begin
FVfoA := 14200000; FVfoB := 7100000; FActiveVfo := 0; FVfoA := 14200000; FVfoB := 7100000; FActiveVfo := 0;
FMode := 1; FFilter := 5; FFilterBW := 2700; FMode := 1; FFilter := 5; FFilterBW := 2700;
FAGCMode := 1; FAGCTop := 90; FAGCMode := 1; FAGCTop := 90;
FVolume := 70; FDriveLevel := 0; FAtten := 0; FVolume := 70; FDrivePercent := 50; FDriveLevel := 0; FAtten := 0;
FCenterFreq := FVfoA; FSpanHz := 192000; FSampleRate := 192000; FCenterFreq := FVfoA; FSpanHz := 192000; FSampleRate := 192000;
FCurrentBand := 5; FCurrentXvtr := -1; FCurrentBand := 5; FCurrentXvtr := -1;
FPAMaxPower := 100.0; FPAMaxPower := 100.0;
@@ -322,7 +323,7 @@ begin
Result.SampleRate := FSampleRate; Result.ActiveVfo := FActiveVfo; Result.SampleRate := FSampleRate; Result.ActiveVfo := FActiveVfo;
Result.Mode := FMode; Result.Filter := FFilter; Result.FilterBW := FFilterBW; Result.Mode := FMode; Result.Filter := FFilter; Result.FilterBW := FFilterBW;
Result.AGCMode := FAGCMode; Result.AGCTop := FAGCTop; Result.AGCMode := FAGCMode; Result.AGCTop := FAGCTop;
Result.Volume := FVolume; Result.Drive := FDriveLevel; Result.Atten := FAtten; Result.Volume := FVolume; Result.Drive := FDrivePercent; Result.Atten := FAtten;
Result.Band := FCurrentBand; Result.Xvtr := FCurrentXvtr; Result.Band := FCurrentBand; Result.Xvtr := FCurrentXvtr;
Result.Muted := FMuted; Result.CTun := FCTun; Result.Duplex := FDisplayDuplex; Result.Muted := FMuted; Result.CTun := FCTun; Result.Duplex := FDisplayDuplex;
Result.Running := FRunning; Result.Connected := FDevConnected; Result.Running := FRunning; Result.Connected := FDevConnected;
@@ -402,10 +403,10 @@ procedure TRadioController.ToggleMute;
begin SetMute(not FMuted); end; begin SetMute(not FMuted); end;
procedure TRadioController.SetDrive(V: Integer); procedure TRadioController.SetDrive(V: Integer);
begin FDriveLevel := Byte(V); Changed(rfDrive); { TODO wiring } end; begin FDrivePercent := V; Changed(rfDrive); { TODO wiring: CalcDriveByte + WDSP } end;
procedure TRadioController.DriveBy(Delta: Integer); procedure TRadioController.DriveBy(Delta: Integer);
begin SetDrive(FDriveLevel + Delta); end; begin SetDrive(FDrivePercent + Delta); end;
procedure TRadioController.SetAtten(Idx: Integer); procedure TRadioController.SetAtten(Idx: Integer);
begin FAtten := Idx; Changed(rfAtten); { TODO wiring } end; begin FAtten := Idx; Changed(rfAtten); { TODO wiring } end;