00001 #ifndef artdaq_ots_Overlays_UDPFragment_hh
00002 #define artdaq_ots_Overlays_UDPFragment_hh
00003
00004 #include "artdaq-core/Data/Fragment.hh"
00005 #include "cetlib/exception.h"
00006
00007 #include <ostream>
00008 #include <vector>
00009
00010
00011
00012 namespace ots {
00013 class UDPFragment;
00014
00015
00016 std::ostream & operator << (std::ostream &, UDPFragment const &);
00017 }
00018
00019 class ots::UDPFragment {
00020 public:
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 struct Metadata {
00031
00032 typedef uint64_t data_t;
00033
00034 data_t port : 16;
00035 data_t address : 32;
00036 data_t unused : 16;
00037
00038 static size_t const size_words = 1ull;
00039 };
00040
00041 static_assert (sizeof (Metadata) == Metadata::size_words * sizeof (Metadata::data_t), "UDPFragment::Metadata size changed");
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 struct Header {
00060 typedef uint32_t data_t;
00061
00062 typedef uint32_t event_size_t;
00063 typedef uint32_t data_type_t;
00064
00065 event_size_t event_size : 28;
00066 event_size_t type : 4;
00067
00068 static size_t const size_words = 1ul;
00069 };
00070
00071 static_assert (sizeof (Header) == Header::size_words * sizeof (Header::data_t), "UDPFragment::Header size changed");
00072
00073
00074
00075
00076 UDPFragment(artdaq::Fragment const & f ) : artdaq_Fragment_(f) {}
00077
00078
00079
00080 Header::event_size_t hdr_event_size() const { return header_()->event_size; }
00081 Header::data_type_t hdr_data_type() const { return header_()->type; }
00082 static constexpr size_t hdr_size_words() { return Header::size_words; }
00083
00084
00085 size_t udp_data_words() const {
00086 return (hdr_event_size() - hdr_size_words()) * bytes_per_word_();
00087 }
00088
00089
00090 uint8_t const * dataBegin() const {
00091 return reinterpret_cast<uint8_t const *>(header_() + 1);
00092 }
00093
00094
00095 uint8_t const * dataEnd() const {
00096 return dataBegin() + udp_data_words();
00097 }
00098
00099 protected:
00100
00101
00102
00103
00104
00105 static constexpr size_t bytes_per_word_() {
00106 return sizeof(Header::data_t) / sizeof(uint8_t);
00107 }
00108
00109
00110
00111
00112
00113 Header const * header_() const {
00114 return reinterpret_cast<UDPFragment::Header const *>(artdaq_Fragment_.dataBeginBytes());
00115 }
00116
00117 private:
00118
00119 artdaq::Fragment const & artdaq_Fragment_;
00120 };
00121
00122 #endif