fix(hpsdr): окно повторов Specific-пакетов — только со старта, не на каждую пере-сборку

RebuildDDCSpecific сбрасывал FResendCount, а этим счётчиком keepalive-поток
управляет окном повторов: пока он меньше 100, каждые 500 мс переотправляются
DDC Specific и DUC Specific. Окно задумано как стартовый костыль — порты
1025/1026 на железе открываются только после Run=1.

Сброс из пере-сборки делал окно рецидивирующим: любая переконфигурация на
живой сессии заводила ещё десять пере-латчей DDC Specific в течение пяти
секунд. Вызывают её вход и выход PureSignal из передачи (то есть каждый MOX,
когда PS вооружён), добавление и удаление панадаптера, смена sample rate.
Пакет конфигурирует все DDC разом, поэтому пере-латч на ходу трогает и
главный приёмник — этой же операцией когда-то был получен мусорный поток на
доп. панах. С PS и 2TON выходило по двадцать пере-латчей на передачу, что
похоже на давний открытый пункт про всплески водопада при 2TON.

Счётчик сбрасывается теперь только по Run=1. Размен: повторы заодно
маскировали потерю UDP-пакета с конфигом посреди сессии, и переконфигурация
стала одним пакетом.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 13:55:19 +03:00
co-authored by Claude Opus 5
parent c6d1e409ff
commit e87ca6b186
+12 -2
View File
@@ -1700,7 +1700,13 @@ begin
SendDDCSpecific(Pkt);
FCachedDDCSpec := Pkt;
FCachedDDCValid := True;
FResendCount := 0;
// ★СЧЁТЧИК ПЕРЕ-ОТПРАВКИ ЗДЕСЬ НЕ СБРАСЫВАЕМ. Окно повторов — сугубо
// СТАРТОВЫЙ костыль (порты 1025/1026 открываются только после Run=1), и
// живёт оно от Run=1. Сброс отсюда превращал его в рецидивирующий: любая
// пере-сборка на живой сессии — вход/выход PureSignal в TX (каждый MOX!),
// добавление пана, смена rate — заводила ЕЩЁ 10 пере-латчей DDC Specific в
// течение 5 секунд. А пере-латч конфига DDC на ходу трогает и ГЛАВНЫЙ
// приёмник: ровно этим уже был получен «мусорный» поток на доп. панах.
end;
procedure THPSDRNetwork.SetPanDDC(DDCIdx: Integer; Enabled: Boolean;
@@ -1983,7 +1989,11 @@ procedure THPSDRNetwork.SetRunAndFreq(Run: Boolean; DDC0FreqHz, DUCFreqHz: Doubl
begin
// При Run=1 аппаратура сбрасывает счётчик HP-последовательности.
// Синхронизируем свой счётчик чтобы не получить SEQ ERROR на первом пакете.
if Run then FSeqHP := 0;
if Run then
begin
FSeqHP := 0;
FResendCount := 0; // окно повторов Specific-пакетов — только со старта
end;
FRunning := Run;
FCurrentRXFreq := DDC0FreqHz;
FCurrentTXFreq := DUCFreqHz;