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