00001 #ifndef artdaq_DAQrate_detail_RequestMessage_hh 00002 #define artdaq_DAQrate_detail_RequestMessage_hh 00003 00004 #include "artdaq-core/Data/Fragment.hh" 00005 00006 namespace artdaq 00007 { 00008 namespace detail 00009 { 00010 struct RequestPacket; 00011 struct RequestHeader; 00012 class RequestMessage; 00013 } 00014 } 00015 00019 struct artdaq::detail::RequestPacket 00020 { 00021 public: 00023 uint32_t header; //TRIG, or 0x54524947 00024 Fragment::sequence_id_t sequence_id; 00025 Fragment::timestamp_t timestamp; 00026 00030 RequestPacket() 00031 : header(0) 00032 , sequence_id(Fragment::InvalidSequenceID) 00033 , timestamp(Fragment::InvalidTimestamp) {} 00034 00040 RequestPacket(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& ts) 00041 : header(0x54524947) 00042 , sequence_id(seq) 00043 , timestamp(ts) {} 00044 00049 bool isValid() const { return header == 0x54524947; } 00050 }; 00051 00055 struct artdaq::detail::RequestHeader 00056 { 00058 uint32_t header; //HEDR, or 0x48454452 00059 uint32_t packet_count; 00060 00064 RequestHeader() : header(0x48454452) 00065 , packet_count(0) {} 00066 00071 bool isValid() const { return header == 0x48454452; } 00072 }; 00073 00077 class artdaq::detail::RequestMessage 00078 { 00079 public: 00083 RequestMessage() : header_() 00084 , packets_() { } 00085 00090 RequestHeader* header() 00091 { 00092 header_.packet_count = packets_.size(); 00093 return &header_; 00094 } 00095 00100 RequestPacket* buffer() { return &packets_[0]; } 00105 size_t size() const { return packets_.size(); } 00106 00112 void addRequest(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& time) 00113 { 00114 packets_.emplace_back(RequestPacket(seq, time)); 00115 } 00116 00117 private: 00118 RequestHeader header_; 00119 std::vector<RequestPacket> packets_; 00120 }; 00121 00122 #endif // artdaq_DAQrate_detail_RequestMessage