6.0 KiB
Общие тренды для 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
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.