Files
elmer/morda.md

9.3 KiB
Raw Permalink Blame History

Морда elmAI v2

Новая архитектура UI. Обсуждено 7 июня 2026.

Макет

┌──────────────────────────────────────────┐
│ 🔧 elmAI                            v?.?.? │
│ 📡 Сервер ●  🔌 ELM ●  🚗 ЭБУ ●  🧠 LLM ●  │  иконки + светофоры
├──────────────────────────────────────────┤
│ [     ОШИБКИ / ДИАГНОСТИКА / СТАРТ / СТОП    ] │  одна кнопка
├──────────────────────────────────────────┤
│                                          │
│          поле вывода результатов         │
│                                          │
├──────────────────────────────────────────┤
│ [📋 История]                             │
├──────────────────────────────────────────┤
│ [____________________________] [➤]      │  поле ввода + кнопка
└──────────────────────────────────────────┘

Иконки и светофоры

Четыре иконки в строке под версией. Справа от каждой — цветной индикатор.

Иконка Текст 🟢 Зелёный 🟡 Жёлтый 🔴 Красный
📡 Сервер ping < 3с проверка... нет связи
🔌 ELM BT + ATI ok подключение... нет ELM
🚗 ЭБУ 0100 ответил нет связи с ЭБУ
🧠 LLM ping-llm ok проверка... нет доступа
  • Жёлтый — только на время проверки
  • LLM проверяется только если Сервер зелёный
  • ЭБУ проверяется только если ELM зелёный
  • Тап по иконке — перепроверка. Сбрасывает цвет на жёлтый, запускает проверку заново.

Таймауты

  • ELM: 2 попытки BT-подключения по ~4с = макс 8с → 🔴
  • Сервер: HTTP GET /api/v1/ping, таймаут 3с🔴
  • LLM: HTTP GET /api/v1/ping-llm, таймаут 5с🔴 (только если Сервер 🟢)
  • При тапе на иконку проверка запускается немедленно, без задержек.

Стартовый сценарий

  1. Открыли приложение → все индикаторы 🟡 или 🔴
  2. ELM 🟡 — пробуем подключиться (8с макс) → 🟢 или 🔴
  3. Сервер 🟡 — ping (3с) → 🟢 или 🔴
  4. Если Сервер 🟢 → LLM 🟡 — ping-llm (5с) → 🟢 или 🔴
  5. Если ELM 🟢 → ЭБУ — пробуем 0100🟢 или 🔴

После первого цикла индикаторы не обновляются автоматически — только по тапу.

Кнопка-трансформер

Одна широкая кнопка. Меняет текст, цвет и действие в зависимости от этапа.

🔴 [⚠️ ОШИБКИ]          — начальное состояние
        ↓ тап
    сканирование DTC (03 + 07)
        ↓
🔵 [🔍 ДИАГНОСТИКА]     — ошибки считаны
        ↓ тап
    ЕСЛИ сервер 🟢 → запрос параметров ЭБУ → отправка на сервер → LLM-анализ → вывод
    ЕСЛИ сервер 🔴 → пояснение в выводе: «Сервер недоступен. Сделайте тест.»
        ↓
🟢 [▶ СТАРТ]            — готов к динамическому тесту
        ↓ тап
    подсказка в выводе: «Газ до 3000, 3-4с, сброс. → СТОП»
    запись 12 PID каждые 250мс
        ↓
🔴 [⏹ СТОП]             — запись идёт
        ↓ тап
    запись остановлена, данные в памяти
    вывод: «Записано N отсчётов. ➤ для отправки.»
        ↓
🟢 [▶ СТАРТ]            — можно повторить тест
  • После СТОП можно снова нажать СТАРТ — новый тест, старые данные сохраняются.
  • Отправка данных — не кнопкой, а через ➤ в поле ввода.

Поле вывода

  • ScrollView, моноширинный шрифт
  • После done — кнопка «✕ Закрыть» (сворачивает вывод, возвращает все кнопки)
  • После Share в истории — возврат в приложение (стандартное поведение Android)

Поле ввода + кнопка ➤

2 строки, всегда активно. Плейсхолдер: «Что беспокоит? Чем подробнее — тем лучше».

Кнопка ➤ справа:

  • Обычный режим: текст из поля → отправка на сервер (/api/v1/chat) → сервер спрашивает LLM → ответ в вывод
  • После СТОП: накопленные данные теста → отправка на сервер (/api/v1/session/upload) + текст (если есть) → сервер анализирует через LLM → ответ в вывод
  • Ответ → в поле вывода

История

  • Кнопка «📋 История»
  • Список последних 20 сессий (дата, заголовок, статус загрузки)
  • Выбор → диагноз во всплывающем окне
  • Кнопка «📤 Поделиться» → системный Share Sheet (Telegram, WhatsApp, Gmail...)
  • После Share — возврат в наше приложение

Что удаляется

  • Кнопки «📡 Сервер», «🔌 ELM», «🚗 ЭБУ» как отдельные — заменены на иконки со светофорами
  • Кнопки «⏱ На месте», «🚗 В движении» — всё через одну кнопку-трансформер
  • tvDtcStatus («Сначала считай ошибки») — не нужен
  • cbFullMode (чекбокс полной диагностики) — всегда полная
  • tvPrompt (оверлей) — не нужен
  • btnDynStart — не нужен

Серверные изменения

Ничего нового — всё уже есть:

  • /api/v1/ping
  • /api/v1/ping-llm
  • /api/v1/chat
  • /api/v1/session/upload с dynamic_samples

Текущий макет (реализовано)

elmAI v0.68 📡🟢 ELM🟢 ECU🟢 LLM🟢          ← одна строка
[          ОШИБКИ / ДИАГНОСТИКА / СТАРТ / СТОП         ]
                     вывод
[     📋 История     ] ⏱ 12с                     ← таймер справа
[____________________________] [➤]               ← 3 строки ввода

Логика кнопки (стейт-машина)

State Текст Цвет Действие
INIT ⚠️ ОШИБКИ 🟠 scanDtc()
DTC 🔍 ДИАГНОСТИКА 🔵 runDiagnostics()
DIAG ▶ СТАРТ 🟢 startDynamicRecording()
START ⏹ СТОП 🔴 stopDynamicRecording()
STOP ▶ СТАРТ 🟢 не используется
  • Кнопка неактивна (alpha=0.4) если ELM 🔴 или ECU 🔴
  • Поле ввода неактивно если LLM 🔴
  • После DTC-сканирования ECU → 🟢
  • После СТОП → DIAG (можно снова СТАРТ)

Исправлено (v0.57 → v0.68)

v Что
0.57 Layout v2, иконки, трансформер
0.58 Всё в одной строке
0.59 setIndicator в runOnUiThread
0.60 LLM → 🤓
0.61 Таймер в строке Истории, нет ELM → кнопка неактивна
0.62 Поле ввода неактивно без LLM
0.63 🤓🎓
0.64 🎓 → LLM текст
0.65 СТОП работает, ECU 🟢 после сканирования
0.66 ensureConnected всегда перед dynamic test
0.67 Кнопка неактивна без ECU
0.68 Двойной вызов checkLlm/checkEcu убран, таймер в catch

Известные проблемы (TODO)

  • findElmDevice() возвращает null при >1 устройствах (диалог асинхронный)
  • Android 12+ — startChecks до получения BT-разрешений
  • State.STOP не используется