From: Maps Date: Wed, 26 Nov 2014 17:46:05 +0000 (+0100) Subject: Unpacker supports the new ROC Format now X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=489326a16bff5a6c2772211d12fede8acbe04598;p=mvdsensorcontrol.git Unpacker supports the new ROC Format now --- diff --git a/tools/unpacker/unpacker.cxx b/tools/unpacker/unpacker.cxx index 6b0c053..fa7f919 100644 --- a/tools/unpacker/unpacker.cxx +++ b/tools/unpacker/unpacker.cxx @@ -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"); diff --git a/tools/unpacker/versions.txt b/tools/unpacker/versions.txt index f6ae0c0..d39a69f 100644 --- a/tools/unpacker/versions.txt +++ b/tools/unpacker/versions.txt @@ -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