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;
LblDrv: TLabel;
LblDrvVal: TLabel; // значение drive: % (openHPSDR) или дБ (Pluto)
TrkDrive: TFlatSlider;
BtnMOX: TFlatButton;
BtnTUN: TFlatButton;
@@ -492,6 +493,7 @@ type
procedure OnVfoOverlayInvalidate(Sender: TObject);
procedure PbSpectrumDblClick(Sender: TObject);
procedure TrkDriveChange(Sender: TObject);
procedure UpdateDriveLabel; // % (openHPSDR) / дБ (Pluto) рядом с ползунком drive
procedure TrkVolumeChange(Sender: TObject);
function CalcDriveByte: Byte;
function ActiveTXFreqHz: Double;
@@ -1257,6 +1259,7 @@ begin
rfDrive:
begin
TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive%
UpdateDriveLabel; // % / дБ рядом с ползунком
FChannelController.OnDriveChanged; // внешнее изменение снимает память канала
end;
rfAGCTop:
@@ -1353,6 +1356,7 @@ begin
RebuildXvtrButtons;
PushXvtrToWeb;
TrkDrive.Position := FController.FDrivePercent; // слайдер ← drive%
UpdateDriveLabel; // переключаем единицу %/дБ под бэкенд
if Assigned(FSampleRateOverlay) then
FSampleRateOverlay.SetCurrentRate(FController.FSampleRate);
UpdateNRButton; UpdateNBButton; UpdateSNBButton; UpdateANFButton;
@@ -1680,10 +1684,17 @@ begin
TrkDrive := TFlatSlider.Create(Self);
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.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);
// RX block: CTUN + VOL + NR/NB/SNB/ANF/MUTE
@@ -5029,6 +5040,17 @@ begin
FController.SetDrive(TrkDrive.Position); // rfDrive-рендер снимет память канала (OnDriveChanged)
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;
begin
// Формула — в контроллере (чистая над состоянием). Делегат для существующих
@@ -5058,6 +5080,7 @@ procedure TMainForm.OnPlutoTxMaxAttChange(MaxAttDb: Double);
begin
// Логика (clamp/apply/persist) — в контроллере; UI лишь передаёт значение.
FController.SetPlutoTxMaxAtt(MaxAttDb);
UpdateDriveLabel; // изменился потолок → пересчитать дБ-подпись drive
end;
procedure TMainForm.OnVHFCalSettingsChange(const VHFCal: array of Double);