fix(pluto): TX-разъём — по диапазону передачи, а не приёма

ApplyAntPorts брал оба разъёма по центру приёма, поэтому при мультислайс-TX
(или split на другой диапазон) передача могла уйти в разъём RX-диапазона.
Теперь RX-разъём — по FCenterFreq, TX — по ActiveTXFreqHz (TX-слайс/TX-VFO);
TX вне VU-плана падает обратно на диапазон приёма. Пересчёт добавлен в
SetTxSlice, SetSplit и в SetMOX(True) как страховка перед выходом в эфир.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 21:39:58 +03:00
co-authored by Claude Opus 4.8
parent b42da10ecf
commit e040c1b24e
+17 -7
View File
@@ -1432,9 +1432,11 @@ end;
procedure TRadioController.ApplyAntPorts; procedure TRadioController.ApplyAntPorts;
// Антенна — свойство диапазона (как RxAnt/TxAnt у Alex): при смене диапазона или // Антенна — свойство диапазона (как RxAnt/TxAnt у Alex): при смене диапазона или
// входе/выходе из трансвертера включаем разъёмы, выбранные для этого контекста. // входе/выходе из трансвертера включаем разъёмы, выбранные для этого контекста.
// RX-разъём берём по диапазону ПРИЁМА, TX — по диапазону ПЕРЕДАЧИ: с мультислайс-TX
// (или split) передача может идти не на частоте центра приёма.
var var
Rx, Tx: Byte; Rx, Tx: Byte;
Bi: Integer; BiRx, BiTx: Integer;
begin begin
if not (Assigned(FNetwork) and FNetwork.Connected) then Exit; if not (Assigned(FNetwork) and FNetwork.Connected) then Exit;
if not FNetwork.Caps.HasAntSwitch then Exit; if not FNetwork.Caps.HasAntSwitch then Exit;
@@ -1445,11 +1447,13 @@ begin
end end
else else
begin begin
// Диапазон — по ВИДИМОЙ частоте приёма (VU-план AD936x). // Диапазоны — по ВИДИМЫМ частотам (VU-план AD936x).
Bi := FreqToBandIdx(FCenterFreq, IsPluto); BiRx := FreqToBandIdx(FCenterFreq, IsPluto);
if (Bi < 0) or (Bi >= CFG_BAND_COUNT) then Exit; // вне плана — не трогаем if (BiRx < 0) or (BiRx >= CFG_BAND_COUNT) then Exit; // вне плана — не трогаем
Rx := FAnt936x.RxAnt[Bi]; Rx := FAnt936x.RxAnt[BiRx];
Tx := FAnt936x.TxAnt[Bi]; BiTx := FreqToBandIdx(ActiveTXFreqHz, IsPluto);
if (BiTx < 0) or (BiTx >= CFG_BAND_COUNT) then BiTx := BiRx; // TX вне плана — как RX
Tx := FAnt936x.TxAnt[BiTx];
end; end;
FNetwork.SetAntPorts(Rx, Tx); FNetwork.SetAntPorts(Rx, Tx);
end; end;
@@ -1860,6 +1864,7 @@ begin
if FWDSPReady and Assigned(FDSPEngine) then if FWDSPReady and Assigned(FDSPEngine) then
FDSPEngine.SetTXMode(ActiveTXMode); FDSPEngine.SetTXMode(ActiveTXMode);
FDriveLevel := CalcDriveByte; // калибровка драйва банда TX-слайса FDriveLevel := CalcDriveByte; // калибровка драйва банда TX-слайса
ApplyAntPorts; // AD936x: TX-разъём — по диапазону TX-слайса
PushNetworkState; // TX-частота/Alex через ActiveTXFreqHz/TxBandIdx PushNetworkState; // TX-частота/Alex через ActiveTXFreqHz/TxBandIdx
Changed(rfTransmitting); // UI: перерисовать TX-бейджи флагов/оверлей Changed(rfTransmitting); // UI: перерисовать TX-бейджи флагов/оверлей
end; end;
@@ -3698,7 +3703,11 @@ begin
Exit; Exit;
WasTransmitting := FTransmitting; WasTransmitting := FTransmitting;
FTransmitting := On_; FTransmitting := On_;
if On_ then FDriveLevel := CalcDriveByte; if On_ then
begin
FDriveLevel := CalcDriveByte;
ApplyAntPorts; // AD936x: страховка — верный разъём до выхода в эфир
end;
FDUCPendingCount := 0; // сброс TX DUC-очереди на смене TX-состояния FDUCPendingCount := 0; // сброс TX DUC-очереди на смене TX-состояния
// Сетевая PTT-последовательность TX-on: сначала реле (Alex bit27=1, drive) без // Сетевая PTT-последовательность TX-on: сначала реле (Alex bit27=1, drive) без
// PTT, затем PTT=1 — переключаем реле раньше передачи. // PTT, затем PTT=1 — переключаем реле раньше передачи.
@@ -3869,6 +3878,7 @@ procedure TRadioController.SetSplit(TxOnB: Boolean);
begin begin
if FSplitTxB = TxOnB then Exit; if FSplitTxB = TxOnB then Exit;
FSplitTxB := TxOnB; FSplitTxB := TxOnB;
ApplyAntPorts; // AD936x: TX-разъём — по диапазону нового TX-VFO
PushNetworkState; PushNetworkState;
Changed(rfActiveVfo); Changed(rfActiveVfo);
end; end;