From ca855e6d39116f5eeef4d14f2ab5b53d6f3c135d Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 30 Nov 2017 18:37:11 +0100 Subject: [PATCH] restream stop from receiver --- slsDetectorSoftware/commonFiles/error_defs.h | 8 +++++ .../multiSlsDetector/multiSlsDetector.cpp | 17 ++++++++++ .../multiSlsDetector/multiSlsDetector.h | 9 ++++++ .../slsDetector/slsDetector.cpp | 23 +++++++++++++ slsDetectorSoftware/slsDetector/slsDetector.h | 9 ++++++ .../slsDetector/slsDetectorCommand.cpp | 32 +++++++++++++------ .../slsDetector/slsDetectorUtils.h | 9 ++++++ 7 files changed, 98 insertions(+), 9 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 272626053..8ba6f5f85 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -82,6 +82,7 @@ using namespace std; #define RECEIVER_FILE_FORMAT 0x0000000080000000ULL #define RECEIVER_SUBF_TIME_NOT_SET 0x0000000100000000ULL #define RECEIVER_SILENT_MODE_NOT_SET 0x0000000200000000ULL +#define RESTREAM_STOP_FROM_RECEIVER 0x0000000400000000ULL // 0x0000000FFFFFFFFFULL /** @short class returning all error messages for error mask */ @@ -266,6 +267,13 @@ public: if(slsErrorMask&RECEIVER_SILENT_MODE_NOT_SET) retval.append("Could not set silent mode in receiver.\n"); + if(slsErrorMask&RESTREAM_STOP_FROM_RECEIVER) + retval.append("Could not restream stop from receiver.\n"); + + + + + //------------------------------------------------------ length of message diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 4d02fa0c3..7f9607fec 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -6535,3 +6535,20 @@ bool multiSlsDetector::isAcquireReady() { thisMultiDetector->acquiringFlag = true; return OK; } + + + +int multiSlsDetector::restreamStopFromReceiver() { + int ret=OK, ret1; + for(int idet=0; idetnumberOfDetectors; ++idet){ + if (detectors[idet]) { + ret1=detectors[idet]->restreamStopFromReceiver(); + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<isAcquireReady(); } + +int slsDetector::restreamStopFromReceiver(){ + int fnum=F_RESTREAM_STOP_FROM_RECEIVER; + int ret = FAIL; + char mess[MAX_STR_LENGTH] = ""; + + if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { +#ifdef VERBOSE + std::cout << "To Restream stop dummy from Receiver via zmq" << std::endl; +#endif + + if (connectData() == OK){ + ret=thisReceiver->executeFunction(fnum,mess); + disconnectData(); + } + if(ret==FORCE_UPDATE) + ret=updateReceiver(); + else if (ret == FAIL) + setErrorMask((getErrorMask())|(RESTREAM_STOP_FROM_RECEIVER)); + } + + return ret; +} diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index c4f70f909..d6ea9140c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1918,6 +1918,15 @@ class slsDetector : public slsDetectorUtils, public energyConversion { */ bool isAcquireReady(); + /** + If data streaming in receiver is enabled, + restream the stop dummy packet from receiver + Used usually for Moench, + in case it is lost in network due to high data rate + \returns OK if success else FAIL + */ + int restreamStopFromReceiver(); + protected: diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index c2212857a..c809cd04f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -2047,6 +2047,12 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; ++i; + /*! \page receiver + - r_restreamstop [i] If data streaming in receiver is enabled, restreams the stop dummy packet via zmq. i can be any value. Only put! \cReturns 1 for success 0 for fail \c (int) + */ + descrToFuncMap[i].m_pFuncName="r_restreamstop"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; + ++i; @@ -6006,6 +6012,20 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { } + else if(cmd=="r_restreamstop"){ + if (action==GET_ACTION) + return string("cannot get"); + else { + if ((myDet->getRunStatus() != IDLE) || (myDet->getReceiverStatus() != IDLE)) { + std::cout << "Could not restream stop from receiver. Acquisition still in progress" << std::endl; + sprintf(answer,"%d",0); + } + sprintf(answer,"%d",(myDet->restreamStopFromReceiver() == OK) ? 1 : 0); + } + return string(answer); + } + + return string("could not decode command"); } @@ -6016,12 +6036,13 @@ string slsDetectorCommand::helpReceiver(int narg, char *args[], int action) { ostringstream os; if (action==PUT_ACTION || action==HELP_ACTION) { - os << "receiver [status] \t starts/stops the receiver to listen to detector packets. - can be start or stop" << std::endl; + os << "receiver [status] \t starts/stops the receiver to listen to detector packets. - can be start, stop." << std::endl; os << "resetframescaught [any value] \t resets frames caught by receiver" << std::endl; os << "r_readfreq \t sets the gui read frequency of the receiver, 0 if gui requests frame, >0 if receiver sends every nth frame to gui" << std::endl; os << "tengiga \t sets system to be configure for 10Gbe if set to 1, else 1Gbe if set to 0" << std::endl; os << "rx_fifodepth [val]\t sets receiver fifo depth to val" << std::endl; os << "r_silent [i]\t sets receiver in silent mode, ie. it will not print anything during real time acquisition. 1 sets, 0 unsets." << std::endl; + os << "r_restreamstop [i]\t If data streaming in receiver is enabled and receiver is idle, restreams the stop dummy packet via zmq. i can be any value." << std::endl; } if (action==GET_ACTION || action==HELP_ACTION){ os << "receiver \t returns the status of receiver - can be running or idle" << std::endl; @@ -6031,16 +6052,9 @@ string slsDetectorCommand::helpReceiver(int narg, char *args[], int action) { os << "tengiga \t returns 1 if the system is configured for 10Gbe else 0 for 1Gbe" << std::endl; os << "rx_fifodepth \t returns receiver fifo depth" << std::endl; os << "r_silent \t returns receiver silent mode enable. 1 is silent, 0 not silent." << std::endl; + os << "r_restreamstop \t returns if restreaming the stop dummy packet from receiver via zmq was success(1) or fail(0)" << std:: endl; } return os.str(); - - - - - - - - } string slsDetectorCommand::helpPattern(int narg, char *args[], int action) { diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index cc380255e..b59510599 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -906,6 +906,15 @@ virtual int setReceiverSilentMode(int i = -1)=0; */ virtual bool isAcquireReady() = 0; + /** + If data streaming in receiver is enabled, + restream the stop dummy packet from receiver + Used usually for Moench, + in case it is lost in network due to high data rate + \returns OK if success else FAIL + */ + virtual int restreamStopFromReceiver() = 0; + protected: