feat: web RF-AGC + QO-100 RX MUTE controls (Pluto)

Прокинул в web-интерфейс управление, которого там не хватало (раньше
только отображение):

- RF-AGC (Pluto hw-gain): дропдаун режима FAST/SLOW/HYB/MAN + слайдер
  GAIN 0–73 дБ (активен только в MAN, драг переводит в manual). Виден
  по BackendCaps.HasHWGain (= Pluto подключён). Команды set_rx_gain_mode
  / set_rx_gain → SetRxGainMode / SetRxGain.
- RX MUTE (QO-100 self-monitor): toggle-кнопка рядом с BCN, видна по
  InQO100, подсветка по состоянию. Команда set_rx_mute → SetRxMuteOnTx.

Гейтинг зеркалит десктоп. Работает в GUI-web-сервере и headless-демоне.
Проверено на железе пользователем.

WebServer: команды + state-поля (rf_agc_visible/rx_gain_mode/rx_gain_db,
rx_mute_visible/rx_mute_on) + SetRxGainStatus/SetRxMuteStatus.
WebAdapter: колбэки OnRxGain*/OnRxMute (Invoke на поток контроллера) +
публикация в PushState. MainForm + ewsdrd.lpr: привязка колбэков.
WebPageHtml: виджеты, JS-обработчики, updRfAgc/updRxMute, PEND_MAP.

Также актуализирован doc/PLUTO_INTEGRATION_PLAN.md: TX-тракт и режим
QO-100 помечены проверенными на железе; раскрыт TODO «XO ppm-калибровка»
(ручной TxLOOffset как текущий обходной путь, xo_correction/GPSDO как
постоянное решение).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 11:02:34 +03:00
co-authored by Claude Opus 4.8
parent 8bb8714a25
commit a885488243
7 changed files with 163 additions and 15 deletions
+41
View File
@@ -68,6 +68,9 @@ type
procedure SyncFMStep;
procedure SyncBeacon;
procedure SyncBeaconSeed;
procedure SyncRxGainMode;
procedure SyncRxGain;
procedure SyncRxMute;
function BeaconStatusText: string; // компактный статус (как десктоп поле 7)
public
constructor Create(AController: TRadioController; AServer: TWebServer;
@@ -103,6 +106,9 @@ type
// QO-100 beacon: вкл/выкл лок и наведение по клику в спектре (frac 0..1).
procedure OnBeacon(On_: Boolean);
procedure OnBeaconSeed(Frac: Double);
procedure OnRxGainMode(Mode: Integer);
procedure OnRxGain(Db: Integer);
procedure OnRxMute(On_: Boolean);
procedure OnClientActiveChanged(Active: Boolean);
// TX-mic от web-клиента → WDSP. Вызывается из WS-потока; без маршалинга —
// подача в движок thread-safe (как OnMicPacket/OnDDCIQ контроллера).
@@ -373,6 +379,33 @@ begin
FController.BeaconSeedAtHz(Hz);
end;
procedure TWebAdapter.OnRxGainMode(Mode: Integer);
begin FSyncInt := Mode; FController.Invoke(@SyncRxGainMode); end;
procedure TWebAdapter.SyncRxGainMode;
begin
// Pluto hw-AGC: 0=manual,1=fast,2=slow,3=hybrid (рендер через rfRxGain).
FController.SetRxGainMode(FSyncInt);
end;
procedure TWebAdapter.OnRxGain(Db: Integer);
begin FSyncInt := Db; FController.Invoke(@SyncRxGain); end;
procedure TWebAdapter.SyncRxGain;
begin
// Ручной hw-gain (0..73 дБ); SetRxGain переводит режим в manual.
FController.SetRxGain(FSyncInt);
end;
procedure TWebAdapter.OnRxMute(On_: Boolean);
begin FSyncBool := On_; FController.Invoke(@SyncRxMute); end;
procedure TWebAdapter.SyncRxMute;
begin
// QO-100 self-monitor: RX-аудио на TX (toggle, рендер через rfRxMuteOnTx).
FController.SetRxMuteOnTx(FSyncBool);
end;
procedure TWebAdapter.OnClientActiveChanged(Active: Boolean);
// Из потока веб-сервера при connect/disconnect клиента. Простая запись флага —
// ядро (SetMOX, в т.ч. HWPTT-путь) выбирает по нему mic-source. Без маршалинга.
@@ -512,6 +545,14 @@ begin
FController.BeaconRefHz,
FController.BeaconTrackedFreqHz);
// Pluto RF-AGC (виден при HasHWGain = Pluto подключён) + QO-100 RX MUTE (InQO100).
FServer.SetRxGainStatus(
FController.BackendCaps.HasHWGain,
FController.FRxGainMode, FController.FRxGainDb);
FServer.SetRxMuteStatus(
FController.InQO100,
FController.FRxMuteOnTx);
FServer.PushSpectrum(
FController.FSpectrumBuf, 1024,
FController.FWaterfallBuf,