Переносит управление с STM-передатчика на STM-приёмник через локальную
сеть/интернет двумя экземплярами одной программы.
- tools/link_proto.py: зеркало link_protocol.h на Python (кадрирование,
CRC16-CCITT, (де)сериализация CONTROL/IDENT, инкрементальный парсер с
ресинхронизацией) + --selftest с тест-векторами.
- tools/bridge.py: роль tx (USB->UDP) и rx (UDP->USB) из одного флага;
поиск порта по product string и handshake HELLO/IDENT; UDP с seq и
anti-replay (распознавание новой сессии при рестарте источника);
сетевой failsafe при тишине; опциональная HMAC-аутентификация пакетов
и фильтр источника.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Прошивка получает две роли, выбираемые compile-time env; общий код
собирается в оба env, специфичный — через build_src_filter, без мёртвого
кода неактивной роли. Роль публикуется в USB product string
(CART-TX/CART-RX), по которой ПК находит нужный порт.
- app_tx.cpp: как раньше формирует SBUS на локальный провод и
дополнительно шлёт те же ch[16] по USB кадром CONTROL; отвечает на
HELLO кадром IDENT. Старый проводной функционал не изменён.
- app_rx.cpp: принимает CONTROL по USB и гонит SBUS на провод строго
каждые 50 мс из последнего состояния. FAILSAFE: нет свежего CONTROL
дольше 150 мс -> нейтраль с флагом failsafe (срабатывает и при обрыве
USB/зависании ПК); сетевой флаг failsafe транслируется в бит SBUS.
- platformio.ini: env cart_tx/cart_rx, макросы роли и USB_PRODUCT_STRING.
- удалён монолитный main.cpp (логика разнесена по модулям).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Единый слой связи пульт<->ПК<->тележка, одинаковый на обеих ролях и
зеркалимый на Python.
- link_protocol.h: единственный источник истины — кадрирование
(SYNC/VER/TYPE/LEN/PAYLOAD/CRC16-CCITT), типы CONTROL/IDENT/HELLO/LOG,
layout полезных нагрузок, роли, тайминги failsafe.
- usb_link.{h,cpp}: CRC16, сериализация CONTROL/IDENT, отправка кадров и
стейт-машина приёма с ресинхронизацией по синхрослову и проверкой CRC.
- device_id.h: чтение 96-битного UID чипа для IDENT.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Подготовка к ролям TX/RX: выделяю из монолитного main.cpp
переиспользуемые части без изменения поведения.
- sbus.{h,cpp}: упаковка 25-байтового SBUS-кадра, инициализация и
вывод инвертированного SBUS на USART1 (PA9) — единственный владелец
провода к драйверу, общий для будущих ролей.
- stick.{h,cpp}: калибровка стика, нормализация осей и профиль
газа/поворота, формирование ch[16]. Неиспользованные в прежнем loop
expo()/toSbus() и мёртвые константы не переносятся.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>