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 enum class RequestMessageMode
00015 {
00016 Normal = 0,
00017 EndOfRun = 1,
00018 };
00019 }
00020 }
00021
00025 struct artdaq::detail::RequestPacket
00026 {
00027 public:
00029 uint32_t header;
00030 Fragment::sequence_id_t sequence_id;
00031 Fragment::timestamp_t timestamp;
00032
00036 RequestPacket()
00037 : header(0)
00038 , sequence_id(Fragment::InvalidSequenceID)
00039 , timestamp(Fragment::InvalidTimestamp) {}
00040
00046 RequestPacket(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& ts)
00047 : header(0x54524947)
00048 , sequence_id(seq)
00049 , timestamp(ts) {}
00050
00055 bool isValid() const { return header == 0x54524947; }
00056 };
00057
00061 struct artdaq::detail::RequestHeader
00062 {
00064 uint32_t header;
00065 uint32_t packet_count;
00066 RequestMessageMode mode ;
00067
00071 RequestHeader() : header(0x48454452)
00072 , packet_count(0)
00073 , mode(RequestMessageMode::Normal)
00074 {}
00075
00080 bool isValid() const { return header == 0x48454452; }
00081 };
00082
00086 class artdaq::detail::RequestMessage
00087 {
00088 public:
00092 RequestMessage() : header_()
00093 , packets_() { }
00094
00099 RequestHeader* header()
00100 {
00101 header_.packet_count = packets_.size();
00102 return &header_;
00103 }
00104
00109 RequestPacket* buffer() { return &packets_[0]; }
00114 size_t size() const { return packets_.size(); }
00115
00121 void addRequest(const Fragment::sequence_id_t& seq, const Fragment::timestamp_t& time)
00122 {
00123 packets_.emplace_back(RequestPacket(seq, time));
00124 }
00125
00126 private:
00127 RequestHeader header_;
00128 std::vector<RequestPacket> packets_;
00129 };
00130
00131 #endif // artdaq_DAQrate_detail_RequestMessage