9 #include <pxd/modules/pxdHelper/PXDRawDumper.h>
10 #include <boost/format.hpp>
11 #include <boost/spirit/home/support/detail/endian.hpp>
17 using namespace boost::spirit::endian;
26 m_storeRaw.isRequired();
29 void PXDRawDumperModule::event(
void)
33 unsigned int pxdTriggerNr = 0x0, tag = 0x0;
34 for (
auto& it : m_storeRaw) {
35 if (getTrigNr(it, pxdTriggerNr, tag))
break;
38 if (pxdTriggerNr != 0x0 && tag != 0x0) {
40 static int nr1 = 1000, nr2 = 1000;
46 for (
auto& it : m_storeRaw) {
48 string name = boost::str(boost::format(
"%08X_%08X_%d.pxd.dump") % tag % pxdTriggerNr % i);
49 B2ERROR(
"PXDRawDumper: Dump to " << name);
50 fh = fopen(name.c_str(),
"wt+");
52 fwrite(it.data(), 4, it.size(), fh);
61 bool PXDRawDumperModule::getTrigNr(
RawPXD& px,
unsigned int& innerDHH,
unsigned int& tag)
67 if (px.
size() <= 0 || px.
size() > 16 * 1024 * 1024) {
68 B2ERROR(
"PXD Unpacker --> invalid packet size (32bit words) " << hex << px.
size());
71 std::vector<unsigned int> data(px.
size());
72 fullsize = px.
size() * 4;
73 std::copy_n(px.
data(), px.
size(), data.begin());
77 B2ERROR(
"Data is to small to hold a valid Header! Will not unpack anything. Size:" << fullsize);
81 if (data[0] != 0xCAFEBABE && data[0] != 0xBEBAFECA) {
82 B2ERROR(
"Magic invalid: Will not unpack anything. Header corrupted! " << hex << data[0]);
86 Frames_in_event = ((ubig32_t*)data.data())[1];
87 if (Frames_in_event < 0 || Frames_in_event > 256) {
88 B2ERROR(
"Number of Frames invalid: Will not unpack anything. Header corrupted! Frames in event: " << Frames_in_event);
92 unsigned int* tableptr;
95 unsigned int* dataptr;
96 dataptr = &tableptr[Frames_in_event];
97 datafullsize = fullsize - 2 * 4 - Frames_in_event * 4;
100 for (
int j = 0; j < Frames_in_event; j++) {
102 lo = ((ubig32_t*)tableptr)[j];
104 B2ERROR(
"size of frame invalid: " << j <<
"size " << lo <<
" at byte offset in dataptr " << ll);
107 if (ll + lo > datafullsize) {
108 B2ERROR(
"frames exceed packet size: " << j <<
" size " << lo <<
" at byte offset in dataptr " << ll <<
" of datafullsize " <<
109 datafullsize <<
" of fullsize " << fullsize);
113 B2ERROR(
"SKIP Frame with Data with not MOD 4 length " <<
" ( $" << hex << lo <<
" ) ");
114 ll += (lo + 3) & 0xFFFFFFFC;
116 B2INFO(
"unpack DHE(C) frame: " << j <<
" with size " << lo <<
" at byte offset in dataptr " << ll);
117 if (unpack_dhc_frame(ll + (
char*)dataptr, innerDHH, tag))
return true;
124 bool PXDRawDumperModule::unpack_dhc_frame(
void* data,
unsigned int& innerDHH,
unsigned int& tag)
127 #define DHC_FRAME_HEADER_DATA_TYPE_DHC_START 0xB
128 #define DHC_FRAME_HEADER_DATA_TYPE_DHC_END 0xC
130 switch (((*(ubig16_t*)data) & 0x7800) >> 11) {
131 case DHC_FRAME_HEADER_DATA_TYPE_DHC_START: {
132 unsigned int hi = ((ubig16_t*)data)[2];
133 innerDHH = (hi << 16) | ((ubig16_t*)data)[1];
134 tag = ((ubig32_t*)data)[3];