#pragma once #include #include #include #include /* header definitions are based on * Development and Implementation of a New Trigger and * Data Acquisition System for the HADES Detector (2012) * by Jan Michel * chapter 5.1 */ class TrbBridgeTrbNetHeaderException : public std::exception { public: explicit TrbBridgeTrbNetHeaderException(const std::string& what_arg = "") : _what(what_arg) {} virtual const char* what() const throw() {return _what.c_str();} private: std::string _what; }; struct TrbBridgeTrbNetEventHeader { uint32_t size; /**< size in bytes incl header and padding (should by dividable by 8 but not enforced here */ uint16_t triggerType; uint32_t eventNumberPerFile; /**< i-th event in hld file */ std::time_t timestamp; uint32_t runNumber; /**< random run number that all events in an hld file share */ bool swappedEndianess; /** * Adds padding (if necessary) and sets size. * @return size of padding required in bytes */ size_t setSizeWithPadding(size_t sizeWoPadding); /** * Write values defined above into buffer. * * @param buffer Destination to write to; require >=32 bytes of space */ void writeToBuffer(uint32_t *buffer) const; /** * Load values defined above from buffer * * @param buffer Pointer to first word of header */ void loadFromBuffer(const uint32_t* buffer); /** * synonym for loadFromBuffer. */ TrbBridgeTrbNetEventHeader operator<<(const uint32_t* buffer); }; uint32_t* operator<<(uint32_t* buffer, const TrbBridgeTrbNetEventHeader & evtHdr); struct TrbBridgeTrbNetSubEventHeader { uint32_t size; /**< size in bytes incl header and padding (should by dividable by 8 but not enforced here */ uint16_t subEventId; /**< "endpoint id" */ uint32_t triggerNumber; /**< sequential trigger number generated by CTS */ uint8_t triggerCode; /**< random trigger code generated by CTS */ uint8_t triggerType; /**< not specified, but GbE and CBMNet bridge include it never-the-less */ bool swappedEndianess; /** * Write values defined above into buffer. * * @param buffer Destination to write to; require >=16 bytes of space */ void writeToBuffer(uint32_t *buffer) const; /** * Load values defined above from buffer * * @param buffer Pointer to first word of header */ void loadFromBuffer(const uint32_t* buffer); /** * synonym for loadFromBuffer. */ TrbBridgeTrbNetSubEventHeader operator<<(const uint32_t* buffer); }; uint32_t* operator<<(uint32_t* buffer, const TrbBridgeTrbNetSubEventHeader & subEvtHdr); struct TrbBridgeTrbNetSubSubEventHeader { uint16_t subSubEventId; uint16_t size; /**< size in bytes incl. header */ uint32_t* payload; TrbBridgeTrbNetSubSubEventHeader(unsigned int ssEvtId=0, unsigned int size=0, uint32_t* payload=0); /** * Searches for all sub-sub-events with-in an sub-event * @param subEventHeader * @param buffer Pointer to the first word of the sub-event (i.e. the header) * @return list of sub-sub-events found */ static std::list extractSubSubEvents(const TrbBridgeTrbNetSubEventHeader & subEventHeader, uint32_t* buffer) throw (TrbBridgeTrbNetHeaderException); };