mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
Phase 5 (batch 30): move device connect/load-by-MAC into the controller
Fill controller.ConnectDevice with the DoConnectDevice load core: Connect, load per-device settings by MAC (TX/Alex/XVTR, PA cal, drive%, sample rate, NR/NB/SNB/ANF, Wf/Show/Spec params) into controller fields, configure DSP display + open audio devices. Returns False on connect failure (UI shows the message). New FLoadedGlobal field retains the loaded TGlobalSettings so the UI can render fields the controller doesn't own (FPS/FreqMhzDigits/CAT). New OnControllerState(rfDevice) renders all device-level widgets from state (drive slider, NR/NB buttons, FSpecView/Wideband params, DUP, sample-rate overlay, CAT apply, web push, FPS, freq digits). drive% now loads directly into FDrivePercent instead of via TrkDrive.Position; the slider reflects it in the render. DoConnectDevice collapses to a thin wrapper: ConnectDevice -> RestoreBand/XVTR/active-VFO -> StartRunning. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
04f621bf3d
commit
783c8976c9
+115
-3
@@ -212,6 +212,9 @@ type
|
||||
FPABandCal: array[0..CFG_BAND_COUNT-1] of Double;
|
||||
FVHFBandCal: array[0..CFG_XVTR_COUNT-1] of Double;
|
||||
FDevMAC: array[0..5] of Byte;
|
||||
// Глобальные настройки устройства, загруженные ConnectDevice. Хранятся для
|
||||
// UI-рендера полей, которых нет в контроллере (DisplayFPS/FreqMhzDigits/CAT).
|
||||
FLoadedGlobal: TGlobalSettings;
|
||||
|
||||
// ---- Телеметрия (наполняется в Фазе 3/4 вместе с сетевыми колбэками) ----
|
||||
FLastSMeter, FLastFwdW, FLastSWR, FLastSupplyV, FLastSupplyA: Double;
|
||||
@@ -396,7 +399,7 @@ type
|
||||
procedure SetRun(On_: Boolean);
|
||||
procedure StartRunning(SpectrumWidth: Integer); // Run=1 bring-up: General/DDC/DUC + DSP restore
|
||||
procedure StopRunning; // Run=0: graceful-стоп RX-потока + сброс TX/телеметрии
|
||||
procedure ConnectDevice(const Dev: THPSDRDevice);
|
||||
function ConnectDevice(const Dev: THPSDRDevice): Boolean; // Connect + load-by-MAC; рендер через rfDevice
|
||||
procedure Discover;
|
||||
|
||||
// ---- События наружу ----
|
||||
@@ -2044,8 +2047,117 @@ begin
|
||||
Changed(rfRunning); // безусловный сброс run-кнопки/MOX.Enabled/sleep (как старый хвост STOP)
|
||||
end;
|
||||
|
||||
procedure TRadioController.ConnectDevice(const Dev: THPSDRDevice);
|
||||
begin { TODO wiring: DoConnectDevice } Changed(rfDevice); end;
|
||||
function TRadioController.ConnectDevice(const Dev: THPSDRDevice): Boolean;
|
||||
// Подключение + загрузка per-device настроек по MAC в поля контроллера + конфиг
|
||||
// движка (DSP display, audio). Возвращает False, если Connect не удался (UI
|
||||
// покажет сообщение по FNetwork.LastError). Рендер ВСЕХ device-виджетов — UI
|
||||
// через OnControllerState(rfDevice). Перестройку диапазона/VFO (RestoreBand/
|
||||
// XVTR/ActiveVfo) делает UI-обёртка ПОСЛЕ (там финальная перестройка через
|
||||
// ApplyVfoA + wideband/web-extras). FLoadedGlobal хранит загруженный G_Settings
|
||||
// для рендера полей, которых нет в контроллере (FPS/FreqMhzDigits/CAT).
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result := FNetwork.Connect(Dev);
|
||||
if not Result then Exit;
|
||||
|
||||
// --- Загружаем настройки устройства по MAC ---
|
||||
Move(FNetwork.Device.MAC[0], FDevMAC[0], 6);
|
||||
FDevConnected := True;
|
||||
FSettings.LoadDevice(FDevMAC, FLoadedGlobal, FBandCache);
|
||||
// TX/Alex/XVTR per-device
|
||||
FSettings.LoadTX(FDevMAC, FTXSettings);
|
||||
FSettings.LoadAlex(FDevMAC, FAlexSettings);
|
||||
FNetwork.SetAlexConfig(FAlexSettings);
|
||||
FSettings.LoadXvtr(FDevMAC, FXvtrSettings);
|
||||
FCurrentXvtr := -1;
|
||||
ApplyXvtrToNetwork;
|
||||
FTXSpecRefLevel := FTXSettings.TXSpecRefLevel;
|
||||
FTXSpecRange := FTXSettings.TXSpecRange;
|
||||
if FTXSettings.TXSpecGridStep > 0 then
|
||||
FTXSpecGridStep := FTXSettings.TXSpecGridStep;
|
||||
FVolume := FLoadedGlobal.Volume;
|
||||
FActiveVfo := FLoadedGlobal.ActiveVfo;
|
||||
FPAMaxPower := FLoadedGlobal.PAMaxPower;
|
||||
for i := 0 to CFG_BAND_COUNT - 1 do
|
||||
FPABandCal[i] := FLoadedGlobal.PABandCal[i];
|
||||
for i := 0 to CFG_XVTR_COUNT - 1 do
|
||||
FVHFBandCal[i] := FLoadedGlobal.VHFBandCal[i];
|
||||
// drive% (0..100) — раньше грузился через TrkDrive.Position; теперь напрямую,
|
||||
// слайдер выставит rfDevice-рендер. Калиброванный байт считаем после FCurrentBand.
|
||||
FDrivePercent := EnsureRange(FLoadedGlobal.DriveLevel, 0, 100);
|
||||
FCurrentBand := FLoadedGlobal.LastBand;
|
||||
FDriveLevel := CalcDriveByte;
|
||||
// SampleRate — глобальный, до RestoreBand
|
||||
if FLoadedGlobal.SampleRate > 0 then
|
||||
begin
|
||||
FSampleRate := FLoadedGlobal.SampleRate;
|
||||
FSpanHz := FSampleRate;
|
||||
end;
|
||||
FNRMode := EnsureRange(FLoadedGlobal.NRMode, 0, 4);
|
||||
FNBMode := EnsureRange(FLoadedGlobal.NBMode, 0, 2);
|
||||
FSNB := FLoadedGlobal.SNBEnabled;
|
||||
FANF := FLoadedGlobal.ANFEnabled;
|
||||
FWfAGCEnabled := FLoadedGlobal.WfAGCEnabled;
|
||||
FWfNFEnabled := FLoadedGlobal.WfNFEnabled;
|
||||
FDitherEnabled := FLoadedGlobal.DitherEnabled;
|
||||
FRandomEnabled := FLoadedGlobal.RandomEnabled;
|
||||
FSendAudioToRadio := FLoadedGlobal.SendAudioToRadio;
|
||||
FWfManualHigh := FLoadedGlobal.WfManualHigh;
|
||||
FWfManualLow := FLoadedGlobal.WfManualLow;
|
||||
FWfAGCOffset := FLoadedGlobal.WfAGCOffset;
|
||||
FShowSpectrum := FLoadedGlobal.ShowSpectrum;
|
||||
FShowWaterfall := FLoadedGlobal.ShowWaterfall;
|
||||
FShowWideband := FLoadedGlobal.ShowWideband;
|
||||
FWidebandFill := FLoadedGlobal.WidebandFill;
|
||||
FSpectrumFill := FLoadedGlobal.SpectrumFill;
|
||||
FDisplayDuplex := FLoadedGlobal.DisplayDuplex;
|
||||
// Настройки дисплея/сетки + DSP display + аудио-устройства
|
||||
if FLoadedGlobal.FFTSize > 0 then
|
||||
begin
|
||||
FSpecRefLevel := FLoadedGlobal.SpecRefLevel;
|
||||
FSpecRange := FLoadedGlobal.SpecRange;
|
||||
if FLoadedGlobal.SpecGridStep > 0 then FSpecGridStep := FLoadedGlobal.SpecGridStep;
|
||||
if FWDSPReady then
|
||||
begin
|
||||
FDSPEngine.SetFFTParams(FLoadedGlobal.FFTSize, FLoadedGlobal.WindowType);
|
||||
FDSPEngine.SetSpectrumDisplay(FLoadedGlobal.SpecDetector, FLoadedGlobal.SpecAvgMode,
|
||||
FLoadedGlobal.SpecAvgTimeMS);
|
||||
FDSPEngine.SetWaterfallDisplay(FLoadedGlobal.WfDetector, FLoadedGlobal.WfAvgMode,
|
||||
FLoadedGlobal.WfAvgTimeMS);
|
||||
end;
|
||||
// Аудио устройство вывода
|
||||
FAudioOut.Close;
|
||||
if FLoadedGlobal.AudioSampleRate > 0 then
|
||||
FAudioOut.SampleRate := FLoadedGlobal.AudioSampleRate;
|
||||
if FLoadedGlobal.AudioOutDevice <> '' then
|
||||
begin
|
||||
FAudioOut.DeviceIndex := FAudioOut.FindDeviceByName(FLoadedGlobal.AudioOutDevice);
|
||||
FAudioOutDevName := FLoadedGlobal.AudioOutDevice;
|
||||
end
|
||||
else
|
||||
begin
|
||||
FAudioOut.DeviceIndex := -1;
|
||||
FAudioOutDevName := '';
|
||||
end;
|
||||
FAudioOut.Open;
|
||||
// Аудио устройство ввода (TX mic). MicSource определяется в SetMOX по PTT —
|
||||
// здесь только открываем устройство.
|
||||
if FLoadedGlobal.AudioInDevice <> '' then
|
||||
begin
|
||||
FAudioIn.DeviceIndex := FAudioIn.FindDeviceByName(FLoadedGlobal.AudioInDevice);
|
||||
FAudioInDevName := FLoadedGlobal.AudioInDevice;
|
||||
FAudioIn.Open;
|
||||
end
|
||||
else
|
||||
begin
|
||||
FAudioIn.DeviceIndex := -1;
|
||||
FAudioInDevName := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
Changed(rfDevice); // UI: полная синхронизация device-виджетов из состояния
|
||||
end;
|
||||
|
||||
procedure TRadioController.Discover;
|
||||
begin { TODO wiring: FNetwork.Discover } end;
|
||||
|
||||
Reference in New Issue
Block a user