Files
elmer/doc/session-2026-06-06.md
T
2026-06-06 21:30:33 +04:00

3.8 KiB

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<String>

Путь 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 завис, поток висит бесконечно.