#ifndef MESSAGES_H #define MESSAGES_H #include #ifdef __cplusplus extern "C" { #endif /*********************** * Message Definitions * ***********************/ #define MSG_HEADER 0x1234 #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_BEGIN_SYNC 0x8000 // begin time sync #pragma pack(1) typedef enum { MSG_ID_INIT, // Device initialization MSG_ID_SYNC, // Time synchronization MSG_ID_EVENT, // Event occurred MSG_MAX_ID, // Maximum message ID } msgid_t; typedef struct { uint32_t seconds; // Seconds since 1970 uint32_t nanosec; // Nanoseconds since 'seconds' } ntime_t; typedef struct { uint16_t header; // Message Header uint16_t msgid; // Message ID uint16_t length; // Body length uint16_t cksum; // Body checksum } header_t; typedef struct { 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 } init_msg_t; typedef struct { ntime_t time; // Time of previous message } sync_msg_t; typedef struct { uint16_t device; // Device ID uint16_t event; // Event ID 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