1 #ifndef _MAVLINK_HELPERS_H_
2 #define _MAVLINK_HELPERS_H_
6 #include "mavlink_types.h"
10 #define MAVLINK_HELPER
16 #ifndef MAVLINK_GET_CHANNEL_STATUS
19 #ifdef MAVLINK_EXTERNAL_RX_STATUS
25 return &m_mavlink_status[chan];
32 #ifndef MAVLINK_GET_CHANNEL_BUFFER
33 MAVLINK_HELPER mavlink_message_t* mavlink_get_channel_buffer(uint8_t chan)
36 #ifdef MAVLINK_EXTERNAL_RX_BUFFER
40 static mavlink_message_t m_mavlink_buffer[MAVLINK_COMM_NUM_BUFFERS];
42 return &m_mavlink_buffer[chan];
49 MAVLINK_HELPER
void mavlink_reset_channel_status(uint8_t chan)
68 MAVLINK_HELPER uint16_t mavlink_finalize_message_chan(mavlink_message_t* msg, uint8_t system_id, uint8_t component_id,
69 uint8_t chan, uint8_t length, uint8_t crc_extra)
71 MAVLINK_HELPER uint16_t mavlink_finalize_message_chan(mavlink_message_t* msg, uint8_t system_id, uint8_t component_id,
72 uint8_t chan, uint8_t length)
76 msg->magic = MAVLINK_STX;
78 msg->sysid = system_id;
79 msg->compid = component_id;
83 msg->checksum = crc_calculate(((
const uint8_t*)(msg)) + 3, MAVLINK_CORE_HEADER_LEN);
84 crc_accumulate_buffer(&msg->checksum, _MAV_PAYLOAD(msg), msg->len);
86 crc_accumulate(crc_extra, &msg->checksum);
88 mavlink_ck_a(msg) = (uint8_t)(msg->checksum & 0xFF);
89 mavlink_ck_b(msg) = (uint8_t)(msg->checksum >> 8);
91 return length + MAVLINK_NUM_NON_PAYLOAD_BYTES;
99 MAVLINK_HELPER uint16_t mavlink_finalize_message(mavlink_message_t* msg, uint8_t system_id, uint8_t component_id,
100 uint8_t length, uint8_t crc_extra)
102 return mavlink_finalize_message_chan(msg, system_id, component_id, MAVLINK_COMM_0, length, crc_extra);
105 MAVLINK_HELPER uint16_t mavlink_finalize_message(mavlink_message_t* msg, uint8_t system_id, uint8_t component_id,
108 return mavlink_finalize_message_chan(msg, system_id, component_id, MAVLINK_COMM_0, length);
112 #ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
113 MAVLINK_HELPER
void _mavlink_send_uart(mavlink_channel_t chan,
const char *buf, uint16_t len);
118 #if MAVLINK_CRC_EXTRA
119 MAVLINK_HELPER
void _mav_finalize_message_chan_send(mavlink_channel_t chan, uint8_t msgid,
const char *packet,
120 uint8_t length, uint8_t crc_extra)
122 MAVLINK_HELPER
void _mav_finalize_message_chan_send(mavlink_channel_t chan, uint8_t msgid,
const char *packet, uint8_t length)
126 uint8_t buf[MAVLINK_NUM_HEADER_BYTES];
129 buf[0] = MAVLINK_STX;
132 buf[3] = mavlink_system.sysid;
133 buf[4] = mavlink_system.compid;
136 checksum = crc_calculate((
const uint8_t*)&buf[1], MAVLINK_CORE_HEADER_LEN);
137 crc_accumulate_buffer(&checksum, packet, length);
138 #if MAVLINK_CRC_EXTRA
139 crc_accumulate(crc_extra, &checksum);
141 ck[0] = (uint8_t)(checksum & 0xFF);
142 ck[1] = (uint8_t)(checksum >> 8);
144 MAVLINK_START_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES + (uint16_t)length);
145 _mavlink_send_uart(chan, (
const char *)buf, MAVLINK_NUM_HEADER_BYTES);
146 _mavlink_send_uart(chan, packet, length);
147 _mavlink_send_uart(chan, (
const char *)ck, 2);
148 MAVLINK_END_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES + (uint16_t)length);
155 MAVLINK_HELPER
void _mavlink_resend_uart(mavlink_channel_t chan,
const mavlink_message_t *msg)
159 ck[0] = (uint8_t)(msg->checksum & 0xFF);
160 ck[1] = (uint8_t)(msg->checksum >> 8);
163 MAVLINK_START_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES + msg->len);
164 _mavlink_send_uart(chan, (
const char *)&msg->magic, MAVLINK_NUM_HEADER_BYTES);
165 _mavlink_send_uart(chan, _MAV_PAYLOAD(msg), msg->len);
166 _mavlink_send_uart(chan, (
const char *)ck, 2);
167 MAVLINK_END_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES + msg->len);
169 #endif // MAVLINK_USE_CONVENIENCE_FUNCTIONS
174 MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t *buffer,
const mavlink_message_t *msg)
176 memcpy(buffer, (
const uint8_t *)&msg->magic, MAVLINK_NUM_HEADER_BYTES + (uint16_t)msg->len);
178 uint8_t *ck = buffer + (MAVLINK_NUM_HEADER_BYTES + (uint16_t)msg->len);
180 ck[0] = (uint8_t)(msg->checksum & 0xFF);
181 ck[1] = (uint8_t)(msg->checksum >> 8);
183 return MAVLINK_NUM_NON_PAYLOAD_BYTES + (uint16_t)msg->len;
196 MAVLINK_HELPER
void mavlink_start_checksum(mavlink_message_t* msg)
198 crc_init(&msg->checksum);
201 MAVLINK_HELPER
void mavlink_update_checksum(mavlink_message_t* msg, uint8_t c)
203 crc_accumulate(c, &msg->checksum);
247 MAVLINK_HELPER uint8_t mavlink_parse_char(uint8_t chan, uint8_t c, mavlink_message_t* r_message,
mavlink_status_t* r_mavlink_status)
253 #if MAVLINK_CRC_EXTRA
254 #ifndef MAVLINK_MESSAGE_CRC
255 static const uint8_t mavlink_message_crcs[256] = MAVLINK_MESSAGE_CRCS;
256 #define MAVLINK_MESSAGE_CRC(msgid) mavlink_message_crcs[msgid]
266 #ifdef MAVLINK_CHECK_MESSAGE_LENGTH
267 #ifndef MAVLINK_MESSAGE_LENGTH
268 static const uint8_t mavlink_message_lengths[256] = MAVLINK_MESSAGE_LENGTHS;
269 #define MAVLINK_MESSAGE_LENGTH(msgid) mavlink_message_lengths[msgid]
273 mavlink_message_t* rxmsg = mavlink_get_channel_buffer(chan);
281 case MAVLINK_PARSE_STATE_UNINIT:
282 case MAVLINK_PARSE_STATE_IDLE:
283 if (c == MAVLINK_STX)
288 mavlink_start_checksum(rxmsg);
292 case MAVLINK_PARSE_STATE_GOT_STX:
296 #if (MAVLINK_MAX_PAYLOAD_LEN < 255)
297 || c > MAVLINK_MAX_PAYLOAD_LEN
311 mavlink_update_checksum(rxmsg, c);
312 status->
parse_state = MAVLINK_PARSE_STATE_GOT_LENGTH;
316 case MAVLINK_PARSE_STATE_GOT_LENGTH:
318 mavlink_update_checksum(rxmsg, c);
322 case MAVLINK_PARSE_STATE_GOT_SEQ:
324 mavlink_update_checksum(rxmsg, c);
325 status->
parse_state = MAVLINK_PARSE_STATE_GOT_SYSID;
328 case MAVLINK_PARSE_STATE_GOT_SYSID:
330 mavlink_update_checksum(rxmsg, c);
331 status->
parse_state = MAVLINK_PARSE_STATE_GOT_COMPID;
334 case MAVLINK_PARSE_STATE_GOT_COMPID:
335 #ifdef MAVLINK_CHECK_MESSAGE_LENGTH
336 if (rxmsg->len != MAVLINK_MESSAGE_LENGTH(c))
341 if (c == MAVLINK_STX)
344 mavlink_start_checksum(rxmsg);
349 mavlink_update_checksum(rxmsg, c);
352 status->
parse_state = MAVLINK_PARSE_STATE_GOT_PAYLOAD;
356 status->
parse_state = MAVLINK_PARSE_STATE_GOT_MSGID;
360 case MAVLINK_PARSE_STATE_GOT_MSGID:
361 _MAV_PAYLOAD_NON_CONST(rxmsg)[status->
packet_idx++] = (char)c;
362 mavlink_update_checksum(rxmsg, c);
365 status->
parse_state = MAVLINK_PARSE_STATE_GOT_PAYLOAD;
369 case MAVLINK_PARSE_STATE_GOT_PAYLOAD:
370 #if MAVLINK_CRC_EXTRA
371 mavlink_update_checksum(rxmsg, MAVLINK_MESSAGE_CRC(rxmsg->msgid));
373 if (c != (rxmsg->checksum & 0xFF)) {
378 if (c == MAVLINK_STX)
382 mavlink_start_checksum(rxmsg);
387 status->
parse_state = MAVLINK_PARSE_STATE_GOT_CRC1;
388 _MAV_PAYLOAD_NON_CONST(rxmsg)[status->
packet_idx] = (char)c;
392 case MAVLINK_PARSE_STATE_GOT_CRC1:
393 if (c != (rxmsg->checksum >> 8)) {
398 if (c == MAVLINK_STX)
402 mavlink_start_checksum(rxmsg);
410 _MAV_PAYLOAD_NON_CONST(rxmsg)[status->
packet_idx+1] = (char)c;
411 memcpy(r_message, rxmsg,
sizeof(mavlink_message_t));
449 MAVLINK_HELPER uint8_t put_bitfield_n_by_index(int32_t b, uint8_t bits, uint8_t packet_index, uint8_t bit_index, uint8_t* r_bit_index, uint8_t* buffer)
451 uint16_t bits_remain = bits;
454 uint8_t i_bit_index, i_byte_index, curr_bits_n;
455 #if MAVLINK_NEED_BYTE_SWAP
461 bout.b[0] = bin.b[3];
462 bout.b[1] = bin.b[2];
463 bout.b[2] = bin.b[1];
464 bout.b[3] = bin.b[0];
486 i_bit_index = bit_index;
487 i_byte_index = packet_index;
496 while (bits_remain > 0)
505 if (bits_remain <= (uint8_t)(8 - i_bit_index))
508 curr_bits_n = (uint8_t)bits_remain;
512 curr_bits_n = (8 - i_bit_index);
517 buffer[i_byte_index] &= (0xFF >> (8 - curr_bits_n));
519 buffer[i_byte_index] |= ((0x00 << curr_bits_n) & v);
522 i_bit_index += curr_bits_n;
525 bits_remain -= curr_bits_n;
534 *r_bit_index = i_bit_index;
536 if (i_bit_index != 7) i_byte_index++;
537 return i_byte_index - packet_index;
540 #ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
563 MAVLINK_HELPER
void _mavlink_send_uart(mavlink_channel_t chan,
const char *buf, uint16_t len)
565 #ifdef MAVLINK_SEND_UART_BYTES
568 MAVLINK_SEND_UART_BYTES(chan, (
const uint8_t *)buf, len);
572 for (i = 0; i < len; i++) {
573 comm_send_ch(chan, (uint8_t)buf[i]);
577 #endif // MAVLINK_USE_CONVENIENCE_FUNCTIONS
Definition: mavlink_types.h:204
uint8_t msg_received
Number of received messages.
Definition: mavlink_types.h:205
mavlink_parse_state_t parse_state
Parsing state machine.
Definition: mavlink_types.h:208
uint8_t parse_error
Number of parse errors.
Definition: mavlink_types.h:207
uint16_t packet_rx_drop_count
Number of packet drops.
Definition: mavlink_types.h:213
uint16_t packet_rx_success_count
Received packets.
Definition: mavlink_types.h:212
Definition: mavlink_helpers.h:186
uint8_t packet_idx
Index in current packet.
Definition: mavlink_types.h:209
uint8_t current_rx_seq
Sequence number of last packet received.
Definition: mavlink_types.h:210
uint8_t buffer_overrun
Number of buffer overruns.
Definition: mavlink_types.h:206
uint8_t current_tx_seq
Sequence number of last packet sent.
Definition: mavlink_types.h:211