79 lines
6.0 KiB
Markdown
79 lines
6.0 KiB
Markdown
# Общие тренды для Android GUI и SETGUI
|
||
|
||
Модуль задаёт совместимые настройки и числовые источники графиков. Он не
|
||
рисует экран, не открывает файлы или порты и не управляет прошивкой устройства.
|
||
|
||
Слои: GUI → Kotlin/Python adapter → `set_trends.c` → уже разобранные кадры.
|
||
Транспорт, таймер опроса, выбор файла, хранение настроек и Canvas/Qt остаются
|
||
в приложении. У ядра нет callbacks, динамической памяти или глобального состояния.
|
||
|
||
| Файл | Назначение и зависимости |
|
||
|---|---|
|
||
| `include/set_trends.h`, `src/set_trends.c` | C99: фильтрация GAS/raw CAN, signed/unsigned word, payload подписки SET GUI; использует `pcan_id` и ABI export macro |
|
||
| `ports/android/kotlin/ru/setcorp/setprotocol/trends/` | Модель, валидация JSON, ограниченная история, GAS_WATCH; JVM + org.json, без Android/Compose |
|
||
| `ports/android/setprotocol_jni.c` | Только преобразование JNI-аргументов |
|
||
| `python/protocan/trends.py` | Модель, JSON, история и `NativeTrends`; Python 3.9+, stdlib, без Qt |
|
||
| `tests/fixtures/trends-v1.json` | Один образец для тестов обоих GUI и обмена настройками |
|
||
|
||
## Формат файла
|
||
|
||
UTF-8 JSON: `format = "setflash-trends"`, `version = 1`, `profiles` — словарь.
|
||
Ключи профилей стабильны: `TMS2812`, `SET_V1`, `CAN_BRIDGE`, `GS_USB_CAN`,
|
||
`SLCAN`, `CANGAROO_SLCAN`, `BALZAM_CAN`. Приложение явно сопоставляет своё
|
||
подключение с этим ключом; импорт не меняет подключение.
|
||
|
||
Поля сигнала обязательны: `id`, `order`, `name`, `source`, `address`, `color`,
|
||
`visible`, `valueType`, `deviceType`, `device`, `byteOffset`, `extended`.
|
||
`id` уникален во всём файле. `order` — 1…9999, уникален внутри профиля.
|
||
`name` — непустое изменяемое имя (до 100 символов), `color` — `#RRGGBB`.
|
||
`visible` управляет только отрисовкой, не сбором. История и соединение в файл
|
||
не входят. Максимум 64 сигнала на профиль и 1 МиБ на файл. Неизвестные версии,
|
||
профили, источники и неверные значения отклоняются до замены настроек.
|
||
|
||
| Профиль / источник | Адрес и значение |
|
||
|---|---|
|
||
| TMS2812 / TMS_MEMORY | 32-битный адрес слова, CMD_PEEK; контроллер из подключения |
|
||
| SET_V1 / SET_GAS | 16-битный GAS; GAS_WATCH_SET `0x12`, DATA `0x13` |
|
||
| SET_V1 / SET_SENSOR | ROM DS18B20, 16 HEX-цифр (дефисы допустимы), °C |
|
||
| Современные CAN / CAN_GAS | GAS 0…65535, DeviceType 0…7, DeviceID 0…15 |
|
||
| Все CAN / CAN_RAW | CAN ID, STD/EXT, byteOffset 0…6; слово Little-endian |
|
||
|
||
Числовые адреса — десятичные либо HEX с `0x`. Регистры трактуются как
|
||
`UINT16` или `INT16`. Для RAW/CAN_GAS C-функция возвращает значение либо
|
||
`SET_TREND_NO_VALUE`, никогда не подставляет ноль вместо отсутствующего кадра.
|
||
|
||
CAN — пассивный приём, без записи GAS и автоматической отправки запросов.
|
||
GAS принимает только входящие FROM_DEVICE; TX/RTR/ошибки исключены.
|
||
SET GUI оформляет подписку в порядке адресов. ACK должен подтвердить весь
|
||
список: при частичном принятии нельзя определить пропущенные адреса, поэтому
|
||
строить график по смещённым индексам запрещено. При паузе порт приложения
|
||
отправляет подписку с периодом 0, когда транспорт доступен и не занят прошивкой.
|
||
|
||
## Быстрый старт SETGUI
|
||
|
||
```python
|
||
from protocan.native import NativeProtocol
|
||
from protocan.trends import TrendSignal, NativeTrends, encode_settings
|
||
|
||
core = NativeProtocol() # библиотека, пересобранная с set_trends.c
|
||
decoder = NativeTrends(core.lib)
|
||
signal = TrendSignal("current", source="CAN_GAS", address="0x1235")
|
||
text = encode_settings({"CAN_BRIDGE": [signal]})
|
||
value = decoder.can_value(signal, 0x1FD31234, 1, bytes([1, 0, 254, 255]))
|
||
assert value == 65534.0
|
||
# GUI сохраняет text выбранным способом и передаёт value своему графику.
|
||
```
|
||
|
||
Android подключает Kotlin-каталог напрямую через Gradle и C-файлы через NDK.
|
||
Приложение SETGUI может импортировать модуль через уже используемый путь
|
||
`third_party/templates/python`; в этом изменении его экран не изменяется.
|
||
После публикации новой ревизии templates оба проекта должны обновить сабмодуль
|
||
и пересобрать собственные native-библиотеки — вручную копировать реализации не нужно.
|
||
|
||
## Проверки
|
||
|
||
- CMake/CTest: `shared_trends`, плюс существующие protocol/ABI тесты.
|
||
- JVM: `TrendSettingsJsonTest`, `GuiGasWatchTest`; один JSON fixture с Python.
|
||
- Python: `PYTHONPATH=python python -m unittest discover -s python/tests`.
|
||
Для проверки настоящего C-декодера задайте `SETPROTOCOL_LIBRARY` путём DLL/SO.
|