26 if (!msg.
data.empty()) {
27 tx_buf_.resize(COBS_ENCODE_DST_BUF_LEN_MAX(msg.
data.size()) + 3);
28 cobs_encode_result res =
29 cobs_encode(tx_buf_.data() + 1, tx_buf_.size() - 3, msg.
data.data(),
31 if (res.status != COBS_ENCODE_OK) {
34 tx_buf_.resize(res.out_len + 3);
40 tx_buf_[tx_buf_.size() - 2] = checksum(tx_buf_.data(), tx_buf_.size() - 2);
41 tx_buf_[tx_buf_.size() - 1] = 0;
42 return uart_.
transmit(tx_buf_.data(), tx_buf_.size(), timeout);
47 while (!read_to_end()) {
49 if (elapsed >= timeout) {
55 if (rx_buf_.size() < 3) {
59 if (checksum(rx_buf_.data(), rx_buf_.size() - 2) !=
60 rx_buf_[rx_buf_.size() - 2]) {
65 if (rx_buf_.size() > 3) {
66 msg.
data.resize(COBS_DECODE_DST_BUF_LEN_MAX(rx_buf_.size() - 3));
67 cobs_decode_result res =
68 cobs_decode(msg.
data.data(), msg.
data.size(), rx_buf_.data() + 1,
70 if (res.status != COBS_DECODE_OK) {
74 msg.
data.resize(res.out_len);
86 std::vector<uint8_t> tx_buf_;
87 std::vector<uint8_t> rx_buf_;
91 while (uart_.
receive(&tmp, 1, 0)) {
92 rx_buf_.push_back(tmp);
100 uint8_t checksum(
const uint8_t *data,
size_t size) {
102 for (
size_t i = 0; i < size; ++i) {
105 return 0x80 | (res & 0x7F);
static uint32_t get_ticks()
Definition kernel.hpp:14
static void delay(uint32_t ticks)
Definition thread.hpp:32
Definition cobs_bridge.hpp:20
bool receive(COBSBridgeMessage &msg, uint32_t timeout)
Definition cobs_bridge.hpp:45
COBSBridge(peripheral::UART &uart)
Definition cobs_bridge.hpp:22
bool transmit(const COBSBridgeMessage &msg, uint32_t timeout)
Definition cobs_bridge.hpp:24
bool receive(uint8_t *data, size_t size, uint32_t timeout)
Definition uart.hpp:85
bool transmit(const uint8_t *data, size_t size, uint32_t timeout)
Definition uart.hpp:69
Definition cobs_bridge.hpp:15
std::vector< uint8_t > data
Definition cobs_bridge.hpp:17
uint8_t id
Definition cobs_bridge.hpp:16