diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 272771956..132c7ed89 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -33,7 +33,7 @@ using namespace std; #define COULDNOT_SET_NETWORK_PARAMETER 0x0000000000000002ULL #define COULDNOT_SET_ROI 0x0000000000000004ULL #define FILE_PATH_DOES_NOT_EXIST 0x0000000000000008ULL - +#define RECEIVER_READ_FREQUENCY 0x0000000000000010ULL /** @short class returning all error messages for error mask */ class errorDefs { @@ -81,6 +81,10 @@ public: if(slsErrorMask&FILE_PATH_DOES_NOT_EXIST) retval.append("File Path does not exist.\n"); + if(slsErrorMask&RECEIVER_READ_FREQUENCY) + retval.append("Could not set receiver read frequency.\n"); + + return retval; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 4d30664ea..85f1ea288 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -194,6 +194,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) thisMultiDetector->scanPrecision[iscan]=0; } + thisMultiDetector->receiver_read_freq = 0; thisMultiDetector->alreadyExisting=1; } @@ -4658,12 +4659,15 @@ int multiSlsDetector::calibratePedestal(int frames){ return ret; } -int multiSlsDetector::setReadReceiverFrequency(int i){ +int multiSlsDetector::setReadReceiverFrequency(int getFromReceiver,int i){ int ret=-100, ret1; + if(!getFromReceiver) + return thisMultiDetector->receiver_read_freq; + for (int idet=0; idetnumberOfDetectors; idet++) { if (detectors[idet]) { - ret1=detectors[idet]->setReadReceiverFrequency(i); + ret1=detectors[idet]->setReadReceiverFrequency(getFromReceiver,i); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<receiver_read_freq = ret; + return ret; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 3aafa7fc1..39790ad54 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -191,6 +191,9 @@ class multiSlsDetector : public slsDetectorUtils { mysteps scanSteps[MAX_SCAN_LEVELS]; int scanPrecision[MAX_SCAN_LEVELS]; + /* Receiver read frequency */ + int receiver_read_freq; + }; @@ -1190,9 +1193,12 @@ class multiSlsDetector : public slsDetectorUtils { /** Sets the read receiver frequency if Receiver read upon gui request, readRxrFrequency=0, else every nth frame to be sent to gui + @param getFromReceiver is 1 if it should ask the receiver, + 0 if it can get it from multislsdetecter + @param i is the receiver read frequency /returns read receiver frequency */ - int setReadReceiverFrequency(int i=-1); + int setReadReceiverFrequency(int getFromReceiver, int i=-1); /** updates the multidetector offsets */ void updateOffsets(); @@ -1202,6 +1208,7 @@ class multiSlsDetector : public slsDetectorUtils { */ void waitForReceiverReadToFinish(); + protected: @@ -1216,6 +1223,7 @@ class multiSlsDetector : public slsDetectorUtils { + }; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 3c5a9dc78..83398bb7d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -6095,8 +6095,6 @@ int* slsDetector::readFrameFromReceiver(char* fName, int &fIndex){ } } } - else - cout << "Acquisition stopped" << endl; dataSocket->Disconnect(); } @@ -6333,12 +6331,15 @@ int64_t slsDetector::clearAllErrorMask(){ -int slsDetector::setReadReceiverFrequency(int i){ +int slsDetector::setReadReceiverFrequency(int getFromReceiver,int i){ int fnum=F_READ_RECEIVER_FREQUENCY; int ret = FAIL; int retval=-1; int arg = i; + if(!getFromReceiver) + return retval; + if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ #ifdef VERBOSE std::cout << "Sending read frequency to receiver " << arg << std::endl; @@ -6350,6 +6351,11 @@ int slsDetector::setReadReceiverFrequency(int i){ if(ret==FORCE_UPDATE) updateReceiver(); } + + if ((i > 0) && (retval != i)){ + cout << "could not set receiver read frequency:" << retval << endl; + setErrorMask((getErrorMask())|(RECEIVER_READ_FREQUENCY)); + } return retval; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index c5a5570b9..2d4f8b37c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1593,12 +1593,15 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /** sets the receiver udp port \sa sharedSlsDetector */ int setReceiverUDPPort(int udpport); - /** Sets the variable readRxrFrequency. + /** Sets the read receiver frequency if Receiver read upon gui request, readRxrFrequency=0, else every nth frame to be sent to gui + @param getFromReceiver is 1 if it should ask the receiver, + 0 if it can get it from multislsdetecter + @param i is the receiver read frequency /returns read receiver frequency */ - int setReadReceiverFrequency(int i=-1); + int setReadReceiverFrequency(int getFromReceiver, int i=-1); /** * Waits for receiver read to finish after stopping acquisition diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 74a4e76a6..525843e3a 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -232,7 +232,8 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef virtual string createFileName()=0; - virtual void incrementProgress(int i=1)=0; + virtual void incrementProgress()=0; + virtual void setCurrentProgress(int i=0)=0; virtual double getCurrentProgress()=0; virtual void incrementFileIndex()=0; virtual int setTotalProgress()=0; @@ -474,6 +475,16 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef virtual int* readFrameFromReceiver(char* fName, int &fIndex)=0; + /** Sets the read receiver frequency + if Receiver read upon gui request, readRxrFrequency=0, + else every nth frame to be sent to gui + @param getFromReceiver is 1 if it should ask the receiver, + 0 if it can get it from multislsdetecter + @param i is the receiver read frequency + /returns read receiver frequency + */ + virtual int setReadReceiverFrequency(int getFromReceiver, int i=-1)=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/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 71894f7bd..4dab7c154 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3766,9 +3766,9 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { if (!sscanf(args[1],"%d",&ival)) return string("Could not scan read frequency mode ")+string(args[1]); if(ival>=0) - myDet->setReadReceiverFrequency(ival); + myDet->setReadReceiverFrequency(1,ival); } - sprintf(answer,"%d",myDet->setReadReceiverFrequency()); + sprintf(answer,"%d",myDet->setReadReceiverFrequency(1)); return string(answer); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index e47664736..6a7865d10 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -71,8 +71,6 @@ void slsDetectorUtils::acquire(int delflag){ void *status; - - if ((*correctionMask&(1<< ANGULAR_CONVERSION)) || (*correctionMask&(1<< I0_NORMALIZATION)) || getActionMode(angCalLog) || (getScanMode(0)==positionScan)|| (getScanMode(1)==positionScan)) { if (connectChannels==0) if (connect_channels) { @@ -127,6 +125,11 @@ void slsDetectorUtils::acquire(int delflag){ if(setReceiverOnline()==OFFLINE_FLAG) *stoppedFlag=1; + //multi detectors shouldnt have different receiver read frequencies enabled/disabled + if(setReadReceiverFrequency(0) < 0){ + std::cout << "Error: The receiver read frequency is invalid:" << setReadReceiverFrequency(0) << std::endl; + *stoppedFlag=1; + } //resets frames caught in receiver resetFramesCaught(); @@ -619,9 +622,9 @@ double slsDetectorUtils::getCurrentProgress() { -void slsDetectorUtils::incrementProgress(int i) { +void slsDetectorUtils::incrementProgress() { pthread_mutex_lock(&mp); - progressIndex+=i; + progressIndex++; cout << fixed << setprecision(2) << setw (6) << 100.*((double)progressIndex)/((double)totalProgress) << " \%"; pthread_mutex_unlock(&mp); #ifdef VERBOSE @@ -633,7 +636,18 @@ void slsDetectorUtils::incrementProgress(int i) { }; - +void slsDetectorUtils::setCurrentProgress(int i){ + pthread_mutex_lock(&mp); + progressIndex++; + progressIndex=i; + cout << fixed << setprecision(2) << setw (6) << 100.*((double)progressIndex)/((double)totalProgress) << " \%"; + pthread_mutex_unlock(&mp); +#ifdef VERBOSE + cout << endl; +#else + cout << "\r" << flush; +#endif +} int slsDetectorUtils::retrieveDetectorSetup(string const fname1, int level){ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index e3ae9701d..3411632cb 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -444,8 +444,8 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { double getCurrentProgress(); - void incrementProgress(int i=1); - + void incrementProgress(); + void setCurrentProgress(int i=0); /** @@ -672,12 +672,15 @@ virtual int setROI(int n=-1,ROI roiLimits[]=NULL)=0; */ virtual ROI* getROI(int &n)=0; -/** Sets the variable readRxrFrequency. +/** Sets the read receiver frequency if Receiver read upon gui request, readRxrFrequency=0, else every nth frame to be sent to gui + @param getFromReceiver is 1 if it should ask the receiver, + 0 if it can get it from multislsdetecter + @param i is the receiver read frequency /returns read receiver frequency */ -virtual int setReadReceiverFrequency(int i=-1)=0; +virtual int setReadReceiverFrequency(int getFromReceiver, int i=-1)=0; /** diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp index fa2d0ad88..55f1e56f3 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp @@ -409,78 +409,113 @@ void* postProcessing::processData(int delflag) { } //receiver else{ -/* + /* //without gui loop while(1){ if (checkJoinThread()) break; usleep(200000); } -*/ + */ /*if(setReadReceiverFrequency()>0)) ******Not implemented yet ******** * else */ - pthread_mutex_lock(&mg); - int prevCaught=getReceiverCurrentFrameIndex(); - pthread_mutex_unlock(&mg); + int prevCaught=0; int caught=0; bool newData=false; char currentfName[MAX_STR_LENGTH]=""; int currentfIndex=0; + int read_freq = setReadReceiverFrequency(0); +#ifdef VERBOSE + std::cout << "receiver read freq:" << read_freq << std::endl; +#endif + + //always read nth data + if (read_freq != 0) + newData = true; while(1){ + cout.flush(); cout< prevCaught) + newData=true; + else + newData=false; +#ifdef VERBOSE + std::cout << "caught:" << caught << " prevcaught:" << prevCaught << " newData:" << newData << std::endl; +#endif + prevCaught=caught; + } - //read frame if new data + //read frame if new data or nth frame reading if (newData){ - strcpy(currentfName,""); - pthread_mutex_lock(&mg); - int* receiverData = readFrameFromReceiver(currentfName,currentfIndex); - pthread_mutex_unlock(&mg); - if(setReceiverOnline()==OFFLINE_FLAG) - receiverData = NULL; - if(receiverData == NULL){ - currentfIndex = -1; - cout<<"****Detector Data returned is NULL***"<=0){ - fdata=decodeData(receiverData); - delete [] receiverData; - if(fdata){ - if (dataReady) { - thisData=new detectorData(fdata,NULL,NULL,getCurrentProgress(),currentfName,getTotalNumberOfChannels()); + + if(setReceiverOnline()==ONLINE_FLAG){ + + //get data + strcpy(currentfName,""); + pthread_mutex_lock(&mg); + int* receiverData = readFrameFromReceiver(currentfName,currentfIndex); + pthread_mutex_unlock(&mg); + if(setReceiverOnline()==OFFLINE_FLAG) + receiverData = NULL; + if(receiverData == NULL){ + currentfIndex = -1; + cout<<"****Detector Data returned is NULL***"<= 0) { + fdata = decodeData(receiverData); + delete [] receiverData; + if ((fdata) && (dataReady)){ + thisData = new detectorData(fdata,NULL,NULL,getCurrentProgress(),currentfName,getTotalNumberOfChannels()); dataReady(thisData, currentfIndex, pCallbackArg); delete thisData; - fdata=NULL; + fdata = NULL; } } - } - else{ - ;//cout<<"****Detector returned mismatched indices/garbage or acquisition is over. Trying again.***"<> frameIndexOffset; - - //currframenum = (int)(*((int*)wbuf)); //cout<<"**************curreframenm:"<