mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:27:33 +00:00
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:
+1
-79
@@ -28,7 +28,7 @@ program tcitest;
|
||||
uses
|
||||
cthreads, Classes, SysUtils, Math, SyncObjs, Sockets, BaseUnix,
|
||||
TCIProtocol, TCIStreams, TCIServer, TCIAdapter, RadioController,
|
||||
WsClient, WebUtils, WDSPEngine, Settings, CWMorse, TxHealth, PlatformUtils;
|
||||
WsClient, WebUtils, WDSPEngine, Settings, CWMorse;
|
||||
|
||||
var
|
||||
Passed, Failed: Integer;
|
||||
@@ -2207,83 +2207,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TestTxHealth;
|
||||
// Детектор голодания очереди TX (TxHealth.pas). Стенд проверяет его отдельно от
|
||||
// сети: порог «опасного» простоя, сводку по передаче, контекст пейсинга рядом с
|
||||
// событием и то, что вне передачи прибор молчит.
|
||||
// ★Диска здесь нет намеренно: TxHealthService писал бы в НАСТОЯЩИЙ журнал
|
||||
// пользователя, поэтому стенд берёт сводки через TxHealthTake.
|
||||
var
|
||||
Base: Int64;
|
||||
S: TTxSession;
|
||||
D: TTxDrought;
|
||||
Was: Integer;
|
||||
begin
|
||||
WriteLn('G. Детектор голодания очереди TX');
|
||||
|
||||
// Сводки, накопленные прошлыми частями стенда (они гоняют SetMOX), забираем,
|
||||
// чтобы мерить своё.
|
||||
while TxHealthTake(S) do ;
|
||||
Was := TxHealthDangerTotal;
|
||||
|
||||
// Вне передачи прибор обязан молчать: простой на приёме — это норма, DUC-поток
|
||||
// тогда не шлёт вообще ничего.
|
||||
Base := MonotonicUs;
|
||||
TxHealthDrought(Base, Base + 50000, 0);
|
||||
TxHealthFifoEmpty;
|
||||
Check('детектор: вне передачи простой не считается',
|
||||
TxHealthDangerTotal = Was, IntToStr(TxHealthDangerTotal - Was));
|
||||
|
||||
TxHealthPtt(True, txhSrcTCI);
|
||||
TxHealthPublishTci(3584, 2200, 1024, 512, 5333, 44100);
|
||||
Base := MonotonicUs;
|
||||
// Короткий простой: подушка отправителя его покрывает, в эфир он не выходит.
|
||||
TxHealthDrought(Base, Base + 8000, 7);
|
||||
Check('детектор: простой короче подушки не опасен',
|
||||
TxHealthDangerTotal = Was, IntToStr(TxHealthDangerTotal - Was));
|
||||
// Длинный: FIFO радио сохнет, в эфире голая несущая.
|
||||
TxHealthDrought(Base + 100000, Base + 118000, 0);
|
||||
TxHealthFifoEmpty;
|
||||
Check('детектор: простой длиннее подушки опасен',
|
||||
TxHealthDangerTotal = Was + 1, IntToStr(TxHealthDangerTotal - Was));
|
||||
TxHealthPtt(False, 0);
|
||||
|
||||
Check('детектор: сводка передачи снялась', TxHealthTake(S));
|
||||
Check('детектор: простоев посчитано верно', S.Droughts = 2, IntToStr(S.Droughts));
|
||||
Check('детектор: опасных посчитано верно', S.Dangerous = 1, IntToStr(S.Dangerous));
|
||||
Check('детектор: самое длинное — длиннее подушки',
|
||||
S.LongestUs = 18000, IntToStr(S.LongestUs));
|
||||
Check('детектор: момент первого опасного — от фронта PTT',
|
||||
(S.FirstDangerMs >= 90) and (S.FirstDangerMs <= 130),
|
||||
IntToStr(S.FirstDangerMs));
|
||||
Check('детектор: источник модуляции в сводке', S.Source = txhSrcTCI);
|
||||
Check('детектор: жалоба радио (FIFO EMPTY) считается только на передаче',
|
||||
S.FifoEmpty = 1, IntToStr(S.FifoEmpty));
|
||||
|
||||
// ★Ради этого прибор и делался: рядом с опасным простоем лежит состояние
|
||||
// пейсинга — по нему видно, чей простой (аванса, зернистости клиента или
|
||||
// планировщика), и оператору не нужно называть интервал на глаз.
|
||||
Check('детектор: контекст пейсинга лежит рядом с событием',
|
||||
TxHealthDetail(S.Id, 0, D));
|
||||
Check('детектор: в контексте аванс и пачка клиента',
|
||||
(D.Lead = 3584) and (D.GapUs = 44100) and (D.Quantum = 512) and
|
||||
(D.LenUs = 18000),
|
||||
Format('аванс %d, пачка %d, квант %d, простой %d',
|
||||
[D.Lead, D.GapUs, D.Quantum, D.LenUs]));
|
||||
Check('детектор: второго опасного в этой передаче нет',
|
||||
not TxHealthDetail(S.Id, 1, D));
|
||||
|
||||
// Чистая передача: сводка обязана прийти с честным «опасных 0» — именно она и
|
||||
// снимает подозрение с нашего тракта.
|
||||
TxHealthPtt(True, txhSrcCard);
|
||||
Base := MonotonicUs;
|
||||
TxHealthDrought(Base, Base + 3000, 9);
|
||||
TxHealthPtt(False, 0);
|
||||
Check('детектор: чистая передача помечена как чистая',
|
||||
TxHealthTake(S) and (S.Dangerous = 0) and (S.Droughts = 1) and
|
||||
(S.FirstDangerMs < 0), Format('опасных %d', [S.Dangerous]));
|
||||
end;
|
||||
|
||||
procedure TestEndToEnd;
|
||||
const
|
||||
PORT = 40098;
|
||||
@@ -2734,7 +2657,6 @@ begin
|
||||
TestServer;
|
||||
TestEndToEnd;
|
||||
TestTxPacing;
|
||||
TestTxHealth;
|
||||
WriteLn;
|
||||
WriteLn(Format('Итого: %d проверок, провалено %d', [Passed + Failed, Failed]));
|
||||
if Failed > 0 then Halt(1);
|
||||
|
||||
Reference in New Issue
Block a user