docs(slices): draft Stage 3 notes (HW DDC design + UI concept)

Record grounded data-path analysis, per-DDC/RX2 deltas, the soft-vs-hard
WDSP channel split, preliminary decisions (4-6 hard DDCs, static first),
and the UI concept (edge markers, slices rail, ADC badge). Marked as a
work-in-progress draft.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 14:36:31 +03:00
co-authored by Claude Opus 4.8
parent db2aafaef9
commit b2fa2756cf
+55
View File
@@ -208,6 +208,61 @@ fan-out живёт в движке и не зависит от бэкенда.
`feature/rx2-support` — это про ВТОРОЙ ADC, не про слайсы; но её каркас `feature/rx2-support` — это про ВТОРОЙ ADC, не про слайсы; но её каркас
(доп. WDSP-канал + доп. аудиовыход + роутинг по индексу) частично переиспользуем. (доп. WDSP-канал + доп. аудиовыход + роутинг по индексу) частично переиспользуем.
### Этап 3 — рабочие заметки (черновик, обсуждение НЕ закончено)
Разобрали фактический data-path и набросали дизайн; вернёмся позже.
**Что есть сейчас (по коду):**
- Один аппаратный DDC: `ConfigureDDCs(1, rate, ADCSource=0)` (`RadioController.pas:3314`),
IQ на порт `1035+n``HandleDDCIQ(DDCIdx)``OnDDCIQ(DDCIndex)`. В WDSP подаётся
**только `FActiveDDC`** (`RadioController.pas:843`), остальные DDC отбрасываются.
- Слайсы = софт fan-out этого одного IQ: `SetSliceShift(Id, TargetHz-FCenterFreq)`
(`RefreshSliceShifts:1063`). Гейт `SliceFitsCapture` ±47.5% rate вокруг центра
(`:1081`); вне полосы `AddSlice` отказывает (`:1097`).
- HP-фрейм шлёт частотное слово **только DDC0**: `Buf[9 + DDCBase*4]`
(`SendFullHP:1567`); слова остальных DDC = нули.
- `ConfigureDDCs` умеет N DDC (per-DDC enable), но пишет **один** rate/ADCSource на все;
`DDCBase=2` на Orion/Angelia/Saturn (DDC0/1=PureSignal), `NumADCs=2` на 2-АЦП платах.
**Что нужно (дельты по точкам):**
1. Per-DDC частота в HP: `SendFullHP` — цикл `Buf[9+ddc*4]=FreqToPhaseWord(FDDCFreq[ddc])`;
контроллер держит `FDDCFreq[]`, обновляет при ретюне слайса.
2. Per-DDC rate + ADCSource в `ConfigureDDCs` (принимать массив): главный DDC широкий
(панорама), слайс-DDC узкие ~48–96 кГц (дёшево по линку). Протокол это позволяет.
3. Аллокатор DDC: пул hw-индексов от `DDCBase+1`, захват/освобождение, кап (см. решения).
4. **Ключевое — два типа слайс-канала в WDSPEngine:**
- *soft* (Этап 1): вход = копия главного IQ, rate главного, NCO shift = `Target-Center`,
общий аккумулятор.
- *hard* (Этап 3): вход = **свой** DDC-пакет, rate его DDC, NCO shift = 0, **свой**
аккумулятор `FSliceAccI/Q`. Нужен `PushSlicePacket(chan, ...)` + роутинг
`OnDDCIQ(DDCIndex)→WDSP-канал привязанного слайса`.
5. RX2 (второй ADC): `TSlice.ADCSource (0/1)` → слайс-DDC на нужный ADC. Даёт двух-антенные
слайсы (главный RX на ANT1, слайс на ANT2). Ортогонально «внутри/вне полосы».
**Принятые решения (предварительно):**
- Лимит: **до 46 hard-DDC слайсов**, со строгим контролем суммарного rate (бюджет Ethernet).
- **Сначала статика**: источник (soft/hard) выбирается при добавлении/явном ретюне;
авто-promotion/demotion (soft↔hard при смене центра/зума) — отдельным этапом позже.
- RX2/ADCSource — не решено (нужно знать, как заведены антенны у пользователя).
**UI-концепция (черновик, не финал — выбор представления off-span НЕ сделан):**
Принцип: **цвет+буква слайса = его личность во всех местах** (флаг, полоса, edge-маркер,
чип рейла, ADC-бейдж) — переиспользуем палитру `SliceColor`, тему, `PaintFlatButton`.
- Слайс в полосе — как сейчас (флаг сбоку + буква на полосе, packing).
- Слайс **вне** видимой панорамы (hard) — приклеенный к краю спектра edge-маркер:
цветная буква + стрелка (◄/►) + абсолютная частота. Клик = выбрать, двойной = перевести
главную панораму на него. Почти бесплатно (флип/клэмп к краю уже есть).
- **Slices-рейл** — тонкая полоса-менеджер (под панорамой или в правой панели): чип на слайс
(цветная точка+буква · частота · режим · мини-S-метр · ADC-бейдж), сортировка по частоте,
`[+]` = добавить с вводом частоты (для off-span, где Ctrl-клик не поможет). Единственное
место, где off-span слайсы всегда видны/управляемы.
- **ADC/антенна** — бейдж `A1`/`A2` в шапке флага и в чипе (только на 2-АЦП платах).
- **soft/hard** — тонкий признак (плотная vs полая точка, или значок `⧉`); не кричать.
- Позже «вау»: мини-панадаптер (свой спектр/водопад) на каждый hard-слайс в чипе рейла.
Развилка для следующего захода: как показывать off-span слайсы —
(a) edge-маркеры + рейл [рекомендация], (b) только edge-маркеры, (c) рейл с мини-панадаптерами.
## Оговорки / риски ## Оговорки / риски
- CPU софтовых слайсов ~линейно от их числа: каждый WDSP-канал жуёт полный rate и - CPU софтовых слайсов ~линейно от их числа: каждый WDSP-канал жуёт полный rate и