Подготовка к ролям 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>
26 lines
1.3 KiB
C
26 lines
1.3 KiB
C
// Общий SBUS-слой: упаковка кадра и вывод инвертированного SBUS на провод
|
|
// (USART1 TX = PA9, 100000 бод, 8E2, TXINV). Единственный владелец всего, что
|
|
// идёт на драйвер колёс — используется и TX (локальный провод), и RX.
|
|
// См. docs/protocol.md.
|
|
#pragma once
|
|
#include <stdint.h>
|
|
|
|
static const uint16_t SBUS_MID = 1024; // нейтраль всех каналов
|
|
|
|
// Флаги в байте 23 SBUS-кадра (см. docs/protocol.md).
|
|
static const uint8_t SBUS_FLAG_FRAME_LOST = 0x04; // bit2
|
|
static const uint8_t SBUS_FLAG_FAILSAFE = 0x08; // bit3
|
|
|
|
// Заполнить ch[16] нейтралью (все каналы 1024).
|
|
void sbusNeutral(uint16_t ch[16]);
|
|
|
|
// Упаковать 16 каналов (0..2047) в стандартный 25-байтовый SBUS-кадр.
|
|
// flags идёт в байт 23 (bit2=frame_lost, bit3=failsafe).
|
|
void sbusPack(uint8_t out[25], const uint16_t ch[16], uint8_t flags = 0);
|
|
|
|
// Инициализация USART1 для вывода инвертированного SBUS.
|
|
void sbusUartInit();
|
|
|
|
// Передать готовый 25-байтовый кадр на провод (блокирующе, таймаут 20 мс).
|
|
void sbusSendFrame(const uint8_t frame[25]);
|