45 #include <px4_platform_common/px4_config.h> 46 #include <px4_platform_common/defines.h> 49 #define B250000 250000 54 static uint8_t
crc8_esc(uint8_t *p, uint8_t len);
60 px4_arch_gpiowrite(GPIO_S0, sel & 1);
61 px4_arch_gpiowrite(GPIO_S1, sel & 2);
62 px4_arch_gpiowrite(GPIO_S2, sel & 4);
69 uart_fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK);
70 int termios_state = -1;
73 PX4_ERR(
"failed to open uart device!");
79 struct termios uart_config;
80 tcgetattr(uart_fd, &uart_config);
83 uart_config.c_oflag &= ~ONLCR;
86 if (cfsetispeed(&uart_config, speed) < 0 || cfsetospeed(&uart_config, speed) < 0) {
87 PX4_ERR(
"failed to set baudrate for %s: %d\n", device, termios_state);
92 if ((termios_state = tcsetattr(uart_fd, TCSANOW, &uart_config)) < 0) {
93 PX4_ERR(
"tcsetattr failed for %s\n", device);
100 PX4_WARN(
"hardware flow disable failed");
108 int ret = close(uart_fd);
119 struct termios uart_config;
121 int ret = tcgetattr(uart_fd, &uart_config);
124 PX4_ERR(
"error getting uart configuration");
129 uart_config.c_cflag |= CRTSCTS;
132 uart_config.c_cflag &= ~CRTSCTS;
135 return tcsetattr(uart_fd, TCSANOW, &uart_config);
140 if (responder >= 0) {
145 int ret =
::write(uart_fd, &packet.
head, packet_len);
147 if (ret != packet_len) {
148 PX4_WARN(
"TX ERROR: ret: %d, errno: %d", ret, errno);
161 for (
int i = 0; i < len; i++) {
170 }
else if (len < 0) {
180 static uint8_t data_index = 0;
181 static uint8_t crc_data_cal;
184 int count = serial_buf->
dat_cnt;
186 for (
int i = 0; i < count; i++) {
222 if (data_index >= packetdata->
len) {
224 crc_data_cal =
crc8_esc((uint8_t *)(&packetdata->
len), packetdata->
len + 2);
235 serial_buf->
head = 0;
253 serial_buf->
head = 0;
267 for (uint8_t i = 0; i < len; i++) {
283 0x00, 0xE7, 0x29, 0xCE, 0x52, 0xB5, 0x7B, 0x9C, 0xA4, 0x43, 0x8D, 0x6A,
284 0xF6, 0x11, 0xDF, 0x38, 0xAF, 0x48, 0x86, 0x61, 0xFD, 0x1A, 0xD4, 0x33,
285 0x0B, 0xEC, 0x22, 0xC5, 0x59, 0xBE, 0x70, 0x97, 0xB9, 0x5E, 0x90, 0x77,
286 0xEB, 0x0C, 0xC2, 0x25, 0x1D, 0xFA, 0x34, 0xD3, 0x4F, 0xA8, 0x66, 0x81,
287 0x16, 0xF1, 0x3F, 0xD8, 0x44, 0xA3, 0x6D, 0x8A, 0xB2, 0x55, 0x9B, 0x7C,
288 0xE0, 0x07, 0xC9, 0x2E, 0x95, 0x72, 0xBC, 0x5B, 0xC7, 0x20, 0xEE, 0x09,
289 0x31, 0xD6, 0x18, 0xFF, 0x63, 0x84, 0x4A, 0xAD, 0x3A, 0xDD, 0x13, 0xF4,
290 0x68, 0x8F, 0x41, 0xA6, 0x9E, 0x79, 0xB7, 0x50, 0xCC, 0x2B, 0xE5, 0x02,
291 0x2C, 0xCB, 0x05, 0xE2, 0x7E, 0x99, 0x57, 0xB0, 0x88, 0x6F, 0xA1, 0x46,
292 0xDA, 0x3D, 0xF3, 0x14, 0x83, 0x64, 0xAA, 0x4D, 0xD1, 0x36, 0xF8, 0x1F,
293 0x27, 0xC0, 0x0E, 0xE9, 0x75, 0x92, 0x5C, 0xBB, 0xCD, 0x2A, 0xE4, 0x03,
294 0x9F, 0x78, 0xB6, 0x51, 0x69, 0x8E, 0x40, 0xA7, 0x3B, 0xDC, 0x12, 0xF5,
295 0x62, 0x85, 0x4B, 0xAC, 0x30, 0xD7, 0x19, 0xFE, 0xC6, 0x21, 0xEF, 0x08,
296 0x94, 0x73, 0xBD, 0x5A, 0x74, 0x93, 0x5D, 0xBA, 0x26, 0xC1, 0x0F, 0xE8,
297 0xD0, 0x37, 0xF9, 0x1E, 0x82, 0x65, 0xAB, 0x4C, 0xDB, 0x3C, 0xF2, 0x15,
298 0x89, 0x6E, 0xA0, 0x47, 0x7F, 0x98, 0x56, 0xB1, 0x2D, 0xCA, 0x04, 0xE3,
299 0x58, 0xBF, 0x71, 0x96, 0x0A, 0xED, 0x23, 0xC4, 0xFC, 0x1B, 0xD5, 0x32,
300 0xAE, 0x49, 0x87, 0x60, 0xF7, 0x10, 0xDE, 0x39, 0xA5, 0x42, 0x8C, 0x6B,
301 0x53, 0xB4, 0x7A, 0x9D, 0x01, 0xE6, 0x28, 0xCF, 0xE1, 0x06, 0xC8, 0x2F,
302 0xB3, 0x54, 0x9A, 0x7D, 0x45, 0xA2, 0x6C, 0x8B, 0x17, 0xF0, 0x3E, 0xD9,
303 0x4E, 0xA9, 0x67, 0x80, 0x1C, 0xFB, 0x35, 0xD2, 0xEA, 0x0D, 0xC3, 0x24,
304 0xB8, 0x5F, 0x91, 0x76
int send_packet(int uart_fd, EscPacket &packet, int responder)
Sends a packet to all ESCs and requests a specific ESC to respond.
int read_data_from_uart(int uart_fd, ESC_UART_BUF *const uart_buf)
Read data from the UART into a buffer.
A set of useful macros for enhanced runtime and compile time error detection and warning suppression...
int deinitialise_uart(int &uart_fd)
Closes a device previously opened with initialise_uart().
Namespace encapsulating all device framework classes, functions and data.
int enable_flow_control(int uart_fd, bool enabled)
Enables/disables flow control for open UART device.
static void read(bootloader_app_shared_t *pshared)
static uint8_t crc_packet(EscPacket &p)
const uint8_t crc_table[256]
Lookup-table for faster CRC computation when sending ESC packets.
int parse_tap_esc_feedback(ESC_UART_BUF *const serial_buf, EscPacket *const packetdata)
Parse feedback from an ESC.
static uint8_t crc8_esc(uint8_t *p, uint8_t len)
uint8_t esc_feedback_buf[UART_BUFFER_SIZE]
static void write(bootloader_app_shared_t *pshared)
void select_responder(uint8_t sel)
Select tap esc responder data for serial interface by 74hct151.
int initialise_uart(const char *const device, int &uart_fd)
Opens a device for use as UART.