$treeview $search $mathjax $extrastylesheet
artdaq
v3_04_01
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #ifndef artdaq_DAQrate_detail_RequestMessage_hh 00002 #define artdaq_DAQrate_detail_RequestMessage_hh 00003 00004 #include "artdaq-core/Data/Fragment.hh" 00005 #define MAX_REQUEST_MESSAGE_SIZE 65000 00006 00007 namespace artdaq 00008 { 00009 namespace detail 00010 { 00011 struct RequestPacket; 00012 struct RequestHeader; 00013 class RequestMessage; 00014 00018 enum class RequestMessageMode : uint8_t 00019 { 00020 Normal = 0, 00021 EndOfRun = 1, 00022 }; 00023 00030 inline std::ostream& operator<<(std::ostream& o, RequestMessageMode m) 00031 { 00032 switch (m) 00033 { 00034 case RequestMessageMode::Normal: 00035 o << "Normal"; 00036 break; 00037 case RequestMessageMode::EndOfRun: 00038 o << "EndOfRun"; 00039 break; 00040 } 00041 return o; 00042 } 00043 00044 } 00045 } 00046 00050 struct artdaq::detail::RequestPacket 00051 { 00052 public: 00054 uint32_t header; //TRIG, or 0x54524947 00055 Fragment::sequence_id_t sequence_id; 00056 Fragment::timestamp_t timestamp; 00057 00061 RequestPacket() 00062 : header(0) 00063 , sequence_id(Fragment::InvalidSequenceID) 00064 , timestamp(Fragment::InvalidTimestamp) 00065 {} 00066 00072 RequestPacket(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& ts) 00073 : header(0x54524947) 00074 , sequence_id(seq) 00075 , timestamp(ts) 00076 {} 00077 00082 bool isValid() const { return header == 0x54524947; } 00083 }; 00084 00088 struct artdaq::detail::RequestHeader 00089 { 00091 uint32_t header; //HEDR, or 0x48454452 00092 uint32_t packet_count; 00093 int rank; 00094 uint32_t run_number; 00095 RequestMessageMode mode; 00096 00100 RequestHeader() : header(0x48454452) 00101 , packet_count(0) 00102 , rank(my_rank) 00103 , run_number(0) 00104 , mode(RequestMessageMode::Normal) 00105 {} 00106 00111 bool isValid() const { return header == 0x48454452; } 00112 }; 00113 00117 class artdaq::detail::RequestMessage 00118 { 00119 public: 00123 RequestMessage() : header_() 00124 , packets_() 00125 {} 00126 00131 std::vector<uint8_t> GetMessage() 00132 { 00133 auto size = sizeof(RequestHeader) + packets_.size() * sizeof(RequestPacket); 00134 header_.packet_count = packets_.size(); 00135 assert(size < MAX_REQUEST_MESSAGE_SIZE); 00136 auto output = std::vector<uint8_t>(size); 00137 memcpy(&output[0], &header_, sizeof(RequestHeader)); 00138 memcpy(&output[sizeof(RequestHeader)], &packets_[0], packets_.size() * sizeof(RequestPacket)); 00139 00140 return output; 00141 } 00142 00147 void setMode(RequestMessageMode mode) 00148 { 00149 header_.mode = mode; 00150 } 00151 00156 void setRank(int rank) 00157 { 00158 header_.rank = rank; 00159 } 00160 00166 void setRunNumber(int run) 00167 { 00168 header_.run_number = run; 00169 } 00170 00175 size_t size() const { return packets_.size(); } 00176 00182 void addRequest(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& time) 00183 { 00184 packets_.emplace_back(RequestPacket(seq, time)); 00185 } 00186 00187 private: 00188 RequestHeader header_; 00189 std::vector<RequestPacket> packets_; 00190 }; 00191 00192 #endif // artdaq_DAQrate_detail_RequestMessage