diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index d68f1c6d4..d69e00b93 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -505,6 +505,9 @@ protected: /** max number of writer threads */ const static int MAX_NUM_WRITER_THREADS = 15; + /** missing packet identifier value */ + const static uint16_t missingPacketValue = 0xFFFF; + /** detector type */ detectorType myDetectorType; @@ -712,6 +715,9 @@ protected: /** 10Gbe enable*/ int tengigaEnable; + /** footer offset is different for 1g and 10g*/ + int footer_offset; + // TODO: not properly sure where to put these... /** structure of an eiger image header*/ diff --git a/slsReceiverSoftware/include/receiver_defs.h b/slsReceiverSoftware/include/receiver_defs.h index 701b4e382..206c8b92b 100755 --- a/slsReceiverSoftware/include/receiver_defs.h +++ b/slsReceiverSoftware/include/receiver_defs.h @@ -118,10 +118,11 @@ #define EIGER_ONE_GIGA_ONE_DATA_SIZE 1024 #define EIGER_TEN_GIGA_ONE_PACKET_SIZE 4112 #define EIGER_TEN_GIGA_ONE_DATA_SIZE 4096 +#define EIGER_PACKET_HEADER_SIZE 8 //#define EIGER_BUFFER_SIZE_CONSTANT (EIGER_ONE_PACKET_SIZE*EIGER_PACKETS_PER_FRAME_COSTANT)//1040*16*2//*bit mode //#define EIGER_DATA_BYTES_CONSTANT (EIGER_ONE_DATA_SIZE*EIGER_PACKETS_PER_FRAME_COSTANT) //1024*16*2//*bit mode -#define EIGER_FRAME_INDEX_MASK 0xFFFF +#define EIGER_FRAME_INDEX_MASK 0xFFFFFFFF //32 bit for now #define EIGER_FRAME_INDEX_OFFSET 0 #define EIGER_PACKET_INDEX_MASK 0x0 diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index c59932b9d..fb10ae106 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -558,83 +558,6 @@ void UDPBaseImplementation::setupFilter(){ FILE_LOG(logDEBUG) << __AT__ << " sta //LEO: it is not clear to me.. void UDPBaseImplementation::setupFifoStructure(){ FILE_LOG(logDEBUG) << __AT__ << " starting"; - int64_t i; - int oldn = numJobsPerThread; - - //if every nth frame mode - if(nFrameToGui) - numJobsPerThread = nFrameToGui; - - //random nth frame mode - else{ - if(!acquisitionPeriod) - i = SAMPLE_TIME_IN_NS; - else - i = SAMPLE_TIME_IN_NS/acquisitionPeriod; - if (i > MAX_JOBS_PER_THREAD) - numJobsPerThread = MAX_JOBS_PER_THREAD; - else if (i < 1) - numJobsPerThread = 1; - else - numJobsPerThread = i; - } - - //if same, return - if(oldn == numJobsPerThread) - return; - - if(myDetectorType == EIGER) - numJobsPerThread = 1; - - //otherwise memory too much if numjobsperthread is at max = 1000 - fifosize = GOTTHARD_FIFO_SIZE; - if(myDetectorType == MOENCH) - fifosize = MOENCH_FIFO_SIZE; - else if(myDetectorType == EIGER) - fifosize = EIGER_FIFO_SIZE; - - if(fifosize % numJobsPerThread) - fifosize = (fifosize/numJobsPerThread)+1; - else - fifosize = fifosize/numJobsPerThread; - - - cout << "Number of Frames per buffer:" << numJobsPerThread << endl; - cout << "Fifo Size:" << fifosize << endl; - - /* - //for testing - numJobsPerThread = 3; fifosize = 11; - */ - - for(int i=0;iisEmpty()) - fifoFree[i]->pop(buffer[i]); - delete fifoFree[i]; - } - if(fifo[i]) delete fifo[i]; - if(mem0[i]) free(mem0[i]); - fifoFree[i] = new CircularFifo(fifosize); - fifo[i] = new CircularFifo(fifosize); - - - //allocate memory - mem0[i]=(char*)malloc((bufferSize * numJobsPerThread + HEADER_SIZE_NUM_TOT_PACKETS)*fifosize); - /** shud let the client know about this */ - if (mem0[i]==NULL){ - cprintf(BG_RED,"++++++++++++++++++++++ COULD NOT ALLOCATE MEMORY FOR LISTENING !!!!!!!+++++++++++++++++++++\n"); - exit(-1); - } - buffer[i]=mem0[i]; - //push the addresses into freed fifoFree and writingFifoFree - while (buffer[i]<(mem0[i]+(bufferSize * numJobsPerThread + HEADER_SIZE_NUM_TOT_PACKETS)*(fifosize-1))) { - fifoFree[i]->push(buffer[i]); - buffer[i]+=(bufferSize * numJobsPerThread + HEADER_SIZE_NUM_TOT_PACKETS); - } - } - cout << "Fifo structure(s) reconstructed" << endl; } @@ -1529,93 +1452,6 @@ int UDPBaseImplementation::startWriting(){ FILE_LOG(logDEBUG) << __AT__ << " sta cout << ithread << "In startWriting()" <fnum); - //gotthard has +1 for frame number and not a short frame - else if ((myDetectorType == GOTTHARD) && (shortFrame == -1)) - startFrameIndex = (((((uint32_t)(*((uint32_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS))))+1) - & (frameIndexMask)) >> frameIndexOffset); - else - startFrameIndex = ((((uint32_t)(*((uint32_t*)(buffer[ithread]+HEADER_SIZE_NUM_TOT_PACKETS)))) - & (frameIndexMask)) >> frameIndexOffset); - //start of acquisition - if(!acqStarted){ - startAcquisitionIndex=startFrameIndex; - currframenum = startAcquisitionIndex; - acqStarted = true; - cout << "startAcquisitionIndex:" << startAcquisitionIndex<missingpacket) = 0xFF; + *( (uint16_t*) blankframe_header->missingpacket) = missingPacketValue; //set each value inside blank frame to 0xff for(j=0;j<(oneDataSize);++j){ - eiger_packet_data = blankframe[i] + sizeof(eiger_packet_header_t) + j; - *(eiger_packet_data) = 0xFF; + blankframe_data = (unsigned char*)blankframe[i] + sizeof(eiger_packet_header_t) + j; + *(blankframe_data) = 0xFF; } //verify - if (*( (uint16_t*) eiger_packet_header->missingpacket) != 0xFF){ - cprintf(RED,"blank frame not detected at %d: 0x%x\n",i,*( (uint16_t*) eiger_packet_header->missingpacket) ); + if (*( (uint16_t*) blankframe_header->missingpacket) != missingPacketValue){ + cprintf(RED,"blank frame not detected at %d: 0x%x\n",i,*( (uint16_t*) blankframe_header->missingpacket) ); exit(-1); } #ifdef FIFO_DEBUG @@ -2041,8 +2057,8 @@ int UDPStandardImplementation::startWriting(){ tempoffset[i] = (i*packetsPerFrame/numListeningThreads); tofreeoffset[i] = (i*packetsPerFrame/numListeningThreads); blankoffset = 0; - lastpacketheader[i] = -1; - currentpacketheader[i] = -1; + lastpacketheader[i] = 0; + currentpacketheader[i] = 0; numberofmissingpackets[i] = 0; numpackets[i] = 0; @@ -2065,6 +2081,7 @@ int UDPStandardImplementation::startWriting(){ cprintf(GREEN,"%d writer poped 0x%x from fifo %d\n", ithread, (void*)(wbuf[i]), i); #endif numpackets[i] = (uint32_t)(*((uint32_t*)wbuf[i])); + #ifdef VERYDEBUG cprintf(GREEN,"%d numpackets: %d for fifo :%d\n", ithread, numpackets[i], i); #endif @@ -2080,17 +2097,22 @@ int UDPStandardImplementation::startWriting(){ #endif }else{ endofacquisition = false; - if(numpackets[i] == 1040){ - cprintf(BLUE,"tempframenum[%d]:%d\n",i,((*(uint32_t*)(((eiger_packet_1g *)((char*)(wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS)))->framenum)))); - cprintf(BLUE,"packetnum[%d]:%d\n",i,((*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS)))->packetnum)))); + if(numpackets[i] == 1040){; +#ifdef EIGER_DEBUG3 + wbuf_footer = (eiger_packet_footer_t*)(wbuf[i] + footer_offset + HEADER_SIZE_NUM_TOT_PACKETS); + //cprintf(BLUE,"footer value:0x%x\n",i,(uint64_t)(*( (uint64_t*) wbuf_footer))); + cprintf(BLUE,"tempframenum[%d]:%d\n",i,(uint32_t)(*( (uint64_t*) wbuf_footer))); + cprintf(BLUE,"packetnum[%d]:%d\n",i,*( (uint16_t*) wbuf_footer->packetnum)); +#endif }else if(numpackets[i] == EIGER_HEADER_LENGTH){ cprintf(BG_RED, "got header in writer, weirdd packetsize:%d\n",numpackets[i]); exit(-1); - }else { - cprintf(BG_RED, "got weird in writer, weirdd packetsize:%d\n",numpackets[i]); - } - +//#ifdef EIGER_DEBUG3 + else { + cprintf(BG_RED, "got weird in writer, weirdd packetsize:%d\n",numpackets[i]); + } +//#endif if(myDetectorType == EIGER){ tofree[tofreeoffset[i]] = wbuf[i]; tofreeoffset[i]++; @@ -2104,9 +2126,9 @@ int UDPStandardImplementation::startWriting(){ //END OF ACQUISITION if(endofacquisition){ -//#ifdef VERYDEBUG +#ifdef EIGER_DEBUG3 cprintf(GREEN,"%d Both dummy frames\n", ithread); -//#endif +#endif //remaining packets to be written if((myDetectorType == EIGER) && ((tempoffset[0]!=0) || (tempoffset[1]!=(packetsPerFrame/numListeningThreads)))); @@ -2121,6 +2143,8 @@ int UDPStandardImplementation::startWriting(){ if(myDetectorType == EIGER){ + + //NOT FULL FRAME if(!fullframe[0] || !fullframe[1]){ for(i=0;imissingpacket)) - cprintf(RED,"1 fifo:%d missing packet added at pnum:%d\n",i,tempoffset[i]); - else cprintf(RED, "1 fifo:%d Weird at pnum:%d\n",i,tempoffset[i]); -#endif - if ((*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket))!= 0xFF){ - cprintf(BG_RED, "dummy blank mismatch num4 earlier2! i:%d pnum:%d fnum:%d missingpacket:0x%x actual missingpacket:0x%x\n", + + tempframe_header = (eiger_packet_header_t*) tempbuffer[tempoffset[i]]; + blankframe_header = (eiger_packet_header_t*) blankframe[blankoffset]; + if (*( (uint16_t*) tempframe_header->missingpacket)!= missingPacketValue){ + cprintf(BG_RED, "dummy blank mismatch num4 earlier2! " + "i:%d pnum:%d fnum:%d missingpacket:0x%x actual missingpacket:0x%x\n", i,tempoffset[i],tempframenum[i], - (*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket)), - (*(uint8_t*)(((eiger_packet_1g *)((char*)(blankframe[blankoffset])))->missingpacket))); + *( (uint16_t*) tempframe_header->missingpacket), + *( (uint16_t*) blankframe_header->missingpacket)); exit(-1); }else -//#ifdef PADDING - cprintf(GREEN, "blank packet i:%d pnum:%d fnum:%d missingpacket:0x%x\n",i,tempoffset[i],tempframenum[i],(*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket))); -//#endif +#ifdef PADDING + cprintf(GREEN, "blank packet i:%d pnum:%d fnum:%d missingpacket:0x%x\n",i, + tempoffset[i],tempframenum[i],*( (uint16_t*) tempframe_header->missingpacket)); +#endif tempoffset[i]++; blankoffset++; } @@ -2184,9 +2208,12 @@ int UDPStandardImplementation::startWriting(){ //not a full frame if(!fullframe[i]){ - + wbuf_footer = (eiger_packet_footer_t*)(wbuf[i] + footer_offset + HEADER_SIZE_NUM_TOT_PACKETS); +#ifdef EIGER_DEBUG3 + cprintf(GREEN,"**pnum of %d: %d\n",i,(*( (uint16_t*) wbuf_footer->packetnum))); +#endif //update frame number - tempframenum[i] = ((*(uint32_t*)(((eiger_packet_1g *)((char*)(wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS)))->framenum))); + tempframenum[i] =(uint32_t)(*( (uint64_t*) wbuf_footer)); if(!tempframenum[i]) @@ -2196,16 +2223,18 @@ int UDPStandardImplementation::startWriting(){ //WRONG FRAME - leave if(tempframenum[i] != presentframenum){ -//#ifdef PADDING +#ifdef PADDING cout<<"wrong packet"<framenum))), - ((*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS)))->packetnum)))); -//#endif + (uint32_t)(*( (uint64_t*) wbuf_footer)), + *( (uint16_t*) wbuf_footer->packetnum)); + +#endif tempframenum[i] = presentframenum; //add missing packets numberofmissingpackets[i] = (LAST_PACKET_VALUE - lastpacketheader[i]); @@ -2216,26 +2245,24 @@ int UDPStandardImplementation::startWriting(){ //to decrement from packetsInFile to calculate packet loss for(j=0;jmissingpacket))== 0xFF) - cprintf(RED,"5 fifo:%d missing packet added at pnum:%d\n",i,tempoffset[i]); - else cprintf(RED, "5 fifo:%d WEird at pnum:%d\n",i,tempoffset[i]); -#endif - if ((*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket))!= 0xFF){ + + tempframe_header = (eiger_packet_header_t*) tempbuffer[tempoffset[i]]; + blankframe_header = (eiger_packet_header_t*) blankframe[blankoffset]; + if (*( (uint16_t*) tempframe_header->missingpacket)!= missingPacketValue){ cprintf(BG_RED, "wrong blank mismatch num4 earlier2! " "i:%d pnum:%d fnum:%d missingpacket:0x%x actual missingpacket:0x%x add:0x%x\n", i,tempoffset[i],tempframenum[i], - (*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket)), - (*(uint8_t*)(((eiger_packet_1g *)((char*)(blankframe[blankoffset])))->missingpacket)), + *( (uint16_t*) tempframe_header->missingpacket), + *( (uint16_t*) blankframe_header->missingpacket), (void*)(tempbuffer[tempoffset[i]])); exit(-1); }else -//#ifdef PADDING +#ifdef PADDING cprintf(GREEN, "blank packet i:%d pnum:%d fnum:%d missingpacket:0x%x add:0x%x\n", i,tempoffset[i],tempframenum[i], - (*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket)), + *( (uint16_t*) tempframe_header->missingpacket), (void*)(tempbuffer[tempoffset[i]])); -//#endif +#endif tempoffset[i] ++; blankoffset ++; } @@ -2247,73 +2274,75 @@ int UDPStandardImplementation::startWriting(){ //CORRECT FRAME - continue building frame else { -//#ifdef PADDING +#ifdef PADDING cout<<"correct packet"<packetnum))); + currentpacketheader[i] = *( (uint16_t*) wbuf_footer->packetnum); #ifdef VERYVERBOSE - cprintf(GREEN,"**fifo:%d currentpacketheader: %d lastpacketheader %d tempoffset:%d\n",i,currentpacketheader[i],lastpacketheader[i], tempoffset[i]); + cprintf(GREEN,"**fifo:%d currentpacketheader: %d lastpacketheader %d tempoffset:%d\n", + i,currentpacketheader[i],lastpacketheader[i], tempoffset[i]); #endif //add missing packets numberofmissingpackets[i] = (currentpacketheader[i] - lastpacketheader[i] -1); #ifdef VERYDEBUG if(numberofmissingpackets[i]>0) - cprintf(BG_RED,"fifo:%d missing packet from: %d now at :%d tempoffset:%d\n",i,lastpacketheader[i],currentpacketheader[i],tempoffset[i]); + cprintf(BG_RED,"fifo:%d missing packet from: %d now at :%d tempoffset:%d\n", + i,lastpacketheader[i],currentpacketheader[i],tempoffset[i]); #endif //to decrement from packetsInFile to calculate packet loss for(j=0;jmissingpacket)) ==0xFF) - cprintf(RED,"4 fifo:%d missing packet added at pnum:%d\n",i,tempoffset[i]); - else cprintf(RED, "4 fifo:%d WEird at pnum:%d\n",i,tempoffset[i]); -#endif - if ((*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket))!= 0xFF){ + + tempframe_header = (eiger_packet_header_t*) tempbuffer[tempoffset[i]]; + blankframe_header = (eiger_packet_header_t*) blankframe[blankoffset]; + if (*( (uint16_t*) tempframe_header->missingpacket)!= missingPacketValue){ cprintf(BG_RED, "correct blank mismatch num4 earlier2! " "i:%d pnum:%d fnum:%d missingpacket:0x%x actual missingpacket:0x%x add:0x%x\n", i,tempoffset[i],tempframenum[i], - (*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket)), - (*(uint8_t*)(((eiger_packet_1g *)((char*)(blankframe[blankoffset])))->missingpacket)), + *( (uint16_t*) tempframe_header->missingpacket), + *( (uint16_t*) blankframe_header->missingpacket), (void*)(tempbuffer[tempoffset[i]])); exit(-1); }else -//#ifdef PADDING +#ifdef PADDING cprintf(GREEN, "blank packet i:%d pnum:%d fnum:%d missingpacket:0x%x add:0x%x\n", i,tempoffset[i],tempframenum[i], - (*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket)), + *( (uint16_t*) tempframe_header->missingpacket), (void*)(tempbuffer[tempoffset[i]])); -//#endif +#endif tempoffset[i] ++; blankoffset ++; } //add current packet - - if(currentpacketheader[i] != (tempoffset[i]-(i*packetsPerFrame/numListeningThreads))){ + if(currentpacketheader[i] != (tempoffset[i]-(i*packetsPerFrame/numListeningThreads))+1){ cprintf(BG_RED, "correct pnum mismatch earlier! tempoffset[%d]:%d pnum:%d fnum:%d rfnum:%d\n", i,tempoffset[i],currentpacketheader[i], - tempframenum[i],(*(uint32_t*)(((eiger_packet_1g *)((char*)(wbuf[i]+ HEADER_SIZE_NUM_TOT_PACKETS)))->framenum))); + tempframenum[i],(uint32_t)(*( (uint64_t*) wbuf_footer))); exit(-1); } + tempbuffer[tempoffset[i]] = wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS; + tempframe_footer = (eiger_packet_footer_t*) (tempbuffer[tempoffset[i]] + footer_offset); #ifdef EIGER_DEBUG3 - cprintf(GREEN,"**fifo:%d currentpacketheader: %d tempoffset:%d\n",i,(*(uint16_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->packetnum)),tempoffset[i]); + cprintf(GREEN,"**fifo:%d currentpacketheader: %d tempoffset:%d\n", + i,*( (uint16_t*) tempframe_footer->packetnum),tempoffset[i]); #endif - if((*(uint16_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->packetnum)) != (tempoffset[i]-(i*packetsPerFrame/numListeningThreads))){ - cprintf(BG_RED, "pnum mismatch num4 earlier! i:%d pnum:%d fnum:%d add:0x%x\n", - i,(*(uint16_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->packetnum)), + if(*( (uint16_t*) tempframe_footer->packetnum)!= (tempoffset[i]-(i*packetsPerFrame/numListeningThreads))+1){ + cprintf(BG_RED, "pnum mismatch num4 earlier! i:%d pnum:%d pnum orig:%d fnum:%d add:0x%x\n", + i,*( (uint16_t*) tempframe_footer->packetnum),*( (uint16_t*) wbuf_footer->packetnum), tempframenum[i],(void*)(tempbuffer[tempoffset[i]])); exit(-1); } -//#ifdef PADDING +#ifdef PADDING cprintf(GREEN, "normal packet i:%d pnum:%d fnum:%d missingpacket:0x%x add:0x%x\n", i,tempoffset[i],tempframenum[i], - (*(uint8_t*)(((eiger_packet_1g *)((char*)(tempbuffer[tempoffset[i]])))->missingpacket)), + *( (uint16_t*) tempframe_footer->packetnum), (void*)(tempbuffer[tempoffset[i]])); -//#endif +#endif tempoffset[i] ++; //update last packet lastpacketheader[i] = currentpacketheader[i]; @@ -2343,10 +2372,10 @@ int UDPStandardImplementation::startWriting(){ numMissingPackets += (numberofmissingpackets[0]+numberofmissingpackets[1]); numTotMissingPacketsInFile += numMissingPackets; numTotMissingPackets += numMissingPackets; -//#ifdef EIGER_DEBUG2 +#ifdef EIGER_DEBUG2 cprintf(GREEN,"**fnum:%d**\n",currframenum); -//#endif -//#ifdef EIGER_DEBUG3 +#endif +#ifdef EIGER_DEBUG3 if(numberofmissingpackets[0]) cprintf(RED, "fifo 0 missing packets:%d fnum:%d\n",numberofmissingpackets[0],currframenum); if(numberofmissingpackets[1]) @@ -2354,11 +2383,13 @@ int UDPStandardImplementation::startWriting(){ if(numMissingPackets){ cprintf(RED, "numMissingPackets:%d fnum:%d\n",numMissingPackets,currframenum); - for (j=0;jmissingpacket))==0xFF) + for (j=0;jmissingpacket)==missingPacketValue) cprintf(RED,"found the missing packet at pnum:%d\n",j); + } } -//#endif +#endif //write and copy to gui @@ -2378,9 +2409,9 @@ int UDPStandardImplementation::startWriting(){ cprintf(GREEN,"%d writer freed pushed into fifofree %x for listener %d\n",ithread, (void*)(tofree[j]),1); #endif } -//#ifdef VERYDEBUG +#ifdef VERYDEBUG cprintf(GREEN,"finished freeing\n"); -//#endif +#endif //reset a few stuff @@ -2394,19 +2425,20 @@ int UDPStandardImplementation::startWriting(){ tempoffset[i] = (i*packetsPerFrame/numListeningThreads); tofreeoffset[i] = (i*packetsPerFrame/numListeningThreads); blankoffset = 0; - lastpacketheader[i] = -1; - currentpacketheader[i] = -1; + lastpacketheader[i] = 0; + currentpacketheader[i] = 0; numberofmissingpackets[i] = 0; } } -//#ifdef VERYDEBUG +#ifdef VERYDEBUG for(int i=0;iframenum)))); - cprintf(GREEN,"packetnum[%d]:%d\n",i,((*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuf[i] + HEADER_SIZE_NUM_TOT_PACKETS)))->packetnum)))); + cprintf(GREEN,"tempframenum[%d]:%d\n",i,(uint32_t)(*( (uint64_t*) wbuf_footer))); + cprintf(GREEN,"packetnum[%d]:%d\n",i,*( (uint16_t*) wbuf_footer->packetnum)); } -//#endif +#endif } @@ -2838,8 +2870,6 @@ void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char* int i,j, missingpacket,port = 0, pnuminc; - - if (cbAction < DO_EVERYTHING){ if (myDetectorType == EIGER){ for(i=0;ipacketnum)); +#endif //which port if (i ==(packetsPerFrame/2)) port = 1; @@ -2863,77 +2902,51 @@ void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char* //missing packet - if ((*(uint8_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->missingpacket))==0xFF){ + if (*( (uint16_t*) wbuf_header->missingpacket)== missingPacketValue){ +#ifdef VERY_VERBOSE + cprintf(GREEN,"missing packet at %d\n", i+1); +#endif missingpacket = 1; - //add packet numbers - (*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)) = (i+1); - (*(uint32_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->framenum)) = currframenum+1; + //add frame and packet numbers + *( (uint64_t*) wbuf_footer) = (uint64_t)((currframenum+1)); + *( (uint16_t*) wbuf_footer->packetnum) = (i+1); }else{ missingpacket = 0; - if((*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)) != (i-(port*packetsPerFrame/numListeningThreads))){ - cprintf(BG_RED, "pnum mismatch num4! i:%d pnum:%d fnum:%d\n",i,(*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)),currframenum); + if(*( (uint16_t*) wbuf_footer->packetnum)!= (i-(port*packetsPerFrame/numListeningThreads))+1){ + cprintf(BG_RED, "pnum mismatch num4! i:%d pnum:%d fnum:%d\n", + i,*( (uint16_t*) wbuf_footer->packetnum),currframenum); exit(-1); } - - /* if(dynamicRange != 32){*/ //move packet numbers to num2, and compensate for port1 starting pnum from 0 - if(!port) - (*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)) = - ((*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum))+1); - else - (*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)) = - ((*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum))+(packetsPerFrame/2) +1); - /*} - //dr == 32 - else{ - if(i == 0) - pnuminc = 0; - else if(i == (packetsPerFrame/4)) - pnuminc = (packetsPerFrame/4); - else if(i == (packetsPerFrame/2)) - pnuminc = (packetsPerFrame/2); - else if(i == (3*packetsPerFrame/4)) - pnuminc = (3*packetsPerFrame/4); - (*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)) - = ((*(uint8_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum,))+pnuminc+1); - - }*/ + if(port) + *( (uint16_t*) wbuf_footer->packetnum) = (*( (uint16_t*) wbuf_footer->packetnum))+(packetsPerFrame/2); } - - if((*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)) != (i+1)){ - cprintf(BG_RED, "pnum mismatch! i:%d pnum:%d fnum:%d\n",i,(*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum)),currframenum); - if ((*(uint8_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->missingpacket))==0xFF) + if(*( (uint16_t*) wbuf_footer->packetnum) != (i+1)){ + cprintf(BG_RED, "pnum mismatch! i:%d pnum:%d fnum:%d\n", + i,*( (uint16_t*) wbuf_footer->packetnum),currframenum); + if (*( (uint16_t*) wbuf_header->missingpacket) == missingPacketValue) cprintf(BG_RED,"missing packet though\n"); exit(-1); } //overwriting port number and dynamic range - (*(uint8_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->missingpacket)) = - ((dynamicRange<<2)|(missingpacket<<1)|(port)); + *( (uint8_t*) wbuf_header->portnum) = port; + *( (uint8_t*) wbuf_header->dynamicrange) = dynamicRange; - //frame number - //(*(uint32_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->framenum)) = currframenum; #ifdef VERYDEBUG if((i==0)||(i==1)){ cprintf(GREEN, "%d packet header:0x%016llx missingpacket:0x%x\n",i, - ((uint64_t)(*((uint64_t*)(wbuffer[i])))), - (uint8_t)(*(uint8_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->missingpacket))); + (uint64_t)()*( (uint64_t*) wbuf_header)), *( (uint16_t*) wbuf_header->missingpacket)); cprintf(GREEN, "%d - 0x%x - %d\n", i, - (*(uint8_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->missingpacket)), - (*(uint16_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->packetnum))); + *( (uint16_t*) wbuf_header->missingpacket), *( (uint16_t*) wbuf_footer->packetnum)); } #endif -/* - cprintf(GREEN,"at writing, fnum:%d, pnum:%d,missingpacket:0x%x add:0x%x\n", - currframenum, i, (*(uint8_t*)(((eiger_packet_1g *)((char*)(wbuffer[i])))->missingpacket)), - (void*)(wbuffer[i])); -*/ } }