refactor(controller): единая дверь SetTXSettings для правки TX-настроек

Применение TX-настроек (WDSP, DUC Specific при смене mic-битов/ATT, живое
обновление TUN, запись в активный профиль, персист) жило в обработчике
MainForm — то есть было недоступно ничему, кроме вкладки Transmit. CAT и web
по архитектуре ходят только в контроллер и дотянуться туда не могли.

Логика переехала в TRadioController.SetTXSettings по образцу уже
существовавшего SetCWSettings; MainForm делегирует ей и оставляет себе только
рендер. Notify=False у формы — иначе rfTXProfile перезагрузил бы вкладку
Transmit прямо под руками у того, кто её правит.

Заодно SetTXMonVolume: громкость self-monitor'а адресно, вне TX-контекста
(слайдер добирается до неё только на передаче, CAT-клиенту такой контекст
не нужен).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 13:12:10 +03:00
co-authored by Claude Opus 5
parent f89f202a34
commit f7bed07831
2 changed files with 76 additions and 48 deletions
+7 -48
View File
@@ -8520,64 +8520,23 @@ begin
end;
procedure TMainForm.OnTXSettingsChange(const T: TTXSettings);
// Любая правка в Settings→Transmit летит сюда: обновляем FController.FTXSettings,
// перешиваем WDSP TX-цепь и (если поменялись mic-биты) перепосылаем DUC Specific.
var
OldMicByte, NewMicByte: Byte;
OldAtt, OldTUNLevel, OldTUNFreq: Integer;
GridChanged: Boolean;
// Любая правка в Settings→Transmit летит сюда. Применение записи (WDSP, DUC
// Specific, живой TUN, профиль, персист) — в контроллере: SetTXSettings, та же
// дверь, что у CAT и web. Форме остаётся рендер.
// Notify=False — иначе rfTXProfile перезагрузил бы вкладку Transmit прямо под
// руками у того, кто её сейчас правит.
var GridChanged: Boolean;
begin
OldMicByte := FController.BuildMicLineSelectByte;
OldAtt := FController.FTXSettings.AttOnTX;
OldTUNLevel := FController.FTXSettings.TUNLevel;
OldTUNFreq := FController.FTXSettings.TUNFreq;
GridChanged := (FController.FTXSpecRefLevel <> T.TXSpecRefLevel)
or (FController.FTXSpecRange <> T.TXSpecRange)
or (FController.FTXSpecGridStep <> T.TXSpecGridStep);
FController.FTXSettings := T;
NewMicByte := FController.BuildMicLineSelectByte;
// TX-grid в момент правки — обновляем рабочие поля и (если на передаче) пушим в FSpecView
FController.FTXSpecRefLevel := FController.FTXSettings.TXSpecRefLevel;
FController.FTXSpecRange := FController.FTXSettings.TXSpecRange;
if FController.FTXSettings.TXSpecGridStep > 0 then
FController.FTXSpecGridStep := FController.FTXSettings.TXSpecGridStep;
FController.SetTXSettings(T, False);
if GridChanged and FController.FTransmitting then
ApplySpecViewGridFromState;
FController.ApplyTXSettingsToDSP;
// Low/High из вкладки Transmit — та же полоска фильтра на спектре: кромки
// берём уже пересчитанными движком (знак боковой) и на передаче перерисовываем.
PushFilterEdgesToView;
if FController.FTransmitting then FSpectrumDirty := True;
if (OldMicByte <> NewMicByte) or (OldAtt <> FController.FTXSettings.AttOnTX) then
FController.SendDUCSpecificFromSettings;
// TUN-параметры live: если идёт tune — обновить тон/drive, иначе просто запомнить.
if FController.FTuning then
begin
if (OldTUNFreq <> FController.FTXSettings.TUNFreq) and FController.FWDSPReady then
FController.FDSPEngine.SetTXTone(True, FController.FTXSettings.TUNFreq, 1.0);
if OldTUNLevel <> FController.FTXSettings.TUNLevel then
begin
FController.FDriveLevel := CalcDriveByte;
if FController.FWDSPReady then
FController.FDSPEngine.SetDriveLevel(FController.FTXSettings.TUNLevel / 100.0);
if FController.FNetwork.Connected and FController.FNetwork.Running then
begin
FController.FNetwork.UpdateState(XvtrTranslate(FController.FCenterFreq), FController.TXTuneFreqHz, FController.FDriveLevel,
FController.FTransmitting, True, True, FController.FTuning, FController.FTwoTone);
FController.FNetwork.SendFullHP;
end;
end;
end;
// Правка «звуковых» полей — это правка активного профиля: отдельной кнопки
// «сохранить» нет, профиль ведётся за живым состоянием (см. TTXProfile).
FController.StoreActiveTXProfile;
// Сохраняем сразу — настройки per-device, попадают в hpsdr_settings.json
if FController.FDevConnected then
begin
FController.FSettings.SaveTX(FController.FDevMAC, FController.FTXSettings);
FController.FSettings.SaveTXProfiles(FController.FDevMAC, FController.FTXProfiles);
FController.FSettings.Save;
end;
end;
procedure TMainForm.OnCWSettingsChange(const C: TCWSettings);