/* * MPSLinkProtocol.h * MPSLinkProcessor * * Created by Stephen Norum. * Copyright 2007 Stanford Linear Accelerator Center. All rights reserved. * */ #ifndef MPSLINKPROTOCOL_H #define MPSLINKPROTOCOL_H #ifdef __cplusplus extern "C" { #endif #include #if 0 #pragma mark - #pragma mark Message Types and Common #endif /**************************************************************************** * Message Types and Common ****************************************************************************/ enum { MPSLinkProtocolVersionInvalid = 0, MPSLinkProtocolVersion1 = 1, MPSLinkProtocolVersion2 = 2, MPSLinkProtocolVersion3 = 3, MPSLinkProtocolVersionCurrent = MPSLinkProtocolVersion3, MPSLinkProtocolPort = 56789, MPSLinkProtocolResponsePort = 56790 }; enum MPSLinkProtocolMessageTypes { MPSMessageTypeInvalid = 0x00, /* Outgoing Message Types LP to LNs */ MPSLinkProcessorMessageTypeSynchronization = 0x01, MPSLinkProcessorMessageTypePermit = 0x02, MPSLinkProcessorMessageTypeUnlatchStatus = 0x10, MPSLinkProcessorMessageTypeUnlatchStatusBlm = 0x11, MPSLinkProcessorMessageTypeUnlatchStatusPic = 0x12, /* Incoming Message Types LNs to LP */ MPSLinkNodeMessageTypeStatus = 0x80, MPSLinkNodeMessageTypeStatusBlm = 0x81, MPSLinkNodeMessageTypeStatusPic = 0x82, /* Beam Synchronous Acquisition Messages */ MPSBSAMessageTypeEnble = 0x70, MPSBSAMessageTypeBsaData = 0xB0 }; typedef enum MPSLinkProtocolMessageTypes MPSLinkProtocolMessageType; #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 { MPSLinkProtocolHeaderSize = 2, MPSLinkProtocolMessageSizeMin = MPSLinkProtocolHeaderSize, MPSLinkProtocolMessageSizeMax = 1400, MPSLinkProtocolDataSizeMin = 0, MPSLinkProtocolDataSizeMax = MPSLinkProtocolMessageSizeMax - MPSLinkProtocolHeaderSize }; #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(_pointerToMLPMessage) ((epicsInt8 *)(_pointerToMLPMessage) + 0) #define LINK_MESSAGE_PROTOCOL_VERSION_POINTER(_pointerToMLPHeader) ((epicsUInt8 *)(_pointerToMLPHeader) + 0) #define LINK_MESSAGE_TYPE_POINTER(_pointerToMLPHeader) ((epicsUInt8 *)(_pointerToMLPHeader) + 1) #define LINK_MESSAGE_DATA_SECTION_POINTER(_pointerToMLPMessage) ((epicsInt8 *)(_pointerToMLPMessage) + 2) #define LINK_MESSAGE_PROTOCOL_VERSION(_pointerToMLPHeader) (*LINK_MESSAGE_PROTOCOL_VERSION_POINTER(_pointerToMLPHeader)) #define LINK_MESSAGE_TYPE(_pointerToMLPHeader) (*LINK_MESSAGE_TYPE_POINTER(_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 (9 + MPSLinkProtocolHeaderSize) #define LINK_SYNC_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 0)) #define LINK_SYNC_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 4)) #define LINK_SYNC_TIMESLOT_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 8)) #define LINK_SYNC_TIMESTAMP_SECPASTEPOCH(_pointerToMLPData) (*LINK_SYNC_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData)) #define LINK_SYNC_TIMESTAMP_NSEC_PULSEID(_pointerToMLPData) (*LINK_SYNC_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData)) #define LINK_SYNC_TIMESLOT(_pointerToMLPData) (*LINK_SYNC_TIMESLOT_POINTER(_pointerToMLPData)) #if 0 #pragma mark - #pragma mark Link Status Common (LINK_STATUS_COMMON) #endif /**************************************************************************** * Common Link Status Message Data (LINK_STATUS_COMMON) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use LINK_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * * Link Status Common * ================================================= * Description Size (bytes) * ------------------------------------------------- * Header See Above * Timestamp seconds 4 * Timestamp nsec and pulse ID 4 * Timeslot 1 * Link Node ID 1 * Output Card Status 2 * Link Node Status 2 * Digital Input Cards 12 * Virutal Input Cards 4 * ------------------------------------------------- * Total Header + 30 * ================================================= * * Digital Input Cards = 6 digital input cards * 16 channels / card * 8 channels / byte * = 6 * 16 / 8 bytes * = 12 bytes * * Virtual Input Cards = 2 virtual input cards * 16 channels / card * 8 channels / byte * = 2 * 16 / 8 bytes * = 4 bytes * * LINK_STATUS_COMMON_NUMBER_OF_INPUT_CARDS = 6 digital input cards + 2 virtual input cards * */ #define LINK_STATUS_COMMON_MESSAGE_SIZE (30 + MPSLinkProtocolHeaderSize) #define LINK_STATUS_COMMON_NUMBER_OF_INPUT_CARDS (6 + 2) #define LINK_STATUS_COMMON_NUMBER_OF_CHANNELS_PER_INPUT_CARD (16) #define LINK_STATUS_COMMON_NUMBER_OF_DEVICE_STATES (LINK_STATUS_COMMON_NUMBER_OF_INPUT_CARDS * LINK_STATUS_COMMON_NUMBER_OF_CHANNELS_PER_INPUT_CARD) #define LINK_STATUS_COMMON_NUMBER_OF_DEVICE_STATES_IN_BYTES (LINK_STATUS_COMMON_NUMBER_OF_DEVICE_STATES / 8) #define LINK_STATUS_COMMON_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 0)) #define LINK_STATUS_COMMON_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 4)) #define LINK_STATUS_COMMON_TIMESLOT_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 8)) #define LINK_STATUS_COMMON_LINK_NODE_ID_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 9)) #define LINK_STATUS_COMMON_OUTPUT_CARD_DATA_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 10)) #define LINK_STATUS_COMMON_LINK_NODE_STATUS_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 12)) #define LINK_STATUS_COMMON_INPUT_CARD_DATA_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 14)) #define LINK_STATUS_COMMON_TIMESTAMP_SECPASTEPOCH(_pointerToMLPData) (*LINK_STATUS_COMMON_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData)) #define LINK_STATUS_COMMON_TIMESTAMP_NSEC_PULSEID(_pointerToMLPData) (*LINK_STATUS_COMMON_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData)) #define LINK_STATUS_COMMON_TIMESLOT(_pointerToMLPData) (*LINK_STATUS_COMMON_TIMESLOT_POINTER(_pointerToMLPData)) #define LINK_STATUS_COMMON_LINK_NODE_ID(_pointerToMLPData) (*LINK_STATUS_COMMON_LINK_NODE_ID_POINTER(_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) * ------------------------------------------------- * Link Status Common See Above * ------------------------------------------------- * Total Link Status Common * ================================================= * * Additional bytes required = Number of additional cards * (16 channels / card) / (8 channels / byte) * = Number of additional cards * 2 bytes */ #define LINK_STATUS_NUMBER_OF_ADDITIONAL_CARDS (0) #define LINK_STATUS_NUMBER_OF_ADDITIONAL_BYTES (LINK_STATUS_NUMBER_OF_ADDITIONAL_CARDS * 2) #define LINK_STATUS_NUMBER_OF_INPUT_CARDS (LINK_STATUS_NUMBER_OF_ADDITIONAL_CARDS + LINK_STATUS_COMMON_NUMBER_OF_INPUT_CARDS) #define LINK_STATUS_MESSAGE_SIZE (LINK_STATUS_NUMBER_OF_ADDITIONAL_BYTES + LINK_STATUS_COMMON_MESSAGE_SIZE) #define LINK_STATUS_NUMBER_OF_ADDITIONAL_STATES (LINK_STATUS_NUMBER_OF_ADDITIONAL_CARDS * LINK_STATUS_COMMON_NUMBER_OF_CHANNELS_PER_INPUT_CARD) #define LINK_STATUS_NUMBER_OF_DEVICE_STATES (LINK_STATUS_NUMBER_OF_ADDITIONAL_STATES + LINK_STATUS_COMMON_NUMBER_OF_DEVICE_STATES) #define LINK_STATUS_NUMBER_OF_DEVICE_STATES_IN_BYTES (LINK_STATUS_NUMBER_OF_DEVICE_STATES / 8) #if 0 #pragma mark - #pragma mark Link Status (LINK_STATUS_BLM) #endif /**************************************************************************** * Link Status BLM Message (LINK_STATUS_BLM) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use LINK_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * * Link Status BLM Message Size * ================================================= * Description Size (bytes) * ------------------------------------------------- * Link Status Common See Above * BLM Input Cards 16 * BLM HVPS Input Card 2 * ------------------------------------------------- * Total Link Status Common + 18 * ================================================= * * Number of additional cards = 8 BLM cards + 1 BLM HVPS card * = 9 cards * * Additional bytes required = Number of additional cards * (16 channels / card) / (8 channels / byte) * = Number of additional cards * 2 bytes */ #define LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_CARDS (9) #define LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_BYTES (LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_CARDS * 2) #define LINK_STATUS_BLM_NUMBER_OF_INPUT_CARDS (LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_CARDS + LINK_STATUS_COMMON_NUMBER_OF_INPUT_CARDS) #define LINK_STATUS_BLM_MESSAGE_SIZE (LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_BYTES + LINK_STATUS_COMMON_MESSAGE_SIZE) #define LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_STATES (LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_CARDS * LINK_STATUS_COMMON_NUMBER_OF_CHANNELS_PER_INPUT_CARD) #define LINK_STATUS_BLM_NUMBER_OF_DEVICE_STATES (LINK_STATUS_BLM_NUMBER_OF_ADDITIONAL_STATES + LINK_STATUS_COMMON_NUMBER_OF_DEVICE_STATES) #define LINK_STATUS_BLM_NUMBER_OF_DEVICE_STATES_IN_BYTES (LINK_STATUS_BLM_NUMBER_OF_DEVICE_STATES / 8) #if 0 #pragma mark - #pragma mark Link Status (LINK_STATUS_PIC) #endif /**************************************************************************** * Link Status PIC Message (LINK_STATUS_PIC) ****************************************************************************/ /* Note: All offsets from beginning of data section. * Use LINK_MESSAGE_DATA_SECTION_POINTER to obtain this location. * * * Link Status PIC Message Size * ================================================= * Description Size (bytes) * ------------------------------------------------- * Link Status Common See Above * PIC Input Cards 64 * ------------------------------------------------- * Total Link Status Common + 64 * ================================================= * * Number of additional cards = 32 PIC cards * * Additional bytes required = Number of additional cards * (16 channels / card) / (8 channels / byte) * = Number of additional cards * 2 bytes */ #define LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_CARDS (32) #define LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_BYTES (LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_CARDS * 2) #define LINK_STATUS_PIC_NUMBER_OF_INPUT_CARDS (LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_CARDS + LINK_STATUS_COMMON_NUMBER_OF_INPUT_CARDS) #define LINK_STATUS_PIC_MESSAGE_SIZE (LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_BYTES + LINK_STATUS_COMMON_MESSAGE_SIZE) #define LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_STATES (LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_CARDS * LINK_STATUS_COMMON_NUMBER_OF_CHANNELS_PER_INPUT_CARD) #define LINK_STATUS_PIC_NUMBER_OF_DEVICE_STATES (LINK_STATUS_PIC_NUMBER_OF_ADDITIONAL_STATES + LINK_STATUS_COMMON_NUMBER_OF_DEVICE_STATES) #define LINK_STATUS_PIC_NUMBER_OF_DEVICE_STATES_IN_BYTES (LINK_STATUS_PIC_NUMBER_OF_DEVICE_STATES / 8) #if 0 #pragma mark - #pragma mark Link Status Unlatch Messages #endif /**************************************************************************** * Link Status Unlatch Messages ****************************************************************************/ /* Link Status Unlatch messages are exact copies of the Link Status messages * except for the messages' types. */ #define LINK_STATUS_UNLATCH_MESSAGE_SIZE (LINK_STATUS_MESSAGE_SIZE) #define LINK_STATUS_BLM_UNLATCH_MESSAGE_SIZE (LINK_STATUS_BLM_MESSAGE_SIZE) #define LINK_STATUS_PIC_UNLATCH_MESSAGE_SIZE (LINK_STATUS_PIC_MESSAGE_SIZE) #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 (20 + MPSLinkProtocolHeaderSize) #define PERMIT_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 0)) #define PERMIT_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 4)) #define PERMIT_TIMESLOT_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 8)) #define PERMIT_DESTINATION_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 9)) #define PERMIT_ESTIMATED_RATE_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 10)) #define PERMIT_MITIGATION_PERMIT_POINTER(_pointerToMLPData) ((epicsUInt8 *)(_pointerToMLPData) + 11) #define PERMIT_MAX_RATE_AFTER_DEVICE_POINTER(_pointerToMLPData) ((epicsUInt8 *)(_pointerToMLPData) + 15) #define PERMIT_OUTPUT_CARD_CONTROL_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 19)) #define PERMIT_TIMESTAMP_SECPASTEPOCH(_pointerToMLPData) (*PERMIT_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData)) #define PERMIT_TIMESTAMP_NSEC_PULSEID(_pointerToMLPData) (*PERMIT_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData)) #define PERMIT_TIMESLOT(_pointerToMLPData) (*PERMIT_TIMESLOT_POINTER(_pointerToMLPData)) #define PERMIT_DESTINATION(_pointerToMLPData) (*PERMIT_DESTINATION_POINTER(_pointerToMLPData)) #define PERMIT_ESTIMATED_RATE(_pointerToMLPData) (*PERMIT_ESTIMATED_RATE_POINTER(_pointerToMLPData)) #define PERMIT_OUTPUT_CARD_CONTROL(_pointerToMLPData) (*PERMIT_OUTPUT_CARD_CONTROL_POINTER(_pointerToMLPData)) #if 0 #pragma mark - #pragma mark Destination Message (DEST) #endif /**************************************************************************** * Destination Message (DEST) ****************************************************************************/ /* 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 * Max Rate After Pockels Cell 1 * Max Rate After Mechanical Shutter 1 * Max Rate After BYKIK 1 * Max Rate After Heater Shutter 1 * * ------------------------------------------------- * Total Header + 20 * ================================================= * * */ #define DEST_MESSAGE_SIZE (20 + MPSLinkProtocolHeaderSize) #define DEST_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 0)) #define DEST_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData) ((epicsUInt32 *)((epicsInt8 *)(_pointerToMLPData) + 4)) #define DEST_TIMESLOT_POINTER(_pointerToMLPData) ((epicsUInt8 *)((epicsInt8 *)(_pointerToMLPData) + 8)) #define DEST_TIMESTAMP_SECPASTEPOCH(_pointerToMLPData) (*PERMIT_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToMLPData)) #define DEST_TIMESTAMP_NSEC_PULSEID(_pointerToMLPData) (*PERMIT_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToMLPData)) #define DEST_TIMESLOT(_pointerToMLPData) (*PERMIT_TIMESLOT_POINTER(_pointerToMLPData)) /**************************************************************************** * End of Message Definitions ****************************************************************************/ #ifdef __cplusplus } #endif #endif