fix RX leak after TX→RX: drop IQ during TX in non-DUP, Windows post-TX hold

В non-DUP при MOX/TUN на возврате слышен и виден на водопаде хвост
своего сигнала. Во время TX RX-IQ оседал в RXA pipeline / FFT-истории
RX-анализатора и «выстреливал» при открытии гейта.

  - WDSPEngine: KeepRXDuringTX (DUP-флаг). В non-DUP TX PushIQItemToDSP
    дропает пакеты на входе DSP-потока — RXA и анализатор не кормятся.
  - Windows-only post-TX hold (250 мс): дропаем И входящие RX-IQ, И аудио
    в окне после MOX-off, чтобы скрыть «хвост» от FPGA TX-buffer/PA
    slew-down радио. На Linux код-путь не активируется (буфер OS мелкий).
  - Network: ClearDUCIQQueue + IsTransmitting guard в DUC sender thread,
    чтобы недопереданные TX-IQ пакеты не уходили после MOX-off.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-09 13:39:45 +03:00
co-authored by Claude Opus 4.7
parent 28859d3e16
commit 9f208006aa
3 changed files with 84 additions and 3 deletions
+10
View File
@@ -193,6 +193,7 @@ type
procedure SendFullHP;
procedure SendDDCAudio(const LeftRight: array of SmallInt);
procedure SendDUCIQ(const IData, QData: array of Integer);
procedure ClearDUCIQQueue;
property Connected: Boolean read FConnected;
property Running: Boolean read FRunning;
@@ -493,6 +494,8 @@ begin
WaitUntil(NextDueUs);
if Terminated then Break;
if not FNet.FIsTransmitting then
Continue;
FNet.PackSeqBytes(Pkt.Seq, FNet.NextSeq(FNet.FSeqDUCIQ));
FNet.DoSendTo(FNet.FSocket, Pkt, SizeOf(Pkt), FNet.FDevice.IPAddress,
@@ -519,6 +522,8 @@ begin
if Terminated then Break;
DrainVirtualFIFO;
if not FNet.FIsTransmitting then
Continue;
FNet.PackSeqBytes(Pkt.Seq, FNet.NextSeq(FNet.FSeqDUCIQ));
FNet.DoSendTo(FNet.FSocket, Pkt, SizeOf(Pkt), FNet.FDevice.IPAddress,
@@ -646,6 +651,11 @@ begin
end;
end;
procedure THPSDRNetwork.ClearDUCIQQueue;
begin
ResetDUCIQQueue;
end;
procedure THPSDRNetwork.EnqueueDUCIQ(const Pkt: TDUCIQPacket);
begin
FDUCIQLock.Enter;