1 #ifndef artdaq_ots_Overlays_UDPFragmentWriter_hh
2 #define artdaq_ots_Overlays_UDPFragmentWriter_hh
17 #include "artdaq-core/Data/Fragment.hh"
18 #include "artdaq-ots/Overlays/UDPFragment.hh"
23 class UDPFragmentWriter;
36 uint8_t * dataBegin();
43 assert(artdaq_Fragment_.dataSizeBytes() >=
sizeof(
Header) );
44 return reinterpret_cast<Header *
>( artdaq_Fragment_.dataBeginBytes());
47 void set_hdr_type(Header::data_type_t dataType) {
48 header_()->type = dataType & 0xF;
51 void resize(
size_t nBytes);
54 size_t calc_event_size_words_(
size_t nBytes);
56 static size_t bytes_to_words_(
size_t nBytes);
59 artdaq::Fragment & artdaq_Fragment_;
66 ots::UDPFragmentWriter::UDPFragmentWriter(artdaq::Fragment& f ) :
69 if ( ! f.hasMetadata() || f.dataSizeBytes() > 0 ) {
70 throw cet::exception(
"Error in UDPFragmentWriter: Raw artdaq::Fragment object does not appear to consist of (and only of) its own header + the UDPFragment::Metadata object");
74 artdaq_Fragment_.resizeBytes(
sizeof(Header) );
78 inline uint8_t * ots::UDPFragmentWriter::dataBegin() {
80 assert(artdaq_Fragment_.dataSizeBytes() >=
sizeof(Header) +
sizeof(artdaq::Fragment::value_type) );
81 return reinterpret_cast<uint8_t *
>(header_() + 1);
84 inline uint8_t * ots::UDPFragmentWriter::dataEnd() {
85 return dataBegin() + udp_data_words();
89 inline void ots::UDPFragmentWriter::resize(
size_t nBytes) {
91 artdaq_Fragment_.resizeBytes(
sizeof(Header::data_t) * calc_event_size_words_(nBytes) );
92 header_()->event_size = calc_event_size_words_(nBytes);
95 inline size_t ots::UDPFragmentWriter::calc_event_size_words_(
size_t nBytes) {
96 return bytes_to_words_(nBytes) + hdr_size_words();
99 inline size_t ots::UDPFragmentWriter::bytes_to_words_(
size_t nBytes) {
100 auto mod(nBytes % bytes_per_word_());
102 nBytes / bytes_per_word_() :
103 nBytes / bytes_per_word_() + 1;