// Роль TX: к STM подключён пульт. Как и раньше, формирует SBUS на локальный // провод (старый функционал не изменён), и ДОПОЛНИТЕЛЬНО шлёт те же значения // каналов по USB на ПК кадром CONTROL. Отвечает на HELLO кадром IDENT. #ifdef CART_ROLE_TX #include #include "sbus.h" #include "stick.h" #include "usb_link.h" #include "device_id.h" static void replyIdent() { LinkIdent id; id.role = ROLE_TX; id.proto_ver = LINK_VERSION; id.fw_ver = CART_FW_VERSION; cartReadUid(id.uid); usbSendIdent(&id); } void setup() { usbLinkInit(); stickInit(); sbusUartInit(); } void loop() { // обслуживаем входящие кадры (ждём только HELLO от ПК) LinkRxEvent ev; do { usbLinkPoll(&ev); if (ev.type == LINK_HELLO) replyIdent(); } while (ev.type != 0); static uint32_t next = 0; static uint32_t seq = 0; uint32_t now = millis(); if (now < next) return; next = now + FRAME_PERIOD_MS; uint16_t ch[16]; float fwd, right; stickComputeChannels(ch, &fwd, &right); // 1) локальный провод к драйверу — как раньше uint8_t frame[25]; sbusPack(frame, ch); sbusSendFrame(frame); // 2) те же каналы по USB на ПК LinkControl c; c.seq = seq++; c.t_ms = now; c.flags = 0; memcpy(c.ch, ch, sizeof(c.ch)); usbSendControl(&c); } #endif // CART_ROLE_TX