web: fix A=B/SWAP VFO ops, wire attenuator, TUN button, FNP filter overlay

- Add freq_a command: sets VFO A regardless of active VFO; fixes A=B and
  SWAP when VFO B is active (prev. sent freq_b which overwrote wrong VFO)
- Add pend("freq") to B=A / A=B / SWAP to guard local display during round-trip
- RX step attenuator: HPSDRNetwork.SetStepAtten → bytes 1442/1443 in HP packet;
  WebServer attn command; MainForm FAtten + SyncWebAttn; attSel.onchange in JS
- TUN mode: set_tun WebSocket command wired to ApplyTUN(); toneBtn toggles
  with on/off highlight and pending protection; tuning field in state JSON
- FNP button opens semi-transparent filter overlay (10 buttons, 5×2 grid)
  with mode-appropriate widths (SSB/CW/AM/FM); active filter highlighted;
  cur.filter_bw updated immediately on click so passband redraws within 50ms

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-09 15:04:23 +03:00
co-authored by Claude Sonnet 4.6
parent 9f208006aa
commit 154b6eccba
4 changed files with 165 additions and 20 deletions
+49 -1
View File
@@ -197,6 +197,7 @@ type
FHWPTTActive: Boolean; // True = hardware PTT нажата
FMuted: Boolean;
FVolume: Integer;
FAtten: Integer; // RX step attenuator index: 0=0dB 1=10dB 2=20dB
FLastSMeter: Double;
FSMeterPeak: Double; // верхняя граница светлой зоны
FSMeterMin: Double; // нижняя граница светлой зоны
@@ -489,6 +490,9 @@ type
procedure WebOnCenter(Hz: Double);
procedure WebOnMOX(On_: Boolean);
procedure WebOnDrive(V: Integer);
procedure WebOnFreqA(Hz: Double);
procedure WebOnAttn(Idx: Integer);
procedure WebOnTun(On_: Boolean);
// Synchronize-обёртки (выполняются в UI-потоке)
procedure SyncWebFreq;
procedure SyncWebMode;
@@ -512,6 +516,9 @@ type
procedure SyncWebCenter;
procedure SyncWebMOX;
procedure SyncWebDrive;
procedure SyncWebFreqA;
procedure SyncWebAttn;
procedure SyncWebTun;
// --- CAT callbacks -------------------------------------------------------
function CATGetVfoA: Double;
function CATGetVfoB: Double;
@@ -1091,6 +1098,9 @@ begin
FWebServer.OnCenter := WebOnCenter;
FWebServer.OnMOX := WebOnMOX;
FWebServer.OnDrive := WebOnDrive;
FWebServer.OnFreqA := WebOnFreqA;
FWebServer.OnAttn := WebOnAttn;
FWebServer.OnTun := WebOnTun;
FWebServer.Start;
FillChar(FCATLastGlobal, SizeOf(FCATLastGlobal), 0);
FCATLastGlobal.CATTcpPort := 19090;
@@ -2765,7 +2775,8 @@ begin
BtnNR.Tag, BtnNB.Tag, BtnSNB.Tag <> 0, BtnANF.Tag <> 0,
FCenterFreq, FFilter,
FVfoB, FActiveVfo,
FTransmitting, TrkDrive.Position);
FTransmitting, TrkDrive.Position,
FAtten, FTuning);
end;
// ===========================================================================
@@ -5204,6 +5215,43 @@ begin
TrkDrive.Position := FWebSyncInt;
end;
procedure TMainForm.WebOnFreqA(Hz: Double);
begin
FWebSyncFreq := Hz;
FWebSyncM := SyncWebFreqA;
TThread.Synchronize(nil, FWebSyncM);
end;
procedure TMainForm.SyncWebFreqA;
begin
ApplyVfoA(Round(FWebSyncFreq));
end;
procedure TMainForm.WebOnAttn(Idx: Integer);
begin
FWebSyncInt := Idx;
FWebSyncM := SyncWebAttn;
TThread.Synchronize(nil, FWebSyncM);
end;
procedure TMainForm.SyncWebAttn;
begin
FAtten := Max(0, Min(2, FWebSyncInt));
FNetwork.SetStepAtten(FAtten * 10);
end;
procedure TMainForm.WebOnTun(On_: Boolean);
begin
FWebSyncBool := On_;
FWebSyncM := SyncWebTun;
TThread.Synchronize(nil, FWebSyncM);
end;
procedure TMainForm.SyncWebTun;
begin
ApplyTUN(FWebSyncBool);
end;
procedure TMainForm.TrkDriveChange(Sender: TObject);
begin
FDriveLevel := CalcDriveByte;