11 #include "STMDAQ-TestBeam/utils/Hex.hh"
14 #include "STMDAQ-TestBeam/processData/checkData.hh"
23 checkData::checkData() {}
27 void checkData::check_packets(
int chan, uint64_t data_len, int16_t*
data)
30 if(data_len % MAX_PACKET_LEN != 0)
32 Logger::Instance()->write(
34 "checkData::check_packets : Packet sizes incorrect! Channel = " +
35 udp.get_channel_name(chan) +
". Data size = " + std::to_string(data_len) +
36 " % MAX_PACKET_LEN = " + std::to_string(data_len % MAX_PACKET_LEN));
40 uint32_t last_packet = getLastPacketNum(chan);
46 last_packet = (uint16_t)
data[1] << 16 | (uint16_t)
data[0];
53 while(count < data_len)
56 uint64_t packet_start = count;
59 (uint16_t)
data[packet_start + 1] << 16 | (uint16_t)
data[packet_start];
62 check_pHdr(packet_num,
data[packet_start + 2]);
65 check_dropped_packets(chan, packet_num, last_packet);
68 last_packet = packet_num;
74 count += MAX_PACKET_LEN;
78 setLastPacketNum(chan, last_packet);
82 void checkData::check_dropped_packets(
int chan, uint32_t packet_num, uint32_t last_packet)
85 int diff = packet_num - last_packet;
89 Logger::Instance()->write(
91 "Packet number mismatch! Channel = " + udp.get_channel_name(chan) +
92 ", previous packet number = " + std::to_string(last_packet) +
93 ", previous packet number = " + std::to_string(packet_num));
94 std::cout <<
"Packet number mismatch! Channel = " << udp.get_channel_name(chan)
95 <<
", previous packet number = " << std::to_string(last_packet)
96 <<
", previous packet number = " << std::to_string(packet_num) <<
"\n";
103 dropped_packet_count[chan] += diff - 1;
105 for(
int j = 1; j < diff; j++)
108 Logger::Instance()->write(
110 "Dropped UDP packet warning: Channel = " + udp.get_channel_name(chan) +
111 ", missing packet number = " + std::to_string(last_packet + j));
112 std::cout <<
"Dropped UDP packet warning: Channel = "
113 << udp.get_channel_name(chan)
114 <<
", missing packet number = " << std::to_string(last_packet + j)
121 void checkData::check_pHdr(uint32_t packet_num, int16_t pHdr_end)
124 if((uint16_t)pHdr_end != fw_pHdr_end_data)
127 std::cout <<
"ERROR! Packet number " << std::to_string(packet_num)
128 <<
" has pHdrEnd " << std::to_string((uint16_t)pHdr_end)
129 <<
" instead of 65518 (0xFFEE)"
132 Logger::Instance()->write(
134 "ERROR! Packet number " + std::to_string(packet_num) +
" has pHdrEnd " +
135 std::to_string((uint16_t)pHdr_end) +
" instead of 65518 (0xFFEE)");
140 void checkData::check_tHdrs(
int chan, int16_t*
data, uint64_t packet_start)
143 uint32_t pnum = (uint16_t)
data[packet_start + 1] << 16 | (uint16_t)
data[packet_start];
146 uint16_t leftInPacket = MAX_PACKET_LEN - fw_pHdr_Len;
149 while(leftInPacket > fw_tHdr_Len)
152 uint64_t hdr_start_loc = packet_start + MAX_PACKET_LEN - leftInPacket;
154 uint64_t hdr_end_loc = hdr_start_loc + fw_tHdr_Len - 1;
157 uint64_t eLen_loc = hdr_start_loc + fw_tHdr::EvLen;
159 uint16_t eLen =
data[eLen_loc];
162 uint64_t evNum = check_fw_tHdr(chan,
data, hdr_start_loc);
165 leftInPacket -= fw_tHdr_Len;
172 if(
data[hdr_start_loc] != fw_tHdr::HdrStart_data[fw_tHdr::HdrStart_len - 1])
174 Logger::Instance()->write(
176 "ERROR! Event/trigger header mismatch!!\nPacket number = " +
177 std::to_string(pnum) +
". Event number = " + std::to_string(evNum));
181 leftInPacket -= eLen;
185 leftInPacket = dv.check_dead_beef(
data, packet_start, leftInPacket);
189 uint64_t checkData::check_fw_tHdr(
int chan, int16_t*
data, uint64_t hdr_index)
192 uint16_t channel =
data[hdr_index + tHdr_vars.Ch_DTCclk_0] & 0xFF;
198 for(uint i = 0; i < fw_tHdr_Len / 2; i++)
201 if((uint16_t)(
data[hdr_index + i * 2] & 0xFFFF) == BEEF and
202 (uint16_t)(
data[hdr_index + i * 2 + 1] & 0xFFFF) == DEAD)
205 deadbeef[chan] =
true;
210 deadbeef[chan] =
false;
216 Logger::Instance()->write(
218 "ERROR! Channel number " + std::to_string(channel) +
219 " in event/trigger header does not match expected channel number " +
220 std::to_string(chan));
241 uint64_t EvNum = dv.make_uint64_t(
data[hdr_index + tHdr_vars.EvNum_0],
242 data[hdr_index + tHdr_vars.EvNum_1],
243 data[hdr_index + tHdr_vars.EvNum_2],
247 uint64_t EWT = dv.make_uint64_t(
data[hdr_index + tHdr_vars.EWT_0],
248 data[hdr_index + tHdr_vars.EWT_1],
249 data[hdr_index + tHdr_vars.EWT_2],
255 Logger::Instance()->write(0,
256 "ERROR! Event number " + std::to_string(EvNum) +
257 " does not match Event Window Tag " +
258 std::to_string(EWT));
278 for(uint i = 0; i < tHdr_vars.HdrStart_len; i++)
280 if(
data[hdr_index + tHdr_vars.HdrStart_start + i] != tHdr_vars.HdrStart_data[i])
282 Logger::Instance()->write(
284 "ERROR! Event number " + std::to_string(EvNum) +
285 " has event header end value " +
286 std::to_string(
data[hdr_index + tHdr_vars.HdrStart_start + i]) +
287 " instead of " + std::to_string(tHdr_vars.HdrStart_data[i]) +
288 " for header index " + std::to_string(tHdr_vars.HdrStart_start + i));