- 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>
15 KiB
Домен K — Датчики / периферия
Не-CAN сенсоры и периферия самого устройства: GPS (→ сервис
Location), IMU, выделенные ADC/GPIO-входы (резистивный руль), USB-сенсоры. Содержитru.shturman.Location, на который ссылаются C (distraction, день/ночь), D, a-base §7 (GPS-время).
Статус: v2 (на ревью). v2 — после adversarial-ревью (18 находок).
Связано с: hardware.md (§4 GPS/периферия) · ipc.md (Location) · security-privacy.md (location, приватность) · 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. Гейтится capabilitylocation.
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 §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 |