feat: QO-100 beacon lock — robustness, persistence, FT8-aware UI

Builds on the beacon-lock baseline: keeps the proven display-FFT control
path (hardware-LO trim folded into the active transverter LOError), and
hardens it. The narrowband NCO/FLL scaffold (BeaconLock.pas) is removed —
it was never in the control path.

- RadioController:
  * Persist live: each correction folds straight into the active xvtr
    LOError (visible in Settings, survives restart as LNB calibration);
    disk writes throttled. FBeaconLockHz is now only a session indicator.
  * Robust tracking vs nearby signals: narrow ±2 kHz gate while locked
    (±6 kHz only for acquisition), slew-rate outlier rejection (a sudden
    centroid jump = interferer, not slow LNB drift → ignored), and lobe
    shape validation in MeasureBeaconFFT (width + power symmetry) so a CW
    carrier / one-sided neighbour isn't mistaken for the BPSK beacon.
    Prominence measured over the in-window noise floor (gate-width robust).
  * Fast convergence: feed-forward (predict post-retune position so the
    window follows the beacon through the jump) + near-deadbeat correction
    on the manual click → one click locks instead of repeated tapping.
  * Single central BPSK beacon (10489.750); dead CoarseBeaconOffset and
    unused throttle counters removed; stale NCO/FLL/4 Hz comments fixed.
- WDSPEngine: drop the per-sample TBeaconTracker RX-IQ tap (tracker gone).
- MainForm: BEACON is now a plain button, shown only on Pluto in a
  transverter. Lock status (off / click / search / LOCK + correction +
  prominence) moves to status-bar field 7 in place of PLL on Pluto;
  openHPSDR keeps PLL there.
- SettingsForm/StatusBar: widen LO Error field to ±10 MHz (QO-100 LNBs
  drift hundreds of kHz) and widen status field 7 for the beacon text.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-19 10:02:48 +03:00
co-authored by Claude Opus 4.8
parent 42610b304e
commit 4728e02459
8 changed files with 277 additions and 545 deletions
+2 -2
View File
@@ -658,7 +658,7 @@ begin
end;
procedure TSpectrumViewOpenGL.DrawBeaconMarkersGL(W, H: Integer);
// QO-100 beacon-маркеры: опорная частота (зелёная) + позиция трекера (оранж).
// QO-100 beacon-маркеры: опорная частота (зелёная) + отслеживаемый центроид (оранж).
procedure Vline(FreqHz: Double; Col: TColor);
var x: Integer;
begin
@@ -669,7 +669,7 @@ procedure TSpectrumViewOpenGL.DrawBeaconMarkersGL(W, H: Integer);
end;
begin
Vline(FBeaconRefFreq, clLime); // где маяк ДОЛЖЕН быть
Vline(FBeaconTrkFreq, TColor($000AA5FF)); // где сидит трекер (оранж)
Vline(FBeaconTrkFreq, TColor($000AA5FF)); // отслеживаемый центроид (оранж)
end;
procedure TSpectrumViewOpenGL.DrawADCOverlay(W, H: Integer);