chore(tx): детектор голодания снят — всплесков не видно, вернём при нужде

Прибор из b173b7f отработал своё на этом заходе: всплески не появляются, и
держать его в тракте нет причин. Снято ровно то, что тот коммит поставил:
юнит TxHealth.pas, замеры простоев в отправителе DUC (обе ветки), публикация
контекста пейсинга из планировщика TCI, счёт бита HPS_FIFO_EMPTY, вызовы
TxHealthService в таймере UI и цикле демона, индикатор «·сухо N» в статусной
строке и секция G стенда.

Вернуть — реверсом этого коммита; опора детектора и правило его устройства
(в тракте передачи ничего, кроме записи в память) записаны в
test/hpsdr/README.md, чтобы не восстанавливать рассуждение заново.

Проверено: test/tci 262/262, test/cat 50/50, GUI (--ws=qt6) и демон собираются.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bkwwyj7xVRrqnSVEseTRfV
This commit is contained in:
2026-08-24 19:25:57 +03:00
co-authored by Claude Opus 5
parent b173b7f542
commit 867da5921e
8 changed files with 30 additions and 553 deletions
+1 -23
View File
@@ -51,7 +51,7 @@ uses
HPSDRProtocol, HPSDRNetwork, RadioBackend, PlutoBackend, IIOBindings,
WDSPEngine, AudioOutput, AudioInput, BeaconDecoder, BeaconFEC, DMRDecoder,
Settings, ChannelStore, FMRepeater, BoardUtils, DeviceStore, CWMorse, CWKeyer,
CWDecoder, TxHealth;
CWDecoder;
// Панадаптеры (этап 3): потолок MAX_PANS живёт в WDSPEngine (общий для
// движка/контроллера/UI). Фактический лимит бэкенда — Caps.MaxPans (Pluto=1).
@@ -1864,11 +1864,6 @@ begin
FHPpPLL := (Status.StatusBits and HPS_PLL_LOCKED) <> 0;
FHPpHWPTT := (Status.StatusBits and HPS_PTT) <> 0;
FHPpOverload := Status.ADCOverload;
// ★Жалоба самого радио: бит «DUC FIFO пуст». Поле ГЛУБИНЫ FIFO (байты 35-36)
// на этой прошивке статично и веры ему нет, а бит мы не читали вовсе —
// если прошивка его заполняет, это независимый свидетель голодания.
if FTransmitting and ((Status.StatusBits and HPS_FIFO_EMPTY) <> 0) then
TxHealthFifoEmpty;
// Состояние ключа/манипулятора в разъёме трансивера (сетевой поток).
// Касание обрывает программную передачу — как в Thetis/pihpsdr («key hit»
// останавливает CAT CW), иначе оператор не может вклиниться. ★Обрываем по
@@ -6297,7 +6292,6 @@ end;
procedure TRadioController.SetMOX(On_: Boolean);
var
WasTransmitting: Boolean;
TxhSrc: Integer;
begin
// DMR support is receive-only. This guard also covers CAT, web and hardware
// PTT. FM RAW is a flat external-modem transmit path.
@@ -6432,19 +6426,6 @@ begin
if FTransmitting and FDisplayDuplex then
FDSPEngine.SetDisplaySourceTX(False);
end;
// Детектор голодания очереди TX: фронт «в эфир» открывает передачу для
// счётчиков. Стоит ПОСЛЕ блока движка — источник модуляции решается там.
// Ввода-вывода тут нет и быть не может: журнал пишет потребитель (таймер UI /
// цикл демона), см. TxHealth.pas.
if FTransmitting and (not WasTransmitting) then
begin
if FTCIMicActive then TxhSrc := txhSrcTCI
else if FWebMicActive then TxhSrc := txhSrcWeb
else if Assigned(FDSPEngine) and (FDSPEngine.TXMicSource = txmsSoundCard) then
TxhSrc := txhSrcCard
else TxhSrc := txhSrcRadio;
TxHealthPtt(True, TxhSrc);
end;
// Сетевая PTT-последовательность TX-off: сначала снимаем PTT, затем реле RX.
if (not FTransmitting) and Assigned(FNetwork) and FNetwork.Connected and FNetwork.Running then
begin
@@ -6462,9 +6443,6 @@ begin
// (оператор держит T/R руками) — вооружение обязано пойти за этой кнопкой.
SyncCWKeyer;
Changed(rfTransmitting);
// Передача кончилась — складываем сводку в память. Диск не трогаем (★прошлый
// прибор писал дамп ровно здесь и тем самым прикрывал гонку в пейсинге).
if WasTransmitting and (not FTransmitting) then TxHealthPtt(False, 0);
end;
procedure TRadioController.SetTune(On_: Boolean);