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
+22 -1
View File
@@ -4468,24 +4468,45 @@ begin
FSpecView.TXOverlay := FTransmitting;
// Перерисовываем сетку спектра под активный тракт (Thetis-style).
ApplySpecViewGridFromState;
if FTransmitting and FNetwork.Connected and FNetwork.Running then
begin
FNetwork.ClearDUCIQQueue;
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel,
True, True, True);
FNetwork.SendFullHP;
end;
if FWDSPReady then
begin
// В non-DUP RX-IQ пакеты дропаются на входе DSP-потока во время TX,
// чтобы TX leakage не накапливался в RXA pipeline и FFT-истории
// RX-анализатора. В DUP RX-тракт работает как обычно.
FDSPEngine.KeepRXDuringTX := FDisplayDuplex;
FDSPEngine.SetTXRun(FTransmitting);
if WasTransmitting and (not FTransmitting) and (not FDisplayDuplex) then
begin
FDSPEngine.FlushRX;
if Assigned(FAudioOut) then
FAudioOut.Clear;
{$IFDEF WINDOWS}
// Windows: на TX→RX дропаем И RX-IQ пакеты, И аудио-выход на это окно.
// Источник «хвоста» — radio FPGA TX-buffer + PA slew-down: после MOX-off
// радио дотравливает буфер передатчика, RX1 ловит это как leak, и WDSP
// отдаёт это и в водопад, и в звук. На Linux наблюдается окно <30мс,
// на Windows может тянуться 200–500мс. Подобрать значение можно здесь
// без перекомпиляции engine. На Linux код-путь не активируется.
FDSPEngine.BeginPostTXMute(250);
{$ENDIF}
end;
// SetTXRun переключает FActiveDisplayID на TX_DISP_ID; при DUP возвращаем
// источник на RX, чтобы видеть приём во время передачи.
if FTransmitting and FDisplayDuplex then
FDSPEngine.SetDisplaySourceTX(False);
end;
if FNetwork.Connected and FNetwork.Running then
if (not FTransmitting) and FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel,
FTransmitting, True, True);
FNetwork.ClearDUCIQQueue;
FNetwork.SendFullHP;
end;
end;