コード例 #1
0
ファイル: can_transport.c プロジェクト: GaugeOwnerRobot/gauge
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;
}
コード例 #2
0
ファイル: get.hpp プロジェクト: viboes/variant-2
 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; }
   );
 }
コード例 #3
0
ファイル: io.hpp プロジェクト: viboes/variant-2
 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;
 }
コード例 #4
0
ファイル: can_transport.c プロジェクト: GaugeOwnerRobot/gauge
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;
    }
}