Jpp  18.0.0-rc.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
clb_common_header.hh
Go to the documentation of this file.
1 #ifndef DATAQUEUE_DATAFORMATS_CLB_COMMON_HEADER_HH
2 #define DATAQUEUE_DATAFORMATS_CLB_COMMON_HEADER_HH
3 
4 #include <utility>
5 #include <ostream>
6 #include <stdint.h>
7 #include <cassert>
8 #include <cstdlib>
9 #include <arpa/inet.h>
10 
11 #include "utctime.hh"
12 
13 /**
14  * \author cpellegrino
15  */
16 
18 {
19  uint32_t DataType;
20  uint32_t RunNumber;
23  uint32_t DOMIdentifier;
24  uint32_t DOMStatus1;
25  uint32_t DOMStatus2;
26  uint32_t DOMStatus3;
27  uint32_t DOMStatus4;
28 
29  uint32_t dataType() const
30  {
31  return ntohl(DataType);
32  }
33 
34  uint32_t runNumber() const
35  {
36  return ntohl(RunNumber);
37  }
38 
39  uint32_t udpSequenceNumber() const
40  {
41  return ntohl(UDPSequenceNumber);
42  }
43 
45  {
46  return Timestamp;
47  }
48 
49  uint32_t domIdentifier() const
50  {
51  return ntohl(DOMIdentifier);
52  }
53 
54  uint32_t domStatus(int n = 1) const
55  {
56  switch (n) {
57  case 1:
58  return ntohl(DOMStatus1);
59  case 2:
60  return ntohl(DOMStatus2);
61  case 3:
62  return ntohl(DOMStatus3);
63  case 4:
64  return ntohl(DOMStatus4);
65  default:
66  assert(!"Programming error: invalid field requested");
67  abort();
68  }
69  }
70 };
71 
72 inline std::ostream& operator <<(std::ostream& stream, const CLBCommonHeader& header)
73 {
74  return stream << "DataType: " << header.dataType() << '\n'
75  << "RunNumber: " << header.runNumber() << '\n'
76  << "UDPSequenceNumber: " << header.udpSequenceNumber() << '\n'
77  << "Timestamp: \n" << header.timeStamp() << '\n'
78  << "DOMIdentifier: " << header.domIdentifier() << '\n'
79  << "DOMStatus1: " << header.domStatus(1) << '\n'
80  << "DOMStatus2: " << header.domStatus(2) << '\n'
81  << "DOMStatus3: " << header.domStatus(3) << '\n'
82  << "DOMStatus4: " << header.domStatus(4);
83 }
84 
85 typedef uint64_t frame_idx_t;
86 
87 inline
89  CLBCommonHeader const& header,
90  uint64_t start_run_ms,
91  int ts_duration_ms)
92 {
93  uint64_t const tstamp_ms = header.timeStamp().inMilliSeconds();
94 
95  return std::make_pair(
96  (tstamp_ms - start_run_ms) / ts_duration_ms,
97  tstamp_ms > start_run_ms);
98 }
99 
100 inline
102  CLBCommonHeader const& header,
103  uint64_t start_run_ms,
104  int ts_duration_ms)
105 {
106  std::pair<uint32_t, bool> const seq_num = seq_number(header, start_run_ms, ts_duration_ms);
107  frame_idx_t value = seq_num.first;
108  value <<= 32;
109  value += header.domIdentifier();
110  return value;
111 }
112 
113 inline
114 uint32_t dom_id(frame_idx_t idx)
115 {
116  frame_idx_t const mask = 0x00000000FFFFFFFF;
117 
118  return idx & mask;
119 }
120 
121 inline
122 bool validTimeStamp(CLBCommonHeader const& header)
123 {
124  const static uint32_t mask = 0x80000000;
125 
126  return header.domStatus() & mask;
127 }
128 
129 inline
130 bool isTrailer(CLBCommonHeader const& header)
131 {
132  const static uint32_t mask = 0x80000000;
133 
134  return header.domStatus(2) & mask;
135 }
136 
137 #endif // DATAQUEUE_DATAFORMATS_CLB_COMMON_HEADER_HH
uint32_t dom_id(frame_idx_t idx)
uint32_t domIdentifier() const
uint32_t runNumber() const
frame_idx_t data2idx(CLBCommonHeader const &header, uint64_t start_run_ms, int ts_duration_ms)
UTCTime timeStamp() const
uint32_t UDPSequenceNumber
uint64_t frame_idx_t
uint32_t domStatus(int n=1) const
const int n
Definition: JPolint.hh:697
bool validTimeStamp(CLBCommonHeader const &header)
uint32_t udpSequenceNumber() const
bool isTrailer(CLBCommonHeader const &header)
uint32_t dataType() const
std::pair< uint32_t, bool > seq_number(CLBCommonHeader const &header, uint64_t start_run_ms, int ts_duration_ms)
std::ostream & operator<<(std::ostream &stream, const CLBCommonHeader &header)
uint64_t inMilliSeconds() const
Definition: utctime.hh:27