From 875a7a91bfa0368b748242ee9fe9a7a4c193c3b8 Mon Sep 17 00:00:00 2001 From: Maps Date: Thu, 2 Jul 2015 20:13:36 +0200 Subject: [PATCH] unpacker: multi-sensor support; tabstop fixes --- tools/unpacker/unpacker.cxx | 1042 +++++++++++++++++------------------ 1 file changed, 520 insertions(+), 522 deletions(-) diff --git a/tools/unpacker/unpacker.cxx b/tools/unpacker/unpacker.cxx index fa7f919..6bd2d94 100644 --- a/tools/unpacker/unpacker.cxx +++ b/tools/unpacker/unpacker.cxx @@ -1,11 +1,11 @@ #include "hadaq/api.h" #include -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"); + } + } + -- 2.43.0