From 6063c712f734a93a08a1e90765e187de2e0690ec Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 10 Mar 2015 15:04:50 +0100 Subject: [PATCH 1/8] copy first frame to latest data no matter what and also copy only if more than packets per frame --- .../src/UDPBaseImplementation.cpp | 2 +- .../src/UDPStandardImplementation.cpp | 75 +++++++++++-------- .../src/slsReceiverTCPIPInterface.cpp | 4 +- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index f12890aa2..8b2cdb598 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -688,7 +688,7 @@ void UDPBaseImplementation::copyFrameToGui(char* startbuf[], uint32_t fnum, char pthread_mutex_unlock(&dataReadyMutex); } - //random read or nth frame read, gui needs data now + //random read or nth frame read, gui needs data now or it is the first frame else{ /* //nth frame read, block current process if the guireader hasnt read it yet diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 6f454ab57..55e8775f7 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -874,7 +874,7 @@ void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, ui if (guiData == NULL){ guiData = latestData; #ifdef VERY_VERY_DEBUG - cout <<"gui data not null anymore" << endl; + cout << "gui data not null anymore" << endl; #endif } @@ -886,14 +886,14 @@ void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, ui //could not get gui data if(!guiDataReady){ #ifdef VERY_VERY_DEBUG - cout<<"gui data not ready"<= packetsPerFrame){//min 1 frame, but neednt be + //if(numpackets == packetsPerFrame * numJobsPerThread){ //only full frames copyFrameToGui(NULL,-1,wbuf[0]+HEADER_SIZE_NUM_TOT_PACKETS); #ifdef VERYVERBOSE cout << ithread << " finished copying" << endl; @@ -2108,8 +2117,16 @@ int i; exit(-1); } + //free buffer + if(rc <= 0){ + cout << ithread << "Discarding empty frame" << endl; + fifoFree[ithread]->push(buffer[ithread]); +#ifdef FIFO_DEBUG + cprintf(BLUE,"%d listener empty buffer pushed into fifofree %x\n", ithread, (void*)(buffer[ithread])); +#endif + } //push the last buffer into fifo - if(rc > 0){ + else{ //eiger (incomplete frames) - throw away if((myDetectorType == EIGER) && (rc < (bufferSize * numJobsPerThread)) ){ if(rc == 266240) @@ -2135,14 +2152,6 @@ int i; #endif } } - //free buffer - else{ - cout << ithread << "Discarding empty frame" << endl; - fifoFree[ithread]->push(buffer[ithread]); -#ifdef FIFO_DEBUG - cprintf(BLUE,"%d listener empty buffer pushed into fifofree %x\n", ithread, (void*)(buffer[ithread])); -#endif - } diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 8b0d52195..8c3815c19 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -1252,10 +1252,10 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){ } #ifdef VERBOSE - if(arg!=-1){ + //if(arg!=-1){ cout << "fName:" << fName << endl; cout << "findex:" << arg << endl; - } + //} #endif From 89ad2112c6b397a340635b5573e2ef645321aa0b Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 12 Mar 2015 12:25:23 +0100 Subject: [PATCH 2/8] difference between acquisition index and frame index --- .../include/UDPBaseImplementation.h | 18 ++- slsReceiverSoftware/include/UDPInterface.h | 10 +- .../include/UDPRESTImplementation.h | 9 +- .../include/UDPStandardImplementation.h | 10 +- .../src/UDPBaseImplementation.cpp | 59 +++++---- .../src/UDPRESTImplementation.cpp | 19 +-- .../src/UDPStandardImplementation.cpp | 36 ++++-- .../src/slsReceiverTCPIPInterface.cpp | 117 +++++++++++++----- 8 files changed, 190 insertions(+), 88 deletions(-) diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index 90aaf52b9..6450f85f0 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -67,6 +67,11 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter //Frame indices and numbers caught + /** + * Returns the frame index at start of entire acquisition (including all scans) + */ + uint32_t getStartAcquisitionIndex(); + /** * Returns current Frame Index Caught for an entire acquisition (including all scans) */ @@ -288,9 +293,11 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter * @param c pointer to current file name * @param raw address of pointer, pointing to current frame to send to gui * @param fnum frame number for eiger as it is not in the packet - * @param fstartind is the start index of the acquisition + * @param startAcquisitionIndex is the start index of the acquisition + * @param startFrameIndex is the start index of the scan */ - void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind); + void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex); + /** * Closes all files * @param ithr thread index @@ -479,6 +486,13 @@ protected: unsigned char fnum[4]; unsigned char header_after[24]; } eiger_image_header; + /** structure of an eiger image header*/ + typedef struct + { + unsigned char header_before[35]; + unsigned char fnum[4]; + unsigned char header_after[9]; + } eiger_image_header32; /** structure of an eiger image header*/ diff --git a/slsReceiverSoftware/include/UDPInterface.h b/slsReceiverSoftware/include/UDPInterface.h index 831b9bb62..8f3ce3f41 100644 --- a/slsReceiverSoftware/include/UDPInterface.h +++ b/slsReceiverSoftware/include/UDPInterface.h @@ -240,6 +240,11 @@ class UDPInterface { */ virtual int getFramesCaught() = 0; + /** + * Returns the frame index at start of entire acquisition (including all scans) + */ + virtual uint32_t getStartAcquisitionIndex()=0; + /** * Returns current Frame Index Caught for an entire acquisition (including all scans) */ @@ -328,9 +333,10 @@ class UDPInterface { * @param c pointer to current file name * @param raw address of pointer, pointing to current frame to send to gui * @param fnum frame number for eiger as it is not in the packet - * @param fstartind is the start index of the acquisition + * @param startAcquisitionIndex is the start index of the acquisition + * @param startFrameIndex is the start index of the scan */ - virtual void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind ) = 0; + virtual void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex)=0; /** set status to transmitting and * when fifo is empty later, sets status to run_finished diff --git a/slsReceiverSoftware/include/UDPRESTImplementation.h b/slsReceiverSoftware/include/UDPRESTImplementation.h index 6f59c30c2..f335ba9d2 100644 --- a/slsReceiverSoftware/include/UDPRESTImplementation.h +++ b/slsReceiverSoftware/include/UDPRESTImplementation.h @@ -89,6 +89,11 @@ class UDPRESTImplementation : protected virtual slsReceiverDefs, public UDPBaseI //Frame indices and numbers caught + /** + * Returns the frame index at start of entire acquisition (including all scans) + */ + uint32_t getStartAcquisitionIndex(); + /** * Returns current Frame Index Caught for an entire acquisition (including all scans) */ @@ -300,8 +305,10 @@ class UDPRESTImplementation : protected virtual slsReceiverDefs, public UDPBaseI * @param c pointer to current file name * @param raw address of pointer, pointing to current frame to send to gui * @param fnum frame number for eiger as it is not in the packet + * @param startAcquisitionIndex is the start index of the acquisition + * @param startFrameIndex is the start index of the scan */ - void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind); + void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex); /** * Closes all files diff --git a/slsReceiverSoftware/include/UDPStandardImplementation.h b/slsReceiverSoftware/include/UDPStandardImplementation.h index dca52e6a4..bad7f7a2e 100644 --- a/slsReceiverSoftware/include/UDPStandardImplementation.h +++ b/slsReceiverSoftware/include/UDPStandardImplementation.h @@ -68,6 +68,11 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase //Frame indices and numbers caught + /** + * Returns the frame index at start of entire acquisition (including all scans) + */ + //uint32_t getStartAcquisitionIndex(); + /** * Returns current Frame Index Caught for an entire acquisition (including all scans) */ @@ -290,8 +295,11 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase * @param c pointer to current file name * @param raw address of pointer, pointing to current frame to send to gui * @param fnum frame number for eiger as it is not in the packet + * @param startAcquisitionIndex is the start index of the acquisition + * @param startFrameIndex is the start index of the scan */ - void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind); + void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex); + /** * Closes all files * @param ithr thread index diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index 8b2cdb598..c70be5b7d 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -155,6 +155,8 @@ int UDPBaseImplementation::getFramesCaught(){ FILE_LOG(logDEBUG) << __AT__ << " int UDPBaseImplementation::getTotalFramesCaught(){ FILE_LOG(logDEBUG) << __AT__ << " starting";return (totalPacketsCaught/packetsPerFrame);} +uint32_t UDPBaseImplementation::getStartAcquisitionIndex(){ FILE_LOG(logDEBUG) << __AT__ << " starting";return startAcquisitionIndex;} + uint32_t UDPBaseImplementation::getStartFrameIndex(){ FILE_LOG(logDEBUG) << __AT__ << " starting";return startFrameIndex;} uint32_t UDPBaseImplementation::getFrameIndex(){ FILE_LOG(logDEBUG) << __AT__ << " starting"; @@ -642,36 +644,33 @@ void UDPBaseImplementation::setupFifoStructure(){ FILE_LOG(logDEBUG) << __AT__ < /** acquisition functions */ -void UDPBaseImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t& fstartind){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; - - //point to gui data - if (guiData == NULL) - guiData = latestData; - - //copy data and filename - strcpy(c,guiFileName); - fnum = guiFrameNumber; - fstartind = getStartFrameIndex(); - - //could not get gui data - if(!guiDataReady){ - *raw = NULL; - } - //data ready, set guidata to receive new data - else{ - *raw = guiData; - guiData = NULL; - - pthread_mutex_lock(&dataReadyMutex); - guiDataReady = 0; - pthread_mutex_unlock(&dataReadyMutex); - if((nFrameToGui) && (writerthreads_mask)){ - /*if(nFrameToGui){*/ - //release after getting data - sem_post(&smp); - } - } +void UDPBaseImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex){ + FILE_LOG(logDEBUG) << __AT__ << " called"; + //point to gui data + if (guiData == NULL){ + guiData = latestData; + } + + //copy data and filename + strcpy(c,guiFileName); + fnum = guiFrameNumber; + startAcquisitionIndex = getStartAcquisitionIndex(); + startFrameIndex = getStartFrameIndex(); + + + //could not get gui data + if(!guiDataReady){ + *raw = NULL; + } + //data ready, set guidata to receive new data + else{ + *raw = guiData; + guiData = NULL; + if((nFrameToGui) && (writerthreads_mask)){ + //release after getting data + sem_post(&smp); + } + } } diff --git a/slsReceiverSoftware/src/UDPRESTImplementation.cpp b/slsReceiverSoftware/src/UDPRESTImplementation.cpp index be929dd0d..b03f92a18 100644 --- a/slsReceiverSoftware/src/UDPRESTImplementation.cpp +++ b/slsReceiverSoftware/src/UDPRESTImplementation.cpp @@ -187,6 +187,11 @@ int UDPRESTImplementation::getTotalFramesCaught(){ return (totalPacketsCaught/packetsPerFrame); } +uint32_t UDPRESTImplementation::getStartAcquisitionIndex(){ + FILE_LOG(logDEBUG) << __AT__ << " called"; + return startAcquisitionIndex; +} + uint32_t UDPRESTImplementation::getStartFrameIndex(){ FILE_LOG(logDEBUG) << __AT__ << " called"; return startFrameIndex; @@ -577,16 +582,19 @@ void UDPRESTImplementation::setupFifoStructure(){ /** acquisition functions */ -void UDPRESTImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind){ +void UDPRESTImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex){ FILE_LOG(logDEBUG) << __AT__ << " called"; //point to gui data - if (guiData == NULL) + if (guiData == NULL){ guiData = latestData; + } //copy data and filename strcpy(c,guiFileName); fnum = guiFrameNumber; - fstartind = getStartFrameIndex(); + startAcquisitionIndex = getStartAcquisitionIndex(); + startFrameIndex = getStartFrameIndex(); + //could not get gui data if(!guiDataReady){ @@ -596,12 +604,7 @@ void UDPRESTImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32 else{ *raw = guiData; guiData = NULL; - - pthread_mutex_lock(&dataReadyMutex); - guiDataReady = 0; - pthread_mutex_unlock(&dataReadyMutex); if((nFrameToGui) && (writerthreads_mask)){ - /*if(nFrameToGui){*/ //release after getting data sem_post(&smp); } diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 55e8775f7..f44ed6017 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -352,6 +352,8 @@ int UDPStandardImplementation::setDetectorType(detectorType det){ FILE_LOG(logD //int UDPStandardImplementation::getTotalFramesCaught(){return (totalPacketsCaught/packetsPerFrame);} +//uint32_t UDPStandardImplementation::getStartAcquisitionIndex(){return startAcquisitionIndex;} + //uint32_t UDPStandardImplementation::getStartFrameIndex(){return startFrameIndex;} /* @@ -868,7 +870,7 @@ void UDPStandardImplementation::setupFifoStructure(){ /** acquisition functions */ -void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &fstartind){ +void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex){ FILE_LOG(logDEBUG) << __AT__ << " called"; //point to gui data if (guiData == NULL){ @@ -881,7 +883,9 @@ void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, ui //copy data and filename strcpy(c,guiFileName); fnum = guiFrameNumber; - fstartind = getStartFrameIndex(); + startAcquisitionIndex = getStartAcquisitionIndex(); + startFrameIndex = getStartFrameIndex(); + //could not get gui data if(!guiDataReady){ @@ -975,9 +979,13 @@ cout << "copyframe" << endl; #endif //nth frame read, block current process if the guireader hasnt read it yet if(nFrameToGui){ - //cout<<"waiting after copying"<fnum); if(dynamicRange != 32) tempframenum += (startFrameIndex-1); //eiger frame numbers start at 1, so need to -1 - else + else{ + cout << " 32 bit eiger could be "<< dec << htonl(*(unsigned int*)((eiger_image_header *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum) << endl; + cout << " 32 bit eiger32 could be "<< dec << htonl(*(unsigned int*)((eiger_image_header32 *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum) << endl; tempframenum = ((tempframenum / EIGER_32BIT_INITIAL_CONSTANT) + startFrameIndex)-1;//eiger 32 bit mode is a multiple of 17c. +startframeindex for scans + } }else if ((myDetectorType == GOTTHARD) && (shortFrame == -1)) tempframenum = (((((uint32_t)(*((uint32_t*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS))))+1)& (frameIndexMask)) >> frameIndexOffset); else @@ -1936,10 +1947,10 @@ int UDPStandardImplementation::startWriting(){ currframenum = tempframenum; pthread_mutex_unlock(&progress_mutex); } -//#ifdef VERYDEBUG +#ifdef VERYDEBUG if(myDetectorType == EIGER) cout << endl <push(buffer[ithread]); #ifdef FIFO_DEBUG @@ -2261,8 +2272,13 @@ void UDPStandardImplementation::stopWriting(int ithread, char* wbuffer[]){ //report cprintf(GREEN, "Status: Run Finished\n"); - cprintf(GREEN, "Total Packets Caught:%d\n", totalPacketsCaught); - cprintf(GREEN, "Total Frames Caught:%d\n",(totalPacketsCaught/packetsPerFrame)); + if(!totalPacketsCaught){ + cprintf(RED, "Total Packets Caught:%d\n", totalPacketsCaught); + cprintf(RED, "Total Frames Caught:%d\n",(totalPacketsCaught/packetsPerFrame)); + }else{ + cprintf(GREEN, "Total Packets Caught:%d\n", totalPacketsCaught); + cprintf(GREEN, "Total Frames Caught:%d\n",(totalPacketsCaught/packetsPerFrame)); + } //acquisition end if (acquisitionFinishedCallBack) acquisitionFinishedCallBack((totalPacketsCaught/packetsPerFrame), pAcquisitionFinished); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 8c3815c19..23d1d0147 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -977,7 +977,9 @@ int slsReceiverTCPIPInterface::read_frame(){ int slsReceiverTCPIPInterface::moench_read_frame(){ ret=OK; char fName[MAX_STR_LENGTH]=""; - int arg = -1,i; + int acquisitionIndex = -1; + int frameIndex= -1; + int i; int bufferSize = MOENCH_BUFFER_SIZE; @@ -990,7 +992,8 @@ int slsReceiverTCPIPInterface::moench_read_frame(){ char* raw = new char[bufferSize]; - uint32_t startIndex=0; + uint32_t startAcquisitionIndex=0; + uint32_t startFrameIndex=0; uint32_t index = 0,bindex = 0, offset=0; strcpy(mess,"Could not read frame\n"); @@ -1001,18 +1004,18 @@ int slsReceiverTCPIPInterface::moench_read_frame(){ /**send garbage with -1 index to try again*/ if(!receiverBase->getFramesCaught()){ - arg = -1; + startAcquisitionIndex = -1; cout<<"haven't caught any frame yet"<getStartFrameIndex();*/ - receiverBase->readFrame(fName,&raw,index,startIndex); + receiverBase->readFrame(fName,&raw,index,startAcquisitionIndex,startFrameIndex); /**send garbage with -1 index to try again*/ if (raw == NULL){ - arg = -1; + startAcquisitionIndex = -1; #ifdef VERBOSE cout<<"data not ready for gui yet"<SendDataOnly(fName,MAX_STR_LENGTH); - socket->SendDataOnly(&arg,sizeof(arg)); + socket->SendDataOnly(&acquisitionIndex,sizeof(acquisitionIndex)); + socket->SendDataOnly(&frameIndex,sizeof(frameIndex)); socket->SendDataOnly(retval,MOENCH_DATA_BYTES); } //return ok/fail @@ -1135,7 +1151,9 @@ int slsReceiverTCPIPInterface::moench_read_frame(){ int slsReceiverTCPIPInterface::gotthard_read_frame(){ ret=OK; char fName[MAX_STR_LENGTH]=""; - int arg = -1,i; + int acquisitionIndex = -1; + int frameIndex= -1; + int i; //retval is a full frame @@ -1161,7 +1179,8 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){ uint32_t index=0,index2=0; uint32_t pindex=0,pindex2=0; uint32_t bindex=0,bindex2=0; - uint32_t startIndex=0; + uint32_t startAcquisitionIndex=0; + uint32_t startFrameIndex=0; strcpy(mess,"Could not read frame\n"); @@ -1173,16 +1192,16 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){ /**send garbage with -1 index to try again*/ if(!receiverBase->getFramesCaught()){ - arg=-1; + startAcquisitionIndex=-1; cout<<"haven't caught any frame yet"<getStartFrameIndex();*/ - receiverBase->readFrame(fName,&raw,index,startIndex); + receiverBase->readFrame(fName,&raw,index,startAcquisitionIndex,startFrameIndex); /**send garbage with -1 index to try again*/ if (raw == NULL){ - arg = -1; + startAcquisitionIndex = -1; #ifdef VERBOSE cout<<"data not ready for gui yet"<SendDataOnly(fName,MAX_STR_LENGTH); - socket->SendDataOnly(&arg,sizeof(arg)); + socket->SendDataOnly(&acquisitionIndex,sizeof(acquisitionIndex)); + socket->SendDataOnly(&frameIndex,sizeof(frameIndex)); socket->SendDataOnly(retval,GOTTHARD_DATA_BYTES); } @@ -1297,7 +1332,9 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){ int slsReceiverTCPIPInterface::eiger_read_frame(){ ret=OK; char fName[MAX_STR_LENGTH]=""; - int arg = -1,i; + int acquisitionIndex = -1; + int frameIndex= -1; + int i; uint32_t index=0; int frameSize = EIGER_ONE_GIGA_ONE_PACKET_SIZE * packetsPerFrame; @@ -1309,7 +1346,8 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ char* raw = new char[frameSize]; char* origVal = new char[frameSize]; char* retval = new char[dataSize]; - uint32_t startIndex=0; + uint32_t startAcquisitionIndex=0; + uint32_t startFrameIndex=0; strcpy(mess,"Could not read frame\n"); @@ -1320,7 +1358,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ /**send garbage with -1 index to try again*/ if(!receiverBase->getFramesCaught()){ - arg=-1; + startAcquisitionIndex=-1; #ifdef VERBOSE cout<<"haven't caught any frame yet"<readFrame(fName,&raw,index,startIndex); + receiverBase->readFrame(fName,&raw,index,startAcquisitionIndex,startFrameIndex); #ifdef VERBOSE cout << "index:" << dec << index << endl; #endif /**send garbage with -1 index to try again*/ if (raw == NULL){ - arg = -1; + startAcquisitionIndex = -1; #ifdef VERBOSE cout<<"data not ready for gui yet"<SendDataOnly(fName,MAX_STR_LENGTH); - socket->SendDataOnly(&arg,sizeof(arg)); + socket->SendDataOnly(&acquisitionIndex,sizeof(acquisitionIndex)); + socket->SendDataOnly(&frameIndex,sizeof(frameIndex)); socket->SendDataOnly(retval,dataSize); } From 9e78bae6148c9b2f9c107de614289596faf1291f Mon Sep 17 00:00:00 2001 From: Leonardo Sala Date: Mon, 23 Mar 2015 11:18:05 +0100 Subject: [PATCH 3/8] solved bad_alloc --- .../src/UDPRESTImplementation.cpp | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/slsReceiverSoftware/src/UDPRESTImplementation.cpp b/slsReceiverSoftware/src/UDPRESTImplementation.cpp index be929dd0d..e1b3a1114 100644 --- a/slsReceiverSoftware/src/UDPRESTImplementation.cpp +++ b/slsReceiverSoftware/src/UDPRESTImplementation.cpp @@ -87,7 +87,9 @@ int UDPRESTImplementation::get_rest_state(RestHelper * rest, string *rest_state) }; void UDPRESTImplementation::initialize_REST(){ + FILE_LOG(logDEBUG) << __AT__ << " called"; + FILE_LOG(logDEBUG) << __AT__ << " REST status is initialized: " << isInitialized; if (rest_hostname.empty()) { FILE_LOG(logDEBUG) << __AT__ <<"can't initialize with empty string or NULL for detectorHostname"; @@ -104,7 +106,9 @@ void UDPRESTImplementation::initialize_REST(){ try{ rest->init(rest_hostname, rest_port); code = get_rest_state(rest, &answer); + std::cout << "AAAAAAAa " << answer << std::endl; + if (code != 0){ throw answer; } @@ -133,11 +137,19 @@ void UDPRESTImplementation::initialize_REST(){ ss >> test; - test = "{\"path\":\"" + string( getFilePath() ) + "\"}"; - code = rest->post_json("state/initialize", &answer, test); - FILE_LOG(logDEBUG) << __AT__ << "state/configure got " << code; code = rest->get_json("state", &answer); - FILE_LOG(logDEBUG) << __AT__ << "state got " << code << " " << answer << "\n"; + FILE_LOG(logDEBUG) << __AT__ << " state got " << code << " " << answer << "\n"; + if (answer != "INITIALIZED"){ + test = "{\"path\":\"" + string( getFilePath() ) + "\"}"; + code = rest->post_json("state/initialize", &answer, test); + } + else{ + test = "{\"path\":\"" + string( getFilePath() ) + "\"}"; + code = rest->post_json("state/configure", &answer, test); + } + FILE_LOG(logDEBUG) << __AT__ << " state/configure got " << code; + code = rest->get_json("state", &answer); + FILE_LOG(logDEBUG) << __AT__ << " state got " << code << " " << answer << "\n"; /* @@ -1169,10 +1181,8 @@ int UDPRESTImplementation::startReceiver(char message[]){ initialize_REST(); FILE_LOG(logDEBUG) << __FILE__ << "::" << __func__ << " initialized"; -// #ifdef VERBOSE cout << "Starting Receiver" << endl; -//#endif - + std::string answer; int code; //char *intStr = itoa(a); @@ -1184,17 +1194,21 @@ int UDPRESTImplementation::startReceiver(char message[]){ stringstream ss2; ss2 << getNumberOfFrames(); string str_n = ss2.str(); + + cout << "Starting Receiver" << endl; + std::string request_body = "{\"settings\": {\"bit_depth\": " + str_dr + ", \"nimages\": " + str_n + "}}"; //std::string request_body = "{\"settings\": {\"nimages\":1, \"scanid\":999, \"bit_depth\":16}}"; FILE_LOG(logDEBUG) << __FILE__ << "::" << " sending this configuration body: " << request_body; code = rest->post_json("state/configure", &answer, request_body); - code = rest->get_json("state", &answer); + //code = rest->get_json("state", &answer); + //FILE_LOG(logDEBUG) << __FILE__ << "::" << " got: " << answer; - code = rest->post_json("state/open", &answer); - code = rest->get_json("state", &answer); + //code = rest->post_json("state/open", &answer); + //code = rest->get_json("state", &answer); - status = slsReceiverDefs::RUNNING; + status = RUNNING; //reset listening thread variables /* From 1df89d4ce20357c7815acd56686d3c58054c0eb8 Mon Sep 17 00:00:00 2001 From: Leonardo Sala Date: Mon, 23 Mar 2015 11:41:19 +0100 Subject: [PATCH 4/8] test --- slsReceiverSoftware/include/RestHelper.h | 76 ++++++++++--------- .../src/UDPRESTImplementation.cpp | 7 +- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/slsReceiverSoftware/include/RestHelper.h b/slsReceiverSoftware/include/RestHelper.h index b3d679b26..92846750d 100644 --- a/slsReceiverSoftware/include/RestHelper.h +++ b/slsReceiverSoftware/include/RestHelper.h @@ -249,45 +249,47 @@ class RestHelper { * @return */ - int n=0; + int n = 0; int code = -1; - while(nsendRequest( (req) ); - else{ - ostream &os = session->sendRequest( req ) ; - os << request_body; - } - - HTTPResponse res; - istream &is = session->receiveResponse(res); - StreamCopier::copyToString(is, *answer); - code = res.getStatus(); - if (code != 200){ - FILE_LOG(logERROR) << "HTTP ERROR " << res.getStatus() << ": " << res.getReason() ; - code = -1; - } - else - code = 0; - return code; - } - catch (exception& e){ - FILE_LOG(logERROR) << "Exception connecting to "<< full_hostname << ": "<< e.what() << ", sleeping 5 seconds (" << n << "/"<sendRequest( (req) ); + else{ + ostream &os = session->sendRequest( req ) ; + os << request_body; + } + + HTTPResponse res; + istream &is = session->receiveResponse(res); + StreamCopier::copyToString(is, *answer); + code = res.getStatus(); + if (code != 200){ + FILE_LOG(logERROR) << "HTTP ERROR " << res.getStatus() << ": " << res.getReason() ; + code = -1; + } + else + code = 0; + return code; + } + catch (exception& e){ + FILE_LOG(logERROR) << "Exception connecting to "<< full_hostname << ": "<< e.what() << ", sleeping 5 seconds (" << n << "/"<post_json("state/configure", &answer, request_body); - //code = rest->get_json("state", &answer); - //FILE_LOG(logDEBUG) << __FILE__ << "::" << " got: " << answer; + code = rest->get_json("state", &answer); + FILE_LOG(logDEBUG) << __FILE__ << "::" << " got: " << answer; //code = rest->post_json("state/open", &answer); //code = rest->get_json("state", &answer); From e35867227f7fed34610dbfe70c8f517e0d57289d Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 30 Mar 2015 17:16:31 +0200 Subject: [PATCH 5/8] writing frame number to the file for eiger --- slsReceiverSoftware/include/UDPBaseImplementation.h | 3 ++- slsReceiverSoftware/src/UDPStandardImplementation.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index 6450f85f0..779827778 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -499,7 +499,8 @@ protected: typedef struct { unsigned char num1[4]; - unsigned char num2[4]; + unsigned char num2[3]; + unsigned char num3[1]; } eiger_packet_header; /** max number of listening threads */ diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index f44ed6017..012d675a5 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -2306,8 +2306,13 @@ void UDPStandardImplementation::writeToFile_withoutCompression(char* buf,int num if((enableFileWrite) && (sfilefd)){ offset = HEADER_SIZE_NUM_TOT_PACKETS; - if(myDetectorType == EIGER) + if(myDetectorType == EIGER){ offset += EIGER_HEADER_LENGTH; + (*(uint32_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num1)) = framenum; + //cprintf(RED, "framenum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset)))->num1))); + //cprintf(RED, "2packetnumber:0x%x\n", (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num3))); + //cprintf(RED, "22packetnumber:0x%x\n",(*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num3))); + } while(numpackets > 0){ //for progress and packet loss calculation(new files) From b5e8c104dbb6b0048dc9094bbfba8a4ac2753397 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 31 Mar 2015 14:45:41 +0200 Subject: [PATCH 6/8] printouts for eigermapping --- .../src/UDPStandardImplementation.cpp | 6 ++-- .../src/slsReceiverTCPIPInterface.cpp | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 012d675a5..0e5adf38e 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -2309,9 +2309,9 @@ void UDPStandardImplementation::writeToFile_withoutCompression(char* buf,int num if(myDetectorType == EIGER){ offset += EIGER_HEADER_LENGTH; (*(uint32_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num1)) = framenum; - //cprintf(RED, "framenum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset)))->num1))); - //cprintf(RED, "2packetnumber:0x%x\n", (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num3))); - //cprintf(RED, "22packetnumber:0x%x\n",(*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num3))); + cprintf(RED, "framenum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset)))->num1))); + cprintf(RED, "2packetnumber:0x%x\n", (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num3))); + cprintf(RED, "22packetnumber:0x%x\n",(*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num3))); } while(numpackets > 0){ diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 23d1d0147..1daf40ae0 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -1489,6 +1489,19 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ } + /*int inum = 0; + //dr = 16, hence uint16_t + for(inum = 0; inum < 2; inum++) + cprintf(YELLOW,"before htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + for(inum = 254; inum < 258; inum++) + cprintf(YELLOW,"before htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + for(inum = 0; inum < 2; inum++) + cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + for(inum = 254; inum < 258; inum++) + cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + + */ + //64 bit htonl cuz of endianness for(i=0;i<(1024*(16*dynamicrange)*2)/8;i++){ (*(((uint64_t*)retval)+i)) = be64toh(((uint64_t)(*(((uint64_t*)retval)+i)))); @@ -1501,6 +1514,21 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ (*(((uint64_t*)retval)+i)) = temp; */ } + + /* + //dr = 16, hence uint16_t + for(inum = 0; inum < 2; inum++) + cprintf(MAGENTA,"after htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + for(inum = 254; inum < 258; inum++) + cprintf(MAGENTA,"after htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + for(inum = 0; inum < 2; inum++) + cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + for(inum = 254; inum < 258; inum++) + cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + */ + + + acquisitionIndex = index-startAcquisitionIndex; if(acquisitionIndex == -1) startFrameIndex = -1; From 6cd28165ca79c4ea9eb5043ce2acdc2ccec75de7 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 10 Apr 2015 17:11:26 +0200 Subject: [PATCH 7/8] top image reconstruct works with make flga --- .../include/UDPBaseImplementation.h | 4 ++-- .../src/UDPStandardImplementation.cpp | 20 +++++++++++++++---- .../src/slsReceiverTCPIPInterface.cpp | 10 +++++----- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index 779827778..eac9fd0da 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -498,8 +498,8 @@ protected: /** structure of an eiger image header*/ typedef struct { - unsigned char num1[4]; - unsigned char num2[3]; + unsigned char num1[6]; + unsigned char num2[1]; unsigned char num3[1]; } eiger_packet_header; diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 0e5adf38e..4a337fce2 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -1963,6 +1963,7 @@ int UDPStandardImplementation::startWriting(){ }else if (numpackets > 0){ for(i=0;inum1)) = framenum; - cprintf(RED, "framenum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset)))->num1))); - cprintf(RED, "2packetnumber:0x%x\n", (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num3))); - cprintf(RED, "22packetnumber:0x%x\n",(*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num3))); +#ifdef WRITE_HEADERS + for (int i = 0; i < packetsPerFrame; i++) + (*(uint32_t*)(((eiger_packet_header *)((char*)(buf + offset + 1040*i)))->num1)) = framenum; + + cprintf(RED, "\np1 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset)))->num1))); + cprintf(RED, "p1:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num2))); + cprintf(RED, "p1 num:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num3))); + cprintf(RED, "p2 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num1))); + cprintf(RED, "p2:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num2))); + cprintf(RED, "p2 num:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num3))); + cprintf(RED, "p3 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset + 2080)))->num1))); + cprintf(RED, "p3:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +2080)))->num2))); + cprintf(RED, "p3 num:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +2080)))->num3))); + +#endif } while(numpackets > 0){ diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 1daf40ae0..97b87e68b 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -1488,8 +1488,8 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ } } - - /*int inum = 0; +/* + int inum = 0; //dr = 16, hence uint16_t for(inum = 0; inum < 2; inum++) cprintf(YELLOW,"before htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); @@ -1499,8 +1499,8 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); for(inum = 254; inum < 258; inum++) cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); +*/ - */ //64 bit htonl cuz of endianness for(i=0;i<(1024*(16*dynamicrange)*2)/8;i++){ @@ -1515,7 +1515,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ */ } - /* +/* //dr = 16, hence uint16_t for(inum = 0; inum < 2; inum++) cprintf(MAGENTA,"after htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); @@ -1525,7 +1525,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); for(inum = 254; inum < 258; inum++) cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); - */ +*/ From 15bbb099d378500ac369f35b030ff0ee0cba0cb0 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 14 Apr 2015 17:11:56 +0200 Subject: [PATCH 8/8] for mapping 32 bit eiger --- .../include/UDPBaseImplementation.h | 9 +- .../src/UDPStandardImplementation.cpp | 131 ++++++++++++++---- .../src/slsReceiverTCPIPInterface.cpp | 16 +-- 3 files changed, 118 insertions(+), 38 deletions(-) diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index eac9fd0da..4801c751e 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -489,18 +489,19 @@ protected: /** structure of an eiger image header*/ typedef struct { - unsigned char header_before[35]; + unsigned char header_before[19]; unsigned char fnum[4]; - unsigned char header_after[9]; + unsigned char header_after[25]; } eiger_image_header32; /** structure of an eiger image header*/ typedef struct { - unsigned char num1[6]; - unsigned char num2[1]; + unsigned char num1[4]; + unsigned char num2[2]; unsigned char num3[1]; + unsigned char num4[1]; } eiger_packet_header; /** max number of listening threads */ diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index 4a337fce2..93ad2c8d1 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -1860,12 +1860,13 @@ int UDPStandardImplementation::startWriting(){ thread_started = 1; + int totalheader = HEADER_SIZE_NUM_TOT_PACKETS + EIGER_HEADER_LENGTH; int numpackets, nf; uint32_t tempframenum; char* wbuf[numListeningThreads];//interleaved char *d=new char[bufferSize*numListeningThreads]; int xmax=0,ymax=0; - int ret,i; + int ret,i,j; int packetsPerThread = packetsPerFrame/numListeningThreads; while(1){ @@ -1926,14 +1927,16 @@ int UDPStandardImplementation::startWriting(){ //for progress if(myDetectorType == EIGER){ - tempframenum = htonl(*(unsigned int*)((eiger_image_header *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum); + if(dynamicRange != 32) - tempframenum += (startFrameIndex-1); //eiger frame numbers start at 1, so need to -1 - else{ - cout << " 32 bit eiger could be "<< dec << htonl(*(unsigned int*)((eiger_image_header *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum) << endl; - cout << " 32 bit eiger32 could be "<< dec << htonl(*(unsigned int*)((eiger_image_header32 *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum) << endl; - tempframenum = ((tempframenum / EIGER_32BIT_INITIAL_CONSTANT) + startFrameIndex)-1;//eiger 32 bit mode is a multiple of 17c. +startframeindex for scans - } + tempframenum = htonl(*(unsigned int*)((eiger_image_header *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum); + else + tempframenum = htonl(*(unsigned int*)((eiger_image_header32 *)((char*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum); + + + tempframenum += (startFrameIndex-1); //eiger frame numbers start at 1, so need to -1 + //tempframenum = ((tempframenum / EIGER_32BIT_INITIAL_CONSTANT) + startFrameIndex)-1;//eiger 32 bit mode is a multiple of 17c. +startframeindex for scans + }else if ((myDetectorType == GOTTHARD) && (shortFrame == -1)) tempframenum = (((((uint32_t)(*((uint32_t*)(wbuf[ithread] + HEADER_SIZE_NUM_TOT_PACKETS))))+1)& (frameIndexMask)) >> frameIndexOffset); else @@ -1961,9 +1964,53 @@ int UDPStandardImplementation::startWriting(){ /* for eiger 32 bit mode, currframenum like gotthard, does not start from 0 or 1 */ rawDataReadyCallBack(currframenum, wbuf[i], numpackets * onePacketSize, sfilefd, guiData,pRawDataReady); }else if (numpackets > 0){ - for(i=0;inum1)) = currframenum; + //for 32 bit,port number needs to be changed and packet number reconstructed + if(dynamicRange == 32){ + for (i = 0; i < packetsPerFrame/4; i++){ + //new packet number that has space for 16 bit + (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader + EIGER_ONE_GIGA_ONE_PACKET_SIZE*i)))->num2)) + = ((*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader + EIGER_ONE_GIGA_ONE_PACKET_SIZE*i)))->num4))); + + //new port number as its the same everywhere for 32 bit!! + if(!j) (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader + EIGER_ONE_GIGA_ONE_PACKET_SIZE*i)))->num3)) = 0x00; + + +#ifdef VERYDEBUG + cprintf(RED, "%d - 0x%x - %d - %d\n", i, + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader +i*EIGER_ONE_GIGA_ONE_PACKET_SIZE)))->num3)), + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader +i*EIGER_ONE_GIGA_ONE_PACKET_SIZE)))->num4)), + (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader +i*EIGER_ONE_GIGA_ONE_PACKET_SIZE)))->num2))); +#endif + } + for (i = packetsPerFrame/4; i < packetsPerFrame/2; i++){ + //new packet number that has space for 16 bit + (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader + EIGER_ONE_GIGA_ONE_PACKET_SIZE*i)))->num2)) + = ((*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader + EIGER_ONE_GIGA_ONE_PACKET_SIZE*i)))->num4))+(packetsPerFrame/4)); + + //new port number as its the same everywhere for 32 bit!! + if(!j) (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader + EIGER_ONE_GIGA_ONE_PACKET_SIZE*i)))->num3)) = 0x00; + + +#ifdef VERYDEBUG + cprintf(RED, "%d -0x%x - %d - %d\n", i, + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader +i*EIGER_ONE_GIGA_ONE_PACKET_SIZE)))->num3)), + (*(uint8_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader +i*EIGER_ONE_GIGA_ONE_PACKET_SIZE)))->num4)), + (*(uint16_t*)(((eiger_packet_header *)((char*)(wbuf[j] + totalheader +i*EIGER_ONE_GIGA_ONE_PACKET_SIZE)))->num2))); +#endif + } + } + } +#endif + + writeToFile_withoutCompression(wbuf[j], numpackets,currframenum); + } #ifdef VERYDEBUG cout << "written everyting" << endl; #endif @@ -2074,9 +2121,13 @@ int UDPStandardImplementation::startWriting(){ void UDPStandardImplementation::startFrameIndices(int ithread){ FILE_LOG(logDEBUG) << __AT__ << " called"; - if (myDetectorType == EIGER) + if (myDetectorType == EIGER){ //add currframenum later in this method for scans - startFrameIndex = htonl(*(unsigned int*)((eiger_image_header *)((char*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum); + if(dynamicRange == 32) + startFrameIndex = htonl(*(unsigned int*)((eiger_image_header32 *)((char*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->fnum); + else + startFrameIndex = htonl(*(unsigned int*)((eiger_image_header *)((char*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS)))->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) @@ -2131,7 +2182,7 @@ int i; //free buffer if(rc <= 0){ - cout << ithread << "Discarding empty frame" << endl; + cout << ithread << "Discarding empty frame/ End of acquisition" << endl; fifoFree[ithread]->push(buffer[ithread]); #ifdef FIFO_DEBUG cprintf(BLUE,"%d listener empty buffer pushed into fifofree %x\n", ithread, (void*)(buffer[ithread])); @@ -2310,19 +2361,47 @@ void UDPStandardImplementation::writeToFile_withoutCompression(char* buf,int num if(myDetectorType == EIGER){ offset += EIGER_HEADER_LENGTH; #ifdef WRITE_HEADERS - for (int i = 0; i < packetsPerFrame; i++) - (*(uint32_t*)(((eiger_packet_header *)((char*)(buf + offset + 1040*i)))->num1)) = framenum; - - cprintf(RED, "\np1 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset)))->num1))); - cprintf(RED, "p1:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num2))); - cprintf(RED, "p1 num:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset)))->num3))); - cprintf(RED, "p2 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num1))); - cprintf(RED, "p2:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num2))); - cprintf(RED, "p2 num:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +1040)))->num3))); - cprintf(RED, "p3 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset + 2080)))->num1))); - cprintf(RED, "p3:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +2080)))->num2))); - cprintf(RED, "p3 num:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +2080)))->num3))); - +#ifdef VERY_DEBUG + int k = 0; + if(dynamicRange != 32){ + cprintf(RED, "\np1 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset+k*1040)))->num1))); + cprintf(RED, "p1:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset+k*1040)))->num3))); + cprintf(RED, "p0 num:%d - %d\n", k, (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset+k*1040)))->num4))); + k = 1; + cprintf(RED, "p2 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num1))); + cprintf(RED, "p2:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num3))); + cprintf(RED, "p1 num:%d - %d\n", k,(*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num4))); + k = 2; + cprintf(RED, "p3 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset + k*1040)))->num1))); + cprintf(RED, "p3:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num3))); + cprintf(RED, "p2 num:%d - %d\n", k,(*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num4))); + }else{ + k = 0; + cprintf(RED, "\np1 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset+k*1040)))->num1))); + cprintf(RED, "p1:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset+k*1040)))->num3))); + cprintf(RED, "p0 num:%d - %d\n", k, (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset+k*1040)))->num2))); + k = 1; + cprintf(RED, "p2 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num1))); + cprintf(RED, "p2:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num3))); + cprintf(RED, "p1 num:%d - %d\n", k, (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num2))); + k = 2; + cprintf(RED, "p3 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset + k*1040)))->num1))); + cprintf(RED, "p3:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num3))); + cprintf(RED, "p2 num:%d - %d\n", k, (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num2))); + k = 256; + cprintf(RED, "p257 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset + k*1040)))->num1))); + cprintf(RED, "p257:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num3))); + cprintf(RED, "p256 num:%d - %d\n", k, (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num2))); + k = 512; + cprintf(RED, "p513 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset + k*1040)))->num1))); + cprintf(RED, "p513:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num3))); + cprintf(RED, "p512 num:%d - %d\n", k, (*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num2))); + k = 768; + cprintf(RED, "p769 fnum:0x%x\n", (*(unsigned int*)(((eiger_packet_header *)((char*)(buf + offset + k*1040)))->num1))); + cprintf(RED, "p769:0x%x\n", (*(uint8_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num3))); + cprintf(RED, "p768 num:%d - %d\n", k,(*(uint16_t*)(((eiger_packet_header *)((char*)(buf + offset +k*1040)))->num2))); + } +#endif #endif } while(numpackets > 0){ diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 97b87e68b..240784ea5 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -1492,13 +1492,13 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ int inum = 0; //dr = 16, hence uint16_t for(inum = 0; inum < 2; inum++) - cprintf(YELLOW,"before htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + cprintf(YELLOW,"before htonl %d,0 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); for(inum = 254; inum < 258; inum++) - cprintf(YELLOW,"before htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + cprintf(YELLOW,"before htonl %d,0 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); for(inum = 0; inum < 2; inum++) - cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); for(inum = 254; inum < 258; inum++) - cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + cprintf(YELLOW,"before htonl %d,2 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); */ @@ -1518,13 +1518,13 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ /* //dr = 16, hence uint16_t for(inum = 0; inum < 2; inum++) - cprintf(MAGENTA,"after htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + cprintf(MAGENTA,"after htonl %d,0 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); for(inum = 254; inum < 258; inum++) - cprintf(MAGENTA,"after htonl %d,0 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); + cprintf(MAGENTA,"after htonl %d,0 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+(inum*(dynamicrange/8)))))))); for(inum = 0; inum < 2; inum++) - cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); for(inum = 254; inum < 258; inum++) - cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint16_t)(*((uint16_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); + cprintf(MAGENTA,"after htonl %d,2 :%d\n",inum,((uint8_t)(*((uint8_t*)((char*)(retval+((2048+inum)*(dynamicrange/8)))))))); */