diff --git a/RadioController.pas b/RadioController.pas index 3a44aca..15cae6d 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -609,6 +609,12 @@ type procedure SendDUCSpecificFromSettings; // DUC Specific (mic/keyer/atten) в сеть procedure ApplyTXSettingsToDSP; // TX-цепь (фильтр/gain/EQ/comp/...) → WDSP // ---- Телеграф ---------------------------------------------------------- + // Живой контекст «где мы сейчас»: в трансвертере правки запоминаются в его + // слоте, иначе в кэше диапазона. ★Развилка обязана стоять у КАЖДОГО поля, + // которое помнится по диапазону: пока её не было у режима/фильтра/AGC/CTUN, + // трансвертер травил ими тот HF-диапазон, на котором стоял до входа + // (FCurrentBand при входе в слот не меняется). + function XvtrSlotActive: Boolean; function TXProhibited: Boolean; // DoNotTx-бэнд / RX-only XVTR function CWTXActive: Boolean; // передачей владеет FPGA-кейер function CWOptionsByte: Byte; // DUC Specific байт 5 @@ -4068,7 +4074,8 @@ begin begin // Частота за окном — сбрасываем CTUN и центрируемся на ней. FCTun := False; - FBandCache[FCurrentBand].CTun := False; + if XvtrSlotActive then FXvtrSettings.Entries[FCurrentXvtr].LastCTun := False + else FBandCache[FCurrentBand].CTun := False; FCenterFreq := ActiveFreq; if FWDSPReady and Assigned(FDSPEngine) then FDSPEngine.SetShift(0.0); NeedPush := True; @@ -4175,7 +4182,8 @@ begin end; if Assigned(FDMRDec) then FDMRDec.SetEnabled(FMode = MODE_DMR); ApplyModeDefaults; // дефолтный фильтр/девиация под режим - FBandCache[FCurrentBand].Mode := FMode; + if XvtrSlotActive then FXvtrSettings.Entries[FCurrentXvtr].LastMode := FMode + else FBandCache[FCurrentBand].Mode := FMode; // Профиль привязан к паре «флаг + модуляция»: если передаём с главного, // новый режим приносит свой профиль. До пуша в WDSP — ApplyTXChainSettings // внутри SetTXMode ниже перешьёт цепь уже с новыми значениями. @@ -4221,6 +4229,11 @@ end; procedure TRadioController.CacheFilterToBand; begin + if XvtrSlotActive then + begin + FXvtrSettings.Entries[FCurrentXvtr].LastFilterIdx := FFilter; + Exit; + end; FBandCache[FCurrentBand].FilterIdx := FFilter; FBandCache[FCurrentBand].FilterBW := FFilterBW; // легаси-поле, для старых конфигов end; @@ -4356,7 +4369,8 @@ begin if (M < 0) or (M > 4) then Exit; FAGCMode := M; ApplyAGCToEngine; - FBandCache[FCurrentBand].AGCMode := FAGCMode; + if XvtrSlotActive then FXvtrSettings.Entries[FCurrentXvtr].LastAGCMode := FAGCMode + else FBandCache[FCurrentBand].AGCMode := FAGCMode; Changed(rfAGCMode); end; @@ -4366,7 +4380,8 @@ begin FAGCTop := DB; if FWDSPReady and Assigned(FDSPEngine) then FDSPEngine.SetAGCTop(FAGCTop); ApplyAGCToEngine; // ре-применяем режим с новым уровнем - FBandCache[FCurrentBand].AGCTop := FAGCTop; + if XvtrSlotActive then FXvtrSettings.Entries[FCurrentXvtr].LastAGCTop := FAGCTop + else FBandCache[FCurrentBand].AGCTop := FAGCTop; Changed(rfAGCTop); end; @@ -4989,7 +5004,8 @@ end; procedure TRadioController.SetCTun(On_: Boolean); begin FCTun := On_; - FBandCache[FCurrentBand].CTun := FCTun; + if XvtrSlotActive then FXvtrSettings.Entries[FCurrentXvtr].LastCTun := FCTun + else FBandCache[FCurrentBand].CTun := FCTun; if not FCTun then begin // Выключили CTUN: центрируемся на АКТИВНОМ VFO, shift=0. (Включение CTUN не @@ -5101,6 +5117,11 @@ begin FDSPEngine.SetANF(FANF); end; +function TRadioController.XvtrSlotActive: Boolean; +begin + Result := (FCurrentXvtr >= 0) and (FCurrentXvtr < CFG_XVTR_COUNT); +end; + function TRadioController.TXProhibited: Boolean; // Единая точка запретов передачи: диапазон с DoNotTx (Alex) и RX-only слот // трансвертера. Раньше эта пара была скопирована в SetMOX/SetTune/SetTwoTone —