mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
Phase 5: make RestoreBand a full controller command (self-retune)
controller.RestoreBand now does the final receiver retune on the active VFO (SetVfoA/SetVfoB) itself — channel orchestration rides the OnAfterTune hook — and emits rfBandRestore so the UI resets the waterfall-average buffer (desktop-only, fires on explicit band change, not per-tune). MainForm.RestoreBand collapses to a thin delegate. RestoreBand is now headless-complete: desktop band buttons, channels, connect- restore, and (soon) web/CAT can call it directly. Preserves the active-VFO retune (active B no longer centers on A) from the batch-15 fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
7b40eae174
commit
de1f4b772d
+5
-13
@@ -714,20 +714,9 @@ end;
|
|||||||
|
|
||||||
procedure TMainForm.RestoreBand(BandIdx: Integer);
|
procedure TMainForm.RestoreBand(BandIdx: Integer);
|
||||||
begin
|
begin
|
||||||
if (BandIdx < 0) or (BandIdx >= CFG_BAND_COUNT) then Exit;
|
// Тонкий делегат: состояние+DSP+финальная перестройка+рендер — в команде
|
||||||
// Сброс порогов водопада — только при явной смене диапазона (не на каждом
|
// контроллера; сброс Wf-avg буфера — в OnControllerState(rfBandRestore).
|
||||||
// пересечении границы при тюнинге, поэтому здесь, а не в rfBand-рендере).
|
|
||||||
FSpecView.ResetWfAvgBuf;
|
|
||||||
// Состояние + DSP + события рендера — в контроллере.
|
|
||||||
FController.RestoreBand(BandIdx);
|
FController.RestoreBand(BandIdx);
|
||||||
// Финальная перестройка приёмника на АКТИВНЫЙ VFO. Если активен B — нельзя
|
|
||||||
// центрироваться на VFO A (иначе движок слушает A, а маркер/мышь — на B).
|
|
||||||
// VFO A идёт через ApplyVfoA (канальная оркестрация: auto-CTCSS, pre-channel
|
|
||||||
// drive); VFO B — через SetVfoB (перестройка + рендер rfVfoB).
|
|
||||||
if FController.FActiveVfo = 0 then
|
|
||||||
ApplyVfoA(Round(FController.FVfoA))
|
|
||||||
else
|
|
||||||
FController.SetVfoB(Round(FController.FVfoB));
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainForm.SaveAllAndExit;
|
procedure TMainForm.SaveAllAndExit;
|
||||||
@@ -1232,6 +1221,9 @@ begin
|
|||||||
for i := 0 to CFG_XVTR_COUNT - 1 do
|
for i := 0 to CFG_XVTR_COUNT - 1 do
|
||||||
if BtnXvtrBand[i] <> nil then
|
if BtnXvtrBand[i] <> nil then
|
||||||
StyleButton(BtnXvtrBand[i], i = FController.FCurrentXvtr);
|
StyleButton(BtnXvtrBand[i], i = FController.FCurrentXvtr);
|
||||||
|
rfBandRestore:
|
||||||
|
// Явная смена диапазона: сброс порогов водопада (не на каждом тюне).
|
||||||
|
FSpecView.ResetWfAvgBuf;
|
||||||
rfMute:
|
rfMute:
|
||||||
begin
|
begin
|
||||||
StyleButton(BtnMute, FController.FMuted);
|
StyleButton(BtnMute, FController.FMuted);
|
||||||
|
|||||||
+10
-5
@@ -59,7 +59,7 @@ type
|
|||||||
rfMode, rfFilter, rfFilterBW,
|
rfMode, rfFilter, rfFilterBW,
|
||||||
rfAGCMode, rfAGCTop,
|
rfAGCMode, rfAGCTop,
|
||||||
rfVolume, rfMute, rfDrive, rfAtten,
|
rfVolume, rfMute, rfDrive, rfAtten,
|
||||||
rfBand, rfXvtr,
|
rfBand, rfXvtr, rfBandRestore, // rfBandRestore: явная смена диапазона (сброс Wf-avg в UI)
|
||||||
rfCenterFreq, rfSpan, rfSampleRate,
|
rfCenterFreq, rfSpan, rfSampleRate,
|
||||||
rfCTun, rfDuplex,
|
rfCTun, rfDuplex,
|
||||||
rfRunning, rfConnected, rfTransmitting, rfTuning,
|
rfRunning, rfConnected, rfTransmitting, rfTuning,
|
||||||
@@ -1136,12 +1136,13 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TRadioController.RestoreBand(BandIdx: Integer);
|
procedure TRadioController.RestoreBand(BandIdx: Integer);
|
||||||
// Загружает состояние диапазона из кэша, применяет к DSP и шлёт события рендера.
|
// Загружает состояние диапазона из кэша, применяет к DSP, делает финальную
|
||||||
// Финальную перестройку VFO A (с канальной оркестрацией) делает вызывающий
|
// перестройку приёмника на активный VFO и шлёт события рендера. Полная команда —
|
||||||
// UI-путь через ApplyVfoA(FVfoA); здесь FVfoA лишь выставляется.
|
// зовётся напрямую desktop/web/channel/connect-restore.
|
||||||
var B: TBandSettings;
|
var B: TBandSettings;
|
||||||
begin
|
begin
|
||||||
if (BandIdx < 0) or (BandIdx >= CFG_BAND_COUNT) then Exit;
|
if (BandIdx < 0) or (BandIdx >= CFG_BAND_COUNT) then Exit;
|
||||||
|
Changed(rfBandRestore); // явная смена диапазона → UI сбросит Wf-avg буфер
|
||||||
B := FBandCache[BandIdx];
|
B := FBandCache[BandIdx];
|
||||||
FCurrentBand := BandIdx;
|
FCurrentBand := BandIdx;
|
||||||
|
|
||||||
@@ -1154,7 +1155,11 @@ begin
|
|||||||
FDriveLevel := CalcDriveByte;
|
FDriveLevel := CalcDriveByte;
|
||||||
|
|
||||||
Changed(rfVfoB);
|
Changed(rfVfoB);
|
||||||
// rfVfoA НЕ шлём: финальную перестройку делает ApplyVfoA в UI-обёртке.
|
// Финальная перестройка приёмника на АКТИВНЫЙ VFO. VFO A — через SetVfoA
|
||||||
|
// (хук OnAfterTune несёт канальную оркестрацию); VFO B — через SetVfoB.
|
||||||
|
// Иначе смена диапазона при активном B центрировала бы приёмник на A.
|
||||||
|
if FActiveVfo = 0 then SetVfoA(FVfoA)
|
||||||
|
else SetVfoB(FVfoB);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TRadioController.ActiveVfoHz: Double;
|
function TRadioController.ActiveVfoHz: Double;
|
||||||
|
|||||||
Reference in New Issue
Block a user