From f5d24721842a4aef052408c4cfbf60834020c30c Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sat, 13 Jun 2026 10:18:13 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20?= =?UTF-8?q?Claude=20v2=20=E2=80=94=20=D0=BF=D0=BE=D1=87=D0=B5=D0=BC=D1=83?= =?UTF-8?q?=20v1.9.0=20=D1=85=D1=83=D0=B6=D0=B5=20v1.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/claude-request-elm-v2.md | 73 ++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 doc/claude-request-elm-v2.md diff --git a/doc/claude-request-elm-v2.md b/doc/claude-request-elm-v2.md new file mode 100644 index 0000000..ca627dd --- /dev/null +++ b/doc/claude-request-elm-v2.md @@ -0,0 +1,73 @@ +# Запрос к Claude Sonnet — поиск багов в ELM-коде + +## Контекст + +Android-приложение для OBD2-диагностики через ELM327 Bluetooth. +Стек: Kotlin, minSdk 24. + +**Проблема:** динамический тест (опрос 3 PID в цикле) — ELM327 v1.5 перестаёт отвечать. + +### Данные тестов (реальные сессии из БД) + +**v1.3.0-dev (#54):** статика работает, ATWS + 300ms перед динамикой +``` +0106 (STFT): 1 ok / 18 попыток +010C (RPM): 1 ok / 18 попыток +0110 (MAF): 0 ok / 18 попыток +Первые 2 ответа — данные, затем 16 пустых. +``` + +**v1.9.0-dev (#56):** без ATWS, без drain, без sleep(350) +``` +0106 (STFT): 0 ok / 15 попыток ← СТАЛО ХУЖЕ +010C (RPM): 0 ok / 15 попыток +0110 (MAF): 0 ok / 15 попыток +ВСЕ 15 ответов пустые. ELM вообще не отвечает. +``` + +### Что изменилось в v1.9.0 +1. Убрали `ATWS` перед динамикой (заменили на `ATE0`/`ATL0`/`ATS0`) +2. Убрали `Thread.sleep(350)` между командами внутри батча +3. Добавили `setDrainBeforeWrite(false)` — drainInput() не вызывается в write() +4. Вызвали `drainInput()` один раз перед стартом DynamicCollector + +### Статика работает идеально (сессия #55, v1.9.0-dev) +Все 9 PID (0104-0111) — ok. Проблема ТОЛЬКО в DynamicCollector. + +## Код + +Файлы лежат в `android/app/src/main/java/ru/elmer/client/`: + +### ElmProtocol.kt (elm/ElmProtocol.kt) — ПОЛНОСТЬЮ ВАЖЕН +Стейт-машина AndrOBD. Методы: `sendCommand()` → `exec()` → `write()` → `read()`. +Ключевое: `write()` вызывает `drainInput()` перед каждой командой. +`exec()` делает до 10 retry при таймауте (каждый retry = новый write()). + +### DynamicCollector.kt (script/DynamicCollector.kt) — ПОЛНОСТЬЮ ВАЖЕН +Цикл опроса: `while(running) { for(step in steps) { elm.sendCommand(step.cmd) } sleep(interval) }` +Сейчас без sleep между командами внутри батча. + +### MainActivity.kt (ui/MainActivity.kt) — строки 344-470 +Метод `startDynamicRecording()`. Поток выполнения: +1. `checker.ensureConnected()` — переподключение если нужно +2. Статический проброс 9 PID (каждый через sendCommand) +3. ATE0/ATL0/ATS0 — переинициализация +4. `elmProto.drainInput()` — однократная очистка +5. `elmProto.setDrainBeforeWrite(false)` — отключаем drain +6. `DynamicCollector.start()` — цикл опроса +7. После stop: `elmProto.setDrainBeforeWrite(true)` + +## Вопросы + +1. **Почему v1.9.0 стал ХУЖЕ чем v1.3.0?** В v1.3.0 было ATWS+300ms и ELM отвечал хотя бы на первые 2 команды. В v1.9.0 — ни одного ответа. + +2. **Нужен ли ATWS перед динамикой?** Если да — сколько ждать после него? + +3. **Нужен ли drainInput() в write()?** Или достаточно одного drain'а перед стартом? Не съедает ли drainInput() ответы от медленного ELM? + +4. **Почему статика работает а динамика нет?** Разница: статика = одиночные sendCommand с паузами между шагами. Динамика = 3 sendCommand подряд в цикле. + +5. **Правильно ли `exec()` делает retry с повторной отправкой команды?** Не забивает ли это ELM327? + +Выдай СВОЙ анализ и КОНКРЕТНЫЕ исправления в файл `doc/claude-analysis-elm-v2.md`. +Не пиши общие рекомендации — дай точные правки кода.