tdaq-develop-2025-02-12
UDPFragment.hh
1 #ifndef artdaq_ots_Overlays_UDPFragment_hh
2 #define artdaq_ots_Overlays_UDPFragment_hh
3 
4 #include "artdaq-core/Data/Fragment.hh"
5 #include "cetlib_except/exception.h"
6 
7 #include <ostream>
8 #include <vector>
9 
12 namespace ots
13 {
14 class UDPFragment;
15 
17 std::ostream& operator<<(std::ostream&, UDPFragment const&);
18 } // namespace ots
19 
21 {
22  public:
31  struct Metadata
32  {
33  typedef uint64_t data_t;
34 
35  data_t port : 16;
36  data_t address : 32;
37  data_t unused : 16;
38 
39  static size_t const size_words = 1ull;
40  };
41 
42  static_assert(sizeof(Metadata) == Metadata::size_words * sizeof(Metadata::data_t),
43  "UDPFragment::Metadata size changed");
44 
60  struct Header
61  {
62  typedef uint32_t data_t;
63 
64  typedef uint32_t event_size_t;
65  typedef uint32_t data_type_t;
66 
67  event_size_t event_size : 28;
68  event_size_t type : 4;
69 
70  static size_t const size_words = 1ul;
71  };
72 
73  static_assert(sizeof(Header) == Header::size_words * sizeof(Header::data_t),
74  "UDPFragment::Header size changed");
75 
79  UDPFragment(artdaq::Fragment const& f) : artdaq_Fragment_(f) {}
80 
83  Header::event_size_t hdr_event_size() const { return header_()->event_size; }
84  Header::data_type_t hdr_data_type() const { return header_()->type; }
85  static constexpr size_t hdr_size_words() { return Header::size_words; }
86 
88  size_t udp_data_words() const
89  {
90  return (hdr_event_size() - hdr_size_words()) * bytes_per_word_();
91  }
92 
94  uint8_t const* dataBegin() const
95  {
96  return reinterpret_cast<uint8_t const*>(header_() + 1);
97  }
98 
100  uint8_t const* dataEnd() const { return dataBegin() + udp_data_words(); }
101 
102  protected:
107  static constexpr size_t bytes_per_word_()
108  {
109  return sizeof(Header::data_t) / sizeof(uint8_t);
110  }
111 
116  Header const* header_() const
117  {
118  return reinterpret_cast<UDPFragment::Header const*>(
119  artdaq_Fragment_.dataBeginBytes());
120  }
121 
122  private:
123  artdaq::Fragment const& artdaq_Fragment_;
124 };
125 
126 #endif /* artdaq_ots_Overlays_UDPFragment_hh */
UDPFragment(artdaq::Fragment const &f)
Definition: UDPFragment.hh:79
static constexpr size_t bytes_per_word_()
Definition: UDPFragment.hh:107
uint8_t const * dataBegin() const
Start of the UDP data, returned as a pointer.
Definition: UDPFragment.hh:94
size_t udp_data_words() const
UDP Data Word Count.
Definition: UDPFragment.hh:88
uint8_t const * dataEnd() const
End of the UDP data, returned as a pointer.
Definition: UDPFragment.hh:100
Header const * header_() const
Definition: UDPFragment.hh:116
Header::event_size_t hdr_event_size() const
Definition: UDPFragment.hh:83
std::ostream & operator<<(std::ostream &, UDPFragment const &)
Let the "<<" operator dump the UDPFragment's data to stdout.
Definition: UDPFragment.cc:3
static size_t const size_words
Units of Header::data_t.
Definition: UDPFragment.hh:70
static size_t const size_words
Units of Metadata::data_t.
Definition: UDPFragment.hh:39