X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=hw2%2Fmessages.h;h=ef81129aedba89b27c281149cb69ca99e189b5b1;hb=91aaf64a8183d260acd043f4ef53d26f0193c090;hp=af40683c9628f79a340fd49069cdf60bc1d76b07;hpb=d5dd8b1b26fb8e11ffaaaa89d58570a19aaeba7d;p=~andy%2Fcsm213a-hw diff --git a/hw2/messages.h b/hw2/messages.h index af40683..ef81129 100644 --- a/hw2/messages.h +++ b/hw2/messages.h @@ -1,16 +1,24 @@ +#ifndef MESSAGES_H +#define MESSAGES_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + /*********************** * Message Definitions * ***********************/ -#include - -#define MSG_HEADER 0x1234 +#define MSG_HEADER 0x1234 -#define MSG_VALID_DEVICE 0x0001 // device id is valid -#define MSG_VALID_WORLD 0x0002 // world time is valid -#define MSG_VALID_START 0x0004 // start time is valid -#define MSG_VALID_PERIOD 0x0008 // period is valid -#define MSG_VALID_SYNC 0x8000 // begin time sync +#define MSG_CTL_VALID_DEVICE 0x0001 // device id is valid +#define MSG_CTL_VALID_WORLD 0x0002 // world time is valid +#define MSG_CTL_VALID_START 0x0004 // start time is valid +#define MSG_CTL_VALID_PERIOD 0x0008 // period is valid +#define MSG_CTL_RELAY_MODE 0x4000 // relay output messages +#define MSG_CTL_VALID_SYNC 0x8000 // begin time sync #pragma pack(1) @@ -22,7 +30,7 @@ typedef enum { } msgid_t; typedef struct { - uint32_t seconds; // Seconds since 1970 (without leap seconds) + uint32_t seconds; // Seconds since 1970 uint32_t nanosec; // Nanoseconds since 'seconds' } ntime_t; @@ -34,22 +42,45 @@ typedef struct { } header_t; typedef struct { - uint16_t valid; // Message valid bits + uint16_t control; // Message control bits uint16_t device; // Device ID to use + ntime_t world; // World time (since 1970) ntime_t start; // Transmit start time ntime_t period; // Transmit period - ntime_t world; // World time (since 1970) } init_msg_t; typedef struct { - uint32_t seq; // Current sequence counter ntime_t time; // Time of previous message } sync_msg_t; typedef struct { uint16_t device; // Device ID uint16_t event; // Event ID - ntime_t time; // Timestamp + ntime_t world; // UTC Time of event + ntime_t local; // Time since turn-on } event_msg_t; #pragma pack() + +/****************** + * Message Parser * + ******************/ + +typedef void (*handler_t)(header_t *head, void *body); + +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