]> jspc29.x-matter.uni-frankfurt.de Git - mvdsensorcontrol.git/commitdiff
Unpacker supports the new ROC Format now
authorMaps <maps@ikf>
Wed, 26 Nov 2014 17:46:05 +0000 (18:46 +0100)
committerMaps <maps@ikf>
Wed, 26 Nov 2014 17:46:05 +0000 (18:46 +0100)
tools/unpacker/unpacker.cxx
tools/unpacker/versions.txt

index 6b0c0534de216a3e7114598929917f3fa3c548fd..fa7f919271f0900a585f9a68f3f2c14cd6cdefba 100644 (file)
@@ -3,6 +3,7 @@
 
 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();
 
@@ -62,22 +63,264 @@ void readSubEvents(hadaq::RawEvent* evnt) {
   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;
@@ -226,8 +469,6 @@ signed analyzeData(hadaq::RawSubevent* sub, unsigned ix, unsigned datalen, unsig
   return 0;
   }
   
-  
-  
 
 void writeResults() {
   printf ("===============\n");
index f6ae0c08d5374edfcd8b529abc8f36bd6993b52a..d39a69fb8f212f2d0812a571c0092a0b687beb2f 100644 (file)
@@ -15,11 +15,3 @@ Format Version
 
 
 
-
-
-
-Planned Boris:
-        HEADER VERSION ='02' / DATA VERSION ='01' / NUM DATA ='01'
-                        TIMER / FOUND EXTRENAL
-                              xxxxxxxxxxx
\ No newline at end of file