File indexing completed on 2025-06-28 06:19:07
0001 #ifndef EventFilter_Utilities_DTHHeaders_h
0002 #define EventFilter_Utilities_DTHHeaders_h
0003
0004 #include <array>
0005 #include <cstddef>
0006 #include <cstdint>
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 namespace evf {
0017 constexpr uint32_t SLR_MAX_EVENT_LEN = (1 << 20) - 1;
0018 constexpr std::array<uint8_t, 2> DTHOrbitMarker{{0x48, 0x4f}};
0019 constexpr std::array<uint8_t, 2> DTHFragmentTrailerMarker{{0x54, 0x46}};
0020 constexpr uint32_t DTH_WORD_NUM_BYTES_SHIFT = 4;
0021 constexpr uint32_t SLR_WORD_NUM_BYTES_SHIFT = 4;
0022
0023 class DTHOrbitHeader_v1 {
0024 public:
0025 DTHOrbitHeader_v1(uint32_t source_id,
0026 uint32_t run_number,
0027 uint32_t orbit_number,
0028 uint16_t event_count,
0029 uint32_t packed_word_count,
0030 uint32_t flags,
0031 uint32_t crc)
0032 : source_id_(source_id),
0033 run_number_(run_number),
0034 orbit_number_(orbit_number),
0035 event_count_(event_count),
0036 packed_word_count_(packed_word_count),
0037 crc32c_(crc) {
0038 flags_.all_ = flags;
0039 }
0040
0041 uint16_t version() const { return version_; }
0042 uint32_t sourceID() const { return source_id_; }
0043 uint32_t runNumber() const { return run_number_; }
0044 uint32_t orbitNumber() const { return orbit_number_; }
0045 uint16_t eventCount() const { return event_count_; }
0046 uint32_t packed_word_count() const { return packed_word_count_; }
0047 uint32_t flags() const { return flags_.all_; }
0048 uint32_t crc() const { return crc32c_; }
0049
0050 uint64_t totalSize() const { return uint64_t(packed_word_count_) << DTH_WORD_NUM_BYTES_SHIFT; }
0051 uint64_t payloadSizeBytes() const { return totalSize() - sizeof(DTHOrbitHeader_v1); }
0052 uint64_t headerSize() const { return sizeof(DTHOrbitHeader_v1); }
0053 const void* payload() const { return (uint8_t*)this + sizeof(DTHOrbitHeader_v1); }
0054 bool verifyMarker() const {
0055 for (size_t i = 0; i < DTHOrbitMarker.size(); i++) {
0056 if (marker_[i] != DTHOrbitMarker[i])
0057 return false;
0058 }
0059 return true;
0060 }
0061
0062 bool verifyChecksum() const;
0063
0064 private:
0065 std::array<uint8_t, 2> marker_ = DTHOrbitMarker;
0066 uint16_t version_ = 1;
0067 uint32_t source_id_;
0068 uint32_t run_number_;
0069 uint32_t orbit_number_;
0070 uint32_t event_count_ : 12, res_ : 20;
0071 uint32_t packed_word_count_;
0072 union {
0073 struct {
0074 uint32_t error_flag_ : 1, res_flags_ : 31;
0075 } bits_;
0076 uint32_t all_;
0077 } flags_;
0078 uint32_t crc32c_;
0079 };
0080
0081 class DTHFragmentTrailer_v1 {
0082 public:
0083 DTHFragmentTrailer_v1(uint16_t flags, uint32_t payload_word_count, uint64_t event_id, uint16_t crc)
0084 : payload_word_count_(payload_word_count), event_id_(event_id), crc_(crc) {
0085 flags_.all_ = flags;
0086 }
0087
0088 uint64_t eventID() const { return event_id_; }
0089 uint32_t payloadWordCount() const { return payload_word_count_; }
0090 uint64_t payloadSizeBytes() const { return uint64_t(payload_word_count_) << DTH_WORD_NUM_BYTES_SHIFT; }
0091 uint16_t flags() const { return flags_.all_; }
0092 uint16_t crc() const { return crc_; }
0093 const void* payload() const { return (uint8_t*)this - payloadSizeBytes(); }
0094 bool verifyMarker() const {
0095 for (size_t i = 0; i < DTHFragmentTrailerMarker.size(); i++) {
0096 if (marker_[i] != DTHFragmentTrailerMarker[i])
0097 return false;
0098 }
0099 return true;
0100 }
0101
0102 private:
0103 std::array<uint8_t, 2> marker_ = DTHFragmentTrailerMarker;
0104 union {
0105 struct {
0106 uint16_t fed_crc_error_ : 1, slink_crc_error_ : 1, source_id_error_ : 1, fragment_cut_ : 1,
0107 event_id_sync_error_ : 1, fragment_timout_ : 1, fragment_length_error_ : 1, res_ : 9;
0108 } bits_;
0109 uint16_t all_;
0110 } flags_;
0111 uint32_t
0112 payload_word_count_;
0113 uint64_t event_id_ : 44, res_ : 4, crc_ : 16;
0114 };
0115
0116 }
0117
0118 #endif