mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 19:45:09 +00:00
feat(tx): self-monitor RX-аудио на TX в любом DUP + меньше TX pre-roll
RX MUTE (self-monitor даунлинка на передаче): кнопка теперь доступна на
ВСЕХ бэкендах, а не только Pluto/QO-100. Активна только в DUP; без DUP
кнопка disabled и звук на TX не проходит (движок гейтит по
FKeepRXDuringTX=FDisplayDuplex — двойная защита: аудио-гейт + RXA не
кормится). Добавлен RadioController.DisplayDuplex. TFlatButton теперь
рисует disabled-состояние приглушённым (текст/рамка к фону).
TX pre-roll 8144->6096 (2 блока подушки вместо 3): обоснование «нужно 3
блока» опиралось на щелчок ~0.5с после старта, который на деле оказался
bfo-глитчом тона (устранён f2d0519), а не underrun'ом подушки. Латентность
старта TX ~-10мс; startup-щелчков под нагрузкой DUP не слышно (подтверждено).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+17
-9
@@ -636,8 +636,11 @@ type
|
||||
function BandPlan: TBandPlanArray;
|
||||
// True если активный бэкенд — Pluto (VHF/UHF band-план вместо HF).
|
||||
function IsPluto: Boolean;
|
||||
// True — активен QO-100 (Pluto + full-duplex XVTR-слот); гейт UI beacon/RX MUTE.
|
||||
// True — активен QO-100 (Pluto + full-duplex XVTR-слот); гейт UI beacon.
|
||||
function InQO100: Boolean;
|
||||
// True — включён режим DUP (дисплей+RX держатся на TX). Гейт активности
|
||||
// кнопки RX MUTE (self-monitor) на ЛЮБОМ бэкенде — без DUP звук на TX не идёт.
|
||||
function DisplayDuplex: Boolean;
|
||||
// Человекочитаемое имя подключённой платы для статус-строки (UI/Web).
|
||||
// HPSDR → тип платы; Pluto/LibreSDR → hw_model + серийник (если есть).
|
||||
function BoardDisplayName: string;
|
||||
@@ -3079,14 +3082,14 @@ begin
|
||||
FDriveLevel, True, True, True);
|
||||
FNetwork.SendFullHP; // 1й пакет: Alex bit27=1 (T/R relay), drive — без PTT
|
||||
FNetwork.SendPTT(True); // 2й пакет: PTT=1 после переключения реле
|
||||
// Pre-roll: THROTTLE (2000) + ТРИ WDSP-блока (3×2048) нулевых пар. Первая
|
||||
// часть улетает сразу и наполняет DUC-FIFO радио до порога THROTTLE (DAC
|
||||
// не стартует с пустого буфера), остаток ~3 блока (~32мс) ложится ПОДУШКОЙ
|
||||
// в очередь — дальше очередь на приходе каждого WDSP-блока непуста, sender
|
||||
// метрит непрерывно, и опоздание блока не роняет FIFO радио. Замеры: под
|
||||
// нагрузкой DUP и при быстром пере-PTT первый WDSP-блок опаздывает до
|
||||
// 25мс — двух блоков подушки не хватало (щелчок через ~0.5с после старта).
|
||||
FNetwork.PrimeDUCIQ(8144);
|
||||
// Pre-roll: THROTTLE (2000, порог FPGA — DAC не стартует с пустого буфера)
|
||||
// + ДВА WDSP-блока (2×2048) нулевых пар подушкой в очередь. Раньше было 3
|
||||
// блока: обоснование «2 не хватало — щелчок через ~0.5с» теперь под вопросом,
|
||||
// т.к. тот щелчок по времени (0.5с, не ~21мс) похож не на underrun подушки, а
|
||||
// на bfo-глитч тона (устранён коммитом f2d0519). Снижено до 2 блоков ради
|
||||
// латентности старта TX (~10мс). Если под нагрузкой DUP / быстром пере-PTT
|
||||
// вернётся щелчок РОВНО на старте — это реальный underrun, вернуть 8144.
|
||||
FNetwork.PrimeDUCIQ(6096);
|
||||
end;
|
||||
if FWDSPReady and Assigned(FDSPEngine) then
|
||||
begin
|
||||
@@ -3791,6 +3794,11 @@ begin
|
||||
and FXvtrSettings.Entries[FCurrentXvtr].FullDuplexTx;
|
||||
end;
|
||||
|
||||
function TRadioController.DisplayDuplex: Boolean;
|
||||
begin
|
||||
Result := FDisplayDuplex;
|
||||
end;
|
||||
|
||||
function TRadioController.BoardDisplayName: string;
|
||||
var
|
||||
Dev: THPSDRDevice;
|
||||
|
||||
Reference in New Issue
Block a user