From e4e46920cd6fb335df2cb0ded5c2a8a5c6d5736e Mon Sep 17 00:00:00 2001 From: l_maliakal_d Date: Thu, 15 Nov 2012 11:19:50 +0000 Subject: [PATCH] fixed frames from receiver to flip accordingly, also display frame index as not visible from filename git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@345 951219d9-93cf-4727-9268-0efd64621fa3 --- .../multiSlsDetector/multiSlsDetector.cpp | 4 +- .../multiSlsDetector/multiSlsDetector.h | 5 +- .../slsDetector/slsDetector.cpp | 16 ++++- slsDetectorSoftware/slsDetector/slsDetector.h | 5 +- .../slsDetector/slsDetectorBase.h | 5 +- .../slsDetector/slsDetectorUsers.cpp | 2 +- .../slsDetector/slsDetectorUsers.h | 2 +- .../slsDetector/slsDetectorUtils.h | 5 +- .../slsDetectorAnalysis/postProcessing.cpp | 43 +++++++------ .../slsDetectorAnalysis/postProcessing.h | 4 +- .../slsReceiver/slsReceiverFunctionList.c | 27 +++----- .../slsReceiver/slsReceiverFunctionList.h | 4 +- .../slsReceiver/slsReceiver_funcs.c | 62 +++++++++++++++++-- .../usersFunctions/usersFunctions.cpp | 2 +- .../usersFunctions/usersFunctions.h | 2 +- 15 files changed, 131 insertions(+), 57 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index d1d2161b5..f3b18e102 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3733,7 +3733,7 @@ int multiSlsDetector::resetFramesCaught(int index) { -int* multiSlsDetector::readFrameFromReceiver(){ +int* multiSlsDetector::readFrameFromReceiver(char* fName, int &fIndex){ int nel=(thisMultiDetector->dataBytes)/sizeof(int); int n; int* retval=new int[nel]; @@ -3741,7 +3741,7 @@ int* multiSlsDetector::readFrameFromReceiver(){ for (int id=0; idnumberOfDetectors; id++) { if (detectors[id]) { - retdet=detectors[id]->readFrameFromReceiver(); + retdet=detectors[id]->readFrameFromReceiver(fName,fIndex); if (retdet) { n=detectors[id]->getDataBytes(); memcpy(p,retdet,n); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 4df55efae..d668f8874 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1094,9 +1094,12 @@ class multiSlsDetector : public slsDetectorUtils { int resetFramesCaught(int index=-1); /** + * Reads a frame from receiver + * @param fName file name of current frame() + * @param fIndex current frame index /returns a frame read from recever */ - int* readFrameFromReceiver(); + int* readFrameFromReceiver(char* fName, int &fIndex); /** Locks/Unlocks the connection to the receiver /param lock sets (1), usets (0), gets (-1) the lock diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 4f3960ee7..a20d5a71d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -5678,12 +5678,13 @@ int slsDetector::resetFramesCaught(int index){ -int* slsDetector::readFrameFromReceiver(){ +int* slsDetector::readFrameFromReceiver(char* fName, int &fIndex){ //cout<<"databytes:"<dataBytes<<" headerlength:"<dataBytes+HEADERLENGTH)/sizeof(int);//2572/ int* retval=new int[nel]; int* origVal=new int[nel]; + int arg[2]; int ret=FAIL; int n; char mess[100]="Nothing"; @@ -5705,6 +5706,8 @@ int* slsDetector::readFrameFromReceiver(){ delete [] retval; return NULL; } else { + n=dataSocket->ReceiveDataOnly(fName,MAX_STR_LENGTH); + n=dataSocket->ReceiveDataOnly(arg,sizeof(arg)); n=dataSocket->ReceiveDataOnly(origVal,thisDetector->dataBytes+HEADERLENGTH); #ifdef VERBOSE std::cout<< "Received "<< n << " data bytes" << std::endl; @@ -5717,8 +5720,15 @@ int* slsDetector::readFrameFromReceiver(){ return NULL; }//worked else{ - memcpy(retval,((char*) origVal)+2, getDataBytes()/2); - memcpy((((char*)retval)+getDataBytes()/2), ((char*) origVal)+8+getDataBytes()/2, getDataBytes()/2); + fIndex=arg[0]; + if(arg[1]){ + memcpy(retval,((char*) origVal)+2, getDataBytes()/2); + memcpy((((char*)retval)+getDataBytes()/2), ((char*) origVal)+8+getDataBytes()/2, getDataBytes()/2); + } + else{ + memcpy((((char*)retval)+getDataBytes()/2),((char*) origVal)+2, getDataBytes()/2); + memcpy(retval, ((char*) origVal)+8+getDataBytes()/2, getDataBytes()/2); + } } } dataSocket->Disconnect(); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index de3bbe5c0..f894622df 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1467,9 +1467,12 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int resetFramesCaught(int index=-1); /** + * Reads a frame from receiver + * @param fName file name of current frame() + * @param fIndex current frame index /returns a frame read from recever */ - int* readFrameFromReceiver(); + int* readFrameFromReceiver(char* fName, int &fIndex); /** Locks/Unlocks the connection to the receiver /param lock sets (1), usets (0), gets (-1) the lock diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 63a2bd031..4025dd9d9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -465,9 +465,12 @@ class slsDetectorBase : public virtual slsDetectorDefs { /** + * Reads a frame from receiver + * @param fName file name of current frame() + * @param fIndex current frame index /returns a frame read from recever */ - virtual int* readFrameFromReceiver()=0; + virtual int* readFrameFromReceiver(char* fName, int &fIndex)=0; /** returns detector type string from detector type index \param t string can be Mythen, Pilatus, Eiger, Gotthard, Agipd, Unknown diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp index 48108f9bb..f8ff5a130 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp @@ -222,7 +222,7 @@ void slsDetectorUsers::finalizeDataset(double *a, double *v, double *e, int &np) -void slsDetectorUsers::registerDataCallback(int( *userCallback)(detectorData*, void*), void *pArg){ +void slsDetectorUsers::registerDataCallback(int( *userCallback)(detectorData*, int, void*), void *pArg){ myDetector->registerDataCallback(userCallback,pArg); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index a2c139b3b..ed7a38ac5 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -382,7 +382,7 @@ class slsDetectorUsers \param userCallback function for plotting/analyzing the data */ - void registerDataCallback(int( *userCallback)(detectorData*, void*), void *pArg); + void registerDataCallback(int( *userCallback)(detectorData*, int, void*), void *pArg); /** @short register callback for accessing raw data - if the rawDataCallback is registered, no filewriting/postprocessing will be carried on automatically by the software - the raw data are deleted by the software diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index bbf5e3233..c486ad53d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -629,9 +629,12 @@ virtual int getCurrentFrameIndex()=0; virtual int resetFramesCaught(int index=-1)=0; /** + * Reads a frame from receiver + * @param fName file name of current frame() + * @param fIndex current frame index /returns a frame read from recever */ -virtual int* readFrameFromReceiver()=0; +virtual int* readFrameFromReceiver(char* fName, int &fIndex)=0; protected: diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp index 847866b72..2c36143b5 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp @@ -131,7 +131,7 @@ void postProcessing::processFrame(int *myData, int delflag) { } else if (dataReady){ thisData=new detectorData(fdata,NULL,NULL,getCurrentProgress(),(fname+string(".raw")).c_str(),getTotalNumberOfChannels()); - dataReady(thisData, pCallbackArg); + dataReady(thisData, -1, pCallbackArg); delete thisData; fdata=NULL; } @@ -243,7 +243,7 @@ void postProcessing::doProcessing(double *lfdata, int delflag, string fname) { if (dataReady) { thisData=new detectorData(val,err,ang,getCurrentProgress(),(fname+ext).c_str(),np); - dataReady(thisData, pCallbackArg); + dataReady(thisData, -1, pCallbackArg); delete thisData; ang=NULL; val=NULL; @@ -390,36 +390,43 @@ void* postProcessing::processData(int delflag) { pthread_mutex_unlock(&mg); int caught=0; + bool newData=false; + char currentfName[MAX_STR_LENGTH]; + int currentfIndex=0; + while(1){ if (checkJoinThread()) break; usleep(200000); - pthread_mutex_lock(&mg); + pthread_mutex_lock(&mg); caught=getCurrentFrameIndex(); - pthread_mutex_unlock(&mg); + pthread_mutex_unlock(&mg); incrementProgress(caught-prevCaught); + if(caught-prevCaught) newData=true; + else newData=false; prevCaught=caught; if (checkJoinThread()) break; //if(progress_call) // progress_call(getCurrentProgress(),pProgressCallArg); - pthread_mutex_lock(&mg); - int* receiverData = readFrameFromReceiver(); - pthread_mutex_unlock(&mg); + if(newData){ + pthread_mutex_lock(&mg); + int* receiverData = readFrameFromReceiver(currentfName,currentfIndex); + pthread_mutex_unlock(&mg); - if(!receiverData) - return 0; - fdata=decodeData(receiverData); - delete [] receiverData; - if(fdata){ - if (dataReady) { - thisData=new detectorData(fdata,NULL,NULL,getCurrentProgress(),(getCurrentFileName()+string(".raw")).c_str(),getTotalNumberOfChannels()); - dataReady(thisData, pCallbackArg); - delete thisData; - fdata=NULL; + if(!receiverData) + return 0; + fdata=decodeData(receiverData); + delete [] receiverData; + if(fdata){ + if (dataReady) { + thisData=new detectorData(fdata,NULL,NULL,getCurrentProgress(),currentfName,getTotalNumberOfChannels()); + dataReady(thisData, currentfIndex, pCallbackArg); + delete thisData; + fdata=NULL; + } } } - } } diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h index 9570ff0e3..6a7d6ea5d 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h @@ -235,7 +235,7 @@ s void ResetPositionIndex(){pthread_mutex_lock(&mp); resetPositionIndex(); pthread_mutex_unlock(&mp);}; - void registerDataCallback(int( *userCallback)(detectorData*, void*), void *pArg) {dataReady = userCallback; pCallbackArg = pArg;}; + void registerDataCallback(int( *userCallback)(detectorData*, int, void*), void *pArg) {dataReady = userCallback; pCallbackArg = pArg;}; void registerRawDataCallback(int( *userCallback)(double*, int, void*), void *pArg) {rawDataReady = userCallback; pRawDataArg = pArg;}; @@ -328,7 +328,7 @@ s private: double *fdata; - int (*dataReady)(detectorData*,void*); + int (*dataReady)(detectorData*,int, void*); void *pCallbackArg; int (*rawDataReady)(double*,int,void*); diff --git a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.c b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.c index 1702f7400..85be0385c 100644 --- a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.c +++ b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.c @@ -50,7 +50,7 @@ int sockfd; FILE *sfilefd; - +char savefilename[128]; char filePath[MAX_STR_LENGTH]=""; char fileName[MAX_STR_LENGTH]="run"; int fileIndex=0; @@ -140,7 +140,9 @@ int setFileIndex(int index){ - +int getStartFrameIndex(){ + return startFrameIndex; +} @@ -192,8 +194,6 @@ void* startListening(void *arg){ sd = -1; int rc1, rc2, rc; int currframenum, prevframenum; -// char buffer2[BUFFER_LENGTH]; - char savefilename[128]; struct sockaddr_in serveraddr; struct sockaddr_in clientaddr; @@ -212,9 +212,9 @@ void* startListening(void *arg){ //create file name if(!frameIndexNeeded) - sprintf(savefilename, "%s/%s_%d.dat", filePath,fileName,fileIndex); + sprintf(savefilename, "%s/%s_%d.raw", filePath,fileName,fileIndex); else - sprintf(savefilename, "%s/%s_f%012d_%d.dat", filePath,fileName,framesCaught,fileIndex); + sprintf(savefilename, "%s/%s_f%012d_%d.raw", filePath,fileName,framesCaught,fileIndex); /***********************************************************************/ /* A do/while(FALSE) loop is used to make error cleanup easier. The */ @@ -270,9 +270,9 @@ void* startListening(void *arg){ getFrameIndex(); //create file name if(!frameIndexNeeded) - sprintf(savefilename, "%s/%s_%d.dat", filePath,fileName,fileIndex); + sprintf(savefilename, "%s/%s_%d.raw", filePath,fileName,fileIndex); else - sprintf(savefilename, "%s/%s_f%012d_%d.dat", filePath,fileName,framesCaught,fileIndex); + sprintf(savefilename, "%s/%s_f%012d_%d.raw", filePath,fileName,framesCaught,fileIndex); printf("saving to %s\t\tpacket loss %f %%\t\tframenum %d\n", savefilename,((currframenum-prevframenum-(2*framesInFile))/(double)(2*framesInFile))*100.000,currframenum); sfilefd = fopen((const char *) (savefilename), "w"); @@ -390,15 +390,8 @@ int stopReceiver(){ } -char* readFrame(){ - int i; - for(i=0;i<20;i++){ - if ((((int)*((int*)buffer))%2)!=0) - break; - else - usleep(20000); - } - //printf("freamenum%d\n",*((int*) sendbuffer)); +char* readFrame(char* fName){ + strcpy(fName,savefilename); return buffer; } diff --git a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.h b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.h index 5c615af84..83bbf1330 100644 --- a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.h +++ b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.h @@ -24,7 +24,9 @@ void* startListening(void *arg); int startReceiver(); int stopReceiver(); -char* readFrame(); +char* readFrame(char *fName); + +int getStartFrameIndex(); //int setUDPPortNumber(int p=-1); //sets/gets port number to listen to for data from the detector //int setTCPPortNumber(int p=-1); //sets/get port number for communication to client diff --git a/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.c b/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.c index e30d1dda7..99944d96d 100644 --- a/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.c +++ b/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.c @@ -527,32 +527,82 @@ int reset_frames_caught(int file_des) { int read_frame(int file_des) { int ret=OK; - int n=0; + int n=0,i,startIndex=-1; + char* retval=NULL; char buffer[1286*2]; + char fName[MAX_STR_LENGTH]; + int arg[2]; + arg[1]=1;//do not flip + int index=-1,index2=-1,fIndex=-1;; + strcpy(mess,"Could not read frame\n"); /* execute action if the arguments correctly arrived*/ #ifdef SLS_RECEIVER_FUNCTION_LIST - retval=readFrame(); -#endif + //wait till you get first frame 1. to get index(from startindex 2. filename corresponds to buffer value + if(startIndex==-1){ + ret=FAIL; + strcpy(mess,"did not start index\n"); + for(i=0;i<10;i++){ + startIndex=getStartFrameIndex(); + if(startIndex==-1) + usleep(1000000); + else { + ret=OK; + break; + } + } + } + //got atleast first frame, read buffer + if(ret==OK){ + int count=0; + do{ + if(count>0){ printf("\nunmatching: index:%d index2:%d\n",index,index2);fflush(stdout);} + retval=readFrame(fName); + index=(int)(*((int*)retval)); + char* retval2= retval+1286; + index2= (int)(*((int*)retval2)); + count++; + }while((index%2)==(index2%2)); + + fIndex=((int)(*((int*)retval)) - startIndex)/2; + arg[0]=fIndex; + arg[1]=(index%2); + +#ifdef VERBOSE + printf("\nstartIndex:%d\n",startIndex); + printf("fName:%s\n",fName); + if((index%2)==0){ + printf("\nEven Index, must flip:%d\n",index); + fflush(stdout); + } +#endif + } + + +#endif if(ret==OK && differentClients){ printf("Force update\n"); ret=FORCE_UPDATE; } - if(getReceiverStatus==IDLE){ + /*if(getReceiverStatus()==IDLE){ ret=FAIL; printf("*************STOPPPED***\n"); - } + }*/ /* send answer */ n = sendDataOnly(file_des,&ret,sizeof(ret)); if(ret==FAIL) n = sendDataOnly(file_des,mess,sizeof(mess)); - n = sendDataOnly(file_des,retval,sizeof(buffer)); + else{ + n = sendDataOnly(file_des,fName,MAX_STR_LENGTH); + n = sendDataOnly(file_des,arg,sizeof(arg)); + n = sendDataOnly(file_des,retval,sizeof(buffer)); + } /*return ok/fail*/ return ret; } diff --git a/slsDetectorSoftware/usersFunctions/usersFunctions.cpp b/slsDetectorSoftware/usersFunctions/usersFunctions.cpp index ce9c4e67f..078339603 100644 --- a/slsDetectorSoftware/usersFunctions/usersFunctions.cpp +++ b/slsDetectorSoftware/usersFunctions/usersFunctions.cpp @@ -304,7 +304,7 @@ int defaultDisconnectChannels(void *d) { -int defaultDataReadyFunc(detectorData* d, void* p) { +int defaultDataReadyFunc(detectorData* d, int i, void* p) { #ifdef VERBOSE printf("UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU Data received \n"); printf("Filename %s\n",d->fileName); diff --git a/slsDetectorSoftware/usersFunctions/usersFunctions.h b/slsDetectorSoftware/usersFunctions/usersFunctions.h index 8530ad7ac..9f40b580b 100644 --- a/slsDetectorSoftware/usersFunctions/usersFunctions.h +++ b/slsDetectorSoftware/usersFunctions/usersFunctions.h @@ -37,7 +37,7 @@ extern "C" { int defaultDisconnectChannels(void *d); double defaultGetI0(int t,void *d); - int defaultDataReadyFunc(detectorData* d, void* p); + int defaultDataReadyFunc(detectorData* d, int i, void* p); int defaultRawDataReadyFunc(double* d, int np, void* p);