mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
feature(calibration): частотная калибровка опорника (ppm) + TO Error в слоте QO-100
Пункт 3 плана. Ручные подгонки остаются: ppm работает ПОД ними, а не вместо — уход тракта где-то больше, где-то меньше. - Settings: TCalibration.FreqCalPPM (JSON cal_freq_ppm, +-100 ppm, per-device). Смысл знака: «опора выше номинала на N ppm», положительное значение поднимает показываемые частоты. - RadioBackend: виртуальный SetFreqCalPPM. - HPSDRNetwork: CalFreq(Hz) = Hz / (1 + ppm) в частотном слове — все четыре точки (главный DDC, DDC панов, feedback-DDC PureSignal, DUC передачи). Тактовый генератор радио менять нечем, поэтому правим запрос. - PlutoBackend: штатный xo_correction в ad9361-phy (device-attr биндинги добавлены в IIOBindings). Номинал XO снимается при коннекте с округлением до 100 кГц, чтобы наша же коррекция с прошлой сессии не накапливалась; после записи LO переписываются, иначе правка ждала бы следующей перестройки. Одна цифра лечит RX и TX на всех диапазонах. - QO-100: TXvtrEntry.TxLOError (JSON tx_lo_error) + поле «TO Error (Hz)» на странице QO-100. Сам транспондер-offset держим стандартным (8089.5 МГц), уход тракта правим поправкой; ActiveTXFreqHz учитывает её, подсказка внизу страницы считает TX-частоту уже с ней. - UI-фиксы вкладки Calibration: длинные подсказки переведены на несколько строк (WordWrap — TLabel по умолчанию режется по краю группы), заголовки таблиц укорочены и не заезжают под кнопку «= S-meter»; RelayoutCalTab сбрасывает прокрутку страницы перед перекладкой (SetBounds в TScrollBox задаёт координаты относительно прокрученного клиента). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -2295,7 +2295,9 @@ begin
|
||||
// QO-100 / split-LO: TX идёт на собственный uplink-LO (visible - TxLOOffset),
|
||||
// без LOError — дрейф LNB к передаче отношения не имеет.
|
||||
if FXvtrSettings.Entries[FCurrentXvtr].FullDuplexTx then
|
||||
// TO Error: сам транспондер-offset держим стандартным, уход тракта — здесь.
|
||||
Result := VisibleHz - FXvtrSettings.Entries[FCurrentXvtr].TxLOOffset
|
||||
+ FXvtrSettings.Entries[FCurrentXvtr].TxLOError
|
||||
else
|
||||
// Обычный трансвертер: RX=TX LO (с калибровкой LOError) — как раньше.
|
||||
Result := VisibleHz
|
||||
@@ -3664,6 +3666,10 @@ begin
|
||||
// Санитизация: битый конфиг не должен дать деление на ноль/абсурдные ватты.
|
||||
FCal.PwrDetModel := EnsureRange(FCal.PwrDetModel, 0, 3);
|
||||
if FCal.AmpSensMVA <= 0 then FCal.AmpSensMVA := 120.0;
|
||||
FCal.FreqCalPPM := EnsureRange(FCal.FreqCalPPM, -100.0, 100.0);
|
||||
// Опорник: у HPSDR правим частотное слово, у AD936x — xo_correction.
|
||||
// Ручные LOError/TO Error трансвертеров остаются сверху.
|
||||
if Assigned(FNetwork) then FNetwork.SetFreqCalPPM(FCal.FreqCalPPM);
|
||||
// Офсет S-метра берётся из FCal на каждом чтении (SMeterCalFor) — применять
|
||||
// отдельно нечего: он зависит от диапазона/трансвертера, а не от движка.
|
||||
SaveGlobalSettings; // персист (гейт по FDevConnected внутри)
|
||||
|
||||
Reference in New Issue
Block a user