diff --git a/BoardUtils.pas b/BoardUtils.pas index 3377695..48bd52e 100644 --- a/BoardUtils.pas +++ b/BoardUtils.pas @@ -6,6 +6,15 @@ unit BoardUtils; interface +type + // Один диапазон плана (имя кнопки + частота по умолчанию). Общий тип для + // desktop/web UI — единый источник band-плана через TRadioController.BandPlan. + TBandInfo = record + Name: string; + FreqHz: Double; + end; + TBandPlanArray = array of TBandInfo; + function BoardTypeName(BoardType: Integer): string; // Короткое человекочитаемое имя AD936x-платы по hw_model (Pluto / LibreSDR / прочие). function PlutoModelName(const HwModel: string): string; @@ -15,6 +24,8 @@ function FreqToBandIdx(Hz: Double; Pluto: Boolean = False): Integer; function BandName(Idx: Integer; Pluto: Boolean = False): string; // Частота по умолчанию при входе в диапазон (если нет сохранённой/в диапазоне). function BandDefaultFreq(Idx: Integer; Pluto: Boolean = False): Double; +// Полный band-план активного бэкенда (имена + дефолтные частоты). +function BuildBandPlan(Pluto: Boolean): TBandPlanArray; implementation @@ -105,4 +116,23 @@ begin if Pluto then Result := VU_DEF[Idx] else Result := HF_DEF[Idx]; end; +function BuildBandPlan(Pluto: Boolean): TBandPlanArray; +var i: Integer; +begin + SetLength(Result, BAND_COUNT); + for i := 0 to BAND_COUNT - 1 do + begin + if Pluto then + begin + Result[i].Name := VU_NAMES[i]; + Result[i].FreqHz := VU_DEF[i]; + end + else + begin + Result[i].Name := HF_NAMES[i]; + Result[i].FreqHz := HF_DEF[i]; + end; + end; +end; + end. diff --git a/MainForm.pas b/MainForm.pas index aaf5770..1f5524a 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -479,6 +479,7 @@ type procedure OnXvtrSettingsChange(const X: TXvtrSettings); procedure PushXvtrToWeb; procedure PushRatePresetsToWeb; // backend sample-rate пресеты → web + procedure PushBandsToWeb; // backend band-план → web // XVTR helpers function FindXvtrIdxForFreq(FreqHz: Double): Integer; function XvtrTranslate(VisibleHz: Double): Double; @@ -884,6 +885,7 @@ begin PushXvtrToWeb; PushDeviceListToWeb; // saved-устройства сразу видны web-overlay PushRatePresetsToWeb; // дефолтный бэкенд до connect; перезапишется на смене + PushBandsToWeb; FillChar(FCATLastGlobal, SizeOf(FCATLastGlobal), 0); FCATLastGlobal.CATTcpPort := 19090; for i := 0 to 3 do @@ -3685,6 +3687,7 @@ begin FSampleRateOverlay.SetCurrentRate(FController.FSampleRate); end; PushRatePresetsToWeb; // тот же источник зеркалим в web-морду + PushBandsToWeb; // band-план бэкенда → web (HF ↔ VHF/UHF) // Отдельный Pluto RF-AGC блок под AGC: показываем и сдвигаем панели ниже. LayoutLeftPanel(Caps.HasHWGain); @@ -5375,6 +5378,27 @@ begin FWebServer.SetRatePresets(FController.SampleRatePresets); end; +procedure TMainForm.PushBandsToWeb; +// Band-план бэкенда → web (HF / VHF-UHF). Единый источник — FController.BandPlan, +// тот же BoardUtils-план, что и для desktop-кнопок (RelabelBands). +var + Plan: TBandPlanArray; + Names: array of string; + Freqs: array of Double; + i: Integer; +begin + if FWebServer = nil then Exit; + Plan := FController.BandPlan; + SetLength(Names, Length(Plan)); + SetLength(Freqs, Length(Plan)); + for i := 0 to High(Plan) do + begin + Names[i] := Plan[i].Name; + Freqs[i] := Plan[i].FreqHz; + end; + FWebServer.SetBands(Names, Freqs); +end; + procedure TMainForm.PushXvtrToWeb; var Arr: TWebXvtrArray; diff --git a/RadioController.pas b/RadioController.pas index d4fddfc..bd3e7f0 100644 --- a/RadioController.pas +++ b/RadioController.pas @@ -547,6 +547,8 @@ type // Единый источник пресетов sample-rate для UI (desktop overlay + web). // Берётся из caps текущего бэкенда (HPSDR 48k..1536k / Pluto 576k..5760k). function SampleRatePresets: TBackendRateArray; + // Единый источник band-плана для UI (HF / VHF-UHF по типу бэкенда). + function BandPlan: TBandPlanArray; // True если активный бэкенд — Pluto (VHF/UHF band-план вместо HF). function IsPluto: Boolean; // Человекочитаемое имя подключённой платы для статус-строки (UI/Web). @@ -3162,6 +3164,11 @@ begin Result := BackendCaps.RatePresets; end; +function TRadioController.BandPlan: TBandPlanArray; +begin + Result := BuildBandPlan(IsPluto); +end; + function TRadioController.IsPluto: Boolean; begin Result := (FNetwork <> nil) and (FNetwork.Caps.Kind = bkPluto); diff --git a/WebPageHtml.pas b/WebPageHtml.pas index 43936c0..36118ad 100644 --- a/WebPageHtml.pas +++ b/WebPageHtml.pas @@ -524,8 +524,10 @@ begin 'function updSpan(s){SPANS.forEach((hz,i)=>{const b=q("sb"+i);if(b)b.classList.toggle("on",hz===s);});}' + 'buildSpanButtons();' + - 'const BAND_N=["160m","80m","60m","40m","30m","20m","17m","15m","12m","10m","6m"];' + - 'const BAND_F=[1900000,3750000,5357000,7100000,10125000,14200000,18120000,21200000,24940000,28500000,50150000];' + + // BAND_N/BAND_F строятся из state.bands (HPSDR HF / Pluto VHF-UHF); ниже — + // bootstrap-значения до первого state. Единый источник — backend в контроллере. + 'let BAND_N=["160m","80m","60m","40m","30m","20m","17m","15m","12m","10m","6m"];' + + 'let BAND_F=[1840000,3700000,5357000,7100000,10120000,14200000,18130000,21300000,24940000,28400000,50150000];' + // XVTR-band list, обновляется из state ("xvtr_bands":[{idx,name},...]). // Активное значение — "xvtr_current" (-1 = HF). В