feat: add LO Error field to QO-100 settings tab

Expose the QO-100 slot's LOError (Hz) on the QO-100 settings page,
placed right after LNB LO. Maps to Entries[QO100_SLOT].LOError — the
live LNB-drift calibration that the beacon lock folds its correction
into. Group height extended to 8 rows and the info label shifted down.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 12:06:07 +03:00
co-authored by Claude Opus 4.8
parent 0906f854fb
commit 3115b2b5bf
+10 -2
View File
@@ -248,6 +248,7 @@ type
FNavQO: TFlatButton; FNavQO: TFlatButton;
FQoEn: TFlatCheckBox; FQoEn: TFlatCheckBox;
FQoLnbLO: TFlatFloatSpinEdit; // МГц — LNB LO (= LOOffset, RX) FQoLnbLO: TFlatFloatSpinEdit; // МГц — LNB LO (= LOOffset, RX)
FQoLoErr: TFlatFloatSpinEdit; // Гц — LO Error (= LOError, живая калибровка LNB / beacon-lock)
FQoTxLO: TFlatFloatSpinEdit; // МГц — транспондер-offset (= TxLOOffset) FQoTxLO: TFlatFloatSpinEdit; // МГц — транспондер-offset (= TxLOOffset)
FQoBegin: TFlatFloatSpinEdit; // МГц — downlink begin FQoBegin: TFlatFloatSpinEdit; // МГц — downlink begin
FQoEnd: TFlatFloatSpinEdit; // МГц — downlink end FQoEnd: TFlatFloatSpinEdit; // МГц — downlink end
@@ -3480,7 +3481,7 @@ begin
L.Font.Name := UI_FONT; L.Font.Size := 9; L.Font.Color := CLR_TEXTDIM; L.Font.Name := UI_FONT; L.Font.Size := 9; L.Font.Color := CLR_TEXTDIM;
L.WordWrap := True; L.WordWrap := True;
Grp := MakeGroupPanel(FPageQO, 'Transponder', MARGIN, 100, 560, GRP_TITLE_H + 7 * 30 + 16); Grp := MakeGroupPanel(FPageQO, 'Transponder', MARGIN, 100, 560, GRP_TITLE_H + 8 * 30 + 16);
Y := GRP_TITLE_H + 8; Y := GRP_TITLE_H + 8;
FQoEn := TFlatCheckBox.Create(Self); FQoEn := TFlatCheckBox.Create(Self);
@@ -3493,6 +3494,11 @@ begin
FQoLnbLO := QoFloat(Y, 0.0, 50000.0, 0.001, 6); FQoLnbLO := QoFloat(Y, 0.0, 50000.0, 0.001, 6);
FQoLnbLO.Value := 9750.0; FQoLnbLO.Value := 9750.0;
// LO Error (Гц): живая калибровка дрейфа LNB; beacon-lock складывает сюда
// свою коррекцию. Диапазон ±10 МГц — LNB без опоры уходит на сотни кГц.
Inc(Y, 30); QoLabel('LO Error (Hz)', Y);
FQoLoErr := QoFloat(Y, -9999999.0, 9999999.0, 1.0, 0);
Inc(Y, 30); QoLabel('Transponder offset = downlink - uplink (MHz)', Y); Inc(Y, 30); QoLabel('Transponder offset = downlink - uplink (MHz)', Y);
FQoTxLO := QoFloat(Y, 0.0, 50000.0, 0.001, 6); FQoTxLO := QoFloat(Y, 0.0, 50000.0, 0.001, 6);
FQoTxLO.Value := 8089.5; FQoTxLO.Value := 8089.5;
@@ -3518,7 +3524,7 @@ begin
FQoInfo := TLabel.Create(Self); FQoInfo := TLabel.Create(Self);
FQoInfo.Parent := FPageQO; FQoInfo.Parent := FPageQO;
FQoInfo.SetBounds(MARGIN, 100 + GRP_TITLE_H + 7 * 30 + 28, 700, 52); FQoInfo.SetBounds(MARGIN, 100 + GRP_TITLE_H + 8 * 30 + 28, 700, 52);
FQoInfo.Font.Color := CLR_TEXTDIM; FQoInfo.Font.Name := 'Courier New'; FQoInfo.Font.Color := CLR_TEXTDIM; FQoInfo.Font.Name := 'Courier New';
FQoInfo.Font.Size := 9; FQoInfo.WordWrap := True; FQoInfo.Font.Size := 9; FQoInfo.WordWrap := True;
finally finally
@@ -3545,6 +3551,7 @@ begin
FXvtrConfig.Entries[QO100_SLOT].FullDuplexTx := True; // слот всегда QO-100 FXvtrConfig.Entries[QO100_SLOT].FullDuplexTx := True; // слот всегда QO-100
FXvtrConfig.Entries[QO100_SLOT].ButtonText := 'QO-100'; FXvtrConfig.Entries[QO100_SLOT].ButtonText := 'QO-100';
FXvtrConfig.Entries[QO100_SLOT].LOOffset := FQoLnbLO.Value * 1.0e6; FXvtrConfig.Entries[QO100_SLOT].LOOffset := FQoLnbLO.Value * 1.0e6;
FXvtrConfig.Entries[QO100_SLOT].LOError := FQoLoErr.Value;
FXvtrConfig.Entries[QO100_SLOT].TxLOOffset := FQoTxLO.Value * 1.0e6; FXvtrConfig.Entries[QO100_SLOT].TxLOOffset := FQoTxLO.Value * 1.0e6;
FXvtrConfig.Entries[QO100_SLOT].FreqBegin := FQoBegin.Value * 1.0e6; FXvtrConfig.Entries[QO100_SLOT].FreqBegin := FQoBegin.Value * 1.0e6;
FXvtrConfig.Entries[QO100_SLOT].FreqEnd := FQoEnd.Value * 1.0e6; FXvtrConfig.Entries[QO100_SLOT].FreqEnd := FQoEnd.Value * 1.0e6;
@@ -3559,6 +3566,7 @@ begin
E := FXvtrConfig.Entries[QO100_SLOT]; E := FXvtrConfig.Entries[QO100_SLOT];
FQoEn.Checked := E.Enabled; FQoEn.Checked := E.Enabled;
FQoLnbLO.Value := E.LOOffset / 1.0e6; FQoLnbLO.Value := E.LOOffset / 1.0e6;
FQoLoErr.Value := E.LOError;
FQoTxLO.Value := E.TxLOOffset / 1.0e6; FQoTxLO.Value := E.TxLOOffset / 1.0e6;
FQoBegin.Value := E.FreqBegin / 1.0e6; FQoBegin.Value := E.FreqBegin / 1.0e6;
FQoEnd.Value := E.FreqEnd / 1.0e6; FQoEnd.Value := E.FreqEnd / 1.0e6;