]> jspc29.x-matter.uni-frankfurt.de Git - mvdsensorcontrol.git/commitdiff
unpacker: multi-sensor support; tabstop fixes
authorMaps <maps@ikf>
Thu, 2 Jul 2015 18:13:36 +0000 (20:13 +0200)
committerMaps <maps@ikf>
Thu, 2 Jul 2015 18:13:36 +0000 (20:13 +0200)
tools/unpacker/unpacker.cxx

index fa7f919271f0900a585f9a68f3f2c14cd6cdefba..6bd2d94dcfe563f38087a35bfe2a2751c782ee1f 100644 (file)
@@ -1,11 +1,11 @@
 #include "hadaq/api.h"
 #include <time.h>
 
-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);
+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();
+void writeResults();
 
 #define DEBUG 0
 #define MAX_SENSORS 12
@@ -18,9 +18,9 @@ unsigned countMarkedFrames = 0;
 unsigned sensors[MAX_SENSORS];
 
 #define FRREALBROKEN 0
-#define FRBROKEN     1
-#define FRVALID      2
-#define FROVERFLOW   3
+#define FRBROKEN 1
+#define FRVALID        2
+#define FROVERFLOW 3
 
 const char* filename = "file.hld";
 const char* picPath = "./png";
@@ -29,539 +29,537 @@ const char* mySystem = "NONE";
 
 int main(int argc, char** argv) {
 
-  if (argc>1) filename = argv[1];
-  if (argc>2) picPath = argv[2];
-  if (argc>3) mySystem = argv[3];  
+       if (argc>1) filename = argv[1];
+       if (argc>2) picPath = argv[2];
+       if (argc>3) mySystem = argv[3];
 
-  hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(filename);
-  hadaq::RawEvent* evnt = 0;
-  while((evnt = ref.NextEvent(1.)) != 0) {
-    readSubEvents(evnt);
+       hadaq::ReadoutHandle ref = hadaq::ReadoutHandle::Connect(filename);
+       hadaq::RawEvent* evnt = 0;
+       while((evnt = ref.NextEvent(1.)) != 0) {
+               readSubEvents(evnt);
 #if DEBUG>=1
-    printf("------------------------\n");
-#endif     
-    }
-  writeResults();
-  return 0;
-
+               printf("------------------------\n");
+#endif
+               }
+       writeResults();
+       return 0;
 }
 
 unsigned getSensor(unsigned sensorId) {
-  for(unsigned i = 0; i < numSensors; i++) {
-    if (sensors[i] == sensorId) {
-      return i;
-      }
-    }
-  if (numSensors == MAX_SENSORS) { return -1;}  
-  
-  sensors[numSensors] = sensorId;
-  return numSensors++;
-  }
+       for(unsigned i = 0; i < numSensors; i++) {
+               if (sensors[i] == sensorId) {
+                       return i;
+                       }
+               }
+       if (numSensors == MAX_SENSORS) { return -1;}
+
+       sensors[numSensors] = sensorId;
+       return numSensors++;
+       }
 
 
 void readSubEvents(hadaq::RawEvent* evnt) {
-  hadaq::RawSubevent* sub = 0;
-  while ((sub=evnt->NextSubevent(sub))!=0) {
-    unsigned trbSubEvSize = sub->GetSize() / 4 - 4;
+       hadaq::RawSubevent* sub = 0;
+       while ((sub=evnt->NextSubevent(sub))!=0) {
+               unsigned trbSubEvSize = sub->GetSize() / 4 - 4;
 #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
-      }
+               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);
+                       printf("Source\t%04x\tLength\t%04x\n",
+                                       source, datalen);
 #endif
-      analyzeSubEvent(sub,pos,datalen,source);
-      pos += datalen+1;
-    }
-  }
-  }
+                       if(source >= 0xd000 && source < 0xe000) { //look at ROCs only
+                               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);
+       unsigned format;
+       unsigned timer1 = 0x0;
+       unsigned timer2 = 0x0;
+       unsigned found_external = 0x0;
+       unsigned hversion;
+       unsigned dversion;
+       unsigned hnum;
+       unsigned data;
+       unsigned pdata = 0x0;
+
+       format = sub->Data(pos+1);
 #if DEBUG>=1
-  printf("form\t%08x\n",format);
+       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;
+       hversion        = (format & 0xff000000) >> 24;
+       dversion        = (format & 0x00ff0000) >> 16;
+       hnum            = (format & 0x0000ffff);
+       #if DEBUG>=1
+       printf("hver\t%02x\tdver\t%02x\thnum\t%04x\n",
+                       hversion, dversion, hnum);
+       #endif
+       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;
+               }
+               else{
+                       printf("ERROR: Unsupported Header Version!\n");
+                       return -1;
+               }
 
-#if DEBUG>=1
-      printf("hver\t%02x\tdver\t%02x\thnum\t%04x\told\t%01x\n",
-                  hversion, dversion, hnum, oldheader);
+
+       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 v1 = 0;
+       int v2 = 0;
+       int v3 = 0;
+       // Process the DATA
+       unsigned end = pos + datalen -1;
+       while(true) {
+#if DEBUG>=2
+               printf("pdata: %08x datalen: %08x\n",pdata, datalen);
 #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 (pdata >= end) break;
+               if (dversion == 0x1){
+                       v1 = 1;
+                       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++);
+                       //sub->Data(pdata++); // start 0x555555555
+                       //sub->Data(pdata++); // frame number
+                       //sub->Data(pdata++); // frame length (same in upper and lower 16bits)
+               }
+               else if (dversion == 0x2){
+                       v2 = 1;
+                       data = sub->Data(pdata);
+                       frame_id = (data & 0x000000ff);
+                       frame_id = (source << 16) | frame_id;
+                       frame_status = (data & 0x0000ff00) >> 8;
+                       frame_length = data >> 16;
+                       pdata++;
+               }
+               else if (dversion == 0x3){
+                       v3 = 1;
+                       data = sub->Data(pdata++);
+                       frame_id = (data & 0x0000ffff);
+                       frame_id = (source << 16) | frame_id;
+                       frame_length = data >> 16;
+                       frame_status = sub->Data(pdata++) & 0xffff;
+                       frame_timestamp = sub->Data(pdata++);
+                       frame_external  = sub->Data(pdata++);
+
+                       //printf(">x    %x      %x      %x      %x\n",frame_id,frame_length,frame_status,frame_timestamp);
+               }
+               else{
+                       printf("ERROR: Unsupported Data Version!\n");
+                       continue;
+               }
+               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; 
-  }
-  
-  
+               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));
+                       continue;
+                       }
+
+               unsigned sensorIsValid = 0;
+               if (v1 == 1){
+                       if(frame_status == 0xf000000f) {
+                               sensorIsValid = 1;
+                       }
+                       else{
+                               sensorIsValid = 0;
+                               statistics[mySensor][FRBROKEN]++;
+                               }
+                       }
+               else if (v2 == 1){
+                       if(frame_status == 0xf) {
+                               sensorIsValid = 1;
+                               }
+                       else{
+                               sensorIsValid = 0;
+                               statistics[mySensor][FRBROKEN]++;
+                               }
+                       }
+               else if (v3 == 1){
+                       if (frame_status == 0x0) {
+                               sensorIsValid = 1;
+                               }
+                       else{
+                               sensorIsValid = 0;
+                               statistics[mySensor][FRBROKEN]++;
+                               }
+                       }
+
+               if(sensorIsValid && frame_length>0x0){
+                       //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]++;
+                               continue;
+                       }
+                       else if(sensorLength == 0) {
+                               if (sub->Data(pdata) == 0x80018001){
+                                       statistics[mySensor][FRVALID]++;
+                                       pdata++;
+                                       continue;
+                                       }
+                               else{
+                                       printf("No Trailer. Something wrong.\n");
+                                       statistics[mySensor][FRBROKEN]++;
+                                       pdata++;
+                                       continue;
+                                       }
+                               }
+
+                       unsigned cntdata = sensorLength;
+                       while(cntdata>0x0) {
+                               for(unsigned i = 0; i<=1; i++) {
+                                       if (v2==1 || v3 == 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]++;
+                               pdata++;
+                               continue;
+                               }
+                       else{
+                               printf("No Trailer. Something wrong.\n");
+                               statistics[mySensor][FRBROKEN]++;
+                               pdata++;
+                               continue;
+                               }
+                       }       // 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;
-  unsigned RocEnd       = ix + datalen -1;
-  int v2 = 0;
-  
-  unsigned rocHead   = sub->Data(ix++);
-  if(((rocHead>>24) & 0xFF) != 1 || (rocHead & 0xFF) != 1) {
-    ix--;  //assume it's old format
-    }
-  else {
-    unsigned externalTimer = sub->Data(ix++);
-    unsigned externalInput = (externalTimer&0x80000000)?1:0;
-    if(externalInput) countMarkedFrames++;
-    externalTimer &= 0x7FFFFFFF;
-    }
-  while(1) {
-    unsigned sensorHead   = sub->Data(ix++);
-    unsigned sensorId = 0x0;
-    unsigned sensorStatus = 0x0;
-    unsigned external = 0x0;
-    unsigned internal_fr_num = 0x0;
-    unsigned mySensor = 0x0;
-    unsigned sensorError = 0x0;
-    unsigned sensorDebug = 0x0;
-    
-    if (sub->Data(ix)>>16 == 0xf002){
-      // Version 2
-      ix++;
-      sensorId     = (source << 16)|(sub->Data(ix++)>>16);
-      sensorStatus = sub->Data(ix++);
-      ix += 2;  // skip reserved words
-      external          = sub->Data(ix++);
-      internal_fr_num   = sub->Data(ix++);
-      sensorError  = 0x0;
-      sensorDebug  = 0x0;
-      v2 = 1;
-    }
-    else{
-      sensorId     = (source << 16)|(sub->Data(ix++)>>16);
-      sensorStatus = sub->Data(ix++);
-      sensorError  = sub->Data(ix++);
-      sensorDebug  = sub->Data(ix++);
-      ix += 2;  //Skip time
-      v2 = 0;
-    }
-    
-    mySensor     = getSensor(sensorId);
-    
-    #if DEBUG>=1
-    printf("Head\t%08x\tID\t%08x\tStatus\t%08x\tError\t%08x\tDebug\t%08x\n",
-                sensorHead, sensorId, sensorStatus, sensorError, sensorDebug);
-    #endif    
-
-    if(sensorHead != 0xffffffff) {
-        //Something is really wrong with data. Skip SubEvent!
-        printf("Broken Sensor Header\n");
-        statistics[mySensor][FRREALBROKEN]++;
-        #if DEBUG==0
-        printf("Head\t%08x\tID\t%08x\tStatus\t%08x\tError\t%08x\tDebug\t%08x\n",
-                    sensorHead, sensorId, sensorStatus, sensorError, sensorDebug);        
-        #endif    
-        return -1;
-        }    
-        
-    //Check Status Word
-    unsigned sensorIsValid = 0;
-    if((sensorStatus & 0xf000000f) == 0xf000000f) {
-      sensorIsValid = 1;
-      statistics[mySensor][FRVALID]++;
-      }
-    else {
-      sensorIsValid = 0;
-      statistics[mySensor][FRBROKEN]++;
-      }
-
-    if(sensorIsValid){
-      //Hey Sensor, tell me who you are!
-      unsigned sensorDummy  = sub->Data(ix++);
-      unsigned sensorNumber = sub->Data(ix++);
-      unsigned sensorLength = sub->Data(ix++) & 0xffff;
-      
-      
-      unsigned frameEndPos = ix + sensorLength;
-      unsigned d,line = 0,column,pixels,statecnt = 0,ovf = 0;      
-      #if DEBUG>=1
-      printf("\t\t\tHeader\t%08x\tFrame\t%08x\tLength\t%i\n",
-                sensorDummy, sensorNumber, sensorLength);
-      #endif 
-      if(sensorLength > 580) {printf("Invalid lenght. Something wrong."); statistics[mySensor][FRBROKEN]++; return -1;}
-      if(sensorLength == 0) {
-        goto FrameEnd;
-        }        
-
-
-      while(1) {
-        for(unsigned i = 0; i<=1; i++) {
-          
-          if (v2==1){
-            if(i==0) d = (sub->Data(ix) << 16) >> 16;
-            else     d = sub->Data(ix++) >> 16;
-          }
-          else{
-            if(i==0) d = sub->Data(ix) >> 16;
-            else     d = sub->Data(ix++);
-          }
-          
-          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>1            
-            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(ix >= frameEndPos) {goto FrameEnd;}
-          if(ix >= RocEnd)      {break;}
-          }
-        }
-      FrameEnd:        
-      //Read end of frame marker without check
-      ix += 1;  
-      }  
-    else {
-      return -2;
-      }
-    if(ix >= RocEnd){break;}
-    }
-  return 0;
-  }
-  
+       if (source == 0x5555)   return -32;
+       if (datalen == 0)               return -33;
+       unsigned RocEnd         = ix + datalen -1;
+       int v2 = 0;
+
+       unsigned rocHead        = sub->Data(ix++);
+       if(((rocHead>>24) & 0xFF) != 1 || (rocHead & 0xFF) != 1) {
+       ix--;   //assume it's old format
+       }
+       else {
+       unsigned externalTimer = sub->Data(ix++);
+       unsigned externalInput = (externalTimer&0x80000000)?1:0;
+       if(externalInput) countMarkedFrames++;
+       externalTimer &= 0x7FFFFFFF;
+       }
+       while(1) {
+       unsigned sensorHead = sub->Data(ix++);
+       unsigned sensorId = 0x0;
+       unsigned sensorStatus = 0x0;
+       unsigned external = 0x0;
+       unsigned internal_fr_num = 0x0;
+       unsigned mySensor = 0x0;
+       unsigned sensorError = 0x0;
+       unsigned sensorDebug = 0x0;
+
+       if (sub->Data(ix)>>16 == 0xf002){
+               // Version 2
+               ix++;
+               sensorId = (source << 16)|(sub->Data(ix++)>>16);
+               sensorStatus = sub->Data(ix++);
+               ix += 2;        // skip reserved words
+               external                        = sub->Data(ix++);
+               internal_fr_num = sub->Data(ix++);
+               sensorError     = 0x0;
+               sensorDebug     = 0x0;
+               v2 = 1;
+       }
+       else{
+               sensorId = (source << 16)|(sub->Data(ix++)>>16);
+               sensorStatus = sub->Data(ix++);
+               ix += 1;        //Skip time
+               external = sub->Data(ix++);
+               v2 = 0;
+       }
+
+       mySensor = getSensor(sensorId);
+
+       #if DEBUG>=1
+       printf("Head\t%08x\tID\t%08x\tStatus\t%08x\tError\t%08x\tDebug\t%08x\n",
+                               sensorHead, sensorId, sensorStatus, sensorError, sensorDebug);
+       #endif
+
+       if(sensorHead != 0xffffffff) {
+               //Something is really wrong with data. Skip SubEvent!
+               printf("Broken Sensor Header\n");
+               statistics[mySensor][FRREALBROKEN]++;
+               #if DEBUG==0
+               printf("Head\t%08x\tID\t%08x\tStatus\t%08x\tError\t%08x\tDebug\t%08x\n",
+                                       sensorHead, sensorId, sensorStatus, sensorError, sensorDebug);
+               #endif
+               return -1;
+               }
+
+       //Check Status Word
+       unsigned sensorIsValid = 0;
+       if((sensorStatus & 0xf000000f) == 0xf000000f) {
+               sensorIsValid = 1;
+               statistics[mySensor][FRVALID]++;
+               }
+       else if (sensorStatus == 0x0){
+               sensorIsValid = 1;
+               statistics[mySensor][FRVALID]++;
+       }
+       else {
+               sensorIsValid = 0;
+               statistics[mySensor][FRBROKEN]++;
+               }
+
+       if(sensorIsValid){
+               //Hey Sensor, tell me who you are!
+               unsigned sensorDummy    = sub->Data(ix++);
+               unsigned sensorNumber = sub->Data(ix++);
+               unsigned sensorLength = sub->Data(ix++) & 0xffff;
+
+
+               unsigned frameEndPos = ix + sensorLength;
+               unsigned d,line = 0,column,pixels,statecnt = 0,ovf = 0;
+               #if DEBUG>=1
+               printf("\t\t\tHeader\t%08x\tFrame\t%08x\tLength\t%i\n",
+                               sensorDummy, sensorNumber, sensorLength);
+               #endif
+               if(sensorLength > 580) {printf("Invalid lenght. Something wrong."); statistics[mySensor][FRBROKEN]++; return -1;}
+               if(sensorLength == 0) {
+               goto FrameEnd;
+               }
+
+
+               while(1) {
+               for(unsigned i = 0; i<=1; i++) {
+
+                       if (v2==1){
+                       if(i==0) d = (sub->Data(ix) << 16) >> 16;
+                       else d = sub->Data(ix++) >> 16;
+                       }
+                       else{
+                       if(i==0) d = sub->Data(ix) >> 16;
+                       else d = sub->Data(ix++);
+                       }
+
+                       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>1
+                       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(ix >= frameEndPos) {goto FrameEnd;}
+                       if(ix >= RocEnd)                {break;}
+                       }
+               }
+               FrameEnd:
+               //Read end of frame marker without check
+               ix += 1;
+               }
+       else {
+               return -2;
+               }
+       if(ix >= RocEnd){break;}
+       }
+       return 0;
+       }
+
 
 void writeResults() {
-  printf ("===============\n");
-  printf ("==  Summary  ==\n");
-  printf ("===============\n");
-  printf ("Sensor\t\tStates\t\tGood\tBroken\tInvalid\tMarked\tBank0\t\tBank1\t\tBank2\t\tBank3\n");
-  for(unsigned i = 0; i < numSensors; i++) {
-    if(statistics[i][FRVALID] == 0) {continue;}
-    double   hitrates[4];
-    unsigned pixcolcnt[MAX_SENSORS][4] = {{0}};
-    unsigned hitcount[MAX_SENSORS] = {0};
-    for(unsigned j = 0; j < 288; j++) {
-      pixcolcnt[i][0] += pixelcount[i][j];
-      pixcolcnt[i][1] += pixelcount[i][j+288];
-      pixcolcnt[i][2] += pixelcount[i][j+288+288];
-      pixcolcnt[i][3] += pixelcount[i][j+288+288+288];
-      }
-    hitcount[i] = pixcolcnt[i][0] + pixcolcnt[i][1] + pixcolcnt[i][2] + pixcolcnt[i][3];
-    
-    printf("%08x\t%10i\t%i\t%i\t%i\t%i\t%10i\t%10i\t%10i\t%10i\n",
-              sensors[i],
-              hitcount[i],
-              statistics[i][FRVALID],
-              statistics[i][FRBROKEN],
-              statistics[i][FRREALBROKEN],
-              countMarkedFrames,
-              pixcolcnt[i][0],
-              pixcolcnt[i][1],
-              pixcolcnt[i][2],
-              pixcolcnt[i][3]
-              );    
-    //printf ("\t\t\t\t\t\tHR Bank0\tHR Bank1\tHR Bank2\tHR Bank3\n");
-    hitrates[0] = (pixcolcnt[i][0]) /(288.*576*(statistics[i][FRVALID]));
-    hitrates[1] = (pixcolcnt[i][1]) /(288.*576*(statistics[i][FRVALID]));
-    hitrates[2] = (pixcolcnt[i][2]) /(288.*576*(statistics[i][FRVALID]));
-    hitrates[3] = (pixcolcnt[i][3]) /(288.*576*(statistics[i][FRVALID]));    
-    printf("\t\t\t\t\t\t\t%e\t%e\t%e\t%e\n",
-               hitrates[0],
-               hitrates[1],
-               hitrates[2],
-               hitrates[3]
-               );    
-    
-    FILE* cvt;
-    int status;
-    cvt = popen("gnuplot", "w");
-    if (!cvt)  {
-      printf("couldn't open a pipe; quitting\n");
-      exit(1);
-      }
-    fprintf(cvt, "set terminal png size 800,400 font \",9\";\n");
-    fprintf(cvt, "set palette model RGB;\n");
-    fprintf(cvt, "set xrange [0:1152];\n");
-    fprintf(cvt, "set yrange [0:576];\n");
-    fprintf(cvt, "set cbrange [0:%i];\n",statistics[i][FRVALID]);
-    fprintf(cvt, "set palette defined ( 0 'white', 1 'red', 5 'black', 10 'blue', %i 'green');\n",statistics[i][FRVALID]);
-
-    time_t rawtime;
-    struct tm * timeinfo;
-    time (&rawtime);
-    timeinfo = localtime (&rawtime);
-    char ts[200];
-    strftime (ts,200,"set label 100 \"%H:%M:%S\" at screen 0.98,0.02 right tc rgb \"#000044\" font \"monospace,8\"\n",timeinfo);
-    fprintf(cvt,ts);
-
-    fprintf(cvt, "set label 101 \"%i States, %i good, %i broken, %i invalid\" at screen 0.02,0.01 left tc  rgb \"#000044\" font \"monospace,8\"\n",
-            hitcount[i],
-            statistics[i][FRVALID],
-            statistics[i][FRBROKEN],
-            statistics[i][FRREALBROKEN]);
-
-    fprintf(cvt, "set label 102 \"hit rates: A: %.3e B: %.3e C: %.3e D:%.3e\" at screen 0.4,0.01 left tc  rgb \"#000044\" font \"monospace,8\"\n",
-              hitrates[0],
-              hitrates[1],
-              hitrates[2],
-              hitrates[3]);
-    fprintf(cvt, "set output '%s/%s_%08x.png';\n",picPath,mySystem,sensors[i]);
-    printf("\nset output '%s/%s_%08x.png';\n",picPath,mySystem,sensors[i]);
-    fprintf(cvt, "plot '-' matrix with image\n");
-    
-    for(unsigned r = 0; r < 576; r++) {
-      for(unsigned c = 0; c < 1152; c++) {
-        fprintf(cvt,"%d ",pixelMap[i][r][c]);
-        }
-      fprintf(cvt,"\n");  
-      }
-    
-    
-    fprintf(cvt, "e\n\n");
-    fflush(cvt);
-    status=pclose(cvt);
-    if (!WIFEXITED(status))  printf("error on closing the pipe\n");    
-    }
-  }  
-
-  
+       printf ("===============\n");
+       printf ("==     Summary ==\n");
+       printf ("===============\n");
+       printf ("Sensor\t\tStates\t\tGood\tBroken\tInvalid\tMarked\tBank0\t\tBank1\t\tBank2\t\tBank3\n");
+       for(unsigned i = 0; i < numSensors; i++) {
+               if(statistics[i][FRVALID] == 0) {continue;}
+               double hitrates[4];
+               unsigned pixcolcnt[MAX_SENSORS][4] = {{0}};
+               unsigned hitcount[MAX_SENSORS] = {0};
+               for(unsigned j = 0; j < 288; j++) {
+                       pixcolcnt[i][0] += pixelcount[i][j];
+                       pixcolcnt[i][1] += pixelcount[i][j+288];
+                       pixcolcnt[i][2] += pixelcount[i][j+288+288];
+                       pixcolcnt[i][3] += pixelcount[i][j+288+288+288];
+                       }
+               hitcount[i] = pixcolcnt[i][0] + pixcolcnt[i][1] + pixcolcnt[i][2] + pixcolcnt[i][3];
+
+               printf("%08x\t%10i\t%i\t%i\t%i\t%i\t%10i\t%10i\t%10i\t%10i\n",
+                               sensors[i],
+                               hitcount[i],
+                               statistics[i][FRVALID],
+                               statistics[i][FRBROKEN],
+                               statistics[i][FRREALBROKEN],
+                               countMarkedFrames,
+                               pixcolcnt[i][0],
+                               pixcolcnt[i][1],
+                               pixcolcnt[i][2],
+                               pixcolcnt[i][3]
+                               );
+               //printf ("\t\t\t\t\t\tHR Bank0\tHR Bank1\tHR Bank2\tHR Bank3\n");
+               hitrates[0] = (pixcolcnt[i][0]) /(288.*576*(statistics[i][FRVALID]));
+               hitrates[1] = (pixcolcnt[i][1]) /(288.*576*(statistics[i][FRVALID]));
+               hitrates[2] = (pixcolcnt[i][2]) /(288.*576*(statistics[i][FRVALID]));
+               hitrates[3] = (pixcolcnt[i][3]) /(288.*576*(statistics[i][FRVALID]));
+               printf("\t\t\t\t\t\t\t%e\t%e\t%e\t%e\n",
+                               hitrates[0],
+                               hitrates[1],
+                               hitrates[2],
+                               hitrates[3]
+                               );
+
+               FILE* cvt;
+               int status;
+               cvt = popen("gnuplot", "w");
+               if (!cvt)       {
+                       printf("couldn't open a pipe; quitting\n");
+                       exit(1);
+                       }
+               //fprintf(cvt, "set terminal png size 1200,600 font \",9\";\n");
+               fprintf(cvt, "set terminal png size 800,400 font \",9\";\n");
+               fprintf(cvt, "set palette model RGB;\n");
+               fprintf(cvt, "set xrange [0:1152];\n");
+               fprintf(cvt, "set yrange [0:576];\n");
+               fprintf(cvt, "set cbrange [0:%i];\n",statistics[i][FRVALID]);
+               fprintf(cvt, "set palette defined ( 0 'white', 1 'red', 5 'black', 10 'blue', %i 'green');\n",statistics[i][FRVALID]);
+
+               time_t rawtime;
+               struct tm * timeinfo;
+               time (&rawtime);
+               timeinfo = localtime (&rawtime);
+               char ts[200];
+               strftime (ts,200,"set label 100 \"%H:%M:%S\" at screen 0.98,0.02 right tc rgb \"#000044\" font \"monospace,8\"\n",timeinfo);
+               fprintf(cvt,ts);
+
+               fprintf(cvt, "set label 101 \"%i States, %i good, %i broken, %i invalid\" at screen 0.02,0.01 left tc   rgb \"#000044\" font \"monospace,8\"\n",
+                               hitcount[i],
+                               statistics[i][FRVALID],
+                               statistics[i][FRBROKEN],
+                               statistics[i][FRREALBROKEN]);
+
+               fprintf(cvt, "set label 102 \"hit rates: A: %.3e B: %.3e C: %.3e D:%.3e\" at screen 0.4,0.01 left tc    rgb \"#000044\" font \"monospace,8\"\n",
+                                       hitrates[0],
+                                       hitrates[1],
+                                       hitrates[2],
+                                       hitrates[3]);
+               fprintf(cvt, "set output '%s/%s_%08x.png';\n",picPath,mySystem,sensors[i]);
+               printf("\nset output '%s/%s_%08x.png';\n",picPath,mySystem,sensors[i]);
+               fprintf(cvt, "plot '-' matrix with image\n");
+
+               for(unsigned r = 0; r < 576; r++) {
+                       for(unsigned c = 0; c < 1152; c++) {
+                               fprintf(cvt,"%d ",pixelMap[i][r][c]);
+                               }
+                       fprintf(cvt,"\n");
+                       }
+
+
+               fprintf(cvt, "e\n\n");
+               fflush(cvt);
+               status=pclose(cvt);
+               if (!WIFEXITED(status)) printf("error on closing the pipe\n");
+               }
+       }
+