1 #ifndef mu2e_artdaq_core_Overlays_DTCFragment_hh
2 #define mu2e_artdaq_core_Overlays_DTCFragment_hh
4 #include "artdaq-core/Data/Fragment.hh"
6 #include "cetlib_except/exception.h"
17 typedef uint8_t packet_t[16];
19 std::ostream &operator<<(std::ostream &, DTCFragment
const &);
41 typedef uint8_t data_t;
42 typedef uint16_t data_size_t;
43 typedef uint64_t timestamp_t;
46 data_size_t BlockByteCount;
48 data_t SubsystemID : 4;
49 data_t PacketType : 4;
54 data_size_t PacketCount : 11;
55 data_size_t unused2 : 5;
57 data_size_t TimestampLow;
58 data_size_t TimestampMed;
59 data_size_t TimestampHigh;
67 static size_t const size_words = 16ul;
70 static_assert(
sizeof(
Header) == Header::size_words *
sizeof(Header::data_t),
"DTCFragment::Header size changed");
76 : artdaq_Fragment_(f) {}
79 Header::data_size_t hdr_byte_count()
const {
return header_()->BlockByteCount; }
80 Header::data_t hdr_subsystem_id()
const {
return header_()->SubsystemID; }
81 Header::data_t hdr_packet_type()
const {
return header_()->PacketType; }
82 Header::data_t hdr_roc_id()
const {
return header_()->ROCID; }
83 bool hdr_is_valid()
const {
return header_()->Valid; }
84 Header::data_t hdr_status()
const {
return header_()->Status; }
85 Header::data_t hdr_data_format_version()
const {
return header_()->FormatVersion; }
86 Header::data_t hdr_dtc_id()
const {
return header_()->DTCID; }
87 Header::data_t hdr_evb_mode()
const {
return header_()->EVBMode; }
88 Header::data_size_t hdr_packet_count()
const {
return header_()->PacketCount; }
89 Header::timestamp_t hdr_timestamp()
const
91 return static_cast<Header::timestamp_t
>(header_()->TimestampLow)
92 + (static_cast<Header::timestamp_t>(header_()->TimestampMed) << 16)
93 + (static_cast<Header::timestamp_t>(header_()->TimestampHigh) << 32);
96 static constexpr
size_t hdr_size_words() {
return Header::size_words; }
98 size_t dataSize()
const {
return hdr_packet_count() * words_per_packet_(); }
101 packet_t
const *dataBegin()
const {
return reinterpret_cast<packet_t
const *
>(header_() + 1); }
104 packet_t
const *dataEnd()
const {
return dataBegin() + hdr_packet_count(); }
112 static constexpr
size_t words_per_packet_() {
return sizeof(packet_t) /
sizeof(Header::data_t); }
114 static constexpr
size_t words_per_frag_word_()
116 return sizeof(artdaq::Fragment::value_type) /
sizeof(Header::data_t);
123 Header
const *header_()
const
125 return reinterpret_cast<DTCFragment::Header
const *
>(&*artdaq_Fragment_.dataBegin());
129 artdaq::Fragment
const &artdaq_Fragment_;