docs: ретро-ревью pass-2 остаточные (data-model/plugin-sdk/hardware/C)
- data-model: структура DTC-кода исправлена (буква + 2-битная категория + 3 hex, не «4 hex»; P0/P2 generic, P1/P3000-33FF производитель); module_voltage путь → Vehicle.OBD.ControlModuleVoltage (был неверный LowVoltageBattery) - plugin-sdk: пример id → dev.example.* (ru.shturman.* зарезервирован); i18n строк манифеста (per-locale, ru обязателен); ui_screens capability + гейт RegisterScreen - hardware: камера «фаза 2» → v2; требования к MCU-копилоту (обновляемость прошивки, fail-safe при его отказе, позиция в цепочке доверия) - tech-stack: карты «фаза 2» → v4 (нормализация фазовой номенклатуры) - C-shell: день/ночь v0 = время, GPS-восход v1 (был конфликт фаз); ui_screens-гейтинг Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -79,7 +79,7 @@ PID** (Mode 01, PID `0x00/0x20/0x40/…` — битовые маски подд
|
|||||||
| `throttle` | `…CombustionEngine.TPS` | 0x11 | float | % | 0..100 |
|
| `throttle` | `…CombustionEngine.TPS` | 0x11 | float | % | 0..100 |
|
||||||
| `intake_pressure` | `…CombustionEngine.MAP` | 0x0B | int | kPa | 0..255 |
|
| `intake_pressure` | `…CombustionEngine.MAP` | 0x0B | int | kPa | 0..255 |
|
||||||
| `fuel_level` | `Vehicle.Powertrain.FuelSystem.Level` | 0x2F | float | % | 0..100 |
|
| `fuel_level` | `Vehicle.Powertrain.FuelSystem.Level` | 0x2F | float | % | 0..100 |
|
||||||
| `module_voltage` | `Vehicle.LowVoltageBattery.Voltage` | 0x42 | float | V | 0..65.5 |
|
| `module_voltage` | `Vehicle.OBD.ControlModuleVoltage` | 0x42 | float | V | 0..65.5 |
|
||||||
| `ambient_temp` | `Vehicle.Exterior.AirTemperature` | 0x46 | int | °C | -40..215 |
|
| `ambient_temp` | `Vehicle.Exterior.AirTemperature` | 0x46 | int | °C | -40..215 |
|
||||||
| `oil_temp` | `…CombustionEngine.EOT` | 0x5C | int | °C | -40..215 |
|
| `oil_temp` | `…CombustionEngine.EOT` | 0x5C | int | °C | -40..215 |
|
||||||
| `fuel_rate` | `…CombustionEngine.FuelRate` | 0x5E | float | L/h | 0..3212 |
|
| `fuel_rate` | `…CombustionEngine.FuelRate` | 0x5E | float | L/h | 0..3212 |
|
||||||
@@ -102,9 +102,10 @@ PID** (Mode 01, PID `0x00/0x20/0x40/…` — битовые маски подд
|
|||||||
|
|
||||||
## 6. Модель DTC (диагностические коды)
|
## 6. Модель DTC (диагностические коды)
|
||||||
|
|
||||||
- **Формат кода:** буква (`P` powertrain / `C` chassis / `B` body / `U` network) +
|
- **Формат кода:** буква (`P`/`C`/`B`/`U`) + **2-битное поле категории** (0–3, не полный hex) +
|
||||||
4 hex-цифры. Грубо: `0` — стандарт SAE/ISO, `1` — производитель (полная карта
|
3 hex-цифры. Для P-кодов: `P0`/`P2` — generic (ISO/SAE), `P1` — производитель, `P3` —
|
||||||
сложнее: `P2xxx` тоже стандарт, `P3xxx` смешанные).
|
смешанный (`P3000–P33FF` производитель, `P3400–P3FFF` SAE-reserved); у C/B/U своя разбивка —
|
||||||
|
уточняем по SAE J2012 при реализации.
|
||||||
- **Статусы:** `confirmed` (Mode 03), `pending` (Mode 07), `permanent` (Mode 0A).
|
- **Статусы:** `confirmed` (Mode 03), `pending` (Mode 07), `permanent` (Mode 0A).
|
||||||
- **Чтение:** Modes 03/07/0A — это **чтение**, разрешено.
|
- **Чтение:** Modes 03/07/0A — это **чтение**, разрешено.
|
||||||
⛔ **Сброс (Mode 04) — НЕТ.** Read-only (принцип #2).
|
⛔ **Сброс (Mode 04) — НЕТ.** Read-only (принцип #2).
|
||||||
|
|||||||
@@ -69,6 +69,12 @@ fsync». Различать резкий обрыв 12 В (hold-up + немед
|
|||||||
ответственность MCU-копилота (он эмитит дебаунснутый ACC + shutdown-imminent → ipc
|
ответственность MCU-копилота (он эмитит дебаунснутый ACC + shutdown-imminent → ipc
|
||||||
`AccChanged`/`ShutdownImminent`); для supercap-only — то же в софте на SoC. → инвариант домена B.
|
`AccChanged`/`ShutdownImminent`); для supercap-only — то же в софте на SoC. → инвариант домена B.
|
||||||
|
|
||||||
|
**Требования к самому MCU-копилоту** (он критичен — watchdog/sequencing/shutdown): прошивка
|
||||||
|
**обновляема** (доступная линия/бутлоадер — баг в MCU не делает кирпич); **детерминированный
|
||||||
|
fail-safe при отказе/зависании самого MCU** (независимый аппаратный таймер снятия питания);
|
||||||
|
**позиция в цепочке доверия** — доверенный ли элемент secure boot, можно ли подменой его прошивки
|
||||||
|
обойти power/red-line-логику. Аппаратные требования — здесь; прошивка — домен B.
|
||||||
|
|
||||||
## 4. Периферия
|
## 4. Периферия
|
||||||
|
|
||||||
| Узел | Старт | Прод / позже |
|
| Узел | Старт | Прод / позже |
|
||||||
@@ -79,7 +85,7 @@ fsync». Различать резкий обрыв 12 В (hold-up + немед
|
|||||||
| **Связь** | USB-модем (ModemManager) / Wi-Fi | — |
|
| **Связь** | USB-модем (ModemManager) / Wi-Fi | — |
|
||||||
| **Аудио** | I2S codec + усилитель | — |
|
| **Аудио** | I2S codec + усилитель | — |
|
||||||
| **Микрофон** | USB **mic-массив** (wake-word, шумоподавление) | — |
|
| **Микрофон** | USB **mic-массив** (wake-word, шумоподавление) | — |
|
||||||
| **Камеры** | задняя (CVBS capture-чип + драйвер, фаза 2) | dashcam / surround (задел, домен J) |
|
| **Камеры** | задняя (CVBS capture-чип + драйвер, **v2**) | dashcam / surround (задел, домен J) |
|
||||||
| **Мультируль** | кнопки руля: чтение с CAN **или** ADC (резистивная лесенка) | — |
|
| **Мультируль** | кнопки руля: чтение с CAN **или** ADC (резистивная лесенка) | — |
|
||||||
|
|
||||||
**Два пути чтения и точный смысл «read-only»:**
|
**Два пути чтения и точный смысл «read-only»:**
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
plugin:
|
plugin:
|
||||||
id: ru.shturman.plugin.fuel-tracker # reverse-DNS, уникальный
|
id: dev.example.fuel-tracker # reverse-DNS своего домена; ru.shturman.* зарезервирован за first-party (security-privacy §5)
|
||||||
name: "Учёт расхода"
|
name: "Учёт расхода"
|
||||||
version: 0.1.0 # semver
|
version: 0.1.0 # semver
|
||||||
description: "Пробег и средний расход"
|
description: "Пробег и средний расход"
|
||||||
@@ -36,6 +36,7 @@ plugin:
|
|||||||
- "сколько я проехал"
|
- "сколько я проехал"
|
||||||
- "средний расход"
|
- "средний расход"
|
||||||
ui_tiles: 1
|
ui_tiles: 1
|
||||||
|
ui_screens: 1
|
||||||
storage: true
|
storage: true
|
||||||
# network: { hosts: ["api.example.ru"] } # опц.: host-allowlist (см. §3)
|
# network: { hosts: ["api.example.ru"] } # опц.: host-allowlist (см. §3)
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ plugin:
|
|||||||
- id: consumption
|
- id: consumption
|
||||||
title: "Расход"
|
title: "Расход"
|
||||||
intents:
|
intents:
|
||||||
handler: /ru/shturman/plugin/fuel_tracker/intents # путь IntentHandler
|
handler: /dev/example/fuel_tracker/intents # путь IntentHandler
|
||||||
```
|
```
|
||||||
|
|
||||||
**Источник истины и согласованность:** `extension_points.tiles` — авторитетный список
|
**Источник истины и согласованность:** `extension_points.tiles` — авторитетный список
|
||||||
@@ -52,6 +53,11 @@ plugin:
|
|||||||
`len(tiles) ≤ ui_tiles`, иначе install отклоняется `InvalidArgument`). Все фразы
|
`len(tiles) ≤ ui_tiles`, иначе install отклоняется `InvalidArgument`). Все фразы
|
||||||
`assistant_intents` маршрутизируются в единственный `extension_points.intents.handler`.
|
`assistant_intents` маршрутизируются в единственный `extension_points.intents.handler`.
|
||||||
|
|
||||||
|
**i18n (принцип #10):** пользовательские строки (`name`/`description`/`tiles[].title`/
|
||||||
|
`assistant_intents`) — локализуемы: per-locale секции (`assistant_intents: { ru: […], en: […] }`)
|
||||||
|
или ключи + `locales/<lang>.yaml`. **`ru` обязателен** (дефолт + фолбэк); матчинг интентов — по
|
||||||
|
активной локали (d-assistant §6). На старте заполняем только `ru` (i18n-ready, не i18n-now).
|
||||||
|
|
||||||
## 3. Capability-модель
|
## 3. Capability-модель
|
||||||
|
|
||||||
- Таксономия и **гейтинг по каналам** — в [security-privacy.md](security-privacy.md) §3–4
|
- Таксономия и **гейтинг по каналам** — в [security-privacy.md](security-privacy.md) §3–4
|
||||||
@@ -68,7 +74,7 @@ plugin:
|
|||||||
|
|
||||||
### 4.1 UI — тайлы и экраны (слот-модель, решение №6)
|
### 4.1 UI — тайлы и экраны (слот-модель, решение №6)
|
||||||
- `Shell.RegisterTile(decl)` — **декларативный** элемент (рендерит shell в едином стиле).
|
- `Shell.RegisterTile(decl)` — **декларативный** элемент (рендерит shell в едином стиле).
|
||||||
- `Shell.RegisterScreen(decl | surface)` — декларативный экран **или** Wayland-поверхность (богатый ап рисует сам).
|
- `Shell.RegisterScreen(decl) → slot_token` (требует capability `ui_screens`) — декларативный экран **или** Wayland-поверхность (slot-token + slot-протокол, c-shell §4).
|
||||||
- Декларативный словарь (констрейнт): `icon`, `title`, `value`, `state`, привязки к
|
- Декларативный словарь (констрейнт): `icon`, `title`, `value`, `state`, привязки к
|
||||||
данным, `action`. Сложнее этого → поверхность. *(🟡 глубину декларативного DSL
|
данным, `action`. Сложнее этого → поверхность. *(🟡 глубину декларативного DSL
|
||||||
уточним при домене C/Shell.)*
|
уточним при домене C/Shell.)*
|
||||||
@@ -166,3 +172,5 @@ plugin:
|
|||||||
| Интенты | `HandleIntent` с обязательным таймаутом; крэш/таймаут → деградированный ответ, не виснет | 2026-06-16 |
|
| Интенты | `HandleIntent` с обязательным таймаутом; крэш/таймаут → деградированный ответ, не виснет | 2026-06-16 |
|
||||||
| Манифест-авторитет | `extension_points.tiles` авторитетны; `ui_tiles` — квота (`len ≤ N`) | 2026-06-16 |
|
| Манифест-авторитет | `extension_points.tiles` авторитетны; `ui_tiles` — квота (`len ≤ N`) | 2026-06-16 |
|
||||||
| Хранилище | квота на `/data/apps/<id>` (ENOSPC плагину); remove чистит; миграция — плагин | 2026-06-16 |
|
| Хранилище | квота на `/data/apps/<id>` (ENOSPC плагину); remove чистит; миграция — плагин | 2026-06-16 |
|
||||||
|
| i18n | строки манифеста локализуемы (per-locale/ключи); `ru` обязателен (i18n-ready) | 2026-06-16 |
|
||||||
|
| UI-capabilities | `ui_tiles` (квота тайлов) + `ui_screens` (гейт `RegisterScreen`) | 2026-06-16 |
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
Shell** (его пробрасывает bubblewrap при `ui_*`, security-privacy §4) и создаёт там surface;
|
Shell** (его пробрасывает bubblewrap при `ui_*`, security-privacy §4) и создаёт там surface;
|
||||||
привязка surface→слот — через приватный **Wayland slot-протокол** (`ru.shturman.shell_slot`),
|
привязка surface→слот — через приватный **Wayland slot-протокол** (`ru.shturman.shell_slot`),
|
||||||
не по D-Bus. `RegisterScreen` по D-Bus возвращает **slot-token**, который клиент предъявляет
|
не по D-Bus. `RegisterScreen` по D-Bus возвращает **slot-token**, который клиент предъявляет
|
||||||
в slot-протоколе; композитор сверяет peer-credentials сокета.
|
в slot-протоколе; композитор сверяет peer-credentials сокета. Гейтится capability `ui_screens` (тайлы — `ui_tiles`; plugin-sdk §4.1).
|
||||||
|
|
||||||
## 5. Декларативный UI-DSL *(резолв отложенного вопроса)*
|
## 5. Декларативный UI-DSL *(резолв отложенного вопроса)*
|
||||||
|
|
||||||
@@ -78,8 +78,8 @@ Shell** (его пробрасывает bubblewrap при `ui_*`, security-priv
|
|||||||
|
|
||||||
## 6. Тема и отклик
|
## 6. Тема и отклик
|
||||||
|
|
||||||
- День/ночь — **авто** (v0: по времени / GPS-восходу; датчик освещённости и сигнал
|
- День/ночь — **авто** (v0: **по времени** (RTC/NTP/fake-hwclock, a-base §7); **GPS-восход — v1**
|
||||||
машины — later, их нет на старте), токены темы.
|
(после поднятия домена K); датчик освещённости и сигнал машины — later), токены темы.
|
||||||
- Крупные тач-таргеты, **мгновенный отклик** (принцип #11): тяжёлое — фоном, UI-поток не блокируем.
|
- Крупные тач-таргеты, **мгновенный отклик** (принцип #11): тяжёлое — фоном, UI-поток не блокируем.
|
||||||
|
|
||||||
## 7. Driver-distraction (принцип #6)
|
## 7. Driver-distraction (принцип #6)
|
||||||
@@ -117,7 +117,7 @@ Shell** (его пробрасывает bubblewrap при `ui_*`, security-priv
|
|||||||
- 🟡 **Точная грамматика декларативного DSL** (поля tile/card/list/form) — детализировать.
|
- 🟡 **Точная грамматика декларативного DSL** (поля tile/card/list/form) — детализировать.
|
||||||
- ◻️ **Пороги и политика driver-distraction** (что именно блокируется и когда). → этот домен + principles #6.
|
- ◻️ **Пороги и политика driver-distraction** (что именно блокируется и когда). → этот домен + principles #6.
|
||||||
- ◻️ **UI управления разрешениями** (review/revoke) — из security-privacy. → этот домен + Settings.
|
- ◻️ **UI управления разрешениями** (review/revoke) — из security-privacy. → этот домен + Settings.
|
||||||
- ◻️ **Источник день/ночь** (время vs датчик освещённости vs сигнал машины). → реализация.
|
- ◻️ **Источник день/ночь** (v0 время; **GPS-восход v1**; датчик освещённости / сигнал машины — later). → реализация + домен K.
|
||||||
- ◻️ **Мультидисплей, профили** — later.
|
- ◻️ **Мультидисплей, профили** — later.
|
||||||
- ◻️ **Контракт Location/GPS (домен K)** — distraction v1 и день/ночь-восход гейтятся им; до K — мок-стаб (ipc `Location`).
|
- ◻️ **Контракт Location/GPS (домен K)** — distraction v1 и день/ночь-восход гейтятся им; до K — мок-стаб (ipc `Location`).
|
||||||
- 🟡 **Slot-протокол поверхностей** (`ru.shturman.shell_slot`: surface→слот, slot-token, peer-creds) — спроектировать (§4).
|
- 🟡 **Slot-протокол поверхностей** (`ru.shturman.shell_slot`: surface→слот, slot-token, peer-creds) — спроектировать (§4).
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@
|
|||||||
| **TTS** | Silero | офлайн, RU |
|
| **TTS** | Silero | офлайн, RU |
|
||||||
| **LLM онлайн** | GigaChat · YandexGPT | HTTP, provider-agnostic, 152-ФЗ |
|
| **LLM онлайн** | GigaChat · YandexGPT | HTTP, provider-agnostic, 152-ФЗ |
|
||||||
| **LLM офлайн** | llama.cpp / Ollama | квантованная мелкая модель |
|
| **LLM офлайн** | llama.cpp / Ollama | квантованная мелкая модель |
|
||||||
| **Карты (фаза 2)** | MapLibre + Valhalla/OSRM | офлайн |
|
| **Карты (v4)** | MapLibre + Valhalla/OSRM | офлайн |
|
||||||
| **Dev VM** | Lima (vz-backend) | ARM64, нативная виртуализация |
|
| **Dev VM** | Lima (vz-backend) | ARM64, нативная виртуализация |
|
||||||
| **CI** | GitHub Actions, ARM64-Linux | совпадает с таргетом |
|
| **CI** | GitHub Actions, ARM64-Linux | совпадает с таргетом |
|
||||||
| **Сборка / оркестрация** | Cargo (workspace) + `justfile` | |
|
| **Сборка / оркестрация** | Cargo (workspace) + `justfile` | |
|
||||||
|
|||||||
Reference in New Issue
Block a user