diff --git a/doc/session-2026-06-06.md b/doc/session-2026-06-06.md new file mode 100644 index 0000000..7402920 --- /dev/null +++ b/doc/session-2026-06-06.md @@ -0,0 +1,69 @@ +# 2026-06-06 — Полевой тест и финальная проверка ELM + +## Контекст +Выезд к машине. Приложение показывает "No ELM", хотя сторонние приложения (Torque, Car Scanner) подключаются нормально. + +## Найденные баги (и их исправления) + +### 1. 🔴 КРИТИЧЕСКИЙ: `checkDevice()` не вызывал `connectAndInit()` +**Файл:** `ElmChecker.kt:69` +**Симптом:** Кнопка "🔌 ELM" показывала ❌ ELM не отвечает +**Причина:** В ходе рефакторинга `checkDevice()` был вынесен как отдельный метод, но вызов `connectAndInit()` был убран. AT-команды слались в никуда — BT-сокет не открывался. +**Исправление:** Вернул `if (!connectAndInit()) return null` в начало `checkDevice()`. +**Коммит:** `6a33048` + +### 2. 🟡 `connect()` не идемпотентный +**Файл:** `ElmChecker.kt:189` +**Проблема:** Повторный вызов `connect()` пытался открыть новый сокет поверх уже открытого → IOException. +**Исправление:** Добавлена проверка `if (socket?.isConnected == true) return` в начале `connect()`. +**Коммит:** `739afa9` + +### 3. 🟡 `run()` — двойной connect +**Файл:** `ElmChecker.kt:133` +**Проблема:** `run()` вызывал `connectAndInit()`, затем `checkDevice()` тоже вызывал `connectAndInit()` → двойное подключение. +**Исправление:** Убрал `connectAndInit()` из `run()`, так как `checkDevice()` сам подключается. +**Статус:** `run()` сейчас не используется в продакшене (UI вызывает методы по отдельности), но исправлен на будущее. +**Коммит:** `739afa9` + +## Архитектура вызовов (финальная) + +Три пути в UI: + +### Путь 1: 🔌 ELM → 🚗 ЭБУ +``` +checkElm() → findElmDevice() → ElmChecker(dev, bt).checkDevice() + → connectAndInit() → connect() → elm.init() + → ATI, AT@1, AT@2, ATDP, ATRV, ATAT1 + → возвращает DeviceInfo + → checker сохранён в elmChecker (сокет НЕ закрыт) + +checkEcu() → elmChecker.checkEcu() + → send("0100"), send("0902") + → возвращает EcuData + → сокет остаётся открытым (GC закроет) +``` + +### Путь 2: ⚠️ DTC +``` +scanDtc() → findElmDevice() → NEW ElmChecker(dev, bt).scanDtc() + → connectAndInit() → connect() → elm.init() + → send("03"), send("07") → parseDtcCodes() + → disconnect() ← сокет ЗАКРЫВАЕТСЯ + → возвращает List +``` + +### Путь 3: run() (не используется) +``` +run() → checkDevice() → connectAndInit() → ... → checkEcu() → disconnect() +``` + +## Текущее состояние +- Версия: **v0.42.0-dev** +- APK: https://obdai.ru/elmer.apk +- BT permissions: Android 12+ запрашиваются в onCreate() +- Сервер: работает, ping ОК +- Тесты: 133 шт (118 pass, 1 expected fail SQLite) + +## Не исправлено (потенциальные проблемы) +- После 🔌ELM → 🚗ЭБУ сокет не закрывается. Если потом нажать ⚠️DTC, создаётся второй сокет к тому же устройству. Некоторые ELM-клоны не держат два соединения. +- Нет таймаута на `checkElm()` — если ELM завис, поток висит бесконечно.