From fa156f337ec3b51c9c4d78d03bc4359e2dca228e Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 28 Jul 2015 18:15:09 +0200 Subject: [PATCH] sorta done without missing packet identifiers --- .../include/UDPBaseImplementation.h | 3 + .../include/UDPStandardImplementation.h | 4 +- .../include/sls_receiver_defs.h | 4 +- .../src/UDPStandardImplementation.cpp | 263 ++++++++++-------- 4 files changed, 154 insertions(+), 120 deletions(-) diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index 8db022a69..1e1c7bdf9 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -575,6 +575,9 @@ protected: /** Pckets currently in current file, starts new file when it reaches max */ int packetsInFile; + /** Number of missing packets in file (sometimes packetsinFile is incorrect due to padded packets for eiger)*/ + int numTotMissingPacketsInFile; + /** Frame index at start of an entire acquisition (including all scans) */ uint32_t startAcquisitionIndex; diff --git a/slsReceiverSoftware/include/UDPStandardImplementation.h b/slsReceiverSoftware/include/UDPStandardImplementation.h index 3462ded22..40c3ab54c 100644 --- a/slsReceiverSoftware/include/UDPStandardImplementation.h +++ b/slsReceiverSoftware/include/UDPStandardImplementation.h @@ -461,7 +461,7 @@ private: * When acquisition is over, this is called * @param ithread listening thread number */ - void stopWriting(int ithread); + void stopWriting(int ithread, char* wbuffer[]); /** * updates parameters and writes to file when not a dummy frame @@ -470,7 +470,7 @@ private: * @param ithread writing thread number * @param wbuffer writer buffer */ - void handleWithoutDataCompression(int ithread, char* wbuffer[]); + void handleWithoutDataCompression(int ithread, char* wbuffer); /** * data compression for each fifo output diff --git a/slsReceiverSoftware/include/sls_receiver_defs.h b/slsReceiverSoftware/include/sls_receiver_defs.h index 7ed6e0837..a9f6d30c2 100755 --- a/slsReceiverSoftware/include/sls_receiver_defs.h +++ b/slsReceiverSoftware/include/sls_receiver_defs.h @@ -19,8 +19,8 @@ typedef int int32_t; #define MAX_FRAMES_PER_FILE 20000 #define SHORT_MAX_FRAMES_PER_FILE 100000 #define MOENCH_MAX_FRAMES_PER_FILE 1000 -#define EIGER_MAX_FRAMES_PER_FILE 20 -#define JFCTB_MAX_FRAMES_PER_FILE 100000 +#define EIGER_MAX_FRAMES_PER_FILE 2000 +#define JFCTB_MAX_FRAMES_PER_FILE 100000 /** diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index ed0df1b47..48d53098e 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -122,6 +122,7 @@ void UDPStandardImplementation::initializeMembers(){ packetsCaught = 0; totalPacketsCaught = 0; packetsInFile = 0; + numTotMissingPacketsInFile = 0; startAcquisitionIndex = 0; acquisitionIndex = 0; packetsPerFrame = 0; @@ -1260,6 +1261,7 @@ int UDPStandardImplementation::setupWriter(){ //reset writing thread variables packetsInFile=0; + numTotMissingPacketsInFile = 0; packetsCaught=0; frameIndex=0; if(sfilefd) sfilefd=NULL; @@ -1377,6 +1379,8 @@ int UDPStandardImplementation::createNewFile(){ //create file name if(frameIndexNeeded==-1) sprintf(savefilename, "%s/%s_%d.raw", filePath,fileName,fileIndex); + else if (myDetectorType == EIGER) + sprintf(savefilename, "%s/%s_f%012d_%d.raw", filePath,fileName,currframenum,fileIndex); else sprintf(savefilename, "%s/%s_f%012d_%d.raw", filePath,fileName,(packetsCaught/packetsPerFrame),fileIndex); @@ -1411,11 +1415,11 @@ int UDPStandardImplementation::createNewFile(){ cout << savefilename << "\tpacket loss " << setw(4)<header_confirm))){ + if( 0x01 == (*(uint8_t*)(((eiger_image_header *)((char*)(wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS)))->header_confirm))){ //new frame (no datapacket received yet), update frame num and corrected for fnum reset for scans if(!startdatapacket[i]) - tempframenum[i] = htonl(*(unsigned int*)((eiger_image_header *)((char*)(wbuf[ithread] + woffset[i])))->fnum)+(startFrameIndex-1); + tempframenum[i] = htonl(*(unsigned int*)((eiger_image_header *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum)+(startFrameIndex-1); //next frame, leave else{ //add missing packets - numberofmissingpackets += (LAST_PACKET_VALUE = lastpacketheader[i]); + numberofmissingpackets[i] = (LAST_PACKET_VALUE - lastpacketheader[i]); + //to decrement from packetsInFile to calculate packet loss + numTotMissingPacketsInFile += numberofmissingpackets[i]; for(j=0;jnum4))); + currentpacketheader[i] = ((*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS)))->num4))); //same frame packet - continue building frame if(currentpacketheader[i] > lastpacketheader[i]){ //add missing packets - numberofmissingpackets[i] += (currentpacketheader[i] - lastpacketheader[i] -1); + numberofmissingpackets[i] = (currentpacketheader[i] - lastpacketheader[i] -1); + //to decrement from packetsInFile to calculate packet loss + numTotMissingPacketsInFile += numberofmissingpackets[i]; for(j=0;jpush(wbuffer[i])); + if(myDetectorType == EIGER) { + //push every packet + for(j=0;jpush(wbuffer[i]+j*onePacketSize)); #ifdef FIFO_DEBUG - cprintf(GREEN,"%d writer free dummy pushed into fifofree %x for listener %d\n", ithread,(void*)(wbuffer[i]),i); + cprintf(GREEN,"%d writer freed pushed into fifofree %x for listener %d\n",ithread, (void*)(wbuffer[i]+j*onePacketSize)); #endif + } + }else{ + while(!fifoFree[i]->push(wbuffer[i])); +#ifdef FIFO_DEBUG + cprintf(GREEN,"%d writer free dummy pushed into fifofree %x for listener %d\n", ithread,(void*)(wbuffer[i]),i); +#endif + } } @@ -2444,7 +2490,6 @@ void UDPStandardImplementation::writeToFile_withoutCompression(char* buf,int num offset = HEADER_SIZE_NUM_TOT_PACKETS; if(myDetectorType == EIGER){ - offset += EIGER_HEADER_LENGTH; #ifdef WRITE_HEADERS #ifdef VERY_DEBUG if(myDetectorType == EIGER){ @@ -2531,7 +2576,7 @@ void UDPStandardImplementation::writeToFile_withoutCompression(char* buf,int num if(packetsInFile >= maxPacketsPerFile){ //for packet loss lastpacket = (((packetsToSave - 1) * onePacketSize) + offset); - if(myDetectorType == EIGER); + if(myDetectorType == EIGER);//because currframenum is the latest one for eiger else if ((myDetectorType == GOTTHARD) && (shortFrame == -1)) tempframenum = (((((uint32_t)(*((uint32_t*)(buf + lastpacket))))+1)& (frameIndexMask)) >> frameIndexOffset); else @@ -2578,79 +2623,67 @@ void UDPStandardImplementation::writeToFile_withoutCompression(char* buf,int num -void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char* wbuffer[]){ - int totalheader = HEADER_SIZE_NUM_TOT_PACKETS + EIGER_HEADER_LENGTH; - int i,j,npackets, ntotpackets=0; +void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char* wbuffer){ + int i,npackets; if (cbAction < DO_EVERYTHING){ - for(i=0;i 0){ + npackets = (uint32_t)(*((uint32_t*)wbuffer)); + if (npackets > 0){ #ifdef WRITE_HEADERS - if (myDetectorType == EIGER){ + if (myDetectorType == EIGER){ - for (i = 0; i < packetsPerFrame/2; i++){ - //overwriting frame number in header - (*(uint32_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader + onePacketSize*i)))->num1)) = currframenum; - //overwriting port number and dynamic range - if (!j) (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader + onePacketSize*i)))->num3)) = (dynamicRange<<2); - else (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader + onePacketSize*i)))->num3)) = ((dynamicRange<<2)|(0x1)); + for (i = 0; i < packetsPerFrame; i++){ + //overwriting frame number in header + (*(uint32_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS + onePacketSize*i)))->num1)) = currframenum; + //overwriting port number and dynamic range + if (i<(packetsPerFrame/2)) + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS + onePacketSize*i)))->num3)) = (dynamicRange<<2); + else + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS + onePacketSize*i)))->num3)) = ((dynamicRange<<2)|(0x1)); #ifdef VERYDEBUG - cprintf(GREEN, "%d - 0x%x - %d\n", i, - (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num3)), - (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num4))); + cprintf(GREEN, "%d - 0x%x - %d\n", i, + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS +i*onePacketSize)))->num3)), + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS +i*onePacketSize)))->num4))); #endif - } + } - //for 32 bit,port number needs to be changed and packet number reconstructed - if(dynamicRange == 32){ - for (i = 0; i < packetsPerFrame/4; i++){ + //for 32 bit,port number needs to be changed and packet number reconstructed + if(dynamicRange == 32){ + for (i = 0; i < packetsPerFrame; i++){ + if( (i < (packetsPerFrame/4)) || ((i > (packetsPerFrame/2)) && (i < (3*packetsPerFrame/4))) ){ //new packet number that has space for 16 bit - (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader + onePacketSize*i)))->num2)) - = ((*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader + onePacketSize*i)))->num4))); - -#ifdef VERYDEBUG - cprintf(GREEN, "%d - 0x%x - %d - %d\n", i, - (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num3)), - (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num4)), - (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num2))); -#endif - } - for (i = packetsPerFrame/4; i < packetsPerFrame/2; i++){ + (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS + onePacketSize*i)))->num2)) + = ((*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS + onePacketSize*i)))->num4))); + }else{ //new packet number that has space for 16 bit - (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader + onePacketSize*i)))->num2)) - = ((*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader + onePacketSize*i)))->num4))+(packetsPerFrame/4)); + (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS + onePacketSize*i)))->num2)) + = ((*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS + onePacketSize*i)))->num4))+(packetsPerFrame/4)); -#ifdef VERYDEBUG - cprintf(GREEN, "%d -0x%x - %d - %d\n", i, - (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num3)), - (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num4)), - (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuffer[j] + totalheader +i*onePacketSize)))->num2))); -#endif } +#ifdef VERYDEBUG + cprintf(GREEN, "%d - 0x%x - %d - %d\n", i, + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS +i*onePacketSize)))->num3)), + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS +i*onePacketSize)))->num4)), + (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuffer + HEADER_SIZE_NUM_TOT_PACKETS +i*onePacketSize)))->num2))); +#endif + } } + } #endif - writeToFile_withoutCompression(wbuffer[j], npackets,currframenum); - } + writeToFile_withoutCompression(wbuffer, npackets,currframenum); } + #ifdef VERYDEBUG cprintf(GREEN,"written everyting\n"); #endif @@ -2658,25 +2691,23 @@ void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char* if(myDetectorType == EIGER) { - if(ntotpackets >= packetsPerFrame ) { + #ifdef VERYDEBUG - cprintf(GREEN,"gonna copy frame\n"); + cprintf(GREEN,"gonna copy frame\n"); #endif - copyFrameToGui(wbuffer,currframenum); -//#ifdef VERYDEBUG - cprintf(GREEN,"copied frame\n"); -//#endif - } - for(i=0;ipush(wbuffer[i])); + copyFrameToGui(wbuffer,currframenum); + //#ifdef VERYDEBUG + cprintf(GREEN,"copied frame\n"); + //#endif + + for(i=0;inum3)) != 0xFF) + while(!fifoFree[i]->push(wbuffer+i*onePacketSize)); #ifdef FIFO_DEBUG - cprintf(GREEN,"%d writer freed pushed into fifofree %x for listener %d\n",ithread, (void*)(wbuffer[i]),i); + cprintf(GREEN,"%d writer freed pushed into fifofree %x for listener %d\n",ithread, (void*)(wbuffer+i*onePacketSize)); #endif } - - } else{ //copy to gui