#ifndef _MESSAGE_PARSER_HEADER #define _MESSAGE_PARSER_HEADER #include #include #define MAX_MESSAGE_PAYLOAD_LENGTH 512 #define MAX_TOTAL_CONTENT_LENGTH (MAX_MESSAGE_PAYLOAD_LENGTH + 1) enum ParserState { WaitingForStartByte, GetMessageType, EscapedMessageType, EscapePayloadByte, InPayload, }; enum ParserError { NoError, WrongCheckSum, MessageToLong, UnexpectedCommandByte, }; typedef enum { StartByte = 0xAA, EscapeByte = 0xBB, EndByte = 0xCC, } MessageBytes; struct MessageReceive { enum ParserState state; enum ParserError error; uint8_t messageid; uint8_t message[MAX_MESSAGE_PAYLOAD_LENGTH]; uint16_t index; uint8_t checksum; }; typedef void (*MessageReceivedCallback)(uint8_t msgid, const uint8_t *payload, size_t payload_len); typedef void (*MessageFailCallback)(uint8_t msgid, const uint8_t *payload, size_t payload_len, enum ParserError error); struct MessageReceive InitMessageReceive(); void register_message_callback(MessageReceivedCallback callback); void register_message_fail_callback(MessageFailCallback callback); void parse_byte(struct MessageReceive *mr, uint8_t pbyte); #endif