/** * @file app_uart_protocol.h * @brief Table-driven incremental UART packet parser and checksum helpers. * * Architectural note: * The parser is intentionally transport-agnostic. It receives one byte at a * time from the IRQ adapter, reconstructs packets according to a descriptor * table, validates checksums when applicable, and emits fully decoded packet * objects for the application core. */ #ifndef APP_UART_PROTOCOL_H #define APP_UART_PROTOCOL_H #include #include #include "app_types.h" /** * @brief Descriptor describing one supported UART packet shape. */ typedef struct app_packet_descriptor_t { uint16_t header; uint8_t total_bytes; uint8_t payload_words; int8_t checksum_word_index; app_packet_kind_t kind; } app_packet_descriptor_t; /** * @brief Parsed UART packet emitted by the protocol layer. */ typedef struct app_packet_t { app_packet_kind_t kind; uint16_t header; uint8_t payload_words; bool checksum_valid; uint16_t words[APP_PROTOCOL_MAX_PAYLOAD_WORDS]; } app_packet_t; /** * @brief Mutable state of the incremental UART parser. */ typedef struct app_uart_protocol_parser_t { const app_packet_descriptor_t *descriptor; uint16_t partial_header; uint8_t bytes_received; uint8_t buffer[APP_PROTOCOL_MAX_PACKET_BYTES]; } app_uart_protocol_parser_t; /** * @brief Result returned after feeding one byte into the parser. */ typedef enum app_protocol_feed_result_t { APP_PROTOCOL_FEED_IN_PROGRESS = 0, APP_PROTOCOL_FEED_PACKET_READY, APP_PROTOCOL_FEED_INVALID_HEADER } app_protocol_feed_result_t; void app_uart_protocol_init(app_uart_protocol_parser_t *parser); void app_uart_protocol_reset(app_uart_protocol_parser_t *parser); app_protocol_feed_result_t app_uart_protocol_feed_byte(app_uart_protocol_parser_t *parser, uint8_t byte, app_packet_t *out_packet); uint16_t app_protocol_calculate_checksum(const uint16_t *words, uint16_t word_count); #endif /* APP_UART_PROTOCOL_H */