fix(cat): align Andromeda panel mapping with real G2 hardware (Thetis)

Button/encoder indices follow Thetis MakeNewAndromedaDataset (our 0-based
index = Thetis Number - 1), verified against andromeda_test/AndDecode.pas.
The old map assumed sequential 0,1,2.. and truncated at 32; the real panel
sends sparse indices up to 47.

- AndromedaMap: AND_MAX_BUTTONS 32->48, renumbered button/encoder tables;
  new actions abVFOAtoB/abVFOBtoA/abVFOLock/abStartStop/abShift.
- RadioController: VFO Lock (FVfoLock, rfVfoLock, SetVfoLock, gate in
  TuneActiveBy).
- AndromedaPanel: wire A>B/B>A/SDR-ON/Lock; Shift band-keypad layer
  (#28 latch, #29..39 -> SetBand 160m..6m, non-sticky); aiVFOLock/aiShift
  indicators.
- Filter High/Low (#4/#5) left as width approximation per decision.
- doc/ANDROMEDA.md updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 16:11:12 +03:00
co-authored by Claude Opus 4.8
parent 2d7290e44d
commit 0e550dd9f9
4 changed files with 179 additions and 53 deletions
+46 -21
View File
@@ -84,46 +84,66 @@ Andromeda — это **не отдельный набор команд**, а д
## 3. Раскладка по умолчанию (AndromedaMap.pas)
Раскладка **зашита в коде** (первая версия). Правится в `AndromedaMap.pas`.
Раскладка **зашита в коде** и зеркалит дефолтную таблицу Thetis
(`MakeNewAndromedaDataset`): наш 0-based индекс = «Pushbutton/Encoder Number»
Thetis 1. Номера **проверены на реальной панели** (см.
`andromeda_test/AndDecode.pas`). Правится в `AndromedaMap.pas`.
### Кнопки (`ZZZP`, индекс 0-based после разбора)
| # | Действие | # | Действие |
|---|---|---|---|
| 0 | MOX | 9 | SNB |
| 1 | Tune (TUN) | 10 | Split (TX VFO-B) |
| 2 | Band Up | 11 | VFO Swap (актив. A/B) |
| 3 | Band Down | 12 | CTUN |
| 4 | Mode Up | 13 | Mute |
| 5 | Mode Down | 14 | CTCSS |
| 6 | NB | 15 | Squelch on/off |
| 7 | NR | 16 | Filter Up |
| 8 | ANF | 17 | Filter Down |
| 0 | RX1 Mute | 35 | A>B (под shift → 17m) |
| 28 | **Shift** (band-keypad) | 36 | B>A (под shift → 15m) |
| 29 | Band Up (под shift → 160m) | 37 | Split (под shift → 12m) |
| 30 | Mode Up (под shift → 80m) | 38 | *(под shift → 10m)* |
| 31 | Filter Up (под shift → 60m) | 39 | *(под shift → 6m)* |
| 32 | Band Down (под shift → 40m) | 42 | VFO Swap (toggle A/B) |
| 33 | Mode Down (под shift → 30m) | 43 | **VFO Lock** |
| 34 | Filter Down (под shift → 20m) | 44 | CTUN |
| | | 45 | SDR ON (start/stop) |
| | | 46 | MOX |
| | | 47 | TUN |
Не назначены (нет тракта в ewsdr): 2 (RX2 Mute), 40 (band GEN), 41 (RIT/XIT).
NB/NR/ANF/SNB/CTCSS/Squelch у реальной панели на кнопках не выведены
(в Thetis — на тачскрине), действия в enum сохранены для кастомной раскладки.
### Shift / band-keypad
Кнопка #28 — модификатор-защёлка (как `eBBShift` в Thetis). Пока активен
(LED `aiShift` #6), кнопки band-группы #29..39 выбирают диапазон напрямую
(`SetBand` 0..10: 160m…6m); #40 = GEN — в ewsdr отсутствует. Снимается
повторным Shift либо автоматически после выбора диапазона (non-sticky).
Логика — в `TAndromedaPanel.HandleButton`.
### Энкодеры (`ZZZE`, индекс 0-based)
| # | Параметр | Шаг |
|---|---|---|
| 0 | AF Gain (громкость) | ±1 |
| 1 | AGC-T | ±1 dB |
| 2 | Drive (мощность) | ±1 % |
| 3 | Squelch level | ±1 |
| 4 | Filter width | ±50 Гц (`AND_BW_STEP_HZ`) |
| 1 | AGC-T (в Thetis — слайдер «RF») | ±1 dB |
| 4 | Filter High → ширина фильтра | ±50 Гц (`AND_BW_STEP_HZ`) |
| 11 | Drive (мощность) | ±1 % |
| VFO | энкодер VFO (`ZZZU/ZZZD`) | ±10 Гц/шаг (`AND_VFO_STEP_HZ`) |
> #4/#5 на панели — независимые края фильтра (Filter High/Low). В ewsdr фильтр
> симметричный (`SetFilterBW`), поэтому #4 крутит ширину, #5 пока не задействован.
> Энкодеры RX2 AF/AGC (#2/#3), diversity (#6/#7), RIT/XIT (#8/#9) — нет тракта.
### Индикаторы (`ZZZI`, номера зеркалят дефолт Thetis)
| LED # | Индикатор | LED # | Индикатор |
|---|---|---|---|
| 1 | MOX | 12 | Split |
| 2 | ATU Ready *(нет в ewsdr)* | 13 | NB |
| 3 | Tune | 14 | NR |
| 6 | Shift *(нет)* | 15 | SNB |
| 6 | Shift | 15 | SNB |
| 7 | CTUN | 16 | ANF |
| 8/9 | RIT/XIT *(нет)* | 17 | Squelch |
| 10 | VFO A/B | | |
| 11 | VFO Lock *(нет)* | | |
| 11 | VFO Lock | | |
Драйвятся реально: **MOX, Tune, CTUN, VFO A/B, Split, NB, NR, SNB, ANF, Squelch**.
Остальные слоты дефолтной таблицы Thetis (ATU/Shift/RIT/XIT/VFOLock) в ewsdr
функций не имеют и не зажигаются.
Драйвятся реально: **MOX, Tune, CTUN, VFO A/B, VFO Lock, Shift, Split, NB, NR,
SNB, ANF, Squelch**. Остальные слоты дефолтной таблицы Thetis (ATU/RIT/XIT)
в ewsdr функций не имеют и не зажигаются.
---
@@ -145,16 +165,21 @@ Andromeda — это **не отдельный набор команд**, а д
## 5. Что сделано / что осталось
### Сделано (первая версия)
### Сделано
- Транспорт: **serial** (USB CAT).
- Вход: `ZZZD/ZZZU` (VFO), `ZZZE` (энкодеры), `ZZZP` (кнопки), `ZZZS` (рукопожатие).
- Выход: **`ZZZI`** — LED-индикаторы (push от `OnStateChanged`, дедуп повторов).
- Раскладка — зашитый дефолт.
- Раскладка — зашитый дефолт, выверена по Thetis и реальной панели.
- **Shift / band-keypad** — прямой выбор диапазона (#29..39 → `SetBand`), LED `aiShift`.
- **VFO Lock** — блокировка перестройки (`SetVfoLock`, гейт в `TuneActiveBy`), LED `aiVFOLock`.
- A>B / B>A / Toggle A/B, SDR ON (start/stop) — на штатных кнопках панели.
- UI-чекбокс на каждый serial-порт + персист.
### Осталось / возможные улучшения
| Задача | Заметки |
|---|---|
| **Filter High/Low (`ZZZE` #4/#5)** | независимые края фильтра; сейчас #4 = ширина, #5 не задействован. Нужны `FFilterLow/High` + переработка `ApplyModeFilter` и passband дисплея (sideband-aware, как в Thetis) |
| **Sticky shift** | сейчас shift всегда non-sticky (снимается band-нажатием); в Thetis есть `AndromedaStickyShift` |
| **`ZZMF`** — текст на LCD мультифункц. энкодера | кодировка: 15 ASCII-символов парами цифр (код−32) |
| **TCP-транспорт (G2 V2 panel)** | сейчас только serial; нужен режим в `CATTcp` |
| **Настраиваемая раскладка** | сейчас зашита; вынести в конфиг/UI (как `AndromedaEditForm` в Thetis) |