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/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
00038 struct Metadata {
00039
00040 typedef uint8_t data_t;
00041 typedef uint32_t run_number_t;
00042
00043 data_t sim_mode : 4;
00044 data_t unused : 4;
00045
00046 data_t board_id;
00047 data_t unused2;
00048 data_t unused3;
00049
00050 run_number_t run_number;
00051
00052 static size_t const size_words = 8ul;
00053 };
00054
00055 static_assert (sizeof (Metadata) == Metadata::size_words * sizeof (Metadata::data_t), "DTCFragment::Metadata size changed");
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 struct Header {
00069 typedef uint8_t data_t;
00070
00071 typedef uint64_t timestamp_t;
00072 typedef uint32_t data_size_t;
00073
00074 data_size_t event_size;
00075
00076 timestamp_t timestamp : 48;
00077 timestamp_t unused : 16;
00078
00079
00080 static size_t const size_words = 16ul;
00081 };
00082
00083 static_assert (sizeof (Header) == Header::size_words * sizeof (Header::data_t), "DTCFragment::Header size changed");
00084
00085
00086
00087
00088 DTCFragment(artdaq::Fragment const & f ) : artdaq_Fragment_(f) {}
00089
00090
00091 Header::data_size_t hdr_packet_count() const { return header_()->event_size; }
00092 Header::timestamp_t hdr_timestamp() const { return header_()->timestamp; }
00093
00094 static constexpr size_t hdr_size_words() { return Header::size_words; }
00095
00096 size_t dataSize() const {
00097 return hdr_packet_count() * words_per_packet_();
00098 }
00099
00100
00101 packet_t const * dataBegin() const {
00102 return reinterpret_cast<packet_t const *>(header_() + 1);
00103 }
00104
00105
00106 packet_t const * dataEnd() const {
00107 return dataBegin() + hdr_packet_count();
00108 }
00109
00110 protected:
00111
00112
00113
00114
00115
00116
00117 static constexpr size_t words_per_packet_() {
00118 return sizeof(packet_t) / sizeof(Header::data_t);
00119 }
00120
00121 static constexpr size_t words_per_frag_word_() {
00122 return sizeof(artdaq::Fragment::value_type) / sizeof(Header::data_t);
00123 }
00124
00125
00126
00127
00128
00129 Header const * header_() const {
00130 return reinterpret_cast<DTCFragment::Header const *>(&*artdaq_Fragment_.dataBegin());
00131 }
00132
00133 private:
00134
00135 artdaq::Fragment const & artdaq_Fragment_;
00136 };
00137
00138 #endif