void set_tx_header(uint16_t addr, uint16_t type, uint8_t priority) { tx_buffer.msg.header.sync = SYNC_BYTE_VALUE; tx_buffer.msg.header.priority = priority; tx_buffer.msg.header.dest_addr = addr; tx_buffer.msg.header.src_addr = address.as_uint16; tx_buffer.msg.header.type = type; tx_buffer.msg.header.version = VERSION; type_switch_return_s app_msg_info = type_switch(&tx_buffer); //TODO check app_msg_info error tx_len = sizeof(tx_buffer.msg.header) + CRC_SIZE + app_msg_info.size; }
auto *get(const variant<Ts...> *v) noexcept { using members = meta::list<Ts...>; static_assert(I < members::size(), ""); using T = meta::at_c<members, I>; using R = std::remove_reference_t<const T>; if (!v) { return static_cast<R *>(nullptr); } // if return type_switch (*v) ( [](const T &elem) { return &elem; }, [](auto &&) -> R * { return nullptr; } ); }
std::basic_ostream<Char, Traits> &operator<<( std::basic_ostream<Char, Traits> &strm, const variant<Ts...> &v) { type_switch(v)([&](const auto &elem) { strm << elem; }); return strm; }
void process_one_rx_char(uint8_t rx_char) { switch (rx_state) { case RX_IDLE: if (rx_char == SYNC_BYTE_VALUE) { rx_idx = 0x00; rx_len = 0x00; rx_state = RX_HEADER; transport_state = RX; store_one_rx_char(rx_char); } break; case RX_HEADER: store_one_rx_char(rx_char); if (rx_idx == sizeof(rx_buffer.msg.header)) // done rxing header { //filter for address and version if (rx_buffer.msg.header.dest_addr == address.as_uint16 && rx_buffer.msg.header.version == VERSION) { //demux type type_switch_return_s app_msg_info = type_switch(&rx_buffer); if (app_msg_info.error == 0) { rx_state = RX_MSG; rx_len = CRC_SIZE + sizeof(rx_buffer.msg.header) + app_msg_info.size; } else { rx_state = RX_IDLE; } } else { rx_state = RX_IDLE; } } break; case RX_MSG: store_one_rx_char(rx_char); if (rx_idx == rx_len) //done rxing message { //setup CRC bytes_and_uint16_u crc; crc.as_bytes.low = rx_buffer.buffer[rx_len - 2]; crc.as_bytes.high = rx_buffer.buffer[rx_len - 1]; //CRC passes if (crc.as_uint16 == get_crc_of_buffer(&rx_buffer, rx_len)) { if (rx_buffer.msg.header.type == ACK) { //ack received rx_state = RX_IDLE; } else { //send ACK on successful receive rx_state = RX_SEND_ACK; //send_ack(rx_buffer.msg.header.src_addr); tx_buffer.msg.app_msgs.ping_req.tag = 0x11; send_msg(0x1234, PING_REQ, 0x00); } } else { rx_state = RX_IDLE; } } break; } }