otsdaq  3.06.00
UDPFragmentWriter.hh
1 #ifndef artdaq_ots_Overlays_UDPFragmentWriter_hh
2 #define artdaq_ots_Overlays_UDPFragmentWriter_hh
3 
16 
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "artdaq-ots/Overlays/UDPFragment.hh"
19 
20 #include <iostream>
21 
22 namespace ots
23 {
24 class UDPFragmentWriter;
25 }
26 
28 {
29  public:
30  UDPFragmentWriter(artdaq::Fragment& f);
31 
35  uint8_t* dataBegin();
36  uint8_t* dataEnd();
37 
42  {
43  assert(artdaq_Fragment_.dataSizeBytes() >= sizeof(Header));
44  return reinterpret_cast<Header*>(artdaq_Fragment_.dataBeginBytes());
45  }
46 
47  void set_hdr_type(Header::data_type_t dataType) { header_()->type = dataType & 0xF; }
48 
49  void resize(size_t nBytes);
50 
51  private:
52  size_t calc_event_size_words_(size_t nBytes);
53 
54  static size_t bytes_to_words_(size_t nBytes);
55 
57  artdaq::Fragment& artdaq_Fragment_;
58 };
59 
65  : UDPFragment(f)
66  , artdaq_Fragment_(f)
67 {
68  if(!f.hasMetadata() || f.dataSizeBytes() > 0)
69  {
70  throw cet::exception(
71  "Error in UDPFragmentWriter: Raw artdaq::Fragment object does not appear to "
72  "consist of (and only of) its own header + the UDPFragment::Metadata object");
73  }
74 
76  artdaq_Fragment_.resizeBytes(sizeof(Header));
77 }
78 
80 {
82  assert(artdaq_Fragment_.dataSizeBytes() >=
83  sizeof(Header) + sizeof(artdaq::Fragment::value_type));
84  return reinterpret_cast<uint8_t*>(header_() + 1);
85 }
86 
87 inline uint8_t* ots::UDPFragmentWriter::dataEnd()
88 {
89  return dataBegin() + udp_data_words();
90 }
91 
92 inline void ots::UDPFragmentWriter::resize(size_t nBytes)
93 {
94  artdaq_Fragment_.resizeBytes(sizeof(Header::data_t) * calc_event_size_words_(nBytes));
95  header_()->event_size = calc_event_size_words_(nBytes);
96 }
97 
98 inline size_t ots::UDPFragmentWriter::calc_event_size_words_(size_t nBytes)
99 {
100  return bytes_to_words_(nBytes) + hdr_size_words();
101 }
102 
103 inline size_t ots::UDPFragmentWriter::bytes_to_words_(size_t nBytes)
104 {
105  auto mod(nBytes % bytes_per_word_());
106  return (mod == 0) ? nBytes / bytes_per_word_() : nBytes / bytes_per_word_() + 1;
107 }
108 
109 #endif /* artdaq_demo_Overlays_UDPFragmentWriter_hh */
UDPFragmentWriter(artdaq::Fragment &f)
defines used also by OtsConfigurationWizardSupervisor