From bd363b2c93c212585c1f46152daf9a65dbe8ca95 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 15 May 2017 17:02:37 +0200 Subject: [PATCH] jungfrau finally works with new header --- slsReceiverSoftware/include/GeneralData.h | 18 ++++++----- slsReceiverSoftware/include/genericSocket.h | 2 +- slsReceiverSoftware/src/Listener.cpp | 31 ++++++++++--------- .../src/UDPStandardImplementation.cpp | 2 +- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index a61fb0509..6475593e6 100644 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -54,6 +54,9 @@ public: /** Max Frames per binary file */ uint32_t maxFramesPerFile; + /** emptybuffer (mainly for jungfrau) */ + uint32_t emptyHeader; + /** Data size that is saved into the fifo buffer at a time*/ uint32_t fifoBufferSize; @@ -78,8 +81,7 @@ public: /** Streaming (for ROI - mainly short Gotthard) - Image size (in bytes) */ uint32_t imageSize_Streamer; - /** emptybuffer (mainly for jungfrau) */ - uint32_t emptyHeader; + /** Cosntructor */ @@ -97,6 +99,7 @@ public: packetIndexMask(0), packetIndexOffset(0), maxFramesPerFile(0), + emptyHeader(0), fifoBufferSize(0), fifoBufferHeaderSize(0), defaultFifoDepth(0), @@ -104,8 +107,7 @@ public: headerPacketSize(0), nPixelsX_Streamer(0), nPixelsY_Streamer(0), - imageSize_Streamer(0), - emptyHeader(0) + imageSize_Streamer(0) {}; /** Destructor */ @@ -184,6 +186,7 @@ public: "Packet Index Mask: 0x%x\n" "Packet Index Offset: %u\n" "Max Frames Per File: %u\n" + "Empty Header: %u\n" "Fifo Buffer Size: %u\n" "Fifo Buffer Header Size: %u\n" "Default Fifo Depth: %u\n" @@ -192,7 +195,7 @@ public: "Streamer Pixels X: %u\n" "Streamer Pixels Y: %u\n" "Streamer Image Size: %u\n" - "Empty Header: %u\n" + ,temp.c_str(),//.c_str() modifies, using temp string for thread safety nPixelsX, nPixelsY, @@ -450,19 +453,20 @@ class JungfrauData : public GeneralData { myDetectorType = slsReceiverDefs::JUNGFRAU; nPixelsX = (256*4); nPixelsY = 256; - headerSizeinPacket = 22; + headerSizeinPacket = sizeof(slsReceiverDefs::sls_detector_header); dataSize = 8192; packetSize = headerSizeinPacket + dataSize; packetsPerFrame = 128; imageSize = dataSize*packetsPerFrame; maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE; + emptyHeader = 6; fifoBufferSize = imageSize; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header); defaultFifoDepth = 2500; nPixelsX_Streamer = nPixelsX; nPixelsY_Streamer = nPixelsY; imageSize_Streamer = imageSize; - emptyHeader = 6; + }; }; diff --git a/slsReceiverSoftware/include/genericSocket.h b/slsReceiverSoftware/include/genericSocket.h index d0074c5a9..fd4c8da75 100644 --- a/slsReceiverSoftware/include/genericSocket.h +++ b/slsReceiverSoftware/include/genericSocket.h @@ -628,7 +628,7 @@ enum communicationProtocol{ cprintf(BLUE,"%d gonna listen\n", portno); fflush(stdout); #endif nsent = recvfrom(socketDescriptor,(char*)buf+total_sent,nsending, 0, (struct sockaddr *) &clientAddress, &clientAddress_length); - //break out of loop only if read one packets size or read didnt work (cuz of shutdown) + //break out of loop only if read one packets size or read didnt work (cuz of shutdown) if(nsent<=0 || nsent == packet_size) break; //incomplete packets or header packets ignored and read buffer again diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 90b287b22..d320720a4 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -224,6 +224,7 @@ void Listener::ShutDownUDPSocket() { if(udpSocket){ udpSocket->ShutDownSocket(); FILE_LOG(logINFO) << "Shut down of UDP port " << *udpPortNumber; + fflush(stdout); delete udpSocket; udpSocket = 0; } @@ -314,11 +315,13 @@ uint32_t Listener::ListenToAnImage(char* buf) { uint32_t rc = 0; uint64_t fnum = 0, bid = 0; uint32_t pnum = 0, snum = 0; + uint32_t numpackets = 0; int dsize = generalData->dataSize; bool isHeaderEmpty = true; sls_detector_header* header = 0; + //reset to -1 memset(buf + generalData->fifoBufferHeaderSize, 0xFF, dsize); @@ -351,7 +354,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { if(isHeaderEmpty) { // -------------------------- new header ---------------------------------------------------------------------- if (myDetectorType == JUNGFRAU) { - memcpy(buf + FIFO_HEADER_NUMBYTES, header, sizeof(sls_detector_header)); + memcpy(buf + FIFO_HEADER_NUMBYTES, (char*)header, sizeof(sls_detector_header)); } // -------------------old header ------------------------------------------------------------------------------ else { @@ -368,24 +371,24 @@ uint32_t Listener::ListenToAnImage(char* buf) { //------------------------------------------------------------------------------------------------------------ isHeaderEmpty = false; } + numpackets++; } //until last packet isHeaderEmpty to account for gotthard short frame, else never entering this loop) - while ( isHeaderEmpty || (pnum < (generalData->packetsPerFrame-1))) { - + while ( numpackets < (generalData->packetsPerFrame)) { //listen to new packet - int curr_rc = 0; + rc = 0; if (udpSocket){ - curr_rc = udpSocket->ReceiveDataOnly(listeningPacket); + rc = udpSocket->ReceiveDataOnly(listeningPacket); } - if(curr_rc <= 0) { - if (rc <= 0) return 0; //empty image + if(rc <= 0) { + if (numpackets == 0) return 0; //empty image return generalData->imageSize; //empty packet now, but not empty image } - rc += curr_rc; + numpackets++; //update parameters numPacketsCaught++; //record immediately to get more time before socket shutdown @@ -393,8 +396,8 @@ uint32_t Listener::ListenToAnImage(char* buf) { // -------------------------- new header ---------------------------------------------------------------------- if (myDetectorType == JUNGFRAU) { - listeningPacket += generalData->emptyHeader; - header = (sls_detector_header*) (listeningPacket); + //listeningPacket += generalData->emptyHeader; + header = (sls_detector_header*) (listeningPacket + generalData->emptyHeader); fnum = header->frameNumber; pnum = header->packetNumber; } @@ -407,7 +410,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { lastCaughtFrameIndex = fnum; #ifdef VERBOSE //if (!index) - cprintf(GREEN,"Listening %d: fnum:%lu, pnum:%d\n", index,fnum, pnum); + cprintf(GREEN,"Listening %d: currentfindex:%lu, fnum:%lu, pnum:%u numpackets:%u\n", index,currentFrameIndex, fnum, pnum, numpackets); #endif if (!measurementStartedFlag) RecordFirstIndices(fnum); @@ -418,16 +421,16 @@ uint32_t Listener::ListenToAnImage(char* buf) { if (fnum != currentFrameIndex) { cprintf(RED,"setting carry over flag to true\n"); carryOverFlag = true; - memcpy(carryOverPacket,listeningPacket, generalData->packetSize); + memcpy(carryOverPacket,listeningPacket + generalData->emptyHeader, generalData->packetSize); return generalData->imageSize; } //copy packet - memcpy(buf + generalData->fifoBufferHeaderSize + (pnum * dsize), listeningPacket + generalData->headerSizeinPacket, dsize); + memcpy(buf + generalData->fifoBufferHeaderSize + (pnum * dsize), listeningPacket + generalData->emptyHeader + generalData->headerSizeinPacket, dsize); if(isHeaderEmpty) { // -------------------------- new header ---------------------------------------------------------------------- if (myDetectorType == JUNGFRAU) { - memcpy(buf + FIFO_HEADER_NUMBYTES, header, sizeof(sls_detector_header)); + memcpy(buf + FIFO_HEADER_NUMBYTES, (char*)header, sizeof(sls_detector_header)); } // -------------------old header ------------------------------------------------------------------------------ else { diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index c9cd6773b..540a6169d 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -567,7 +567,7 @@ void UDPStandardImplementation::startReadout(){ prev,totalP); #endif - usleep(1*1000*1000);usleep(1*1000*1000);usleep(1*1000*1000);usleep(1*1000*1000); + //usleep(1*1000*1000);usleep(1*1000*1000);usleep(1*1000*1000);usleep(1*1000*1000); usleep(5*1000);/* Need to find optimal time **/ prev = totalP;