19 return two_pow((hdr >> 0x03) & 0x07);
25 false, (hdr & 0xc7), 0x00
28 const uint8_t payload_len_code { (hdr >> 0x03) & 0x07 };
30 switch (info.header_sanitized) {
31 case (static_cast<uint8_t>(Magics::SYS::SYS_BASE)
32 |
static_cast<uint8_t
>(Magics::SYS::ACK)):
33 if (!payload_len_code)
37 case (static_cast<uint8_t>(Magics::SYS::SYS_BASE)
38 |
static_cast<uint8_t
>(Magics::SYS::NACK)):
39 if (!payload_len_code)
40 info.header_valid =
true;
43 case (static_cast<uint8_t>(Magics::CMD::CMD_BASE)
44 |
static_cast<uint8_t
>(Magics::CMD::SELECT)):
45 if (payload_len_code == 0) {
46 info.header_valid =
true;
47 info.payload_length = payload_length(hdr);
51 case (static_cast<uint8_t>(Magics::CMD::CMD_BASE)
52 | static_cast<uint8_t>(Magics::CMD::WRITE)):
53 if (payload_len_code < 6) {
54 info.header_valid =
true;
55 info.payload_length = payload_length(hdr);
73 switch (current_state) {
78 if (info.header_valid) {
79 if (info.payload_length > 0) {
82 message_pending_bytes = (info.payload_length + 0x01);
87 switch (info.header_sanitized & 0x07) {
88 case static_cast<uint8_t
>(Magics::SYS::NACK):
91 case static_cast<uint8_t>(Magics::SYS::ACK):
103 const uint8_t write_index { ((message_payload_length + 0x01)
104 - message_pending_bytes) + 0x01 };
105 buffer[write_index] = input;
106 message_pending_bytes -= 0x01;
108 if (message_pending_bytes) {
111 rtn.len = message_payload_length;
112 if (Framing::checksum(buffer, message_payload_length + 1)
113 != buffer[write_index]) {
116 switch (buffer[0] & 0x07) {
117 case static_cast<uint8_t
>(Magics::CMD::SELECT):
120 case static_cast<uint8_t>(Magics::CMD::WRITE):
Parser is waiting for the checksum byte.
ParserReturn update(uint8_t input)
HeaderInformation analyze_header(const uint8_t hdr)
constexpr State next_state(State st)
Parser is waiting for the header byte.
constexpr uint8_t two_pow(uint8_t val)
uint8_t payload_length(const uint8_t hdr)
Starting value for State values.