docs: пояснения почему выбрана такая логика (reasoning)

This commit is contained in:
Repinoid
2026-06-06 07:24:17 +04:00
parent 8da4876cb8
commit fd8059bb6a
4 changed files with 45 additions and 7 deletions
+14 -3
View File
@@ -120,7 +120,14 @@ class AndrOBD:
# ── Приватные методы ──────────────────────────────────
def _exec(self, cmd: str, timeout: int) -> str:
"""Выполнить команду с таймаутом и ретраями (до 10 попыток)."""
"""Выполнить команду ELM327 с ретраями (до 10 попыток).
Архитектура AndrOBD: ELM327 может не ответить, если:
- Адаптер ещё не инициализирован (SEARCHING)
- ЭБУ медленно отвечает (увеличиваем AdaptiveTiming)
- Плохой контакт / потеря связи (Busy→Timeout→Error)
10 ретраев — жёсткий лимит из AndrOBD, после — ERROR.
"""
self._last_cmd = cmd
self._write(cmd)
t = timeout
@@ -128,9 +135,11 @@ class AndrOBD:
try:
return self._handle(self._read(t))
except TimeoutError:
# Инициализация: каждый ретрай +1с (ELM может быть занят init)
if self._state == State.INITIALIZING:
t += 1000
else:
# Активный режим: растём таймаут адаптивно
self._timing.increase()
t = self._timing.ms
logger.error(f"AndrOBD: no response for {cmd}")
@@ -138,9 +147,9 @@ class AndrOBD:
return ""
def _handle(self, raw: str) -> str:
"""Обработать ответ ELM327: классифицировать и обновить таймаут.
"""Обработать ответ ELM327: классификация → обновление таймаута.
Возвращает raw как есть — обработка данных делается выше.
Возвращает raw как есть — декодирование данных на уровень выше.
"""
t = Rsp.identify(raw)
@@ -150,6 +159,8 @@ class AndrOBD:
self._timing.decrease()
return raw
if t == Rsp.NODATA:
# NODATA = ЭБУ жив, но не может ответить (например, PID недоступен)
# Увеличиваем таймаут — возможно ЭБУ медленный
self._timing.increase()
self._update_atst()
return raw