Files
shturman/docs/domains/k-sensors-peripherals.md
kk0t9 5ba19cde46 docs(domain K): v2 после adversarial-ревью (18 находок) + кросс-док
- GPS-скорость: zero-clamp <~2-3 км/ч (на стоянке Doppler-шум, не ноль) — distraction v1
  получал бы ложный on; FixQuality многоуровневый (no_fix/2d/3d/augmented/dead_reckoning
  + HDOP/sats); dead_reckoning не валиден для distraction/Nav; валидность времени ≠ позиции
- приватность локации: эфемерна (без трека в v1), audit-log, исключена из LLM-промпта,
  while-in-use грант, on-device
- антенна (внешняя/активная), TTFF cold/warm-start, окно без GPS на старте поездки;
  питание GPS в sleep/battery-cutoff (обесточивание+cold-start по умолчанию)
- резистивная ADC-лесенка руля: контракт window-table + кондиционирование + collision-drop
  + темп-дрейф; транспорт ввода = uinput/evdev (не Shell-D-Bus, иначе surface-апы не покрыты);
  гейтинг руль-действий в distraction
- IMU опционален/не гарантирован → dashcam (J) = непрерывный ring-buffer, не на g-sensor
- точность времени SHM (~десятки-сотни мс), PPS опц./hardware-gated; Nav «фаза 2»→v4
- кросс-док: a-base §7/§14 (SHM, split time-row + K-dep), hardware §4 (антенна/1PPS),
  domains/README (K-cell без TPMS/климата), ipc Location (enum), c-shell §7/§9/§11
  (clamped speed, uinput-ввод, закрыт Location-вопрос)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 15:30:08 +03:00

162 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Домен K — Датчики / периферия
> Не-CAN сенсоры и периферия **самого устройства**: GPS (→ сервис `Location`),
> IMU, выделенные ADC/GPIO-входы (резистивный руль), USB-сенсоры. Содержит
> `ru.shturman.Location`, на который ссылаются C (distraction, день/ночь), D, a-base §7 (GPS-время).
Статус: **v2 (на ревью).** v2 — после adversarial-ревью (18 находок).
Связано с: [hardware.md](../contracts/hardware.md) (§4 GPS/периферия) · [ipc.md](../contracts/ipc.md) (`Location`) · [security-privacy.md](../contracts/security-privacy.md) (`location`, приватность) · [a-base-system.md](a-base-system.md) (§7 GPS-время) · домены C (ввод/distraction/тема), D, E (CAN-граница), J (камеры)
---
## 1. Назначение и границы
- **Что делает:** интегрирует **не-vehicle-bus** сенсоры и периферию устройства:
**GPS** (→ `Location`), IMU/акселерометр, выделенные ADC/GPIO-входы, специфичные USB-сенсоры.
- **Граница с E (важно):** **K не трогает CAN** — единственный владелец CAN — E (red-line, #2).
Сигналы с шины авто (кнопки руля на CAN, парктроники, TPMS, климат) — **сигналы E/data-model**, не K.
- **Граница с A:** udev/USB-стек — база (A); K — прикладная интеграция конкретных сенсоров.
## 2. `ru.shturman.Location` — GPS / положение (главный артефакт K)
- **Источник:** GPS-приёмник (USB/UART, NMEA) → `gpsd` → сервис (hardware §4).
- **Публикует** (ipc §3): `Latitude`, `Longitude`, `Heading`, `Speed`, `FixQuality`, `HDOP`,
`satellites`, `ts`; сигналы `LocationChanged`, `FixChanged`. Гейтится capability `location`.
**FixQuality — многоуровневый** (не бинарный): enum `{no_fix, fix_2d, fix_3d, augmented (DGPS/SBAS),
dead_reckoning}` + `HDOP`/`satellites` как метрики достоверности при валидном фиксе. Инварианты:
`dead_reckoning` НЕ считается валидным для distraction/Nav (экстраполяция); высокий HDOP =
большая ошибка. **Валидность времени отделена от валидности позиции** (RMC/ZDA UTC может быть
валиден без позиционного фикса — для a-base §7). Точный маппинг NMEA — сверяется при реализации.
**Скорость/курс на малой скорости (контракт):** ниже порога уверенности (~2–3 км/ч,
BSP-tunable) Location **зануляет `Speed`** (не сырой Doppler-шум) и помечает `Heading` невалидным.
Это **source-level** фикс (ортогонален гистерезису distraction в C §7): убирает систематический
дрейф на стоянке, который иначе держал бы ложный distraction-on. C потребляет **занулённую/
quality-флагнутую** `Speed`, не сырую.
**QoS:** типовая частота NMEA ~1 Гц (выше — зависит от приёмника); латентный бюджет
fix→`LocationChanged`→потребитель. Ненадёжность у нуля и в urban-canyon — вход для гистерезиса/
fail-safe C §7. До поднятия K — **мок-стаб** (dev fake-GPS).
**Приём, старт, антенна:**
- **Внешняя/активная антенна** на reference-плате (встроенная в торпедо часто не видит небо) → hardware §4.
- **TTFF:** cold-start (потеря эфемерид) — десятки секунд; warm/hot — быстрее. После
`battery-cutoff` (B §7, долгая стоянка) поездка может стартовать с **окна без GPS** — потребители
деградируют штатно (C §7 консервативный distraction; a-base §7 нет GPS-времени до первого fix).
- **Питание в sleep/battery-cutoff:** по умолчанию GPS **обесточивается** (приоритет энергии на
запуск, #5; ценой cold-start на wake), keep-alive рейл — только если сценарий wake требует фикса
сразу. Селективный рейл — hardware §3; бюджет разряда — B §7/§12.
- **Boot:** Location/gpsd поднимаются в **Stage 2** (фоном, architecture §6); ранняя поездка до
фикса — деградированный режим. Подписки авто-снимаются по `NameOwnerChanged` (ipc §2).
**Точность времени:** по NMEA-via-gpsd-SHM — **десятки–сотни мс** (достаточно для TLS-гейта
a-base §7 и упорядочивания логов). **PPS (µs)** — опционально, требует приёмник с 1PPS + линию на
GPIO/UART-DCD (hardware §4); на USB-донгле обычно нет. По умолчанию — SHM-класс.
**Приватность локации:** по умолчанию **эфемерна** — live-позиция на шине, **без персистентного
трека** (в v1 нет фичи, требующей хранения; Nav — v4). Если позже понадобится (last-parked/
trip-log) — только **fscrypt-поддерево** `/data` (a-base §3), с retention и factory-reset-wipe
(a-base §12). Доступ к локации — в **audit-log** (security-privacy ✅); точная локация **исключена
из онлайн-LLM-промпта** по умолчанию (только по отдельному гранту, security-privacy §7);
`location`-грант — **while-in-use** (revoke при уходе в фон). First-party-потребители (C, a-base) —
строго **on-device**, наружу не уходит.
**Dev-симулятор Location** (#13): обязательные сценарии — реплей NMEA-трека, no-fix/тоннель/потеря,
дрейф, cold-start TTFF, время-без-позиции, низкоскоростной джиттер у нуля, расхождение GPS-vs-OBD
(для арбитража C §7 v2). Детали — dev-environment.
## 3. Мультируль (кнопки руля) — двойной источник
- **CAN-кнопки** (современные авто): читаются как **сигналы E** (через VehicleData), не K.
- **Резистивная ADC-лесенка** (старые авто): **K** оцифровывает → нормализует в события.
**Контракт ADC-лесенки** (самая хрупкая часть — не одна строка):
- **Window-table, не точечные пороги:** BSP даёт на кнопку окно `[min,max]` + гистерезис (учитывая
резисторы авто И наш делитель/Vref/pull-up). Статические per-vehicle данные, аналог DBC (hardware §5).
- **Рантайм-кондиционирование:** debounce + median/avg-фильтр + отбрасывание транзиентных уровней
при нажатии/отпускании (release-through-adjacent не даёт фантомных нажатий); short/long/repeat.
- **Коллизии:** чтение вне всех окон → no-press (никогда не ложная кнопка); простая лесенка не
различает одновременные нажатия (паразитный уровень) — политика detect-and-drop.
- **Темп./aging-дрейф:** ширина окон/гистерезис под конверт −20…+70 °C (hardware §1a) + запас.
**Транспорт ввода — `uinput`/evdev (не Shell-D-Bus):** K нормализует кнопки (ADC + опц. проксированные
CAN из E) в виртуальное **uinput-устройство** → libinput → smithay-композитор Shell → штатный
Wayland-input сфокусированному клиенту. Это покрывает и декларативные тайлы, и **surface-апы**
(нав/медиа), что вариант «только Shell-D-Bus» НЕ покрывает. Гейтинг «кому руль» — фокус
композитора (C §2), не отдельная D-Bus-capability.
**Distraction-дисциплина:** в distraction-режиме (C §7, через `DistractionModeChanged`) часть
руль-действий **гейтится** — навигация по упрощённому UI и приоритет голосу OK; сложное листание/
глубокие меню блокируются, чтобы руль не обходил #6.
## 4. IMU / акселерометр
- Ориентация устройства, детект движения; **опционально** g-sensor.
- I2C/SPI-сенсор на плате — **не обязателен, на большинстве сборок может отсутствовать**. Фаза — later.
- ⚠️ **Констрейнт для J:** g-sensor НЕ гарантирован. Dashcam (J) **не закладывается** на g-sensor:
дефолт — **непрерывная кольцевая запись** без триггера; event-маркировка опциональна (IMU **или**
резкое замедление по GPS-`Speed`). Деградирует видимо (пишет всегда), не тихо (#4).
## 5. Прочие сенсоры (в основном — E)
- **Парктроники, TPMS, климат (чтение):** в современных авто на CAN → **сигналы E/data-model** (K не дублирует).
- K подключает только **выделенные не-CAN** датчики (редко, ретрофит). Парктроник-дистанция →
оверлей поверх вида камеры (J) — данные из E или K по источнику.
## 6. USB-периферия
- Енумерация/интеграция специфичных **сенсоров** на USB. Базовый udev/USB-стек — A.
- (mic-массив — PipeWire/аудио; ELM327 — транспорт E; модем — Connectivity; не K.)
## 7. IPC
- `ru.shturman.Location` — см. §2 и [ipc.md](../contracts/ipc.md) §3 (`FixQuality`-enum + per-property quality для `Speed`/`Heading`).
- **Input руля** — через **uinput/evdev** (§3), не отдельный D-Bus-интерфейс.
## 8. Функции
| функция | MVP/later | зависит от | фаза |
|---------|-----------|------------|------|
| `ru.shturman.Location` (GPS → position/speed/heading + FixQuality/HDOP) | **MVP** | hardware(GPS), gpsd | v1 |
| Zero-clamp скорости / валидность курса у нуля | **MVP** | — | v1 |
| GPS-источник (NMEA/gpsd) для time-sync a-base §7 | **MVP** | hardware(GPS) | v1 |
| Приватность локации (эфемерна; audit; не в промпт) | **MVP** | security-privacy | v1 |
| Мультируль: ADC-лесенка (window-table) → uinput | later | hardware(ADC)/BSP | v1/v2 |
| Мультируль: CAN-кнопки (через E) | later | E | v2 |
| IMU/акселерометр (опц.) | later | hardware(IMU) | later |
| Выделенные не-CAN датчики | later | hardware | later |
| Nav-позиционирование (потребитель Location) | later | домен I | v4 |
## 9. Зависимости
- **Вниз:** hardware (§4 GPS/антенна/1PPS-опц., ADC-входы, IMU; §3 селективный рейл GPS).
- **Вбок:** E (CAN-граница); A (udev/USB-стек); **B** (питание GPS в sleep/battery-cutoff, бюджет разряда);
J (парктроник-оверлей; констрейнт — dashcam не на гарантированный g-sensor, §4).
- **Вверх/потребители:** C (GPS-скорость для distraction v1, GPS-восход для темы v1; input с руля
через uinput), D (геоконтекст), a-base §7 (GPS-время, v1), Nav (I, v4).
## 10. Открытые вопросы
- 🟡 **Маппинг кнопок руля → действия** + калибровка ADC-порогов на конкретном авто (BSP/HAL, hardware §5).
- ◻️ **Какие руль-действия гейтятся в distraction** (C §7) — парный вопрос с C §11.
- ◻️ **IMU на reference-плате** — нужен ли (ориентация? опц. g-sensor для dashcam-маркировки?); до
решения J = непрерывный ring-buffer (§4). + **dead-reckoning** (IMU+GPS) для тоннелей/удержания
distraction-скорости при потере GPS — нужен ли и где живёт (K-fusion/gpsd/Nav).
- ◻️ **Питание GPS в sleep/battery-cutoff** (keep-alive warm-start vs обесточивание+cold-start) — hardware §3 + B §7.
- ◻️ **Арбитраж GPS-vs-OBD-скорости** (C §7 v2) — кросс-проверка.
---
## Журнал решений (домен K)
| Решение | Выбор | Дата |
|---------|-------|------|
| Граница с E | K — не-CAN сенсоры/периферия; CAN-сигналы (кнопки/парктроник/TPMS/климат) — у E | 2026-06-16 |
| Location | `ru.shturman.Location` (GPS/gpsd) — владелец K; K поставляет фид, time-sync владеет a-base §7 | 2026-06-16 |
| Скорость GPS | zero-clamp <~2-3 км/ч; FixQuality многоуровневый; dead_reckoning не валиден для distraction | 2026-06-16 |
| Приватность | эфемерна (без трека в v1); audit-log; не в LLM-промпт; while-in-use грант; on-device | 2026-06-16 |
| Мультируль | window-table + кондиционирование + collision-drop; транспорт **uinput/evdev**; гейт фокусом C | 2026-06-16 |
| IMU/dashcam | IMU опц./не гарантирован; J = непрерывный ring-buffer, не на g-sensor | 2026-06-16 |
| Время | SHM-класс (десятки-сотни мс); PPS — опц., hardware-gated | 2026-06-16 |