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
00017 enum class RequestMessageMode : uint8_t
00018 {
00019 Normal = 0,
00020 EndOfRun = 1,
00021 };
00022
00029 inline std::ostream& operator<<(std::ostream& o, RequestMessageMode m)
00030 {
00031 switch (m)
00032 {
00033 case RequestMessageMode::Normal:
00034 o << "Normal";
00035 break;
00036 case RequestMessageMode::EndOfRun:
00037 o << "EndOfRun";
00038 break;
00039 }
00040 return o;
00041 }
00042
00043 }
00044 }
00045
00049 struct artdaq::detail::RequestPacket
00050 {
00051 public:
00053 uint32_t header;
00054 Fragment::sequence_id_t sequence_id;
00055 Fragment::timestamp_t timestamp;
00056
00060 RequestPacket()
00061 : header(0)
00062 , sequence_id(Fragment::InvalidSequenceID)
00063 , timestamp(Fragment::InvalidTimestamp)
00064 {}
00065
00071 RequestPacket(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& ts)
00072 : header(0x54524947)
00073 , sequence_id(seq)
00074 , timestamp(ts)
00075 {}
00076
00081 bool isValid() const { return header == 0x54524947; }
00082 };
00083
00087 struct artdaq::detail::RequestHeader
00088 {
00090 uint32_t header;
00091 uint32_t packet_count;
00092 RequestMessageMode mode;
00093
00097 RequestHeader() : header(0x48454452)
00098 , packet_count(0)
00099 , mode(RequestMessageMode::Normal)
00100 {}
00101
00106 bool isValid() const { return header == 0x48454452; }
00107 };
00108
00112 class artdaq::detail::RequestMessage
00113 {
00114 public:
00118 RequestMessage() : header_()
00119 , packets_()
00120 {}
00121
00126 RequestHeader* header()
00127 {
00128 header_.packet_count = packets_.size();
00129 return &header_;
00130 }
00131
00136 RequestPacket* buffer() { return &packets_[0]; }
00141 size_t size() const { return packets_.size(); }
00142
00148 void addRequest(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& time)
00149 {
00150 packets_.emplace_back(RequestPacket(seq, time));
00151 }
00152
00153 private:
00154 RequestHeader header_;
00155 std::vector<RequestPacket> packets_;
00156 };
00157
00158 #endif // artdaq_DAQrate_detail_RequestMessage