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. // ClientActive). Здесь только то, что дёргает UI-обёртки MainForm.
procedure WebOnFreq(Hz: Double); procedure WebOnFreq(Hz: Double);
procedure WebOnBand(Idx: Integer); procedure WebOnBand(Idx: Integer);
procedure WebOnSpan(Hz: Integer);
procedure WebOnRun(On_: Boolean); procedure WebOnRun(On_: Boolean);
procedure WebOnFreqA(Hz: Double); procedure WebOnFreqA(Hz: Double);
procedure WebOnXvtrBand(Idx: Integer); procedure WebOnXvtrBand(Idx: Integer);
@@ -460,7 +459,6 @@ type
procedure SyncWebFreq; procedure SyncWebFreq;
procedure SyncWebBand; procedure SyncWebBand;
procedure SyncWebXvtrBand; procedure SyncWebXvtrBand;
procedure SyncWebSpan;
procedure SyncWebRun; procedure SyncWebRun;
procedure SyncWebFreqA; procedure SyncWebFreqA;
// --- CAT callbacks ------------------------------------------------------- // --- CAT callbacks -------------------------------------------------------
@@ -899,7 +897,7 @@ begin
// Host-зависимые (UI-обёртки) — пока на MainForm: // Host-зависимые (UI-обёртки) — пока на MainForm:
FWebServer.OnFreq := WebOnFreq; FWebServer.OnFreq := WebOnFreq;
FWebServer.OnBand := WebOnBand; FWebServer.OnBand := WebOnBand;
FWebServer.OnSpan := WebOnSpan; FWebServer.OnSpan := FWebAdapter.OnSpan;
FWebServer.OnRun := WebOnRun; FWebServer.OnRun := WebOnRun;
FWebServer.OnDrive := FWebAdapter.OnDrive; FWebServer.OnDrive := FWebAdapter.OnDrive;
FWebServer.OnFreqA := WebOnFreqA; FWebServer.OnFreqA := WebOnFreqA;
@@ -4656,13 +4654,9 @@ end;
procedure TMainForm.OnSampleRateSelect(SampleRate: Integer); procedure TMainForm.OnSampleRateSelect(SampleRate: Integer);
begin begin
if SampleRate = FController.FSampleRate then Exit; // Тонкая обёртка: движок (пересоздание WDSP-канала, DDC-rate, DSP-restore) +
// Движок (пересоздание WDSP-канала, DDC-rate, восстановление DSP) — в // персист — в команде SetSampleRate; рендер overlay/AGC — OnControllerState.
// контроллере; рендер overlay + AGC-линий — в OnControllerState(rfSampleRate).
FController.SetSampleRate(SampleRate); FController.SetSampleRate(SampleRate);
// SampleRate глобальный — сохраняем в global settings.
if FController.FDevConnected then
FController.SaveGlobalSettings;
end; end;
// =========================================================================== // ===========================================================================
@@ -4735,27 +4729,6 @@ begin
ActivateXvtrBand(FWebSyncInt); ActivateXvtrBand(FWebSyncInt);
end; 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 ──────────────────────────────────────────────────────────────────── // ── Run ────────────────────────────────────────────────────────────────────
procedure TMainForm.WebOnRun(On_: Boolean); 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); procedure TRadioController.SetSampleRate(Hz: Integer);
// Смена частоты дискретизации DDC. В этом приложении span ≡ sample rate. // Смена частоты дискретизации DDC. В этом приложении span ≡ sample rate.
// Несёт: пересоздание WDSP-канала (Close+FlushQueue+Open), новый rate в // Несёт: пересоздание WDSP-канала (Close+FlushQueue+Open), новый rate в
// трансивер и полное восстановление DSP-состояния. Сохранение в global // трансивер и полное восстановление DSP-состояния. Команда сама персистит
// settings + рендер overlay/AGC-линий остаются в UI (OnControllerState). // (sample rate глобальный); рендер overlay/AGC-линий — в OnControllerState.
begin begin
if (Hz <= 0) or (Hz = FSampleRate) then Exit; if (Hz <= 0) or (Hz = FSampleRate) then Exit;
FSampleRate := Hz; FSampleRate := Hz;
@@ -1690,6 +1690,7 @@ begin
FDSPEngine.SetShift(FVfoA - FCenterFreq); FDSPEngine.SetShift(FVfoA - FCenterFreq);
end; end;
end; end;
SaveGlobalSettings; // sample rate глобальный — персистим (гейт по FDevConnected внутри)
Changed(rfSampleRate); Changed(rfSampleRate);
end; end;
+20
View File
@@ -46,6 +46,7 @@ type
procedure SyncAGCTop; procedure SyncAGCTop;
procedure SyncVolume; procedure SyncVolume;
procedure SyncDrive; procedure SyncDrive;
procedure SyncSpan;
procedure SyncWfAGC; procedure SyncWfAGC;
procedure SyncWfNF; procedure SyncWfNF;
procedure SyncMute; procedure SyncMute;
@@ -72,6 +73,7 @@ type
procedure OnAGCTop(DB: Integer); procedure OnAGCTop(DB: Integer);
procedure OnVolume(V: Integer); procedure OnVolume(V: Integer);
procedure OnDrive(V: Integer); procedure OnDrive(V: Integer);
procedure OnSpan(Hz: Integer);
procedure OnWfAGC(On_: Boolean); procedure OnWfAGC(On_: Boolean);
procedure OnWfNF(On_: Boolean); procedure OnWfNF(On_: Boolean);
procedure OnMute(On_: Boolean); procedure OnMute(On_: Boolean);
@@ -158,6 +160,24 @@ begin FSyncInt := V; FController.Invoke(@SyncDrive); end;
procedure TWebAdapter.SyncDrive; procedure TWebAdapter.SyncDrive;
begin FController.SetDrive(FSyncInt); end; // rfDrive снимет память канала (ChannelController) 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); procedure TWebAdapter.OnWfAGC(On_: Boolean);
begin FSyncBool := On_; FController.Invoke(@SyncWfAGC); end; begin FSyncBool := On_; FController.Invoke(@SyncWfAGC); end;