void readSubEvents(hadaq::RawEvent* evnt);
signed analyzeData(hadaq::RawSubevent* sub, unsigned ix, unsigned datalen, unsigned source);
+signed analyzeSubEvent(hadaq::RawSubevent* sub, unsigned pos, unsigned datalen, unsigned source);
unsigned getSensor(unsigned sensorId);
void writeResults();
hadaq::RawSubevent* sub = 0;
while ((sub=evnt->NextSubevent(sub))!=0) {
unsigned trbSubEvSize = sub->GetSize() / 4 - 4;
- unsigned ix = 0;
- while (ix < trbSubEvSize) {
- unsigned data = sub->Data(ix++);
+#if DEBUG>=2
+ printf("Subevent Size\t%08x\n",
+ trbSubEvSize);
+#endif
+ unsigned pos = 0;
+ while(trbSubEvSize-pos>1){
+ unsigned data = sub->Data(pos);
unsigned datalen = (data >> 16) & 0xFFFF;
unsigned source = (data >> 0) & 0xFFFF;
+ if (datalen == 0){
+ break; // Hub: END of SubEvent
+ }
#if DEBUG>=1
- printf("Source\t%04x\tLength\t%04x\n",
- source, datalen);
-#endif
- signed ret = analyzeData(sub, ix, datalen, source);
- ix+=datalen;
- if(ret == -32) {break;}
- }
+ printf("Source\t%04x\tLength\t%04x\n",
+ source, datalen);
+#endif
+ analyzeSubEvent(sub,pos,datalen,source);
+ pos += datalen+1;
}
}
+ }
+signed analyzeSubEvent(hadaq::RawSubevent* sub, unsigned pos, unsigned datalen, unsigned source) {
+
+ unsigned format = sub->Data(pos+1);
+#if DEBUG>=1
+ printf("form\t%08x\n",format);
+#endif
+ unsigned hversion = (format & 0xff000000) >> 24;
+ unsigned dversion = (format & 0x00ff0000) >> 16;
+ unsigned hnum = (format & 0x0000ffff);
+ unsigned oldheader = 0;
+ if ( (format & 0xffffffff) == 0xffffffff)
+ oldheader = 1;
+
+#if DEBUG>=1
+ printf("hver\t%02x\tdver\t%02x\thnum\t%04x\told\t%01x\n",
+ hversion, dversion, hnum, oldheader);
+#endif
+
+ unsigned timer1 = 0x0;
+ unsigned timer2 = 0x0;
+ unsigned found_external = 0x0;
+ unsigned frame_length = 0x0;
+ unsigned frame_id = 0x0;
+ unsigned frame_status = 0x0;
+ unsigned frame_debug = 0x0;
+ unsigned frame_timestamp = 0x0;
+ unsigned frame_errcode = 0x0;
+ unsigned frame_external = 0x0;
+ unsigned frame_fnum = 0x0;
+ int v2 = 0;
+
+ unsigned data;
+ unsigned pdata;
+ if (oldheader){
+ data = sub->Data(pos+2);
+ //data = data >> 16;
+ if ((data >> 16) == 0xf002){
+ //v2
+ v2 = 1;
+ if ((data & 0x0000ffff) == 0x0){
+ // no testmode
+ pdata = pos+3;
+ frame_id = (source << 16) | sub->Data(pdata++) >> 16;
+ frame_status = sub->Data(pdata++);
+ pdata++;
+ pdata++;
+ frame_external = sub->Data(pdata++);
+ frame_fnum = sub->Data(pdata++);
+ }
+ else{
+ //testmode
+ printf("ERROR: Testmode Active!\n");
+ return -1;
+ }
+ }
+ else{
+ //v1
+ pdata = pos+2;
+ frame_id = (source << 16) | sub->Data(pdata++) >> 16;
+ frame_status = sub->Data(pdata++);
+ frame_errcode = sub->Data(pdata++);
+ frame_debug = sub->Data(pdata++);
+ pdata++;
+ frame_timestamp = sub->Data(pdata++);
+ }
+ }
+
+ // New Format
+ else{
+ if(hversion == 0x1){
+ data = sub->Data(pos+2);
+ timer1 = (data & 0x00ffffff);
+ found_external = data >> 31;
+ countMarkedFrames += found_external;
+ if (hnum == 2)
+ timer2 = sub->Data(pos+3);
+
+ pdata = pos+2+hnum;
+ if (dversion == 0x0){
+ printf("ERROR: Data Version 0x0 is not implemented!\n");
+ return -1;
+ }
+ else if (dversion == 0x1){
+ data = sub->Data(pdata++);
+ frame_id = (data & 0x000000ff);
+ frame_id = (source << 16) | frame_id;
+ frame_length = data >> 16;
+ frame_status = sub->Data(pdata++);
+ frame_debug = sub->Data(pdata++);
+ frame_timestamp = sub->Data(pdata++);
+ }
+ else if (dversion == 0x2){
+ data = sub->Data(pdata);
+ frame_id = (data & 0x000000ff);
+ frame_id = (source << 16) | frame_id;
+ frame_status = (data & 0x0000ff00) >> 8;
+ frame_length = data >> 16;
+ pdata = pdata++;
+ }
+ else{
+ printf("ERROR: Unsupported Data Version!\n");
+ return -1;
+ }
+
+ }
+ else{
+ printf("ERROR: Unsupported Header Version!\n");
+ return -1;
+ }
+
+
+ }
+
+
+ // Process the DATA
+
+ unsigned mySensor = getSensor(frame_id);
+#if DEBUG>=1
+ printf("Sensor\t%02x\tID\t%08x\tStatus\t%08x\tError\t%08x\tDebug\t%08x\n",
+ mySensor, frame_id, frame_status, frame_errcode, frame_debug);
+#endif
+
+ if (sub->Data(pdata) != 0x55555555) {
+ printf("ERROR: Sensor Header (0x55555555) Not Found! (got: %08x)\n",sub->Data(pdata));
+ return -1;
+ }
+
+ unsigned sensorIsValid = 0;
+ if(frame_status == 0xf000000f) {
+ sensorIsValid = 1;
+ //statistics[mySensor][FRVALID]++;
+ }
+ else if(frame_status == 0xff) { // New Format, DVERSION 0x2+
+ sensorIsValid = 1;
+ //statistics[mySensor][FRVALID]++;
+ }
+ else{
+ sensorIsValid = 0;
+ statistics[mySensor][FRBROKEN]++;
+ }
+
+ if(sensorIsValid){
+ //Hey Sensor, tell me who you are!
+ pdata++;
+ unsigned sensorNumber = sub->Data(pdata++);
+ unsigned sensorLength = sub->Data(pdata++) & 0xffff;
+
+// unsigned frameEndPos = ix + sensorLength;
+ unsigned d,line = 0,column,pixels,statecnt = 0,ovf = 0;
+ #if DEBUG>=1
+ printf("\t\t\tFrame\t%08x\tLength\t%i\n",
+ sensorNumber, sensorLength);
+ #endif
+ if(sensorLength > 580) {
+ printf("Invalid length. Something wrong.\n");
+ statistics[mySensor][FRBROKEN]++;
+ return -1;
+ }
+ else if(sensorLength == 0) {
+ if (sub->Data(pdata) == 0x80018001){
+ statistics[mySensor][FRVALID]++;
+ return 1;
+ }
+ else{
+ printf("No Trailer. Something wrong.\n");
+ statistics[mySensor][FRBROKEN]++;
+ return -1;
+ }
+ }
+
+ unsigned cntdata = sensorLength;
+ while(cntdata>0x0) {
+ for(unsigned i = 0; i<=1; i++) {
+
+ if (v2==1){
+ if(i==0) d = (sub->Data(pdata) & 0x0000ffff);
+ else{
+ d = (sub->Data(pdata++) >> 16);
+ cntdata--;
+ }
+ }
+ else{
+ if(i==0) d = sub->Data(pdata) >> 16;
+ else{
+ d = (sub->Data(pdata++) & 0x0000ffff);
+ cntdata--;
+ }
+ }
+
+ #if DEBUG>=2
+ printf("\tdx >>> %04x\n",d);
+ #endif
+
+ if(statecnt-- == 0) {
+ ovf += (d >> 15) & 1;
+ line = (d >> 4) & 0x7FF;
+ statecnt = d & 0xF;
+ pixelcount[mySensor][1152]++;
+ }
+ else {
+ pixels = (d & 0x3);
+ column = (d >> 2) & 0x7FF;
+ #if DEBUG>=2
+ printf("\t%d, %d x %d\n",line,column,pixels+1);
+ #endif
+ pixelcount[mySensor][column] += pixels+1;
+
+ pixelMap[mySensor][line][column]++;
+ if (pixels) {
+ pixelMap[mySensor][line][column+1]++;
+ if (pixels > 1) {
+ pixelMap[mySensor][line][column+2]++;
+ if (pixels > 2) {
+ pixelMap[mySensor][line][column+3]++;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (sub->Data(pdata) == 0x80018001){
+ statistics[mySensor][FRVALID]++;
+ return 1;
+ }
+ else{
+ printf("No Trailer. Something wrong.\n");
+ statistics[mySensor][FRBROKEN]++;
+ return -1;
+ }
+
+ } // End(If Sensor Valid)
+
+ return 1;
+ }
+
+
signed analyzeData(hadaq::RawSubevent* sub, unsigned ix, unsigned datalen, unsigned source) {
if (source == 0x5555) return -32;
if (datalen == 0) return -33;
return 0;
}
-
-
void writeResults() {
printf ("===============\n");