diff --git a/slsReceiverSoftware/include/slsReceiver.h b/slsReceiverSoftware/include/slsReceiver.h index e76ea7d1b..94548caed 100644 --- a/slsReceiverSoftware/include/slsReceiver.h +++ b/slsReceiverSoftware/include/slsReceiver.h @@ -62,14 +62,14 @@ class slsReceiver : private virtual slsReceiverDefs { @param func callback to be called when starting the acquisition. Its arguments are filepath filename fileindex data size \returns 0 callback takes care of open,close,write file; 1 callback writes file, we have to open, close it; 2 we open, close, write file, callback does not do anything */ - void registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg); + void registerCallBackStartAcquisition(int (*func)(char*, char*,uint64_t, uint32_t, void*),void *arg); /** callback argument is toatal farmes caught */ - void registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg); + void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg); /** args to raw data ready callback are @@ -79,7 +79,7 @@ class slsReceiver : private virtual slsReceiverDefs { file descriptor guidatapointer (NULL, no data required) */ - void registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg); + void registerCallBackRawDataReady(void (*func)(uint64_t, char*, uint32_t, FILE*, char*, void*),void *arg); private: diff --git a/slsReceiverSoftware/include/slsReceiverUsers.h b/slsReceiverSoftware/include/slsReceiverUsers.h index 50d6f38fe..0d242d372 100644 --- a/slsReceiverSoftware/include/slsReceiverUsers.h +++ b/slsReceiverSoftware/include/slsReceiverUsers.h @@ -61,7 +61,7 @@ public: */ - void registerCallBackStartAcquisition(int (*func)(char* filepath, char* filename,int fileindex, int datasize, void*),void *arg); + void registerCallBackStartAcquisition(int (*func)(char* filepath, char* filename,uint64_t fileindex, uint32_t datasize, void*),void *arg); /** @@ -71,7 +71,7 @@ public: */ - void registerCallBackAcquisitionFinished(void (*func)(int nf, void*),void *arg); + void registerCallBackAcquisitionFinished(void (*func)(uint64_t nf, void*),void *arg); @@ -81,7 +81,7 @@ public: \returns nothing */ - void registerCallBackRawDataReady(void (*func)(int framenumber, char* datapointer, int datasize, FILE* filedescriptor, char* guidatapointer, void*),void *arg); + void registerCallBackRawDataReady(void (*func)(uint64_t framenumber, char* datapointer, uint32_t datasize, FILE* filedescriptor, char* guidatapointer, void*),void *arg); // made static to close thread files with ctrl+c static slsReceiver* receiver; diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index a6833e57d..b15a48cc4 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -1921,7 +1921,7 @@ void UDPStandardImplementation::processWritingBufferPacketByPacket(int ithread){ //pop fifo and if end of acquisition if(popAndCheckEndofAcquisition(ithread, packetBuffer, popReady, numPackets,toFreePointers,toFreePointersOffset)){ #ifdef DEBUG4 - cprintf(GREEN,"All dummy-end buffers popped\n", ithread); + cprintf(GREEN,"Writing_Thread All dummy-end buffers popped\n", ithread); #endif //finish missing packets if(((frameBufferoffset[0]!=0) || (frameBufferoffset[1]!=(packetsPerFrame/numberofListeningThreads)))); @@ -1932,22 +1932,25 @@ void UDPStandardImplementation::processWritingBufferPacketByPacket(int ithread){ } - + //get a full frame------------------------------------------------------------------------------------------------------- for(int i=0;ipacketNumber); -#ifdef DEBUG4 - cprintf(GREEN,"Fifo %d: Packet has fnum %d, pnum %d, last_packet %d, pnum_offset\n", - i,threadFrameNumber[i],currentPacketNumber[i],lastPacketNumber[i],frameBufferoffset[i]); -#endif } - - - //dummy not done ----------------------------- - if(numPackets[i] == dummyPacketValue){ + //calculate number of missing packets----------------------------------------------------- + numberofMissingPackets[i] = 0; #ifdef DEBUG4 - cprintf(RED, "Fifo %d: Dummy packet: Adding missing packets to the last frame\n", i); -#endif - numberofMissingPackets[i] = (LAST_PACKET_VALUE - lastPacketNumber[i]); - threadFrameNumber[i] = dummyPacketValue; - } - - /**check if next frame lastpacket number is actually +1*/ - //wrong packet & correct (dummy (not full) or from future packet))-------------------------------- - else{// if ((threadFrameNumber[i] != presentFrameNumber) ||(currentPacketNumber[i] != lastPacketNumber[i] + 1)){ -#ifdef DEBUG4 - cprintf(GREEN,"Fifo %d: Wrong Packet has fnum %d, (firmware fnum %d), pnum %d, last_packet %d, pnum_offset %d\n", + if(numPackets[i] == dummyPacketValue) + cprintf(GREEN, "Fifo %d: Dummy packet: Adding missing packets to the last frame\n", i); + else{ + cprintf(GREEN,"Fifo %d: fnum %d, (FW_fnum %d), pnum %d, last_pnum %d, pnum_offset %d\n" + "Fifo %d: Add missing packets to the right fnum %d\n", i,presentFrameNumber[i],(uint32_t)(*( (uint64_t*) packetBuffer_footer)), - *( (uint16_t*) packetBuffer_footer->packetNumber),lastPacketNumber[i],frameBufferoffset[i] ); - cprintf(RED,"Fifo %d: Add missing packets to the right fnum %d\n", + *( (uint16_t*) packetBuffer_footer->packetNumber),lastPacketNumber[i],frameBufferoffset[i], i,presentFrameNumber); -#endif - if(threadFrameNumber[i] != presentFrameNumber) - numberofMissingPackets[i] = (LAST_PACKET_VALUE - lastPacketNumber[i]); - else - numberofMissingPackets[i] = (currentPacketNumber[i] - lastPacketNumber[i] - 1); } +#endif + if((numPackets[i] == dummyPacketValue) || (threadFrameNumber[i] != presentFrameNumber)) + numberofMissingPackets[i] = (LAST_PACKET_VALUE - lastPacketNumber[i]); + else + numberofMissingPackets[i] = (currentPacketNumber[i] - lastPacketNumber[i] - 1); - //add missing packets + //add missing packets--------------------------------------------------------------------- for(int j=0;jmissingPacket)!= missingPacketValue){ blankframe_header = (eiger_packet_header_t*) blankframe[blankoffset]; cprintf(BG_RED, "Fifo %d: Missing Packet Error: Adding blank packets mismatch " - "pnum_offset %d, fnum_thread %d, missingpacket_buffer 0x%x, missingpacket_blank 0x%x\n", - i,frameBufferoffset[i],threadFrameNumber[i], + "pnum_offset %d, pnum %d, fnum_thread %d, missingpacket_buffer 0x%x, missingpacket_blank 0x%x\n", + i,frameBufferoffset[i],currentPacketNumber[i],threadFrameNumber[i], *( (uint16_t*) frameBuffer_header->missingPacket), *( (uint16_t*) blankframe_header->missingPacket)); exit(-1); }else{ #ifdef DEBUG4 - cprintf(GREEN, "Fifo %d: Missing Packet Adding blank packets success " - "pnum_offset %d, fnum_thread %d, missingpacket_buffer 0x%x\n", - i,frameBufferoffset[i],threadFrameNumber[i], + cprintf(RED, "Fifo %d: Missing Packet: Adding blank packets success " + "pnum_offset %d, pnum %d, fnum_thread %d, missingpacket_buffer 0x%x\n", + i,frameBufferoffset[i],currentPacketNumber[i],threadFrameNumber[i], *( (uint16_t*) frameBuffer_header->missingPacket)); #endif frameBufferoffset[i]++; blankoffset++; } + } - } - if((numPackets[i] == dummyPacketValue) ||(threadFrameNumber[i] != presentFrameNumber)){ - //set fullframe and dont let fifo pop over it - fullframe[i] = true; + //missed packets/future packet: do not pop over and determine fullframe-------------------- + if(numberofMissingPackets[i]){ popReady[i] = false; + if((numPackets[i] == dummyPacketValue) ||(threadFrameNumber[i] != presentFrameNumber)) + fullframe[i] = true; + else{ + fullframe[i] = false; + //update last packet + lastPacketNumber[i] = currentPacketNumber[i] - 1; + } + if(threadFrameNumber[i] != presentFrameNumber) + threadFrameNumber[i] = presentFrameNumber; + numMissingPackets += numberofMissingPackets[i]; } - //add current packet - if(threadFrameNumber[i] == presentFrameNumber){ + + //no missed packet: add current packet-------------------------------------------------------------- + else{ if(currentPacketNumber[i] != (uint32_t)(frameBufferoffset[i]-(i*packetsPerFrame/numberofListeningThreads))+1){ - cprintf(BG_RED, "Fifo %d: Correct Packet Error:Adding current packet mismatch " - "pnum_offset %d,pnum %d fnum %d, (firmware fnum %d)\n", + cprintf(BG_RED, "Fifo %d: Correct Packet Offset Error:Adding current packet mismatch " + "pnum_offset %d,pnum %d fnum_thread %d, (FW_fnum %d)\n", i,frameBufferoffset[i],currentPacketNumber[i], threadFrameNumber[i],(uint32_t)(*( (uint64_t*) packetBuffer_footer))); exit(-1); } frameBuffer[frameBufferoffset[i]] = packetBuffer[i] + HEADER_SIZE_NUM_TOT_PACKETS; - tempframe_header = (eiger_packet_header_t*) tempbuffer[tempoffset[i]]; - tempframe_footer = (eiger_packet_footer_t*) (tempbuffer[tempoffset[i]] + footer_offset); +#ifdef DEBUG4 + eiger_packet_header_t* frameBuffer_header = (eiger_packet_header_t*) frameBuffer[frameBufferoffset[i]]; + eiger_packet_footer_t* frameBuffer_footer = (eiger_packet_footer_t*) (frameBuffer[frameBufferoffset[i]] + footer_offset); + cprintf(GREEN, "Fifo %d: Current Packet added success:" + "pnum_offset %d, pnum %d, fnum_thread %d, missingpacket_buffer 0x%x\n", + i,frameBufferoffset[i],currentPacketNumber[i],threadFrameNumber[i], + *( (uint16_t*) frameBuffer_header->missingPacket)); +#endif + frameBufferoffset[i]++; + //update last packet + lastPacketNumber[i] = currentPacketNumber[i]; + popReady[i] = true; + fullframe[i] = false; + if(currentPacketNumber[i] == LAST_PACKET_VALUE){ +#ifdef DEBUG4 + cprintf(GREEN, "Fifo %d: Got last packet\n",i); +#endif + popReady[i] = false; + fullframe[i] = true; + } } + } + } + //full frame + if(fullframe[0] && fullframe[1]){ + currentPacketNumber = presentFrameNumber; + numTotMissingPacketsInFile += numMissingPackets; + numTotMissingPackets += numMissingPackets; +#ifdef FNUM_DEBUG + cprintf(GREEN,"**fnum:%d**\n",currframenum); +#endif +#ifdef MISSINGP_DEBUG + if(numberofMissingPackets[0]) + cprintf(RED, "Fifo 0 missing packets %d for fnum %d\n",numberofMissingPackets[0],currentPacketNumber); + if(numberofMissingPackets[1]) + cprintf(RED, "Fifo 1 missing packets%d for fnum %d\n",numberofMissingPackets[1],currentPacketNumber); + if(numMissingPackets){ + cprintf(RED, "Total missing packets %d for fnum %d\n",numMissingPackets,currentPacketNumber); + for (int j=0;jmissingPacket)==missingPacketValue) + cprintf(RED,"Found missing packet at pnum %d\n",j); + } + } +#endif - if(threadFrameNumber[i] != presentFrameNumber) - threadFrameNumber[i] = presentFrameNumber; - - - - - - - + //write and copy to gui + handleWithoutDataCompression(ithread,frameBuffer,packetsPerFrame); + + //freeing + for(int j=0;jpush(toFreePointers[j])); +#ifdef FIFODEBUG + cprintf(GREEN,"Fifo 0: Writing_Thread freed: pushed into fifofree %p\n",ithread, (void*)(toFreePointers[j])); +#endif + } + for(int j=(packetsPerFrame/numberofListeningThreads);jpush(toFreePointers[j])); +#ifdef FIFODEBUG + cprintf(GREEN,"Fifo 1: Writing_Thread freed: pushed into fifofree %p\n",ithread, (void*)(toFreePointers[j])); +#endif + } +#ifdef DEBUG4 + cprintf(GREEN,"Writing_Thread: finished freeing\n"); +#endif + //reset a few stuff + presentFrameNumber++; + for(int i=0; ipacketNumber), (void*)(packetBuffer[i])); + } +#endif @@ -2646,244 +2712,3 @@ void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -int UDPStandardImplementation::startWriting(){ - FILE_LOG(logDEBUG1) << __AT__ << " called"; - - - - - - - eiger_packet_footer_t* wbuf_footer=0; - eiger_packet_header_t* tempframe_header=0; - eiger_packet_footer_t* tempframe_footer=0; - - - - - while(1){ - - - - - - - while((1<packetnum),tempoffset[i]); -#endif - 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%p\n", - i,*( (uint16_t*) tempframe_footer->packetnum),*( (uint16_t*) wbuf_footer->packetnum), - tempframenum[i],(void*)(tempbuffer[tempoffset[i]])); - exit(-1); - } -#ifdef PADDING - cprintf(GREEN, "normal packet i:%d pnum:%d fnum:%d missingpacket:0x%x add:0x%x\n", - i,tempoffset[i],tempframenum[i], - *( (uint16_t*) tempframe_header->missingpacket), - (void*)(tempbuffer[tempoffset[i]])); -#endif - tempoffset[i] ++; - //update last packet - lastpacketheader[i] = currentpacketheader[i]; - popready[i] = true; - //last frame got, this will save time and also for last frames, it doesnt wait for stop receiver - if(currentpacketheader[i] == LAST_PACKET_VALUE){ -#ifdef EIGER_DEBUG3 - cprintf(GREEN, "Got last packet\n"); -#endif - fullframe[i] = true; - popready[i] = false; - } - } - } - } - } - - - - //FULL FRAME - if(fullframe[0] && fullframe[1]){ - - //determine frame number - if(tempframenum[0] != tempframenum[1]) - cprintf(RED,"Frame numbers mismatch!!! %d %d\n",tempframenum[0],tempframenum[1]); - currframenum = tempframenum[0]; - numMissingPackets += (numberofmissingpackets[0]+numberofmissingpackets[1]); - numTotMissingPacketsInFile += numMissingPackets; - numTotMissingPackets += numMissingPackets; -#ifdef EIGER_DEBUG2 - cprintf(GREEN,"**fnum:%d**\n",currframenum); -#endif -#ifdef EIGER_DEBUG3 - if(numberofmissingpackets[0]) - cprintf(RED, "fifo 0 missing packets:%d fnum:%d\n",numberofmissingpackets[0],currframenum); - if(numberofmissingpackets[1]) - cprintf(RED, "fifo 1 missing packets:%d fnum:%d\n",numberofmissingpackets[1],currframenum); - if(numMissingPackets){ - cprintf(RED, "numMissingPackets:%d fnum:%d\n",numMissingPackets,currframenum); - - for (j=0;jmissingpacket)==missingPacketValue) - cprintf(RED,"found the missing packet at pnum:%d\n",j); - } - } -#endif - - - //write and copy to gui - handleWithoutDataCompression(ithread,tempbuffer,packetsPerFrame); - - - //freeing - for(j=0;jpush(tofree[j])); -#ifdef FIFO_DEBUG - cprintf(GREEN,"%d writer freed pushed into fifofree %x for listener %d\n",ithread, (void*)(tofree[j]),0); -#endif - } - for(j=(packetsPerFrame/numListeningThreads);jpush(tofree[j])); -#ifdef FIFO_DEBUG - cprintf(GREEN,"%d writer freed pushed into fifofree %x for listener %d\n",ithread, (void*)(tofree[j]),1); -#endif - } -#ifdef VERYDEBUG - cprintf(GREEN,"finished freeing\n"); -#endif - - - //reset a few stuff - presentframenum = tempframenum[0]+1; - for(int i=0;ipacketnum)); - } -#endif - } - - - - - } - - } - - - return OK; -} - - - - - - - - - - - - - - diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/src/slsReceiver.cpp index 5783e601c..15149dde0 100644 --- a/slsReceiverSoftware/src/slsReceiver.cpp +++ b/slsReceiverSoftware/src/slsReceiver.cpp @@ -166,20 +166,20 @@ int64_t slsReceiver::getReceiverVersion(){ } -void slsReceiver::registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg){ +void slsReceiver::registerCallBackStartAcquisition(int (*func)(char*, char*,uint64_t, uint32_t, void*),void *arg){ //tcpipInterface udp_interface->registerCallBackStartAcquisition(func,arg); } -void slsReceiver::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){ +void slsReceiver::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){ //tcpipInterface udp_interface->registerCallBackAcquisitionFinished(func,arg); } -void slsReceiver::registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg){ +void slsReceiver::registerCallBackRawDataReady(void (*func)(uint64_t, char*, uint32_t, FILE*, char*, void*),void *arg){ //tcpipInterface udp_interface->registerCallBackRawDataReady(func,arg); } diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index cfab3e75d..5b4664e55 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -9,6 +9,7 @@ #include "slsReceiverUsers.h" #include "slsReceiver.h" + #include //SIGINT #include //EXIT @@ -401,6 +402,7 @@ int slsReceiverTCPIPInterface::set_detector_type(){ } } } + } //#ifdef VERBOSE if(ret!=FAIL) cout << "detector type" << dr << endl; @@ -432,7 +434,7 @@ int slsReceiverTCPIPInterface::set_detector_type(){ int slsReceiverTCPIPInterface::set_file_name() { ret=OK; - char* retval[MAX_STR_LENGTH] = NULL; + char* retval = NULL; char defaultVal[MAX_STR_LENGTH] = ""; char fName[MAX_STR_LENGTH]; strcpy(mess,"Could not set file name"); @@ -457,7 +459,7 @@ int slsReceiverTCPIPInterface::set_file_name() { } else{ receiverBase->setFileName(fName); - retval = receiveBase->getFileName(); + retval = receiverBase->getFileName(); if(retval == NULL) ret = FAIL; } @@ -526,8 +528,8 @@ int slsReceiverTCPIPInterface::set_file_dir() { } else{ receiverBase->setFilePath(fPath); - retval = receiveBase->getFilePath(); - if(reval == NULL){ + retval = receiverBase->getFilePath(); + if(retval == NULL){ ret = FAIL; strcpy(mess,"receiver file path does not exist\n"); } @@ -741,8 +743,8 @@ int slsReceiverTCPIPInterface::setup_udp(){ //set up udp port sscanf(args[1],"%d",&udpport); sscanf(args[2],"%d",&udpport2); - receiverBase->setUDPPortNo(udpport); - receiverBase->setUDPPortNo2(udpport2); + receiverBase->setUDPPortNumber(udpport); + receiverBase->setUDPPortNumber2(udpport2); //setup udpip //get ethernet interface or IP to listen to cout << "Ethernet interface is " << args[0] << endl; diff --git a/slsReceiverSoftware/src/slsReceiverUsers.cpp b/slsReceiverSoftware/src/slsReceiverUsers.cpp index c27f1efc2..1df35558c 100644 --- a/slsReceiverSoftware/src/slsReceiverUsers.cpp +++ b/slsReceiverSoftware/src/slsReceiverUsers.cpp @@ -29,18 +29,18 @@ int64_t slsReceiverUsers::getReceiverVersion(){ } -void slsReceiverUsers::registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg){ +void slsReceiverUsers::registerCallBackStartAcquisition(int (*func)(char*, char*,uint64_t, uint32_t, void*),void *arg){ slsReceiverUsers::receiver->registerCallBackStartAcquisition(func,arg); } -void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){ +void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){ slsReceiverUsers::receiver->registerCallBackAcquisitionFinished(func,arg); } -void slsReceiverUsers::registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg){ +void slsReceiverUsers::registerCallBackRawDataReady(void (*func)(uint64_t, char*, uint32_t, FILE*, char*, void*),void *arg){ slsReceiverUsers::receiver->registerCallBackRawDataReady(func,arg); }