/* * MPSHistoryProtocol.h * mpsLinkProcessor * * Created by Stephen Norum. * Copyright 2008 Stanford Linear Accelerator Center. All rights reserved. * */ #ifndef MPSHISTORYPROTOCOL_H #define MPSHISTORYPROTOCOL_H #ifdef __cplusplus extern "C" { #endif #include #include #if 0 #pragma mark - #pragma mark Message Types and Common #endif /**************************************************************************** * Message Types and Common ****************************************************************************/ enum { MPSHistoryProtocolVersion1 = 1, MPSHistoryProtocolVersion2 = 2, MPSHistoryProtocolVersionCurrent = 2, MPSHistoryProtocolNotificationPort = 30000 }; enum MPSHistoryProtocolMessageTypes { MPSHistoryMessageTypeSuper = 0x01, MPSHistoryMessageTypeNotification = 0x02, MPSHistoryMessageTypeFaultState = 0x03, MPSHistoryMessageTypeBypassValue = 0x04, MPSHistoryMessageTypeBypassTime = 0x05, MPSHistoryMessageTypeRate = 0x06, MPSHistoryMessageTypeDestination = 0x07, MPSHistoryMessageTypeAllLinkNodeChannels = 0x08, MPSHistoryMessageTypeTruthTableState = 0x09 }; typedef enum MPSHistoryProtocolMessageTypes MPSHistoryProtocolMessageType; struct MPSHistoryMessageStruct { epicsUInt8 type; epicsTimeStamp timestampWithPulseId; epicsUInt8 timeslot; epicsUInt32 id; epicsUInt32 oldValue; epicsUInt32 newValue; }; typedef struct MPSHistoryMessageStruct MPSHistoryMessage; struct MPSHistoryMessageStructV1 { epicsUInt8 type; epicsTimeStamp timestampWithPulseId; epicsUInt8 timeslot; epicsUInt32 id; epicsUInt8 oldValue; epicsUInt8 newValue; }; typedef struct MPSHistoryMessageStructV1 MPSHistoryMessageV1; #if 0 #pragma mark - #pragma mark Message Sizes #endif /**************************************************************************** * Message Sizes ****************************************************************************/ /* Header Size = Protocol Version (1 byte) + Message Type (1 byte) = 2 */ enum { MPSHistoryProtocolHeaderSize = 2, MPSHistoryProtocolMessageSizeMin = MPSHistoryProtocolHeaderSize, MPSHistoryProtocolDataSizeMin = 0, MPSHistoryProtocolDataSizeMax = 32, }; #if 0 #pragma mark - #pragma mark Data Pointers #endif /**************************************************************************** * Data Pointers ****************************************************************************/ /* Note: The history message header begins at the first byte of TCP Data */ #define HISTORY_MESSAGE_HEADER_SECTION_POINTER(_pointerToFullMessage) ((epicsInt8 *)(_pointerToFullMessage) + 0) #define HISTORY_MESSAGE_PROTOCOL_VERSION_POINTER(_pointerToHistoryHeader) ((epicsUInt8 *)(_pointerToHistoryHeader) + 0) #define HISTORY_MESSAGE_TYPE_POINTER(_pointerToHistoryHeader) ((epicsUInt8 *)(_pointerToHistoryHeader) + 1) #define HISTORY_MESSAGE_DATA_SECTION_POINTER(_pointerToHistoryHeader) ((epicsInt8 *)(_pointerToHistoryHeader) + 2) #define HISTORY_MESSAGE_PROTOCOL_VERSION(_pointerToHistoryHeader) (*HISTORY_MESSAGE_PROTOCOL_VERSION_POINTER(_pointerToHistoryHeader)) #define HISTORY_MESSAGE_TYPE(_pointerToHistoryHeader) (*HISTORY_MESSAGE_TYPE_POINTER(_pointerToHistoryHeader)) #if 0 #pragma mark - #pragma mark Data Pointers #endif /**************************************************************************** * Super Message ****************************************************************************/ /* All history message struct data. */ #define HISTORY_SUPER_MESSAGE_SIZE_V2 (22 + MPSHistoryProtocolHeaderSize) #define HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 0)) #define HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 4)) #define HISTORY_SUPER_TIMESLOT_POINTER_V2(_pointerToHistoryData) ((epicsUInt8 *)((_pointerToHistoryData) + 8)) #define HISTORY_SUPER_TYPE_POINTER_V2(_pointerToHistoryData) ((epicsUInt8 *)((_pointerToHistoryData) + 9)) #define HISTORY_SUPER_ID_POINTER_V2(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 10)) #define HISTORY_SUPER_OLD_VALUE_POINTER_V2(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 14)) #define HISTORY_SUPER_NEW_VALUE_POINTER_V2(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 18)) #define HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_V2(_pointerToHistoryData) (*HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToHistoryData)) #define HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_V2(_pointerToHistoryData) (*HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToHistoryData)) #define HISTORY_SUPER_TIMESLOT_V2(_pointerToHistoryData) (*HISTORY_SUPER_TIMESLOT_POINTER_V2(_pointerToHistoryData)) #define HISTORY_SUPER_TYPE_V2(_pointerToHistoryData) (*HISTORY_SUPER_TYPE_POINTER_V2(_pointerToHistoryData)) #define HISTORY_SUPER_ID_V2(_pointerToHistoryData) (*HISTORY_SUPER_ID_POINTER_V2(_pointerToHistoryData)) #define HISTORY_SUPER_OLD_VALUE_V2(_pointerToHistoryData) (*HISTORY_SUPER_OLD_VALUE_POINTER_V2(_pointerToHistoryData)) #define HISTORY_SUPER_NEW_VALUE_V2(_pointerToHistoryData) (*HISTORY_SUPER_NEW_VALUE_POINTER_V2(_pointerToHistoryData)) /**************************************************************************** * Super Message Version 1 ****************************************************************************/ /* All history message struct data. */ #define HISTORY_SUPER_MESSAGE_SIZE_V1 (16 + MPSHistoryProtocolHeaderSize) #define HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_POINTER_V1(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 0)) #define HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_POINTER_V1(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 4)) #define HISTORY_SUPER_TIMESLOT_POINTER_V1(_pointerToHistoryData) ((epicsUInt8 *)((_pointerToHistoryData) + 8)) #define HISTORY_SUPER_TYPE_POINTER_V1(_pointerToHistoryData) ((epicsUInt8 *)((_pointerToHistoryData) + 9)) #define HISTORY_SUPER_ID_POINTER_V1(_pointerToHistoryData) ((epicsUInt32 *)((_pointerToHistoryData) + 10)) #define HISTORY_SUPER_OLD_VALUE_POINTER_V1(_pointerToHistoryData) ((epicsUInt8 *)((_pointerToHistoryData) + 14)) #define HISTORY_SUPER_NEW_VALUE_POINTER_V1(_pointerToHistoryData) ((epicsUInt8 *)((_pointerToHistoryData) + 15)) #define HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_V1(_pointerToHistoryData) (*HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_POINTER_V1(_pointerToHistoryData)) #define HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_V1(_pointerToHistoryData) (*HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_POINTER_V1(_pointerToHistoryData)) #define HISTORY_SUPER_TIMESLOT_V1(_pointerToHistoryData) (*HISTORY_SUPER_TIMESLOT_POINTER_V1(_pointerToHistoryData)) #define HISTORY_SUPER_TYPE_V1(_pointerToHistoryData) (*HISTORY_SUPER_TYPE_POINTER_V1(_pointerToHistoryData)) #define HISTORY_SUPER_ID_V1(_pointerToHistoryData) (*HISTORY_SUPER_ID_POINTER_V1(_pointerToHistoryData)) #define HISTORY_SUPER_OLD_VALUE_V1(_pointerToHistoryData) (*HISTORY_SUPER_OLD_VALUE_POINTER_V1(_pointerToHistoryData)) #define HISTORY_SUPER_NEW_VALUE_V1(_pointerToHistoryData) (*HISTORY_SUPER_NEW_VALUE_POINTER_V1(_pointerToHistoryData)) #if 0 #pragma mark - #pragma mark Notification (NOTIFICATION) #endif /**************************************************************************** * Notification (NOTIFICATION) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use HISTORY_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * Notification Message Size = Server Port Number (2 bytes) + Header = 2 + Header */ #define NOTIFICATION_MESSAGE_SIZE (2 + MPSHistoryProtocolHeaderSize) #define NOTIFICATION_SERVER_PORT_NUMBER_POINTER(_pointerToHistoryData) ((in_port_t *)((_pointerToHistoryData) + 0)) #define NOTIFICATION_SERVER_PORT_NUMBER(_pointerToHistoryData) (*NOTIFICATION_SERVER_PORT_NUMBER_POINTER(_pointerToHistoryData)) /**************************************************************************** * End of Message Definitions ****************************************************************************/ #ifdef __cplusplus } #endif #endif