From 1263e80d21689cb24187a7aeab3a38edcc9bd160 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 16 Sep 2016 12:49:27 +0200 Subject: [PATCH] done --- slsDetectorSoftware/commonFiles/error_defs.h | 4 +- .../multiSlsDetector/multiSlsDetector.cpp | 23 ++++++++++- .../multiSlsDetector/multiSlsDetector.h | 14 +++++-- .../slsDetector/slsDetector.cpp | 40 ++++++++++++++++--- slsDetectorSoftware/slsDetector/slsDetector.h | 14 +++++-- .../slsDetector/slsDetectorBase.h | 8 ++-- .../slsDetector/slsDetectorUtils.cpp | 29 ++++++++++++-- .../slsDetector/slsDetectorUtils.h | 15 ++++--- .../slsDetectorAnalysis/postProcessing.h | 1 - .../receiverInterface.cpp | 18 +++++++++ .../slsReceiverInterface/receiverInterface.h | 10 +++++ 11 files changed, 146 insertions(+), 30 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 89798faef..889a56240 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -61,6 +61,7 @@ using namespace std; #define DETECTOR_NETWORK_PARAMETER 0x0000000000400000ULL #define RATE_CORRECTION_NOT_32BIT 0x0000000000800000ULL #define RATE_CORRECTION_NO_TAU_PROVIDED 0x0000000001000000ULL +#define DATA_STREAMING_IN_RECEIVER 0x0000000002000000ULL // 0x00000000FFFFFFFFULL /** @short class returning all error messages for error mask */ @@ -198,7 +199,8 @@ public: if(slsErrorMask&RATE_CORRECTION_NO_TAU_PROVIDED) retval.append("Rate correction Deactivated. No default tau provided in file\n"); - + if(slsErrorMask&DATA_STREAMING_IN_RECEIVER) + retval.append("Could not set/reset Data Streaming in Receiver\n"); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index c33b5767d..21b50a023 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3352,6 +3352,7 @@ char* multiSlsDetector::setNetworkParameter(networkParameter p, string s){ } } + return getNetworkParameter(p); } @@ -5421,7 +5422,7 @@ int multiSlsDetector::calibratePedestal(int frames){ return ret; } -int multiSlsDetector::setReadReceiverFrequency(int getFromReceiver,int i){ +int multiSlsDetector::setReadReceiverFrequency(int getFromReceiver, int freq){ int ret=-100, ret1; if(!getFromReceiver) @@ -5429,7 +5430,7 @@ int multiSlsDetector::setReadReceiverFrequency(int getFromReceiver,int i){ for (int idet=0; idetnumberOfDetectors; idet++) { if (detectors[idet]) { - ret1=detectors[idet]->setReadReceiverFrequency(getFromReceiver,i); + ret1=detectors[idet]->setReadReceiverFrequency(getFromReceiver,freq); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<numberOfDetectors; idet++) { + if (detectors[idet]) { + ret1=detectors[idet]->setDataStreamingFromReceiver(enable); + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; idet++) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index c9826390d..0c811894b 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1242,14 +1242,20 @@ class multiSlsDetector : public slsDetectorUtils { int calibratePedestal(int frames = 0); /** Sets the read receiver frequency - if Receiver read upon gui request, readRxrFrequency=0, + if data required from receiver randomly 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 + 0 if it can get it from multi structure + @param freq is the receiver read frequency /returns read receiver frequency */ - int setReadReceiverFrequency(int getFromReceiver, int i=-1); + int setReadReceiverFrequency(int getFromReceiver, int freq=-1); + + /** Enable or disable streaming data from receiver to client + * @param enable 0 to disable 1 to enable -1 to only get the value + * @returns data streaming + */ + int setDataStreamingFromReceiver(int enable=-1); /** updates the multidetector offsets */ void updateOffsets(); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 344d3081d..e50c85442 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -7431,18 +7431,18 @@ int64_t slsDetector::clearAllErrorMask(){ -int slsDetector::setReadReceiverFrequency(int getFromReceiver,int i){ +int slsDetector::setReadReceiverFrequency(int getFromReceiver, int freq){ int fnum=F_READ_RECEIVER_FREQUENCY; int ret = FAIL; int retval=-1; - int arg = i; + int arg = freq; if(!getFromReceiver) return retval; if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending read frequency to receiver " << arg << std::endl; + std::cout << "Sending read frequency to receiver " << arg << std::endl; #endif if (connectData() == OK) ret=thisReceiver->sendInt(fnum,retval,arg); @@ -7453,14 +7453,44 @@ int slsDetector::setReadReceiverFrequency(int getFromReceiver,int i){ updateReceiver(); } - if ((i > 0) && (retval != i)){ - cout << "could not set receiver read frequency:" << retval << endl; + if ((freq > 0) && (retval != freq)){ + cout << "could not set receiver read frequency to " << freq <<" Returned:" << retval << endl; setErrorMask((getErrorMask())|(RECEIVER_READ_FREQUENCY)); } return retval; } + +int slsDetector::setDataStreamingFromReceiver(int enable){ + int fnum=F_STREAM_DATA_FROM_RECEIVER; + int ret = FAIL; + int retval=-1; + int arg = enable; + + + if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ +#ifdef VERBOSE + std::cout << "***************Sending Data Streaming in Receiver " << arg << std::endl; +#endif + if (connectData() == OK) + ret=thisReceiver->sendInt(fnum,retval,arg); + disconnectData(); + if(ret==FAIL) + retval = -1; + if(ret==FORCE_UPDATE) + updateReceiver(); + } + + if ((enable > 0) && (retval != enable)){ + cout << "could not set data streaming in receiver to " << enable <<" Returned:" << retval << endl; + setErrorMask((getErrorMask())|(RECEIVER_READ_FREQUENCY)); + } + return retval; +} + + + int slsDetector::enableReceiverCompression(int i){ int fnum=F_ENABLE_RECEIVER_COMPRESSION; int ret = FAIL; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 58a5f7a61..91f3ea91f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1671,14 +1671,20 @@ class slsDetector : public slsDetectorUtils, public energyConversion { char* setDetectorNetworkParameter(networkParameter index, int delay); /** Sets the read receiver frequency - if Receiver read upon gui request, readRxrFrequency=0, + if data required from receiver randomly 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 + 0 if it can get it from multi structure + @param freq is the receiver read frequency /returns read receiver frequency */ - int setReadReceiverFrequency(int getFromReceiver, int i=-1); + int setReadReceiverFrequency(int getFromReceiver, int freq=-1); + + /** Enable or disable streaming data from receiver to client + * @param enable 0 to disable 1 to enable -1 to only get the value + * @returns data streaming + */ + int setDataStreamingFromReceiver(int enable=-1); /** enable/disable or get data compression in receiver * @param i is -1 to get, 0 to disable and 1 to enable diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 8bbb145a3..9ebfd25c0 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -512,14 +512,14 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef /** Sets the read receiver frequency - if Receiver read upon gui request, readRxrFrequency=0, + if data required from receiver randomly 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 + 0 if it can get it from multi structure + @param freq is the receiver read frequency /returns read receiver frequency */ - virtual int setReadReceiverFrequency(int getFromReceiver, int i=-1)=0; + virtual int setReadReceiverFrequency(int getFromReceiver, int freq=-1)=0; /** Sets the receiver to start any readout remaining in the fifo and * change status to transmitting. diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index cfae1c279..5abe7d8d9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -8,7 +8,7 @@ #include #include #include - +#include //clock() using namespace std; slsDetectorUtils::slsDetectorUtils() { @@ -42,6 +42,8 @@ slsDetectorUtils::slsDetectorUtils() { int slsDetectorUtils::acquire(int delflag){ + struct timespec begin,end; + clock_gettime(CLOCK_REALTIME, &begin); //ensure acquire isnt started multiple times by same client if(getAcquiringFlag() == false) @@ -58,11 +60,25 @@ int slsDetectorUtils::acquire(int delflag){ }else{ //put receiver read frequency to random if no gui int ret = setReadReceiverFrequency(0); - if(ret>0 && (acquisition_finished == NULL)){ - std::cout << "Error: receiver read frequency is set to " << ret << " but should be > 0 only when using gui." << std::endl; + if(ret>0 && (dataReady == NULL)){ ret = setReadReceiverFrequency(1,0); - std::cout << "Current receiver read frequency: " << ret << std::endl; + std::cout << "No Data call back and hence receiver read frequency reset to " << ret <<" (Random)" << std::endl; } + + //start data streaming threads in receiver if enabled + ret = setDataStreamingFromReceiver(-1); + if(dataReady == NULL){ + if(ret){ + cout << "Disabling Data Streaming from Receiver" << endl; + setDataStreamingFromReceiver(0); //no call back but streaming enabled, then dont stream. + } + }else{ + if(*threadedProcessing && (!ret)){ + cout << "Enabling Data Streaming from Receiver" << endl; + setDataStreamingFromReceiver(1); //call back exists, threaded but streaming disabled, then stream. + } + } + } int nc=setTimer(CYCLES_NUMBER,-1); @@ -475,6 +491,7 @@ int slsDetectorUtils::acquire(int delflag){ #endif if(dataReady) sem_destroy(&dataThreadStartedSemaphore); + } @@ -502,6 +519,10 @@ int slsDetectorUtils::acquire(int delflag){ #endif setAcquiringFlag(false); + + clock_gettime(CLOCK_REALTIME, &end); + cprintf(BLUE,"Elapsed time:%f seconds\n",( end.tv_sec - begin.tv_sec ) + ( end.tv_nsec - begin.tv_nsec ) / 1000000000.0); + return OK; } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index d84503d59..929ce64ce 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -645,7 +645,6 @@ virtual int resetFramesCaught()=0; */ virtual void readFrameFromReceiver()=0; - /** Turns off the receiver server! */ @@ -688,14 +687,20 @@ virtual int setROI(int n=-1,ROI roiLimits[]=NULL)=0; virtual ROI* getROI(int &n)=0; /** Sets the read receiver frequency - if Receiver read upon gui request, readRxrFrequency=0, + if data required from receiver randomly 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 + 0 if it can get it from multi structure + @param freq is the receiver read frequency /returns read receiver frequency */ -virtual int setReadReceiverFrequency(int getFromReceiver, int i=-1)=0; +virtual int setReadReceiverFrequency(int getFromReceiver, int freq=-1)=0; + +/** Enable or disable streaming of data from receiver to client + * @param enable 0 to disable 1 to enable -1 to only get the value + * @returns data streaming +*/ +virtual int setDataStreamingFromReceiver(int enable=-1)=0; /** enable/disable or get data compression in receiver diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h index ae89471a9..dff44e5f8 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h @@ -338,7 +338,6 @@ s private: // double *fdata; - // int (*dataReady)(detectorData*,int, int,void*); // void *pCallbackArg; diff --git a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp index e5a5011a0..463d51a71 100644 --- a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp +++ b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp @@ -129,6 +129,24 @@ int receiverInterface::sendIntArray(int fnum, int64_t &retval, int64_t arg[2]){ +int receiverInterface::sendIntArray(int fnum, int &retval, int arg[2]){ + int args[2]; + int ret = slsDetectorDefs::FAIL; + char mess[100] = ""; + dataSocket->SendDataOnly(&fnum,sizeof(fnum)); + dataSocket->SendDataOnly(arg,sizeof(args)); + dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==slsDetectorDefs::FAIL){ + dataSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Receiver returned error: " << mess << std::endl; + } + dataSocket->ReceiveDataOnly(&retval,sizeof(retval)); + + return ret; +} + + + int receiverInterface::getInt(int fnum, int64_t &retval){ int ret = slsDetectorDefs::FAIL; diff --git a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h index 27fbea6a1..11e433a08 100644 --- a/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h +++ b/slsDetectorSoftware/slsReceiverInterface/receiverInterface.h @@ -95,6 +95,16 @@ public: */ int sendIntArray(int fnum, int64_t &retval, int64_t arg[2]); + + /** + * Send an integer to receiver + * @param fnum function enum to determine what parameter + * @param retval return value + * @param arg values to send + * \returns success of operation + */ + int sendIntArray(int fnum, int &retval, int arg[2]); + /** * Get an integer value from receiver * @param fnum function enum to determine what parameter