feat: drive slider value label — % (openHPSDR) / dB (Pluto)

Show current drive value next to the slider: percent for openHPSDR,
TX attenuation in dB for Pluto (via controller PlutoTxAttForDrive;
unit flips on backend connect). Refreshed on drive change, device
render, and TX max-att change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-19 14:50:39 +03:00
co-authored by Claude Opus 4.8
parent d08fc17056
commit c6660891c0
+24 -1
View File
@@ -278,6 +278,7 @@ type
PanelTX: TPanel; PanelTX: TPanel;
LblDrv: TLabel; LblDrv: TLabel;
LblDrvVal: TLabel; // значение drive: % (openHPSDR) или дБ (Pluto)
TrkDrive: TFlatSlider; TrkDrive: TFlatSlider;
BtnMOX: TFlatButton; BtnMOX: TFlatButton;
BtnTUN: TFlatButton; BtnTUN: TFlatButton;
@@ -492,6 +493,7 @@ type
procedure OnVfoOverlayInvalidate(Sender: TObject); procedure OnVfoOverlayInvalidate(Sender: TObject);
procedure PbSpectrumDblClick(Sender: TObject); procedure PbSpectrumDblClick(Sender: TObject);
procedure TrkDriveChange(Sender: TObject); procedure TrkDriveChange(Sender: TObject);
procedure UpdateDriveLabel; // % (openHPSDR) / дБ (Pluto) рядом с ползунком drive
procedure TrkVolumeChange(Sender: TObject); procedure TrkVolumeChange(Sender: TObject);
function CalcDriveByte: Byte; function CalcDriveByte: Byte;
function ActiveTXFreqHz: Double; function ActiveTXFreqHz: Double;
@@ -1257,6 +1259,7 @@ begin
rfDrive: rfDrive:
begin begin
TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive% TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive%
UpdateDriveLabel; // % / дБ рядом с ползунком
FChannelController.OnDriveChanged; // внешнее изменение снимает память канала FChannelController.OnDriveChanged; // внешнее изменение снимает память канала
end; end;
rfAGCTop: rfAGCTop:
@@ -1353,6 +1356,7 @@ begin
RebuildXvtrButtons; RebuildXvtrButtons;
PushXvtrToWeb; PushXvtrToWeb;
TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive% TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive%
UpdateDriveLabel; // переключаем единицу %/дБ под бэкенд
if Assigned(FSampleRateOverlay) then if Assigned(FSampleRateOverlay) then
FSampleRateOverlay.SetCurrentRate(FController.FSampleRate); FSampleRateOverlay.SetCurrentRate(FController.FSampleRate);
UpdateNRButton; UpdateNBButton; UpdateSNBButton; UpdateANFButton; UpdateNRButton; UpdateNBButton; UpdateSNBButton; UpdateANFButton;
@@ -1680,10 +1684,17 @@ begin
TrkDrive := TFlatSlider.Create(Self); TrkDrive := TFlatSlider.Create(Self);
TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 74; TrkDrive.Parent := PanelTX; TrkDrive.Left := 34; TrkDrive.Top := 74;
TrkDrive.Width := 150; TrkDrive.Height := 16; TrkDrive.Width := 120; TrkDrive.Height := 16;
TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50; TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50;
TrkDrive.OnChange := TrkDriveChange; TrkDrive.OnChange := TrkDriveChange;
LblDrvVal := TLabel.Create(Self);
LblDrvVal.Parent := PanelTX;
LblDrvVal.Left := 158; LblDrvVal.Top := 77;
LblDrvVal.Font.Color := CLR_TEXT; LblDrvVal.Font.Name := 'Courier New';
LblDrvVal.Font.Size := 7;
UpdateDriveLabel;
Inc(Y, 100); Inc(Y, 100);
// RX block: CTUN + VOL + NR/NB/SNB/ANF/MUTE // RX block: CTUN + VOL + NR/NB/SNB/ANF/MUTE
@@ -5029,6 +5040,17 @@ begin
FController.SetDrive(TrkDrive.Position); // rfDrive-рендер снимет память канала (OnDriveChanged) FController.SetDrive(TrkDrive.Position); // rfDrive-рендер снимет память канала (OnDriveChanged)
end; end;
procedure TMainForm.UpdateDriveLabel;
// Значение рядом с ползунком drive: openHPSDR — проценты, Pluto — TX-аттенюация
// в дБ (берём из контроллера; маппинг drive%→дБ — там же).
begin
if LblDrvVal = nil then Exit;
if FController.IsPluto then
LblDrvVal.Caption := Format('%.0fdB', [FController.PlutoTxAttForDrive])
else
LblDrvVal.Caption := Format('%d%%', [FController.FDrivePercent]);
end;
function TMainForm.CalcDriveByte: Byte; function TMainForm.CalcDriveByte: Byte;
begin begin
// Формула — в контроллере (чистая над состоянием). Делегат для существующих // Формула — в контроллере (чистая над состоянием). Делегат для существующих
@@ -5058,6 +5080,7 @@ procedure TMainForm.OnPlutoTxMaxAttChange(MaxAttDb: Double);
begin begin
// Логика (clamp/apply/persist) — в контроллере; UI лишь передаёт значение. // Логика (clamp/apply/persist) — в контроллере; UI лишь передаёт значение.
FController.SetPlutoTxMaxAtt(MaxAttDb); FController.SetPlutoTxMaxAtt(MaxAttDb);
UpdateDriveLabel; // изменился потолок → пересчитать дБ-подпись drive
end; end;
procedure TMainForm.OnVHFCalSettingsChange(const VHFCal: array of Double); procedure TMainForm.OnVHFCalSettingsChange(const VHFCal: array of Double);