feat(slices): независимый rate панадаптеров (селектор в шапке)

- Создание пана: rate наследуется от главного с клампом ≤768к
  (вне сетки → 384к); за сменой rate главного паны не следуют
- Клик по «NNN kHz» в шапке пана N → меню полной сетки железа
  (PanRateAllowed = Caps.RatePresets ∩ кратные 48 кГц; захардкоженный
  PAN_DDC_RATES удалён)
- WDSPEngine.SetPanRate: под FSliceLock пересбор аккумулятора/анализатора
  пана + переоткрытие слайс-каналов на новом rate (state сохраняется)
- RadioController.SetPanDDCRate: движок → реконфиг DDC (SetPanDDC) →
  кламп слайсов к новой полосе; FPanADC[] хранится (база под 3.4)
- Шапка: rate отдельным лейблом (у панов N кликабелен, акцент/рука)

Смоук-тест без железа ALL PASS (тон: спектр+аудио слайса живы через
384→192→768). Проверено юзером на экране.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 23:28:25 +03:00
co-authored by Claude Fable 5
parent 95b4f749be
commit e5921b8196
5 changed files with 264 additions and 23 deletions
+28 -4
View File
@@ -413,10 +413,34 @@ ChangeSampleRate).
не `crDefault`. ⚠Урок на 3.5 (pop-out) и вообще: любой динамически
создаваемый нативный GL-виджет должен получать явный курсор при создании.
Статус: собирается (GUI+демон), НА ЭКРАНЕ НЕ ПРОВЕРЕНО (юзер проверяет).
Открыто из фидбека: юзер видел курсор-«палец» на водопаде пана N — в коде
панов N `crHandPoint` нигде не ставится (подозрение: артефакт сломанной
раскладки, перекрытие чужим контролом); перепроверить после фиксов.
Статус: все фиксы подтверждены юзером на экране, закоммичено 95b4f74
(+ dae0c19 банд-столл отдельно).
**RATE ПАНОВ (реализовано 2026-07-11, после коммита 3.3):**
Решение (обсуждено с юзером): (1) при создании пан наследует rate главного
с клампом ≤768к (48/96/192к как есть; вне сетки → 384к); (2) rate пана
независим и меняется кликом по «NNN kHz» в шапке пана → меню полной сетки
железа; (3) за сменой rate главного НЕ следует (издержки Ethernet/CPU, churn).
- `WDSPEngine.SetPanRate(PanId, RateHz)`: под FSliceLock — DestroyPanAnalyzer →
пересбор аккумулятора (BufSize/AccI/AccQ) → CreatePanAnalyzer → переоткрытие
слайс-каналов пана (Close+OpenSliceChannel, state слайсов сохраняется).
- `RadioController`: PAN_DDC_RATES (192/384/768) УДАЛЁН — валидация
`PanRateAllowed` = Caps.RatePresets ∩ кратные 48 кГц (полная сетка HPSDR
48-1536к). `SetPanDDCRate`: движок → FPanRateKHz → `SetPanDDC` (реконфиг
DDC тем же RebuildDDCSpecific+SendFullHP) → кламп слайсов к новой полосе.
`FPanADC[]` — ADC пана теперь хранится (нужен реконфигу; база под 3.4).
- UI: rate в шапке — отдельный TLabel (`SetHeaderRate`, у панов N кликабелен,
акцентный цвет, crHandPoint), `OnPanRateClick` → TPopupMenu из RatePresets
(текущий отмечен) → `PanRateMenuItemClick` → SetPanDDCRate + SyncPanViews +
PushAllSliceFlagStates + LayoutFlags. Пан 0 показывает rate некликабельно
(его rate — существующий SampleRateOverlay).
- ★СМОУК-ТЕСТ БЕЗ ЖЕЛЕЗА ALL PASS (scratchpad panratetest.pas, паттерн 3.2):
синтетический тон +10.8кГц → пан 384к: пик спектра на месте, слайс 800Гц
RMS 0.33 → SetPanRate 192к → пик/аудио живы → 768к → живы → RemovePan чисто.
НА ЭКРАНЕ НЕ ПРОВЕРЕНО, НЕ закоммичено. Смена rate пана на эфире = короткий
разрыв IQ этого пана (реконфиг DDC) — ожидаемо.
### 3.4 — ADC-селектор панадаптера (+ антенны Alex, уточнено 2026-07-11)