Phase 5 (batch 27): move Run=0 teardown (StopRunning) into the controller

Extract the graceful Run=0 teardown from BtnStartStopClick's STOP branch
into TRadioController.StopRunning: UpdateState/SetRunAndFreq(False) at zero
drive, clear FRunning/FTransmitting, SetTXRun(False), reset RX telemetry,
emit Changed(rfTransmitting) + rfRunning. The network stays Connected so the
UI wrapper can persist state before Disconnect.

New OnControllerState(rfRunning) render handles the START/STOP button,
BtnMOX.Enabled and sleep inhibit; the context-specific offline status text
stays with the caller. FormClose reuses StopRunning (same teardown).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Uladzimir Karpenka
2026-06-08 10:59:14 +03:00
co-authored by Claude Opus 4.8
parent 452795dc59
commit 9fdfc67f65
2 changed files with 44 additions and 24 deletions
+24 -24
View File
@@ -1306,6 +1306,24 @@ begin
end; // (DUC-очередь сбрасывает SetMOX)
rfTuning:
StyleButton(BtnTUN, FController.FTuning);
rfRunning:
// Run-состояние: кнопка START/STOP, доступность MOX, запрет сна.
// Текст offline-статуса контекстно-зависим (Disconnected / Connection
// lost / …) — его ставит вызывающий, не общий рендер.
if FController.FRunning then
begin
InhibitSleep;
BtnStartStop.Caption := 'STOP';
StyleButton(BtnStartStop, True);
BtnMOX.Enabled := True;
end
else
begin
UninhibitSleep;
BtnStartStop.Caption := 'START';
StyleButton(BtnStartStop, False);
BtnMOX.Enabled := False;
end;
rfADCOverload:
if FSpecView <> nil then
begin
@@ -1450,15 +1468,7 @@ begin
// Останавливаем трансивер как при нажатии STOP
if FController.FNetwork.Connected then
begin
if FController.FRunning then
begin
FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), 0, False, True, True);
FController.FNetwork.SetRunAndFreq(False, XvtrTranslate(FController.FCenterFreq), XvtrTranslate(FController.FCenterFreq), 0);
FController.FRunning := False;
UninhibitSleep;
FController.FTransmitting := False;
if FController.FWDSPReady then FController.FDSPEngine.SetTXRun(False);
end;
FController.StopRunning;
FController.FNetwork.Disconnect;
end;
CloseAction := caFree;
@@ -3643,18 +3653,9 @@ begin
if FController.FNetwork.Connected then
begin
// --- STOP ---
if FController.FRunning then
begin
FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), XvtrTranslate(ActiveTXFreqHz), 0, False, True, True);
FController.FNetwork.SetRunAndFreq(False, XvtrTranslate(FController.FCenterFreq), XvtrTranslate(FController.FCenterFreq), 0);
FController.FRunning := False;
UninhibitSleep;
FController.FTransmitting := False;
if FController.FWDSPReady then FController.FDSPEngine.SetTXRun(False);
StyleButton(BtnMOX, False);
end;
FController.FRXPacketCount := 0;
FController.FActiveDDC := 0;
// Движок (graceful Run=0, сброс TX/телеметрии) + рендер run-кнопки/MOX/sleep
// — в контроллере (StopRunning + OnControllerState rfRunning/rfTransmitting).
FController.StopRunning;
// Сохраняем текущую частоту/настройки чтобы следующий START восстановил их
if FController.FDevConnected then
begin
@@ -3672,10 +3673,9 @@ begin
FSpecView.DrawSpectrum;
PbSpectrum.Invalidate;
FController.FNetwork.Disconnect;
BtnStartStop.Caption := 'START';
StyleButton(BtnStartStop, False);
// Run-кнопка/MOX уже перерисованы StopRunning (rfRunning); здесь только
// контекстный offline-статус.
SetRadioOfflineStatus('Disconnected', True);
BtnMOX.Enabled := False;
Exit;
end;