Phase 3 (WA2c): move web Span into the adapter; SetSampleRate self-persists

Now that global-settings persistence is controller-owned, fold the persist into
SetSampleRate (sample rate is global; self-gated on FDevConnected). OnSampleRateSelect
becomes a thin wrapper. Web Span moves to TWebAdapter.OnSpan (keeps the valid-span
whitelist), so the last span coupling to MainForm is gone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Uladzimir Karpenka
2026-06-08 21:03:47 +03:00
co-authored by Claude Opus 4.8
parent 2c356beb77
commit 5f5558e4a2
3 changed files with 26 additions and 32 deletions
+3 -30
View File
@@ -438,7 +438,6 @@ type
// ClientActive). Здесь только то, что дёргает UI-обёртки MainForm.
procedure WebOnFreq(Hz: Double);
procedure WebOnBand(Idx: Integer);
procedure WebOnSpan(Hz: Integer);
procedure WebOnRun(On_: Boolean);
procedure WebOnFreqA(Hz: Double);
procedure WebOnXvtrBand(Idx: Integer);
@@ -460,7 +459,6 @@ type
procedure SyncWebFreq;
procedure SyncWebBand;
procedure SyncWebXvtrBand;
procedure SyncWebSpan;
procedure SyncWebRun;
procedure SyncWebFreqA;
// --- CAT callbacks -------------------------------------------------------
@@ -899,7 +897,7 @@ begin
// Host-зависимые (UI-обёртки) — пока на MainForm:
FWebServer.OnFreq := WebOnFreq;
FWebServer.OnBand := WebOnBand;
FWebServer.OnSpan := WebOnSpan;
FWebServer.OnSpan := FWebAdapter.OnSpan;
FWebServer.OnRun := WebOnRun;
FWebServer.OnDrive := FWebAdapter.OnDrive;
FWebServer.OnFreqA := WebOnFreqA;
@@ -4656,13 +4654,9 @@ end;
procedure TMainForm.OnSampleRateSelect(SampleRate: Integer);
begin
if SampleRate = FController.FSampleRate then Exit;
// Движок (пересоздание WDSP-канала, DDC-rate, восстановление DSP) — в
// контроллере; рендер overlay + AGC-линий — в OnControllerState(rfSampleRate).
// Тонкая обёртка: движок (пересоздание WDSP-канала, DDC-rate, DSP-restore) +
// персист — в команде SetSampleRate; рендер overlay/AGC — OnControllerState.
FController.SetSampleRate(SampleRate);
// SampleRate глобальный — сохраняем в global settings.
if FController.FDevConnected then
FController.SaveGlobalSettings;
end;
// ===========================================================================
@@ -4735,27 +4729,6 @@ begin
ActivateXvtrBand(FWebSyncInt);
end;
procedure TMainForm.WebOnSpan(Hz: Integer);
begin
FWebSyncInt := Hz;
FWebSyncM := SyncWebSpan;
TThread.Synchronize(nil, FWebSyncM);
end;
procedure TMainForm.SyncWebSpan;
const
ValidSpans: array[0..5] of Integer = (48000, 96000, 192000, 384000, 768000, 1536000);
var
i: Integer;
begin
for i := 0 to High(ValidSpans) do
if ValidSpans[i] = FWebSyncInt then
begin
OnSampleRateSelect(FWebSyncInt);
Exit;
end;
end;
// ── Run ────────────────────────────────────────────────────────────────────
procedure TMainForm.WebOnRun(On_: Boolean);
+3 -2
View File
@@ -1652,8 +1652,8 @@ begin FSpanHz := Hz; Changed(rfSpan); { TODO wiring } end;
procedure TRadioController.SetSampleRate(Hz: Integer);
// Смена частоты дискретизации DDC. В этом приложении span ≡ sample rate.
// Несёт: пересоздание WDSP-канала (Close+FlushQueue+Open), новый rate в
// трансивер и полное восстановление DSP-состояния. Сохранение в global
// settings + рендер overlay/AGC-линий остаются в UI (OnControllerState).
// трансивер и полное восстановление DSP-состояния. Команда сама персистит
// (sample rate глобальный); рендер overlay/AGC-линий — в OnControllerState.
begin
if (Hz <= 0) or (Hz = FSampleRate) then Exit;
FSampleRate := Hz;
@@ -1690,6 +1690,7 @@ begin
FDSPEngine.SetShift(FVfoA - FCenterFreq);
end;
end;
SaveGlobalSettings; // sample rate глобальный — персистим (гейт по FDevConnected внутри)
Changed(rfSampleRate);
end;
+20
View File
@@ -46,6 +46,7 @@ type
procedure SyncAGCTop;
procedure SyncVolume;
procedure SyncDrive;
procedure SyncSpan;
procedure SyncWfAGC;
procedure SyncWfNF;
procedure SyncMute;
@@ -72,6 +73,7 @@ type
procedure OnAGCTop(DB: Integer);
procedure OnVolume(V: Integer);
procedure OnDrive(V: Integer);
procedure OnSpan(Hz: Integer);
procedure OnWfAGC(On_: Boolean);
procedure OnWfNF(On_: Boolean);
procedure OnMute(On_: Boolean);
@@ -158,6 +160,24 @@ begin FSyncInt := V; FController.Invoke(@SyncDrive); end;
procedure TWebAdapter.SyncDrive;
begin FController.SetDrive(FSyncInt); end; // rfDrive снимет память канала (ChannelController)
procedure TWebAdapter.OnSpan(Hz: Integer);
begin FSyncInt := Hz; FController.Invoke(@SyncSpan); end;
procedure TWebAdapter.SyncSpan;
// span ≡ sample rate. Принимаем только валидные значения (как десктоп-оверлей);
// SetSampleRate сам пересоздаёт WDSP-канал + персистит (idempotent при том же rate).
const
ValidSpans: array[0..5] of Integer = (48000, 96000, 192000, 384000, 768000, 1536000);
var i: Integer;
begin
for i := 0 to High(ValidSpans) do
if ValidSpans[i] = FSyncInt then
begin
FController.SetSampleRate(FSyncInt);
Exit;
end;
end;
procedure TWebAdapter.OnWfAGC(On_: Boolean);
begin FSyncBool := On_; FController.Invoke(@SyncWfAGC); end;