# Морда 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` не используется