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
+25 -10
View File
@@ -260,8 +260,12 @@ end;
- ✅ RX gain: блок `RF AGC` (десктоп) — кнопки FAST/SLOW/HYB/MAN (4 режима AD9361,
подтверждены на железе `gain_control_mode_available`) + слайдер manual 0–73 дБ при
`Caps.HasHWGain`; персист per-device. WDSP AGC поверх. TODO: проброс RF-AGC в web
(сейчас в web только отображение, без управления).
`Caps.HasHWGain`; персист per-device. WDSP AGC поверх.
-**RF-AGC в web** (управление): дропдаун режима RFagc-F/S/H/M + слайдер GAIN
0–73 дБ (активен только в MAN), виден при `BackendCaps.HasHWGain` (Pluto подключён).
Команды `set_rx_gain_mode`/`set_rx_gain``SetRxGainMode`/`SetRxGain`; state-поля
`rf_agc_visible`/`rx_gain_mode`/`rx_gain_db`. GUI-web-сервер + headless-демон. Собрано,
live-проверка на железе за пользователем.
- Телеметрия: S-meter (WDSP) — для обоих. fwd/SWR/supply/PLL/overload — скрыть при
`not Caps.HasPA`. ✅ RSSI/температура Pluto: `ReadTelemetry` (backend) →
`ServicePlutoTelemetry` (контроллер, опрос ~2 Гц с фильтром выбросов) → поле 3
@@ -309,7 +313,12 @@ end;
- ✅ RX gain / hw-AGC, транспорт (USB/IP), persist per-device по synthetic-MAC.
- ✅ Имя платы (Pluto/LibreSDR + serial) и телеметрия в статус-бар: RSSI + **две
температуры** (трансивер AD9361 + Zynq SoC `xadc`, формат `Temp 37/53C`).
- TODO: XO ppm-калибровка, buffer/timeout-контролы.
- TODO: **XO ppm-калибровка** — корень частотной ошибки опорника Pluto. Сейчас
обходится вручную через `TxLOOffset` QO-100-слота (подстройка под фактический
uplink, см. Фаза 5). Правильный фикс — `xo_correction` AD9361 (правит RX **и** TX
в ppm на всех частотах разом) или внешний 40 МГц GPSDO-реф (золотой стандарт для
QO-100). На 2.4 ГГц 1 ppm ≈ 2.4 кГц, поэтому TX без GPSDO плывёт с прогревом.
- TODO: buffer/timeout-контролы.
**Фаза 4 — TX-тракт Pluto**
-`SendDUCIQ` 24→16 + апсемпл 192k→device-rate + пейсинг (FIFO + push-поток, §4.6).
@@ -319,9 +328,10 @@ end;
- ✅ Управление мощностью через TX-аттенюацию (ADI-модель), маппинг **power-linear**
+ полная цифра WDSP (§4.8). Без PA → нет drive-байта/SWR/Alex/keyer.
-**TX LO powerdown по PTT** (§4.8) — нет утечки несущей TX в RX-спектре в простое.
- TODO: проверка на железе на rate ≥1536k (ориентация SSB по Q-инверсии, уровни);
опц. headroom 6 дБ для FM (full-scale const-envelope → нелинейность ЦАП); опц.
зануление IQ на приёме. Опц. поддержка F5OEO-прошивки (PTT внешнего PA через
- **Проверено на железе** (передача QO-100 через спутник, downlink виден в
full-duplex self-monitor; SSB-ориентация и уровни в норме).
- TODO: опц. headroom 6 дБ для FM (full-scale const-envelope → нелинейность ЦАП);
опц. зануление IQ на приёме. Опц. поддержка F5OEO-прошивки (PTT внешнего PA через
`hardwaregain=40`) — отложено, нужно только под конкретное железо.
**Фаза 5 — Режим QO-100**
@@ -342,7 +352,9 @@ end;
глушится на TX, как раньше); OFF → RX-аудио идёт на колонки и во время TX (свой
downlink через транспондер, ~250 мс). Реализация: гейт `WDSPEngine` (`not FTXActive
or (FKeepRXDuringTX and FMonitorRXDuringTX)`) + флаг `FRxMuteOnTx` в контроллере,
персист в глобале (`rx_mute_on_tx`). Web — не сделано (пока вне области).
персист в глобале (`rx_mute_on_tx`). **В web**: toggle-кнопка `RX MUTE` рядом с
BCN, видна по `InQO100`, подсветка по `rx_mute_on`; команда `set_rx_mute`
`SetRxMuteOnTx`. GUI-web-сервер + headless-демон.
-**Bandplan-оверлей NB-транспондера** (`BandPlanOverlay.pas`): полоска внизу
спектра (над ruler) с сегментами CW ONLY / NB DIGI / DIGI / SSB / MIXED MODES +
маяки CW/PSK/EXP. Модель `VfoOverlay` (кэш-битмап + const-alpha), CPU и GL, виден
@@ -351,7 +363,10 @@ end;
* **Индикатор «не громче маяка»** — сравнение уровня своего downlink с маяком
(этикет QO-100); амплитуда маяка уже известна декодеру.
* RIT/XIT-клариффайер — опц., на геостационаре нужен редко.
- TODO: проверка на железе.
- **Проверено на железе** (QSO через QO-100: TX uplink 2400 + RX downlink 739.5 МГц,
full-duplex self-monitor). Нюанс калибровки: `TxLOOffset` пришлось подстроить руками
под фактический uplink — это ошибка опорника Pluto (TCXO), а не геометрия (геом.
offset точно 8089.5 МГц). Постоянное решение — XO ppm / GPSDO, см. Фаза 3 TODO.
- ОТВЕРГНУТО: TX-маркер на RX-спектре в DUP — в обычной работе RX=TX (один VFO),
маркер ложится на RX-курсор, информации не даёт; полезен только в split (редко).
@@ -359,8 +374,8 @@ end;
- ✅ Web/CAT-фронтенды (команды уже агностичны) + гейтинг полей; демон `ewsdrd.lpr`
(discovery/connect Pluto headless, beacon-lock @10 Гц); кросс-платформенная сборка
с/без libiio.
- TODO: проброс в web того, чего там ещё нет — RF-AGC (gain/режимы) и QO-100
`RX MUTE` (self-monitor). Доки актуализируются по ходу.
- ✅ Проброс в web RF-AGC (gain/режимы) и QO-100 `RX MUTE` (self-monitor) — см.
§4.7 / Фаза 5. Доки актуализируются по ходу.
**Сопутствующие исправления (найдены при тесте Pluto VHF/UHF FM, но баги общие):**
- ✅ Восстановление per-band FM-настроек на старте (`Settings.LoadDevice`): bulk-