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