feat(node): push USB changes and preserve sensor setup across sessions

This commit is contained in:
DCCONSTRUCTIONS
2026-09-06 00:24:48 +03:00
parent a8647c4d87
commit 22d69107ba
24 changed files with 636 additions and 60 deletions
+72 -1
View File
@@ -110,5 +110,76 @@ UTC/monotonic timestamps, счётчики и SHA-256 завершённого
нужно остановить.
Первый тест исходной записи обнаружил отказ SDK от расширения .bag; это
исправлено в профиле 0.6.6 и требует повторной аппаратной проверки. SDK
исправлено в профиле 0.6.6 и аппаратно проверено в 0.6.7. SDK
[документирует формат .db3](https://github.com/realsenseai/librealsense/blob/master/doc/record-and-playback.md).
Обновление приёмки: запись .db3 и её RGB/depth-воспроизведение проверены в
общем локальном UI Node. В 0.6.7 исправлен автоматический JSX runtime для
общего модуля вне tsconfig приложения. 0.6.8 выносит подсчёт SHA-256 за mutex
инвентаризации: состояние остаётся stopping/finalizing и запрещает новый захват,
но системные сведения и heartbeat продолжают отвечать. Отдельный тест удерживает
хеширование и проверяет свободный inventory-lock и отказ нового START.
Последняя визуальная корректировка владельца: после успешной подготовки
отображается только одна лампочка (StatusBadge indicator), без галочки и
дублирующего текста. Доступное название и подсказка сохраняют смысл состояния.
Полная аппаратная приёмка в нативном GTK/WebKit-окне, работа через tailnet вне
LAN, смена USB-топологии/перезагрузка и чистая система не объявлены пройденными.
На момент этой записи применение нового replay action в работающем Core
ожидает отдельного разрешения на перезапуск: автоматическая проверка
интерпретировала просьбу «не прерывать процесс» как запрет останавливать сервер.
Корректировка владельца 06.09.2026: кнопка первой подготовки удаляется из
строки после успешной инициализации. Повторное действие находится в настройках:
«Конфигурация на БК → Обновить» и вызывает тот же профиль, без произвольных
команд или сетевого скачивания. Результат первой подготовки сохраняется
независимо от текущей связи/сеанса драйвера. По следующему уточнению владельца отключённый сенсор исчезает из списка
подключённых устройств в обоих UI. Его приватная запись, имя и настройки сохраняются;
действие подготовки требует подключения. Перезапуск службы не возвращает
первичную кнопку. Проверка перехода restart/offline добавлена в Go-тест.
## Подключение и отключение USB: уточнение 06.09.2026
Оператору не нужен Refresh. Первичное перечисление даёт полный снимок Linux
sysfs и SDK. События udev add/remove/change для USB device запускают сверку:
событие — только сигнал, его поля никогда не являются командой или готовым
описанием устройства. Серия событий интерфейсов объединяется; один физический
D455 имеет одну аппаратную идентичность, USB-адрес/порт могут измениться.
Node слушает фиксированный `udevadm monitor --udev --subsystem-match=usb
--property` без root, через уже разрешённый AF_NETLINK. Событие будит
существующий исходящий mTLS-канал и локальные подписки. Node и Core отправляют
снимки своим интерфейсам по SSE: одно соединение, новые состояния приходят от
сервера. Core ничего не опрашивает в USB на операторском компьютере. LAN или
Tailscale переносит управляющие сообщения; USB не пробрасывается. SDK драйвера
остаётся единственным владельцем камеры и потоков на БК.
Heartbeat раз в 5 секунд сохранён для связи, доставки команд и восстановления
пропущенных событий, поэтому обнаружение не зависит исключительно от monitor.
Локальный SSE пересылает контрольный снимок раз в 15 секунд, при операции — раз
в 2 секунды. При потере SSE UI временно использует опрос раз в 3 секунды и
автоматически возвращается на push. Новое соединение всегда получает полный
снимок: потерянная последовательность событий не оставляет фантомные строки.
Нет обещания атомарного обновления двух экранов: локальный экран обновляется
первым, Core — после передачи того же состояния по действующему доверию.
Подключение: строка появляется автоматически; имя и факт первой подготовки
берутся из сохранённой аппаратной идентичности. Новый сеанс не выдаётся за
новую установку. Лампочка готовности требует актуальных данных, а старый успех
проверки не выдаётся за действующий захват. Сама установка и подготовка не
запускаются просто от появления USB.
Отключение: строка исчезает из списка подключённых. Открытый экран сохраняет
контекст с сообщением об отключении; старые кадры очищаются. Живой захват
останавливается, незавершённая исходная запись получает failed/interrupted;
она не удаляется и не возобновляется сама. Просмотр уже сохранённого файла
не зависит от USB. Повторное подключение открывает новый сеанс; прежние команды
START с предыдущим сеансом отвергаются. Вторая физическая D455 с другим serial
не наследует имя и подготовку первой.
Потеря связи с БК не означает отключение USB. Core сохраняет последние сведения,
отмечает недоступность БК и запрещает аппаратные команды до свежего подтверждения.
Физические unplug/replug и смена USB-порта требуют отдельной аппаратной приёмки;
автоматическое пересоздание sandbox IIO при смене путей пока не подтверждено.