/* * MPSLinkProtocolV2.h * MPSLinkProcessor * * Created by Stephen Norum. * Copyright 2007 Stanford Linear Accelerator Center. All rights reserved. * */ #ifndef MPSLINKPROTOCOLV2_H #define MPSLINKPROTOCOLV2_H #ifdef __cplusplus extern "C" { #endif #include #if 0 #pragma mark - #pragma mark Message Types and Common #endif /**************************************************************************** * Message Types and Common ****************************************************************************/ enum MPSLinkProtocolMessageTypesV2 { MPSLinkProcessorMessageTypeOutputControlV2 = 0x41, MPSLinkProcessorMessageTypeSynchronizationV2 = 0x51, MPSLinkProcessorMessageTypeUnlatchStatusV2 = 0x61, MPSLinkProcessorMessageTypeUnlatchBlmV2 = 0x62, MPSLinkProcessorMessageTypeUnlatchPicV2 = 0x63, MPSLinkProcessorMessageTypePermitV2 = 0x71, MPSLinkNodeMessageTypeStatusV2 = 0xAC, MPSLinkNodeMessageTypeBeamLossMonitorV2 = 0xB1, MPSLinkNodeMessageTypeProtectionIonChamberV2 = 0xC1 }; typedef enum MPSLinkProtocolMessageTypesV2 MPSLinkProtocolMessageTypeV2; #if 0 #pragma mark - #pragma mark Message Sizes #endif /**************************************************************************** * Message Sizes ****************************************************************************/ /* MLP Header Size = Protocol Version (1 byte) + Message Type (1 byte) = 2 */ /* MLP Message Size Max = Max ethernet message size - UDP header - IP header - Ethernet header - ethernet checksum ~= 1400 */ enum { MPSLinkProtocolHeaderSizeV2 = 2, MPSLinkProtocolMessageSizeMinV2 = MPSLinkProtocolHeaderSizeV2, MPSLinkProtocolMessageSizeMaxV2 = 1400, MPSLinkProtocolDataSizeMinV2 = 0, MPSLinkProtocolDataSizeMaxV2 = MPSLinkProtocolMessageSizeMaxV2 - MPSLinkProtocolHeaderSizeV2 }; #if 0 #pragma mark - #pragma mark Data Pointers #endif /**************************************************************************** * Data Pointers ****************************************************************************/ /* Note: The pointer to MLP header is synonymous to the pointer to the enclosing * UDP packet's data section i.e., pointerToMLPHeader = &UDPDataStart. * * * MLP Header Size * ================================================= * Description Size (bytes) * ------------------------------------------------- * Protocol Version 1 * Message Type 1 * ------------------------------------------------- * Total 2 * ================================================= * * */ #define LINK_MESSAGE_HEADER_SECTION_POINTER_V2(_pointerToMLPMessage) ((epicsInt8 *)(_pointerToMLPMessage) + 0) #define LINK_MESSAGE_PROTOCOL_VERSION_POINTER_V2(_pointerToMLPHeader) ((epicsUInt8 *)(_pointerToMLPHeader) + 0) #define LINK_MESSAGE_TYPE_POINTER_V2(_pointerToMLPHeader) ((epicsUInt8 *)(_pointerToMLPHeader) + 1) #define LINK_MESSAGE_DATA_SECTION_POINTER_V2(_pointerToMLPMessage) ((epicsInt8 *)(_pointerToMLPMessage) + 2) #define LINK_MESSAGE_PROTOCOL_VERSION_V2(_pointerToMLPHeader) (*LINK_MESSAGE_PROTOCOL_VERSION_POINTER_V2(_pointerToMLPHeader)) #define LINK_MESSAGE_TYPE_V2(_pointerToMLPHeader) (*LINK_MESSAGE_TYPE_POINTER_V2(_pointerToMLPHeader)) #if 0 #pragma mark - #pragma mark Link Synchronization (LINK_SYNC) #endif /**************************************************************************** * Link Synchronization Message (LINK_SYNC) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use LINK_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * * Link Synchronization Message Size * ================================================= * Description Size (bytes) * ------------------------------------------------- * Header See Above * Timestamp seconds 4 * Timestamp nsec and pulse ID 4 * Timeslot 1 * ------------------------------------------------- * Total Header + 9 * ================================================= * * */ #define LINK_SYNC_MESSAGE_SIZE_V2 (9 + MPSLinkProtocolHeaderSize) #define LINK_SYNC_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 0)) #define LINK_SYNC_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 4)) #define LINK_SYNC_TIMESLOT_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 8)) #define LINK_SYNC_TIMESTAMP_SECPASTEPOCH_V2(_pointerToMLPData) (*LINK_SYNC_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToMLPData)) #define LINK_SYNC_TIMESTAMP_NSEC_PULSEID_V2(_pointerToMLPData) (*LINK_SYNC_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToMLPData)) #define LINK_SYNC_TIMESLOT_V2(_pointerToMLPData) (*LINK_SYNC_TIMESLOT_POINTER_V2(_pointerToMLPData)) #if 0 #pragma mark - #pragma mark Link Status (LINK_STATUS) #endif /**************************************************************************** * Link Status Message (LINK_STATUS) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use LINK_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * * Link Status Message Size * ================================================= * Description Size (bytes) * ------------------------------------------------- * Header See Above * Timestamp seconds 4 * Timestamp nsec and pulse ID 4 * Timeslot 1 * Link Node ID 1 * Card Channels 34 * Output Card Status 2 * Link Node Status 2 * ------------------------------------------------- * Total Header + 48 * ================================================= * * Number of channels = ( 6 digital input cards + * 2 virtual input cards + * 8 BLM cards + * 1 BLM HVPS card ) * (16 channels / card) * = 272 channels * * Number of bytes = 272 channels / (8 channels / byte) * = 34 * * LINK_STATUS_NUMBER_OF_INPUT_CARDS = 6 digital input cards + 2 virtual input cards + 8 BLM cards + 1 BLM HVPS card * LINK_STATUS_NUMBER_OF_CHANNELS_PER_INPUT_CARD = 16 * */ #define LINK_STATUS_MESSAGE_SIZE_V2 (48 + MPSLinkProtocolHeaderSizeV2) #define LINK_STATUS_NUMBER_OF_INPUT_CARDS_V2 (6 + 2 + 8 + 1) #define LINK_STATUS_NUMBER_OF_CHANNELS_PER_INPUT_CARD_V2 (16) #define LINK_STATUS_NUMBER_OF_DEVICE_STATES_V2 (LINK_STATUS_NUMBER_OF_INPUT_CARDS_V2 * LINK_STATUS_NUMBER_OF_CHANNELS_PER_INPUT_CARD_V2) #define LINK_STATUS_NUMBER_OF_DEVICE_STATES_IN_BYTES_V2 (LINK_STATUS_NUMBER_OF_DEVICE_STATES_V2 / 8) #define LINK_STATUS_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 0)) #define LINK_STATUS_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 4)) #define LINK_STATUS_TIMESLOT_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 8)) #define LINK_STATUS_LINK_NODE_ID_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 9)) #define LINK_STATUS_INPUT_CARD_DATA_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 10)) #define LINK_STATUS_OUTPUT_CARD_DATA_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 43)) #define LINK_STATUS_LINK_NODE_STATUS_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 45)) #define LINK_STATUS_TIMESTAMP_SECPASTEPOCH_V2(_pointerToMLPData) (*LINK_STATUS_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToMLPData)) #define LINK_STATUS_TIMESTAMP_NSEC_PULSEID_V2(_pointerToMLPData) (*LINK_STATUS_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToMLPData)) #define LINK_STATUS_TIMESLOT_V2(_pointerToMLPData) (*LINK_STATUS_TIMESLOT_POINTER_V2(_pointerToMLPData)) #define LINK_STATUS_LINK_NODE_ID_V2(_pointerToMLPData) (*LINK_STATUS_LINK_NODE_ID_POINTER_V2(_pointerToMLPData)) #if 0 #pragma mark - #pragma mark Link Status Unlatch (LINK_STATUS_UNLATCH) #endif /**************************************************************************** * Link Status Unlatch Message (LINK_STATUS_UNLATCH) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use LINK_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * The Link Status Unlatch message is an exact copy of the Link Status message. * Only the message type in the message's header changes. * * Unlatch Message Size = Status Message Size */ #define LINK_STATUS_UNLATCH_MESSAGE_SIZE_V2 (LINK_STATUS_MESSAGE_SIZE_V2) #if 0 #pragma mark - #pragma mark Permit Message (PERMIT) #endif /**************************************************************************** * Permit Message (PERMIT) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use LINK_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * * Permit Message Size * ================================================= * Description Size (bytes) * ------------------------------------------------- * Header See Above * Timestamp seconds 4 * Timestamp nsec and pulse ID 4 * Timeslot 1 * Destination 1 * Estimated Beam Rate 1 * Mitigation device permit 4 * Rate after/at device 4 * Output Card Control 1 * ------------------------------------------------- * Total Header + 20 * ================================================= * * * PERMIT_DESTINATION can be decoded with MPSConstantAndTypes.h's enum MPSBeamDestinations. * * PERMIT_ESTIMATED_RATE can be decoded with MPSConstantAndTypes.h's enum MPSBeamRates. * * PERMIT_MITIGATION_PERMIT_POINTER gives a pointer to a four element epicsUInt8 array. * Bytes are non-zero if beam is permitted past the device and are zero if beam is not permitted. * Use MPSConstantAndTypes.h's enum MPSMitigationDevices to access elements in this array. * * PERMIT_MAX_RATE_AFTER_DEVICE_POINTER gives a pointer to a four element epicsUInt8 array. * The array contains the max beam rates allowed after each mitigation device. * Use MPSConstantAndTypes.h's enum MPSMitigationDevices to access elements in this array. * * PERMIT_OUTPUT_CARD_CONTROL a byte to control the output cards of Link Nodes in Digital Output mode. * One bit per output channel. LSBit = Channel 1, MSBit = Channel 8. */ #define PERMIT_MESSAGE_SIZE_V2 (20 + MPSLinkProtocolHeaderSizeV2) #define PERMIT_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 0)) #define PERMIT_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 4)) #define PERMIT_TIMESLOT_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 8)) #define PERMIT_DESTINATION_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 9)) #define PERMIT_ESTIMATED_RATE_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 10)) #define PERMIT_MITIGATION_PERMIT_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 11)) #define PERMIT_MAX_RATE_AFTER_DEVICE_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 15)) #define PERMIT_OUTPUT_CARD_CONTROL_POINTER_V2(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 19)) #define PERMIT_TIMESTAMP_SECPASTEPOCH_V2(_pointerToMLPData) (*PERMIT_TIMESTAMP_SECPASTEPOCH_POINTER_V2(_pointerToMLPData)) #define PERMIT_TIMESTAMP_NSEC_PULSEID_V2(_pointerToMLPData) (*PERMIT_TIMESTAMP_NSEC_PULSEID_POINTER_V2(_pointerToMLPData)) #define PERMIT_TIMESLOT_V2(_pointerToMLPData) (*PERMIT_TIMESLOT_POINTER_V2(_pointerToMLPData)) #define PERMIT_DESTINATION_V2(_pointerToMLPData) (*PERMIT_DESTINATION_POINTER_V2(_pointerToMLPData)) #define PERMIT_ESTIMATED_RATE_V2(_pointerToMLPData) (*PERMIT_ESTIMATED_RATE_POINTER_V2(_pointerToMLPData)) #define PERMIT_OUTPUT_CARD_CONTROL_V2(_pointerToMLPData) (*PERMIT_OUTPUT_CARD_CONTROL_POINTER_V2(_pointerToMLPData)) /**************************************************************************** * End of Message Definitions ****************************************************************************/ #ifdef __cplusplus } #endif #endif