|
|
|
@ -113,96 +113,111 @@ ssize_t Transport_node::read(uint8_t *topic_ID, char out_buffer[], size_t buffer
@@ -113,96 +113,111 @@ ssize_t Transport_node::read(uint8_t *topic_ID, char out_buffer[], size_t buffer
|
|
|
|
|
|
|
|
|
|
*topic_ID = 255; |
|
|
|
|
|
|
|
|
|
ssize_t len = 0; |
|
|
|
|
ssize_t len = node_read((void *)(rx_buffer + rx_buff_pos), sizeof(rx_buffer) - rx_buff_pos); |
|
|
|
|
|
|
|
|
|
while (0 < (len = node_read((void *)(rx_buffer + rx_buff_pos), sizeof(rx_buffer) - rx_buff_pos))) { |
|
|
|
|
rx_buff_pos += len; |
|
|
|
|
if (len <= 0) { |
|
|
|
|
int errsv = errno; |
|
|
|
|
|
|
|
|
|
// We read some
|
|
|
|
|
size_t header_size = sizeof(struct Header); |
|
|
|
|
|
|
|
|
|
// but not enough
|
|
|
|
|
if (rx_buff_pos < header_size) { |
|
|
|
|
return 0; |
|
|
|
|
if (errsv && EAGAIN != errsv && ETIMEDOUT != errsv) { |
|
|
|
|
#ifndef PX4_DEBUG |
|
|
|
|
if (debug) printf("\033[0;31m[ micrortps_transport ]\tRead fail %d\033[0m\n", errsv); |
|
|
|
|
#else |
|
|
|
|
if (debug) PX4_DEBUG("Read fail %d", errsv); |
|
|
|
|
#endif /* PX4_DEBUG */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint32_t msg_start_pos = 0; |
|
|
|
|
return len; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rx_buff_pos += len; |
|
|
|
|
|
|
|
|
|
// We read some
|
|
|
|
|
size_t header_size = sizeof(struct Header); |
|
|
|
|
|
|
|
|
|
// but not enough
|
|
|
|
|
if (rx_buff_pos < header_size) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint32_t msg_start_pos = 0; |
|
|
|
|
|
|
|
|
|
for (msg_start_pos = 0; msg_start_pos <= rx_buff_pos - header_size; ++msg_start_pos) { |
|
|
|
|
if ('>' == rx_buffer[msg_start_pos] && memcmp(rx_buffer + msg_start_pos, ">>>", 3) == 0) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
for (msg_start_pos = 0; msg_start_pos <= rx_buff_pos - header_size; ++msg_start_pos) { |
|
|
|
|
if ('>' == rx_buffer[msg_start_pos] && memcmp(rx_buffer + msg_start_pos, ">>>", 3) == 0) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start not found
|
|
|
|
|
if (msg_start_pos > (rx_buff_pos - header_size)) { |
|
|
|
|
// Start not found
|
|
|
|
|
if (msg_start_pos > (rx_buff_pos - header_size)) { |
|
|
|
|
#ifndef PX4_DEBUG |
|
|
|
|
if (debug) printf("\033[1;33m[ micrortps_transport ]\t (↓↓ %u)\033[0m\n", msg_start_pos); |
|
|
|
|
if (debug) printf("\033[1;33m[ micrortps_transport ]\t (↓↓ %u)\033[0m\n", msg_start_pos); |
|
|
|
|
#else |
|
|
|
|
if (debug) PX4_DEBUG(" (↓↓ %u)", msg_start_pos); |
|
|
|
|
if (debug) PX4_DEBUG(" (↓↓ %u)", msg_start_pos); |
|
|
|
|
#endif /* PX4_DEBUG */ |
|
|
|
|
|
|
|
|
|
// All we've checked so far is garbage, drop it - but save unchecked bytes
|
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos, rx_buff_pos - msg_start_pos); |
|
|
|
|
rx_buff_pos = rx_buff_pos - msg_start_pos; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
// All we've checked so far is garbage, drop it - but save unchecked bytes
|
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos, rx_buff_pos - msg_start_pos); |
|
|
|
|
rx_buff_pos = rx_buff_pos - msg_start_pos; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// [>,>,>,topic_ID,seq,payload_length_H,payload_length_L,CRCHigh,CRCLow,payloadStart, ... ,payloadEnd]
|
|
|
|
|
struct Header *header = (struct Header *)&rx_buffer[msg_start_pos]; |
|
|
|
|
uint32_t payload_len = ((uint32_t)header->payload_len_h << 8) | header->payload_len_l; |
|
|
|
|
|
|
|
|
|
// The message won't fit the buffer.
|
|
|
|
|
if (buffer_len < header_size + payload_len) { |
|
|
|
|
// drop the message and continue the readings
|
|
|
|
|
// @note: this is just a work around to avoid the link to be closed
|
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos + 1, rx_buff_pos - (msg_start_pos + 1)); |
|
|
|
|
rx_buff_pos = rx_buff_pos - (msg_start_pos + 1); |
|
|
|
|
return -EMSGSIZE; |
|
|
|
|
} |
|
|
|
|
// [>,>,>,topic_ID,seq,payload_length_H,payload_length_L,CRCHigh,CRCLow,payloadStart, ... ,payloadEnd]
|
|
|
|
|
struct Header *header = (struct Header *)&rx_buffer[msg_start_pos]; |
|
|
|
|
uint32_t payload_len = ((uint32_t)header->payload_len_h << 8) | header->payload_len_l; |
|
|
|
|
|
|
|
|
|
// We do not have a complete message yet
|
|
|
|
|
if (msg_start_pos + header_size + payload_len > rx_buff_pos) { |
|
|
|
|
// If there's garbage at the beginning, drop it
|
|
|
|
|
if (msg_start_pos > 0) { |
|
|
|
|
// The message won't fit the buffer.
|
|
|
|
|
if (buffer_len < header_size + payload_len) { |
|
|
|
|
// Drop the message and continue with the read buffer
|
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos + 1, rx_buff_pos - (msg_start_pos + 1)); |
|
|
|
|
rx_buff_pos = rx_buff_pos - (msg_start_pos + 1); |
|
|
|
|
return -EMSGSIZE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// We do not have a complete message yet
|
|
|
|
|
if (msg_start_pos + header_size + payload_len > rx_buff_pos) { |
|
|
|
|
// If there's garbage at the beginning, drop it
|
|
|
|
|
if (msg_start_pos > 0) { |
|
|
|
|
#ifndef PX4_DEBUG |
|
|
|
|
if (debug) printf("\033[1;33m[ micrortps_transport ]\t (↓ %u)\033[0m\n", msg_start_pos); |
|
|
|
|
if (debug) printf("\033[1;33m[ micrortps_transport ]\t (↓ %u)\033[0m\n", msg_start_pos); |
|
|
|
|
#else |
|
|
|
|
if (debug) PX4_DEBUG(" (↓ %u)", msg_start_pos); |
|
|
|
|
if (debug) PX4_DEBUG(" (↓ %u)", msg_start_pos); |
|
|
|
|
#endif /* PX4_DEBUG */ |
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos, rx_buff_pos - msg_start_pos); |
|
|
|
|
rx_buff_pos -= msg_start_pos; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos, rx_buff_pos - msg_start_pos); |
|
|
|
|
rx_buff_pos -= msg_start_pos; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint16_t read_crc = ((uint16_t)header->crc_h << 8) | header->crc_l; |
|
|
|
|
uint16_t calc_crc = crc16((uint8_t *)rx_buffer + msg_start_pos + header_size, payload_len); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint16_t read_crc = ((uint16_t)header->crc_h << 8) | header->crc_l; |
|
|
|
|
uint16_t calc_crc = crc16((uint8_t *)rx_buffer + msg_start_pos + header_size, payload_len); |
|
|
|
|
|
|
|
|
|
if (read_crc != calc_crc) { |
|
|
|
|
if (read_crc != calc_crc) { |
|
|
|
|
#ifndef PX4_DEBUG |
|
|
|
|
if (debug) printf("\033[0;31m[ micrortps_transport ]\tBad CRC %u != %u\t\t(↓ %lu)\033[0m\n", read_crc, calc_crc, (unsigned long)(header_size + payload_len)); |
|
|
|
|
if (debug) printf("\033[0;31m[ micrortps_transport ]\tBad CRC %u != %u\t\t(↓ %lu)\033[0m\n", read_crc, calc_crc, (unsigned long)(header_size + payload_len)); |
|
|
|
|
#else |
|
|
|
|
if (debug) PX4_DEBUG("Bad CRC %u != %u\t\t(↓ %lu)", read_crc, calc_crc, (unsigned long)(header_size + payload_len)); |
|
|
|
|
if (debug) PX4_DEBUG("Bad CRC %u != %u\t\t(↓ %lu)", read_crc, calc_crc, (unsigned long)(header_size + payload_len)); |
|
|
|
|
#endif /* PX4_DEBUG */ |
|
|
|
|
len = -1; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
// copy message to outbuffer and set other return values
|
|
|
|
|
memmove(out_buffer, rx_buffer + msg_start_pos + header_size, payload_len); |
|
|
|
|
*topic_ID = header->topic_ID; |
|
|
|
|
len = payload_len + header_size; |
|
|
|
|
} |
|
|
|
|
// If there is a CRC error, the payload len cannot be trusted
|
|
|
|
|
rx_buff_pos -= (msg_start_pos + 1); |
|
|
|
|
|
|
|
|
|
// discard message from rx_buffer
|
|
|
|
|
rx_buff_pos -= header_size + payload_len; |
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos + header_size + payload_len, rx_buff_pos); |
|
|
|
|
// Drop garbage up just beyond the start of the message
|
|
|
|
|
memmove(rx_buffer, rx_buffer + (msg_start_pos + 1 ), rx_buff_pos ); |
|
|
|
|
len = -1; |
|
|
|
|
|
|
|
|
|
return len; |
|
|
|
|
} else { |
|
|
|
|
// copy message to outbuffer and set other return values
|
|
|
|
|
memmove(out_buffer, rx_buffer + msg_start_pos + header_size, payload_len); |
|
|
|
|
*topic_ID = header->topic_ID; |
|
|
|
|
len = payload_len + header_size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
// discard message from rx_buffer
|
|
|
|
|
rx_buff_pos -= msg_start_pos + header_size + payload_len; |
|
|
|
|
memmove(rx_buffer, rx_buffer + msg_start_pos + header_size + payload_len, rx_buff_pos); |
|
|
|
|
|
|
|
|
|
return len; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t Transport_node::get_header_length() |
|
|
|
@ -321,7 +336,7 @@ int UART_node::init()
@@ -321,7 +336,7 @@ int UART_node::init()
|
|
|
|
|
|
|
|
|
|
if (!baudrate_to_speed(baudrate, &speed)) { |
|
|
|
|
#ifndef PX4_ERR |
|
|
|
|
printf("\033[0;31mUART transport: ERR SET BAUD %s: Unsupported baudrate: %d\n\tsupported examples:\n\t9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 921600, 1000000\033[0m\n", |
|
|
|
|
printf("\033[0;31m[ micrortps_transport ]\tUART transport: ERR SET BAUD %s: Unsupported baudrate: %d\n\tsupported examples:\n\t9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 921600, 1000000\033[0m\n", |
|
|
|
|
uart_name, baudrate); |
|
|
|
|
#else |
|
|
|
|
PX4_ERR("UART transport: ERR SET BAUD %s: Unsupported baudrate: %d\n\tsupported examples:\n\t9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 921600, 1000000\n", |
|
|
|
@ -451,63 +466,80 @@ bool UART_node::baudrate_to_speed(uint32_t bauds, speed_t *speed)
@@ -451,63 +466,80 @@ bool UART_node::baudrate_to_speed(uint32_t bauds, speed_t *speed)
|
|
|
|
|
|
|
|
|
|
#ifndef B1000000 |
|
|
|
|
#define B1000000 1000000 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifndef B1500000 |
|
|
|
|
#define B1500000 1500000 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifndef B2000000 |
|
|
|
|
#define B2000000 2000000 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
switch (bauds) { |
|
|
|
|
case 0: *speed = B0; break; |
|
|
|
|
case 0: *speed = B0; break; |
|
|
|
|
|
|
|
|
|
case 50: *speed = B50; break; |
|
|
|
|
case 50: *speed = B50; break; |
|
|
|
|
|
|
|
|
|
case 75: *speed = B75; break; |
|
|
|
|
case 75: *speed = B75; break; |
|
|
|
|
|
|
|
|
|
case 110: *speed = B110; break; |
|
|
|
|
case 110: *speed = B110; break; |
|
|
|
|
|
|
|
|
|
case 134: *speed = B134; break; |
|
|
|
|
case 134: *speed = B134; break; |
|
|
|
|
|
|
|
|
|
case 150: *speed = B150; break; |
|
|
|
|
case 150: *speed = B150; break; |
|
|
|
|
|
|
|
|
|
case 200: *speed = B200; break; |
|
|
|
|
case 200: *speed = B200; break; |
|
|
|
|
|
|
|
|
|
case 300: *speed = B300; break; |
|
|
|
|
case 300: *speed = B300; break; |
|
|
|
|
|
|
|
|
|
case 600: *speed = B600; break; |
|
|
|
|
case 600: *speed = B600; break; |
|
|
|
|
|
|
|
|
|
case 1200: *speed = B1200; break; |
|
|
|
|
case 1200: *speed = B1200; break; |
|
|
|
|
|
|
|
|
|
case 1800: *speed = B1800; break; |
|
|
|
|
case 1800: *speed = B1800; break; |
|
|
|
|
|
|
|
|
|
case 2400: *speed = B2400; break; |
|
|
|
|
case 2400: *speed = B2400; break; |
|
|
|
|
|
|
|
|
|
case 4800: *speed = B4800; break; |
|
|
|
|
case 4800: *speed = B4800; break; |
|
|
|
|
|
|
|
|
|
case 9600: *speed = B9600; break; |
|
|
|
|
case 9600: *speed = B9600; break; |
|
|
|
|
|
|
|
|
|
case 19200: *speed = B19200; break; |
|
|
|
|
case 19200: *speed = B19200; break; |
|
|
|
|
|
|
|
|
|
case 38400: *speed = B38400; break; |
|
|
|
|
case 38400: *speed = B38400; break; |
|
|
|
|
|
|
|
|
|
case 57600: *speed = B57600; break; |
|
|
|
|
case 57600: *speed = B57600; break; |
|
|
|
|
|
|
|
|
|
case 115200: *speed = B115200; break; |
|
|
|
|
case 115200: *speed = B115200; break; |
|
|
|
|
|
|
|
|
|
case 230400: *speed = B230400; break; |
|
|
|
|
case 230400: *speed = B230400; break; |
|
|
|
|
|
|
|
|
|
case 460800: *speed = B460800; break; |
|
|
|
|
case 460800: *speed = B460800; break; |
|
|
|
|
|
|
|
|
|
case 500000: *speed = B500000; break; |
|
|
|
|
case 500000: *speed = B500000; break; |
|
|
|
|
|
|
|
|
|
case 921600: *speed = B921600; break; |
|
|
|
|
case 921600: *speed = B921600; break; |
|
|
|
|
|
|
|
|
|
case 1000000: *speed = B1000000; break; |
|
|
|
|
case 1000000: *speed = B1000000; break; |
|
|
|
|
|
|
|
|
|
#ifdef B1500000 |
|
|
|
|
case 1500000: *speed = B1500000; break; |
|
|
|
|
|
|
|
|
|
case 1500000: *speed = B1500000; break; |
|
|
|
|
#endif |
|
|
|
|
case 2000000: *speed = B2000000; break; |
|
|
|
|
|
|
|
|
|
#ifdef B3000000 |
|
|
|
|
|
|
|
|
|
case 3000000: *speed = B3000000; break; |
|
|
|
|
case 3000000: *speed = B3000000; break; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef B3500000 |
|
|
|
|
|
|
|
|
|
case 3500000: *speed = B3500000; break; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef B4000000 |
|
|
|
|
|
|
|
|
|
case 4000000: *speed = B4000000; break; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|