Архитектура
Как связаны интерфейс, бэкенд на Rust, связь с устройством и плагины.
Приложение состоит из двух больших частей: интерфейса на Preact и бэкенда на Rust. Они обмениваются командами Tauri и событиями. Интерфейс отвечает за состояние профилей и отрисовку, бэкенд за работу с железом и процессами.
Интерфейс
src/store.tsзагружает и сохраняет состояние в локальное хранилище webview. Ключ состояния версионирован, миграции старых форматов выполняются при загрузке.src/data.tsсодержит каталог встроенных модулей и константы: 15 кнопок в сетке, три слота боковой полосы, до 10 страниц.src/deck/рисует кнопки в буфер, превращает его в команды OSD1 и ставит их в очередь.animator.tsотвечает за анимации,link.tsза связь с бэкендом.src/widgets/описывает виджеты и их отрисовку.src/plugins/исполняет плагины и реализует сторону приложения в протоколе SDK:runtime.tsсоздаёт для каждого плагина скрытый iframe сsandbox="allow-scripts", следит за ним сторожевым таймером и перезапускает после сбоя;harness.tsэто код внутри iframe, который запускает воркер плагина и связывает его с приложением черезMessagePort;host.tsпроверяет команды плагинов, ведёт контексты кнопок и отправляет события;gestures.tsсчитаетtap,longPressи удержание,visuals.tsхранит подписи и картинки, которые нарисовал плагин.
src/i18n/хранит тексты в тройках[ru, en, zh]. Отсутствующий перевод становится ошибкой типов.
Бэкенд
deck.rsоткрывает два HID-дескриптора к устройству. Один поток читает входные отчёты и отправляет событияdeck-key. Второй собирает команды в отчёты по 1024 байта. Супервизор переподключает устройство и отправляетdeck-status, чтобы интерфейс заново передал страницы.firmware.rsпереводит устройство в загрузчик, записывает образ и ждёт возврата устройства. Ход записи уходит в интерфейс событиемfirmware-progress.plugins/mod.rsустанавливает пакеты.opensdчерез крейтopensd-packageи ведёт список плагинов. Код плагинов в процессе бэкенда не исполняется.plugins/files.rsотдаёт файлы плагинов по схемеosd-plugin://со строгой политикой безопасности и мост/_opensd/inspector.jsдля страниц настроек.plugins/grants.rsхранит согласие пользователя на разрешения,broker.rsвыполняет операции брокеров: loopback, запуск приложений и буфер обмена.plugins/logs.rsпишет журналы плагинов,dev.rsпринимает сеансыopensd dev.stats.rsсобирает данные для виджетов нагрузки.
Команды Tauri
Основные команды, которые вызывает интерфейс:
Поток нажатия
- Устройство отправляет входной отчёт с битовой картой кнопок.
- Бэкенд превращает изменения в событие
deck-keyс номером кнопки и состоянием. - Интерфейс находит действие кнопки. Встроенное действие выполняется через
run_action. Действие плагина уходит в его воркер событиямиkeyDown,keyUpи жестами вродеtap. - Плагин отвечает подписью или картинкой. Интерфейс перерисовывает кнопку и отправляет обновлённый поток команд.
Устройство и отрисовка
Все кнопки и боковая полоса рисуются в растр, который потом передаётся в устройство. Страницы кэшируются в SDRAM деки, поэтому переключение страниц не требует полной перезаписи, если содержимое уже лежит в памяти устройства. Подробности протокола в разделе прошивки.