diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index 680cf35c1..0ea8402ae 100644 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -7,6 +7,7 @@ *@short abstract for setting/getting properties of detector data */ +#include "sls_receiver_defs.h" #include "receiver_defs.h" @@ -14,6 +15,9 @@ class GeneralData { public: + /** DetectorType */ + slsReceiverDefs::detectorType myDetectorType; + /** Number of Pixels in x axis */ uint32_t nPixelsX; @@ -67,8 +71,22 @@ public: /** Cosntructor */ GeneralData(): + myDetectorType(slsReceiverDefs::GENERIC), + nPixelsX(0), + nPixelsY(0), + headerSizeinPacket(0), + dataSize(0), + packetSize(0), + packetsPerFrame(0), + imageSize(0), + frameIndexMask(0), + frameIndexOffset(0), packetIndexMask(0), packetIndexOffset(0), + maxFramesPerFile(0), + fifoBufferSize(0), + fifoBufferHeaderSize(0), + defaultFifoDepth(0), threadsPerReceiver(1), headerPacketSize(0){}; @@ -134,7 +152,8 @@ public: */ virtual void Print() const { printf("\n\nDetector Data Variables:\n"); - printf( "Pixels X: %d\n" + printf( "myDetectorType:%s\n" + "Pixels X: %d\n" "Pixels Y: %d\n" "Header Size in Packet: %d\n" "Data Size: %d\n" @@ -151,6 +170,7 @@ public: "Default Fifo Depth: %d\n" "Threads Per Receiver: %d\n" "Header Packet Size: %d\n", + slsReceiverDefs::getDetectorType(myDetectorType).c_str(), nPixelsX, nPixelsY, headerSizeinPacket, @@ -178,6 +198,7 @@ class GotthardData : public GeneralData { /** Constructor */ GotthardData(){ + myDetectorType = slsReceiverDefs::GOTTHARD; nPixelsX = 1280; nPixelsY = 1; headerSizeinPacket = 4; @@ -202,6 +223,7 @@ class ShortGotthardData : public GeneralData { /** Constructor */ ShortGotthardData(){ + myDetectorType = slsReceiverDefs::GOTTHARD; nPixelsX = 256; nPixelsY = 1; headerSizeinPacket = 4; @@ -229,6 +251,7 @@ class PropixData : public GeneralData { /** Constructor */ PropixData(){ + myDetectorType = slsReceiverDefs::PROPIX; nPixelsX = 22; nPixelsY = 22; headerSizeinPacket = 4; @@ -256,6 +279,7 @@ class Moench02Data : public GeneralData { /** Constructor */ Moench02Data(){ + myDetectorType = slsReceiverDefs::MOENCH; nPixelsX = 160; nPixelsY = 160; headerSizeinPacket = 4; @@ -288,6 +312,7 @@ class Moench03Data : public GeneralData { /** Constructor */ Moench03Data(){ + myDetectorType = slsReceiverDefs::MOENCH; nPixelsX = 400; nPixelsY = 400; headerSizeinPacket = 22; @@ -315,6 +340,7 @@ class JCTBData : public GeneralData { /** Constructor */ JCTBData(){ + myDetectorType = slsReceiverDefs::JUNGFRAUCTB; nPixelsX = 32; nPixelsY = 128; headerSizeinPacket = 22; @@ -358,6 +384,7 @@ private: /** Constructor */ JungfrauData(){ + myDetectorType = slsReceiverDefs::JUNGFRAU; nPixelsX = (256*4); nPixelsY = 256; headerSizeinPacket = 22; @@ -401,7 +428,7 @@ private: subFrameNumber = -1; jfrau_packet_header_t* header = (jfrau_packet_header_t*)(packetData); frameNumber = (uint64_t)(*( (uint32_t*) header->frameNumber)); - packetNumber = packetsPerFrame - 1 -(uint32_t)(*( (uint8_t*) header->packetNumber)); + packetNumber = packetsPerFrame - 1 -(uint32_t)(*( (uint8_t*) header->packetNumber));//old firmware (not needed in new firmware) bunchId = (*((uint64_t*) header->bunchid)); } @@ -443,6 +470,7 @@ private: /** Constructor */ EigerData(){ + myDetectorType = slsReceiverDefs::EIGER; nPixelsX = (256*2); nPixelsY = 256; headerSizeinPacket = 8; @@ -470,7 +498,7 @@ private: void GetHeaderInfo(int index, char* packetData, uint64_t& frameNumber, uint32_t& packetNumber) const { eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(packetData + footerOffset); frameNumber = (uint64_t)((*( (uint64_t*) footer)) & frameIndexMask); - packetNumber = (uint32_t)(*( (uint16_t*) footer->packetNumber))-1; + packetNumber = ((uint32_t)(*( (uint16_t*) footer->packetNumber)))-1; } /** @@ -489,7 +517,7 @@ private: subFrameNumber = -1; eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(packetData + footerOffset); frameNumber = (uint64_t)((*( (uint64_t*) footer)) & frameIndexMask); - packetNumber = (uint32_t)(*( (uint16_t*) footer->packetNumber))-1; + packetNumber = ((uint32_t)(*( (uint16_t*) footer->packetNumber)))-1; if (dynamicRange == 32) { eiger_packet_header_t* header = (eiger_packet_header_t*) (packetData); subFrameNumber = (uint64_t) *( (uint32_t*) header->subFrameNumber); diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index adeb0110d..326b0cde8 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -258,16 +258,21 @@ void Listener::ThreadExecution() { return; } - //error check + //error check, (should not be here) if not transmitting yet (previous if) rc should be > 0 if (rc <= 0) { - cprintf(BG_RED,"Error:(Weird), UDP Sockets not shut down, but received nothing\n"); - fifo->FreeAddress(buffer); + if (carryOverFlag) { + uint64_t fnum=0;uint32_t pnum=0; + generalData->GetHeaderInfo(index, carryOverPacket, fnum, pnum); + if (fnum < currentFrameIndex) + cprintf(BG_RED,"Error:(Weird Early self shut down), Frame number less than current frame number\n"); + }else + cprintf(BG_RED,"Error:(Weird Early self shut down), UDP Sockets not shut down, but received nothing\n"); + StopListening(buffer); return; } (*((uint32_t*)buffer)) = rc; - //for those returning earlier - (*((uint64_t*)(buffer + FIFO_HEADER_NUMBYTES ))) = currentFrameIndex; + (*((uint64_t*)(buffer + FIFO_HEADER_NUMBYTES ))) = currentFrameIndex; //for those returning earlier currentFrameIndex++; //push into fifo @@ -295,6 +300,9 @@ uint32_t Listener::ListenToAnImage(char* buf) { int dsize = generalData->dataSize; bool isHeaderEmpty = true; + //only for jungfrau as we look only at pnum + uint32_t expectpnum = 0; + //reset to -1 memset(buf,0xFF,dsize); @@ -305,6 +313,8 @@ uint32_t Listener::ListenToAnImage(char* buf) { //check if its the current image packet generalData->GetHeaderInfo(index, carryOverPacket, *dynamicRange, fnum, pnum, snum, bid); if (fnum != currentFrameIndex) { + if (fnum < currentFrameIndex) + return 0; return generalData->imageSize; } carryOverFlag = false; @@ -315,15 +325,20 @@ uint32_t Listener::ListenToAnImage(char* buf) { (*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid; isHeaderEmpty = false; } + expectpnum = pnum+1; //for jungfrau } + //until last packet while (pnum < (generalData->packetsPerFrame-1)) { //listen to new packet - rc += udpSocket->ReceiveDataOnly(listeningPacket); - if (rc <= 0) return 0; - + int curr_rc = udpSocket->ReceiveDataOnly(listeningPacket); + if(curr_rc <= 0) { + if (rc <= 0) return 0; //empty image + return generalData->imageSize; //empty packet now, but not empty image + } + rc += curr_rc; //update parameters numPacketsCaught++; //record immediately to get more time before socket shutdown @@ -331,14 +346,26 @@ uint32_t Listener::ListenToAnImage(char* buf) { generalData->GetHeaderInfo(index, listeningPacket, *dynamicRange, fnum, pnum, snum, bid); lastCaughtFrameIndex = fnum; #ifdef VERBOSE - if (!index && !pnum) + if (!index) cprintf(GREEN,"Listening %d: fnum:%lld, pnum:%d\n", index, (long long int)fnum, pnum); #endif if (!measurementStartedFlag) RecordFirstIndices(fnum); - //future packet - if (fnum != currentFrameIndex) { + + + //future packet (jungfrau) look at packet numbers + if (generalData->myDetectorType == JUNGFRAU) { + if (pnum < expectpnum) { + cprintf(RED,"setting carry over flag to true\n"); + carryOverFlag = true; + memcpy(carryOverPacket,listeningPacket, generalData->packetSize); + return generalData->imageSize; + } + } + //future packet by looking at image number (all other detectors) + else if (fnum != currentFrameIndex) { + cprintf(RED,"setting carry over flag to true\n"); carryOverFlag = true; memcpy(carryOverPacket,listeningPacket, generalData->packetSize); return generalData->imageSize; @@ -352,6 +379,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { (*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid; isHeaderEmpty = false; } + expectpnum = pnum+1; //for jungfrau } return generalData->imageSize; diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index bafc2bffb..127dc62a6 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -562,15 +562,16 @@ void UDPStandardImplementation::stopReceiver(){ for (int i = 0; i < numThreads; i++) { tot += dataProcessor[i]->GetNumFramesCaught(); - if (dataProcessor[i]->GetNumFramesCaught() < numberOfFrames) { + uint64_t missingpackets = numberOfFrames*generalData->packetsPerFrame-listener[i]->GetTotalPacketsCaught(); + if (missingpackets) { cprintf(RED, "\n[Port %d]\n",udpPortNum[i]); - cprintf(RED, "Missing Packets\t\t: %lld\n",(long long int)numberOfFrames*generalData->packetsPerFrame-listener[i]->GetTotalPacketsCaught()); - cprintf(RED, "Frames Caught\t\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught()); + cprintf(RED, "Missing Packets\t\t: %lld\n",(long long int)missingpackets); + cprintf(RED, "Frames Processed\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught()); cprintf(RED, "Last Frame Caught\t: %lld\n",(long long int)listener[i]->GetLastFrameIndexCaught()); }else{ cprintf(GREEN, "\n[Port %d]\n",udpPortNum[i]); - cprintf(GREEN, "Missing Packets\t\t: %lld\n",(long long int)numberOfFrames*generalData->packetsPerFrame-listener[i]->GetTotalPacketsCaught()); - cprintf(GREEN, "Frames Caught\t\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught()); + cprintf(GREEN, "Missing Packets\t\t: %lld\n",(long long int)missingpackets); + cprintf(GREEN, "Frames Processed\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught()); cprintf(GREEN, "Last Frame Caught\t: %lld\n",(long long int)listener[i]->GetLastFrameIndexCaught()); } }