]> Pileus Git - ~andy/csm213a-hw/commitdiff
Factor out message parser
authorAndy Spencer <andy753421@gmail.com>
Fri, 14 Mar 2014 05:51:49 +0000 (05:51 +0000)
committerAndy Spencer <andy753421@gmail.com>
Fri, 14 Mar 2014 05:51:49 +0000 (05:51 +0000)
hw2/main.cpp
hw2/makefile
hw2/messages.c [new file with mode: 0644]
hw2/messages.h

index 2c0f2746e716f3064431fc1ee08901322fb5167e..1bc0cda280da2e3effc2cfe5ab90a815989024fa 100644 (file)
@@ -85,7 +85,7 @@ void time_ext_sync(uint64_t local, uint64_t world)
        world = time_last_world;
 
 //#ifdef VERBOSE
-#if 0
+#if 1
        uint64_t error = world > guess ? world - guess :
                         guess > world ? guess - world : 0;
        int      ahead = guess > world;
@@ -290,12 +290,6 @@ void emit_transmit(uint64_t local, uint64_t world)
  * Serial I/O functions *
  ************************/
 
-typedef struct {
-       int      index;
-       int      state;
-       uint8_t  buffer[256];
-} parser_t;
-
 static uint32_t serial_device_id   = 0;
 
 const  uint64_t serial_sync_delay  = NSEC_PER_SEC / 100;
@@ -424,7 +418,7 @@ void serial_send_event(sirq_t *port, uint16_t event, uint64_t local)
 /**
  * Handle init message
  */
-void serial_handle_init(init_msg_t *msg)
+void serial_handle_init(int msgid, init_msg_t *msg)
 {
        sirq_printf("initialize: %s %s %s %s %s\r\n",
                msg->valid & MSG_VALID_DEVICE ? "DEV"    : "dev",
@@ -460,7 +454,7 @@ void serial_handle_init(init_msg_t *msg)
 /**
  * Handle sync message
  */
-void serial_handle_sync(sync_msg_t *msg)
+void serial_handle_sync(int msgid, sync_msg_t *msg)
 {
        // Read receive timestamp
        uint64_t local = 0, world = 0;
@@ -487,75 +481,8 @@ void serial_handle_sync(sync_msg_t *msg)
 /**
  * Handle event message
  */
-void serial_handle_event(event_msg_t *msg)
-{
-}
-
-/**
- * Deliver message
- */
-void serial_deliver(int msgid, void *body)
+void serial_handle_event(int msgid, event_msg_t *msg)
 {
-       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;
-       }
 }
 
 /********************
@@ -589,17 +516,17 @@ void task_serial(uint64_t local, uint64_t world)
 {
        while (sirq_ready(sirq_dbg)) {
                //sirq_printf("serial recv - dbg\r\n");
-               serial_receive(&parser_dbg,  sirq_getc(sirq_dbg));
+               msg_receive(&parser_dbg,  sirq_getc(sirq_dbg));
        }
 
        while (sirq_ready(sirq_bbb)) {
                //sirq_printf("serial recv - bbb\r\n");
-               serial_receive(&parser_bbb,  sirq_getc(sirq_bbb));
+               msg_receive(&parser_bbb,  sirq_getc(sirq_bbb));
        }
 
        while (sirq_ready(sirq_mbed)) {
                //sirq_printf("serial recv - mbed\r\n");
-               serial_receive(&parser_mbed, sirq_getc(sirq_mbed));
+               msg_receive(&parser_mbed, sirq_getc(sirq_mbed));
        }
 }
 
@@ -647,7 +574,7 @@ void task_debug(uint64_t local, uint64_t world)
 
        //sirq_debug(sirq_mbed);
 
-       //serial_send_event(sirq_bbb, 1, local);
+       serial_send_event(sirq_bbb, 1, local);
 
 #ifdef VERBOSE
        sirq_printf("background - %6u.%02u -> %u.%02u\r\n",
@@ -699,8 +626,6 @@ int main(int argc, char **argv)
 {
        tdma_init();
 
-       //pin = 1;
-
        // Open serial ports
        sirq_dbg   = sirq_open(SIRQ_UART0, USBTX, USBRX, 115200); // to pc
        sirq_bbb   = sirq_open(SIRQ_UART1, PTE0,  PTE1,  115200); // to bbb
@@ -708,14 +633,15 @@ int main(int argc, char **argv)
 
        // Setup timers
        tdma_evt   = tdma_open(TDMA_CHAN0, 3, PTC9,  PullDown); // async event
-
-       // mbed time sync
        tdma_rcv   = tdma_open(TDMA_CHAN2, 3, PTD2,  PullUp);   // time sync rcv
        tdma_xmt   = tdma_open(TDMA_CHAN3, 3, PTD3,  PullUp);   // time sync xmt
 
-       // host time sync
-       //tdma_rcv   = tdma_open(TDMA_CHAN2, 2, USBRX, PullUp); // time sync rcv
-       //tdma_xmt   = tdma_open(TDMA_CHAN3, 2, USBTX, PullUp); // time sync xmt
+       // Register messages
+       msg_register(&parser_dbg,  MSG_ID_INIT,  (handler_t)serial_handle_init);
+       msg_register(&parser_dbg,  MSG_ID_SYNC,  (handler_t)serial_handle_sync);
+       msg_register(&parser_dbg,  MSG_ID_EVENT, (handler_t)serial_handle_event);
+       msg_register(&parser_bbb,  MSG_ID_INIT,  (handler_t)serial_handle_init);
+       msg_register(&parser_mbed, MSG_ID_SYNC,  (handler_t)serial_handle_sync);
 
        // start timers
        tdma_start(tdma_evt);
index e7c5b4006ffe77909e783aeed7958813a3f0dbb4..11824a8e20aa1dd86a22b8b29ef2fa6088ea63da 100644 (file)
@@ -19,7 +19,7 @@ dist:
        zip mbed.zip makefile ../common.mk *.{c,cpp,h} */*.{cpp,.h}
 
 # Primary mbed (mbed1/mbed2)
-mbed.elf: main.o serial_irq.o serial_dma.o timer_dma.o
+mbed.elf: main.o serial_irq.o serial_dma.o timer_dma.o messages.o
 
 mbed-run: mbed.bin control install.sh
        @./install.sh $<
diff --git a/hw2/messages.c b/hw2/messages.c
new file mode 100644 (file)
index 0000000..eeeff80
--- /dev/null
@@ -0,0 +1,53 @@
+#include "messages.h"
+
+void msg_register(parser_t *parser, int msgid, handler_t handler)
+{
+       if (msgid < MSG_MAX_ID)
+               parser->handler[msgid] = handler;
+}
+
+void msg_receive(parser_t *parser, int byte)
+{
+       //sirq_printf("msg_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) {
+                               handler_t handler = parser->handler[head->msgid];
+                               if (handler)
+                                       handler(head->msgid, body);
+
+                               parser->index = 0;
+                               parser->state = 0;
+                       }
+                       break;
+       }
+}
index 752476fb2c4ecd60b8fd2425b72171eceb868be0..2e84107aee849df9c071657aa05e103727c60520 100644 (file)
@@ -1,9 +1,16 @@
+#ifndef MESSAGES_H
+#define MESSAGES_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /***********************
  * Message Definitions *
  ***********************/
 
-#include <stdint.h>
-
 #define MSG_HEADER       0x1234
 
 #define MSG_VALID_DEVICE 0x0001  // device id is valid
@@ -53,3 +60,26 @@ typedef struct {
 } event_msg_t;
 
 #pragma pack()
+
+/******************
+ * Message Parser *
+ ******************/
+
+typedef void (*handler_t)(int msgid, void *msg);
+
+typedef struct {
+       int       index;
+       int       state;
+       uint8_t   buffer[256];
+       handler_t handler[MSG_MAX_ID];
+} parser_t;
+
+void msg_register(parser_t *parser, int msgid, handler_t handler);
+
+void msg_receive(parser_t *parser, int byte);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif