- switch (msgid) {
- case MSG_ID_INIT:
- //sirq_printf("received init msg\r\n");
- serial_handle_init((init_msg_t*)body);
- break;
- case MSG_ID_SYNC:
- //sirq_printf("received sync msg\r\n");
- serial_handle_sync((sync_msg_t*)body);
- break;
- case MSG_ID_EVENT:
- //sirq_printf("received event msg\r\n");
- serial_handle_event((event_msg_t*)body);
- break;
- }
-}
-
-/**
- * Process serial receive messages
- */
-void serial_receive(parser_t *parser, int byte)
-{
- //sirq_printf("serial_receive - %02x\r\n", byte);
-
- // Lookup pointers
- header_t *head = (header_t*)parser->buffer;
- void *body = (void*)(head+1);
- const int max_length = sizeof(parser->buffer)-sizeof(header_t);
-
- // Process uart messages
- parser->buffer[parser->index++] = byte;
- switch (parser->state) {
- case 0: // Search
- if (parser->index == sizeof(uint16_t)) {
- if (head->header == MSG_HEADER) {
- parser->state = 1;
- } else {
- parser->buffer[0] = parser->buffer[1];
- parser->index = 1;
- }
- }
- break;
- case 1: // Header
- if (parser->index == sizeof(header_t)) {
- if (head->length <= max_length &&
- head->msgid <= MSG_MAX_ID) {
- parser->state = 2;
- } else {
- parser->index = 0;
- parser->state = 0;
- }
- }
- break;
- case 2: // Data
- if (parser->index == (int)sizeof(header_t)+head->length) {
- serial_deliver(head->msgid, body);
- parser->index = 0;
- parser->state = 0;
- }
- break;
- }