mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
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:
+22
-1
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user