diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 3e88af858..1b586d03a 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -242,7 +242,7 @@ public: retval.append("Could not activate/deactivate receiver\n"); if(slsErrorMask&DATA_STREAMING) - retval.append("Could not set/reset Data Streaming\n"); + retval.append("Could not enable/disable Data Streaming\n"); if(slsErrorMask&RESET_ERROR) retval.append("Could not reset the FPGA\n"); diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index 4dfc6f97c..a22877146 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -194,6 +194,7 @@ enum networkParameter { FLOW_CONTROL_WR_PTR, /**< memory write pointer for flow control */ FLOW_CONTROL_RD_PTR, /**< memory read pointer for flow control */ RECEIVER_STREAMING_PORT, /**< receiever streaming TCP(ZMQ) port */ + CLIENT_STREAMING_PORT, /**< client streaming TCP(ZMQ) port */ RECEIVER_STREAMING_SRC_IP /**< receiever streaming TCP(ZMQ) ip */ }; diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 82eea673f..f65166098 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -216,6 +216,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) thisMultiDetector->receiver_read_freq = 0; thisMultiDetector->acquiringFlag = false; thisMultiDetector->externalgui = false; + thisMultiDetector->receiver_datastream = false; thisMultiDetector->alreadyExisting=1; } @@ -281,7 +282,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) getNMods(); getMaxMods(); - dataSocketsStarted = false; + client_datastream = false; for(int i=0;inumberOfDetectors]; for(int idet=0; idetnumberOfDetectors; ++idet){ if(detectors[idet]){ - if (p == RECEIVER_STREAMING_PORT) + if (p == RECEIVER_STREAMING_PORT || p == CLIENT_STREAMING_PORT) s.append("multi\0"); sret[idet]=new string("error"); Task* task = new Task(new func2_t(&slsDetector::setNetworkParameter, @@ -3786,8 +3798,20 @@ string multiSlsDetector::setNetworkParameter(networkParameter p, string s){ } //enable data streaming if it was on - if ((p == RECEIVER_STREAMING_PORT || p == RECEIVER_STREAMING_SRC_IP) && prev_streaming) - enableDataStreamingFromReceiver(1); + if (prev_streaming) { + switch (p) { + case RECEIVER_STREAMING_PORT: + enableDataStreamingFromReceiver(1); + break; + case CLIENT_STREAMING_PORT: + enableDataStreamingToClient(1); + break; + case RECEIVER_STREAMING_SRC_IP: + enableDataStreamingFromReceiver(1); + break; + default: break; + } + } return getNetworkParameter(p); @@ -5740,7 +5764,7 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){ zmqSocket[i] = 0; } } - dataSocketsStarted = false; + client_datastream = false; cout << "Destroyed Receiving Data Socket(s)" << endl; return OK; } @@ -5748,14 +5772,9 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){ cprintf(MAGENTA,"Going to create data sockets\n"); for(int i=0;igetReceiverStreamingPort().c_str(),"%d",&portnum); - if (portnum == 0) { - portnum = DEFAULT_ZMQ_PORTNO + - (i/numSocketsPerDetector)*numSocketsPerDetector + (i%numSocketsPerDetector); // *num and /num is not same cuz its integers - }else{ - portnum += (i%numSocketsPerDetector); - } + uint32_t portnum = 0; + sscanf(detectors[i/numSocketsPerDetector]->getClientStreamingPort().c_str(),"%d",&portnum); + portnum += (i%numSocketsPerDetector); zmqSocket[i] = new ZmqSocket(detectors[i/numSocketsPerDetector]->getReceiver().c_str(), portnum); if (zmqSocket[i]->IsError()) { @@ -5766,7 +5785,7 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){ printf("Zmq Client[%d] at %s\n",i, zmqSocket[i]->GetZmqServerAddress()); } - dataSocketsStarted = true; + client_datastream = true; cout << "Receiving Data Socket(s) created" << endl; return OK; } @@ -6340,71 +6359,63 @@ int multiSlsDetector::setReceiverReadTimer(int time_in_ms){ return ret; } -int multiSlsDetector::getStreamingSocketsCreatedInClient() { - return dataSocketsStarted; +int multiSlsDetector::enableDataStreamingToClient(int enable) { + if(enable >= 0){ + + //destroy data threads + if (!enable) + createReceivingDataSockets(true); + + //create data threads + else { + if(createReceivingDataSockets() == FAIL){ + std::cout << "Could not create data threads in client." << std::endl; + //only for the first det as theres no general one + setErrorMask(getErrorMask()|(1<<0)); + detectors[0]->setErrorMask((detectors[0]->getErrorMask())|(DATA_STREAMING)); + } + } + } + return client_datastream; } -int multiSlsDetector::enableDataStreamingFromReceiver(int enable){//cannot parrallize due to serReceiver calling parentdet->enabledatastremain - - //create client sockets only if no external gui - if (!thisMultiDetector->externalgui) { - if(enable >= 0){ - - //destroy data threads - if(dataSocketsStarted) - createReceivingDataSockets(true); - - //create data threads - if(enable > 0){ - if(createReceivingDataSockets() == FAIL){ - std::cout << "Could not create data threads in client. Aborting creating data sockets in receiver" << std::endl; - //only for the first det as theres no general one - setErrorMask(getErrorMask()|(1<<0)); - detectors[0]->setErrorMask((detectors[0]->getErrorMask())|(DATA_STREAMING)); - return -1; +int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ + if(enable >= 0){ + int ret=-100; + if(!threadpool){ + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + }else{ + //return storage values + int* iret[thisMultiDetector->numberOfDetectors]; + for(int idet=0; idetnumberOfDetectors; ++idet){ + if(detectors[idet]){ + iret[idet]= new int(-1); + Task* task = new Task(new func1_t(&slsDetector::enableDataStreamingFromReceiver, + detectors[idet],enable,iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for(int idet=0; idetnumberOfDetectors; ++idet){ + if(detectors[idet]){ + if(iret[idet] != NULL){ + if (ret==-100) + ret=*iret[idet]; + else if (ret!=*iret[idet]) + ret=-1; + delete iret[idet]; + }else ret=-1; + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<receiver_datastream = ret; } - - int ret=-100; - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - }else{ - //return storage values - int* iret[thisMultiDetector->numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::enableDataStreamingFromReceiver, - detectors[idet],enable,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if(iret[idet] != NULL){ - if (ret==-100) - ret=*iret[idet]; - else if (ret!=*iret[idet]) - ret=-1; - delete iret[idet]; - }else ret=-1; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<externalgui) { - if (ret != dataSocketsStarted) - ret = -1; - } - return ret; + return thisMultiDetector->receiver_datastream; } int multiSlsDetector::enableReceiverCompression(int i){ diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index a170aecb8..6ea818dc3 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -219,6 +219,9 @@ class multiSlsDetector : public slsDetectorUtils { /** receiver online flag - is set if the receiver is connected, unset if socket connection is not possible */ int receiverOnlineFlag; + /** data streaming (up stream) enable in receiver */ + bool receiver_datastream; + } sharedMultiSlsDetector; @@ -1367,17 +1370,19 @@ class multiSlsDetector : public slsDetectorUtils { /** - * Get Streaming sockets created in client from reciever - /returns 1 if sockets created, else 0 + * Enable data streaming to client + * @param enable 0 to disable, 1 to enable, -1 to get the value + * @returns data streaming to client enable */ - int getStreamingSocketsCreatedInClient(); + int enableDataStreamingToClient(int enable=-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 + * @param enable 0 to disable 1 to enable -1 to only get the value + * @returns data streaming from receiver enable */ int enableDataStreamingFromReceiver(int enable=-1); + /** updates the multidetector offsets */ void updateOffsets(); @@ -1523,8 +1528,8 @@ private: - /** Ensures if sockets created successfully */ - bool dataSocketsStarted; + /** data streaming (down stream) enabled in client (zmq sckets created) */ + bool client_datastream; /** ZMQ Socket - Receiver to Client */ ZmqSocket* zmqSocket[MAXDET]; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index e70e1448b..7ca65dfb7 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -788,6 +788,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->flippedData[0] = 0; thisDetector->flippedData[1] = 0; thisDetector->zmqport = 0; + thisDetector->receiver_zmqport = 0; + thisDetector->receiver_datastream = false; for (int ia=0; iaactionScript[ia],"none"); @@ -932,6 +934,14 @@ int slsDetector::initializeDetectorSize(detectorType type) { delete thisReceiver; thisReceiver = new receiverInterface(dataSocket); + // zmq ports + if (posId != -1) { + if (thisDetector->zmqport == 0) + thisDetector->zmqport = DEFAULT_ZMQ_CL_PORTNO + (posId * ((thisDetector->myDetectorType == EIGER) ? 2 : 1)); + if (thisDetector->receiver_zmqport == 0) + thisDetector->receiver_zmqport = DEFAULT_ZMQ_RX_PORTNO + (posId * ((thisDetector->myDetectorType == EIGER) ? 2 : 1)); + } + // setAngularConversionPointer(thisDetector->angOff,&thisDetector->nMods, thisDetector->nChans*thisDetector->nChips); #ifdef VERBOSE @@ -6017,6 +6027,9 @@ string slsDetector::setNetworkParameter(networkParameter index, string value) { case FLOW_CONTROL_10G: sscanf(value.c_str(),"%d",&i); return setDetectorNetworkParameter(index, i); + case CLIENT_STREAMING_PORT: + setClientStreamingPort(value); + return getClientStreamingPort(); case RECEIVER_STREAMING_PORT: setReceiverStreamingPort(value); return getReceiverStreamingPort(); @@ -6052,6 +6065,8 @@ string slsDetector::getNetworkParameter(networkParameter index) { case DETECTOR_TXN_DELAY_FRAME: case FLOW_CONTROL_10G: return setDetectorNetworkParameter(index, -1); + case CLIENT_STREAMING_PORT: + return getClientStreamingPort(); case RECEIVER_STREAMING_PORT: return getReceiverStreamingPort(); case RECEIVER_STREAMING_SRC_IP: @@ -6155,9 +6170,10 @@ string slsDetector::setReceiver(string receiverIP){ std::cout << "dynamic range:" << thisDetector->dynamicRange << endl << endl; std::cout << "flippeddatax:" << thisDetector->flippedData[d] << endl; std::cout << "10GbE:" << thisDetector->tenGigaEnable << endl << endl; - std::cout << "streaming port:" << thisDetector->zmqport << endl; std::cout << "streaming source ip:" << thisDetector->zmqsrcip << endl; std::cout << "enable gap pixels:" << thisDetector->gappixels << endl; + std::cout << "rx streaming port:" << thisDetector->receiver_zmqport << endl; + //std::cout << "dataStreaming:" << enableDataStreamingFromReceiver(-1) << endl << endl; /** enable compresison, */ #endif @@ -6200,20 +6216,7 @@ string slsDetector::setReceiver(string receiverIP){ // data streaming setReceiverStreamingPort(getReceiverStreamingPort()); - setReceiverStreamingSourceIP(getReceiverStreamingSourceIP()); - int clientSockets = parentDet->getStreamingSocketsCreatedInClient(); - int recSockets = enableDataStreamingFromReceiver(-1); - if(clientSockets != recSockets) { - pthread_mutex_lock(&ms); - if(clientSockets) - printf("Enabling Data Streaming\n"); - else - printf("Disabling Data Streaming\n"); - // push client state to receiver - /*parentDet->enableDataStreamingFromReceiver(clientSockets);*/ - enableDataStreamingFromReceiver(clientSockets); - pthread_mutex_unlock(&ms); - } + enableDataStreamingFromReceiver(enableDataStreamingFromReceiver(-1)); } } @@ -6312,7 +6315,29 @@ int slsDetector::setReceiverUDPPort2(int udpport){ } -int slsDetector::setReceiverStreamingPort(string port) { +string slsDetector::setClientStreamingPort(string port) { + int defaultport = 0; + int numsockets = (thisDetector->myDetectorType == EIGER) ? 2:1; + int arg = 0; + + //multi command, calculate individual ports + size_t found = port.find("multi"); + if(found != string::npos) { + port.erase(found,5); + sscanf(port.c_str(),"%d",&defaultport); + arg = defaultport + (posId * numsockets); + } + else + sscanf(port.c_str(),"%d",&arg); + thisDetector->zmqport = arg; + + return getClientStreamingPort(); +} + + + + +string slsDetector::setReceiverStreamingPort(string port) { int defaultport = 0; int numsockets = (thisDetector->myDetectorType == EIGER) ? 2:1; int arg = 0; @@ -6340,12 +6365,12 @@ int slsDetector::setReceiverStreamingPort(string port) { disconnectData(); } if(ret!=FAIL) - thisDetector->zmqport = retval; + thisDetector->receiver_zmqport = retval; if(ret==FORCE_UPDATE) updateReceiver(); } - return thisDetector->zmqport; + return getReceiverStreamingPort(); } string slsDetector::setReceiverStreamingSourceIP(string sourceIP) { @@ -8394,9 +8419,13 @@ int slsDetector::updateReceiverNoWait() { parentDet->enableOverwriteMask(ind); pthread_mutex_unlock(&ms); - // streaming port + // receiver streaming port n += dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); - thisDetector->zmqport = ind; + thisDetector->receiver_zmqport = ind; + + // receiver streaming enable + n += dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); + thisDetector->receiver_datastream = ind; // streaming source ip n += dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 91ffed795..5d4ff757d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -269,8 +269,12 @@ class slsDetector : public slsDetectorUtils, public energyConversion { bool acquiringFlag; /** flipped data across x or y axis */ int flippedData[2]; - /** tcp port between receiver and gui (only data) */ + /** tcp port from gui/different process to receiver (only data) */ int zmqport; + /** tcp port from receiver to gui/different process (only data) */ + int receiver_zmqport; + /** data streaming (up stream) enable in receiver */ + bool receiver_datastream; /** zmq tcp src ip address between receiver and gui (only data) **/ char zmqsrcip[MAX_STR_LENGTH]; @@ -1670,7 +1674,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /** gets the number of frames caught by any one receiver (to avoid using threadpool) \returns number of frames caught by any one receiver (master receiver if exists) */ - int getFramesCaughtByAnyReceiver() {getFramesCaughtByReceiver();}; + int getFramesCaughtByAnyReceiver() {return getFramesCaughtByReceiver();}; /** gets the current frame index of receiver \returns current frame index of receiver @@ -1757,8 +1761,10 @@ class slsDetector : public slsDetectorUtils, public energyConversion { string getReceiverUDPPort() {ostringstream ss; ss << thisDetector->receiverUDPPort; string s = ss.str(); return s;}; /** returns the receiver UDP2 for Eiger IP address \sa sharedSlsDetector */ string getReceiverUDPPort2() {ostringstream ss; ss << thisDetector->receiverUDPPort2; string s = ss.str(); return s;}; - /** returns the zmq port \sa sharedSlsDetector */ - string getReceiverStreamingPort() {ostringstream ss; ss << thisDetector->zmqport; string s = ss.str(); return s;}; + /** returns the client zmq port \sa sharedSlsDetector */ + string getClientStreamingPort() {ostringstream ss; ss << thisDetector->zmqport; string s = ss.str(); return s;}; + /** returns the receiver zmq port \sa sharedSlsDetector */ + string getReceiverStreamingPort() {ostringstream ss; ss << thisDetector->receiver_zmqport; string s = ss.str(); return s;}; /** gets the zmq source ip in client and receiver, returns "none" if default setting and no custom ip set*/ string getReceiverStreamingSourceIP(){return string(thisDetector->zmqsrcip);}; @@ -1776,10 +1782,13 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int setReceiverUDPPort(int udpport); /** sets the receiver udp port2 for Eiger \sa sharedSlsDetector */ int setReceiverUDPPort2(int udpport); - /** sets the zmq port in client and receiver (includes "multi" at the end if it should calculate individual ports \sa sharedSlsDetector */ - int setReceiverStreamingPort(string port); + /** sets the zmq port in client (includes "multi" at the end if it should calculate individual ports \sa sharedSlsDetector */ + string setClientStreamingPort(string port); + /** sets the zmq port in receiver (includes "multi" at the end if it should calculate individual ports \sa sharedSlsDetector */ + string setReceiverStreamingPort(string port); /** sets the zmq source ip in client and receiver */ string setReceiverStreamingSourceIP(string sourceIP); + /** sets the transmission delay for left or right port or for an entire frame*/ string setDetectorNetworkParameter(networkParameter index, int delay); @@ -1802,8 +1811,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int setReceiverReadTimer(int time_in_ms=500); /** 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 + * @param enable 0 to disable 1 to enable -1 to only get the value + * @returns data streaming from receiver enable */ int enableDataStreamingFromReceiver(int enable=-1); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 7d8683fdc..f8a8b4626 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -425,7 +425,6 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef */ int setHighVoltage(int val){return setDAC(val, HV_NEW, 0, -1);} \ - /** set dacs value \param val value diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 2230f602a..82f00b44c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -255,13 +255,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { commands to configure detector data structure */ - /*! \page config - - externalgui sets/gets external gui flag. 1 sets and enables the 0MQ data stream (0MQ threads created) from receiver to client, while 0 unsets and disables. \c Returns \c (int) - */ - descrToFuncMap[i].m_pFuncName="externalgui"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDataStream; - ++i; - /*! \page config - \b free Free shared memory on the control PC */ @@ -1902,12 +1895,26 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { ++i; /*! \page network - - zmqport [port] sets/gets the 0MQ (TCP) port of the receiver from where data is streamed to the client. Use single-detector command to set individually or multi-detector command to calculate based on \c port for the rest. \c Returns \c (int) + - zmqport [port] sets/gets the 0MQ (TCP) port of the client to where final data is streamed to (eg. for GUI). Use single-detector command to set individually or multi-detector command to calculate based on \c port for the rest. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="zmqport"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; ++i; + /*! \page network + - rx_zmqport [port] sets/gets the 0MQ (TCP) port of the receiver from where data is streamed from (eg. to GUI or another process for further processing). Use single-detector command to set individually or multi-detector command to calculate based on \c port for the rest. \c Returns \c (int) + */ + descrToFuncMap[i].m_pFuncName="rx_zmqport"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + ++i; + + /*! \page network + - rx_datastream enables/disables data streaming from receiver. 1 enables 0MQ data stream from receiver (creates streamer threads), while 0 disables (destroys streamer threads). \c Returns \c (int) + */ + descrToFuncMap[i].m_pFuncName="rx_datastream"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDataStream; + ++i; + /*! \page network - zmqsrcip [ip] sets/gets the 0MQ (TCP) ip of the receiver from where data is streamed to the client. Default is ip of rx_hostname. Use this only with external gui. \c Returns \c (string) */ @@ -2318,19 +2325,13 @@ string slsDetectorCommand::cmdAcquire(int narg, char *args[], int action) { #endif + if (action==HELP_ACTION) { + return helpAcquire(narg,args,HELP_ACTION); + } + myDet->setOnline(ONLINE_FLAG); int r_online = myDet->setReceiverOnline(ONLINE_FLAG); - if ((!myDet->getExternalGuiFlag()) && (r_online == ONLINE_FLAG)) { - // command line: must be off, if receiver on or there was -1, then - if (myDet->enableDataStreamingFromReceiver(-1) != 0){ - //switch it off, if error - if (myDet->enableDataStreamingFromReceiver(0) != 0) { - return string("could not disable data streaming in receiver\n"); - } - } - } - if(myDet->acquire() == FAIL) return string("acquire unsuccessful"); if(r_online){ @@ -2495,18 +2496,11 @@ string slsDetectorCommand::cmdDataStream(int narg, char *args[], int action) { if (action==PUT_ACTION) { if (!sscanf(args[1],"%d",&ival)) - return string ("cannot scan externalgui mode"); - myDet->setExternalGuiFlag(ival>0?true:false); + return string ("cannot scan rx_datastream mode"); myDet->enableDataStreamingFromReceiver(ival); } - int retval = myDet->getExternalGuiFlag(); - //if external gui on and datastreaming off - if (retval && !myDet->enableDataStreamingFromReceiver()) { - retval=-1; - printf("Error: data streaming in receiver is switched off while external gui flag in shared memory is off.\n"); - } - sprintf(ans,"%d",myDet->getExternalGuiFlag()); + sprintf(ans,"%d",myDet->enableDataStreamingFromReceiver()); return string(ans); } @@ -2515,9 +2509,9 @@ string slsDetectorCommand::helpDataStream(int narg, char *args[], int action) { ostringstream os; if (action==GET_ACTION || action==HELP_ACTION) - os << string("externalgui \t gets external gui flag. 1/0 means the 0MQ data stream (0MQ threads created) from receiver to client is enabled/disabled. -1 for inconsistency. \n"); + os << string("rx_datastream \t enables/disables data streaming from receiver. 1 is 0MQ data stream from receiver enabled, while 0 is 0MQ disabled. -1 for inconsistency between multiple receivers. \n"); if (action==PUT_ACTION || action==HELP_ACTION) - os << string("externalgui i\t sets external gui flag. 1/0 means the 0MQ data stream (0MQ threads created) from receiver to client is enabled/disabled. \n"); + os << string("rx_datastream i\t enables/disables data streaming from receiver. i is 1 enables 0MQ data stream from receiver (creates streamer threads), while 0 disables (destroys streamer threads). \n"); return os.str(); } @@ -3958,6 +3952,12 @@ string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int actio return ("cannot parse argument") + string(args[1]); } }else if (cmd=="zmqport") { + t=CLIENT_STREAMING_PORT; + if (action==PUT_ACTION){ + if (!(sscanf(args[1],"%d",&i))) + return ("cannot parse argument") + string(args[1]); + } + }else if (cmd=="rx_zmqport") { t=RECEIVER_STREAMING_PORT; if (action==PUT_ACTION){ if (!(sscanf(args[1],"%d",&i))) @@ -3991,7 +3991,8 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti os << "txndelay_right port \n sets detector transmission delay of the right port"<< std::endl; os << "txndelay_frame port \n sets detector transmission delay of the entire frame"<< std::endl; os << "flowcontrol_10g port \n sets flow control for 10g for eiger"<< std::endl; - os << "zmqport port \n sets zmq port (data from receiver to client); setting via multidetector command calculates port for individual detectors"<< std::endl; + os << "zmqport port \n sets zmq port (data to client from receiver/different process); setting via multidetector command calculates port for individual detectors"<< std::endl; + os << "rx_zmqport port \n sets zmq port (data from receiver to client/different process); setting via multidetector command calculates port for individual detectors"<< std::endl; os << "zmqsrcip ip \n sets/gets the 0MQ (TCP) ip of the receiver from where data is streamed to the client. Default is ip of rx_hostname. Use this only with external gui." << std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { @@ -4005,7 +4006,8 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti os << "txndelay_right \n gets detector transmission delay of the right port"<< std::endl; os << "txndelay_frame \n gets detector transmission delay of the entire frame"<< std::endl; os << "flowcontrol_10g \n gets flow control for 10g for eiger"<< std::endl; - os << "zmqport \n gets zmq port (data from receiver to client)"<< std::endl; + os << "zmqport \n gets zmq port (data to client from receiver/different process)"<< std::endl; + os << "rx_zmqport \n gets zmq port (data from receiver to client/different process)"<< std::endl; os << "zmqsrcip \n gets zmq source ip (data from receiver to client), none if default setting and no custom ip" << std::endl; } return os.str(); @@ -5916,33 +5918,14 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { myDet->setOnline(ONLINE_FLAG); - int receivers = myDet->setReceiverOnline(ONLINE_FLAG); + myDet->setReceiverOnline(ONLINE_FLAG); if(cmd=="receiver"){ if (action==PUT_ACTION) { - if(!strcasecmp(args[1],"start")) { - //to ensure data streaming enable is the same across client and receiver - if ((!myDet->getExternalGuiFlag()) && (receivers == ONLINE_FLAG)) { - //if it was not off - if (myDet->enableDataStreamingFromReceiver(-1) != 0){ - //switch it off, if error - if (myDet->enableDataStreamingFromReceiver(0) != 0) { - return string("could not disable data streaming in receiver\n"); - } - } - } + if(!strcasecmp(args[1],"start")) myDet->startReceiver(); - } - else if(!strcasecmp(args[1],"stop")){ - //myDet->stopReceiver(); - // myDet->startReceiverReadout(); - /*runStatus s = myDet->getReceiverStatus(); - while(s != RUN_FINISHED){ - usleep(50000); - s = myDet->getReceiverStatus(); - }*/ + else if(!strcasecmp(args[1],"stop")) myDet->stopReceiver(); - } else return helpReceiver(narg, args, action); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp index 95d9369ec..c783d349f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp @@ -227,6 +227,18 @@ int slsDetectorUsers::enableDataStreamingFromReceiver(int i){ return myDetector->enableDataStreamingFromReceiver(i); } +int slsDetectorUsers::enableDataStreamingToClient(int i){ + return myDetector->enableDataStreamingToClient(i); +} + +int slsDetectorUsers::setReceiverDataStreamingOutPort(int i){ + return myDetector->setReceiverDataStreamingOutPort(i); +} + +int slsDetectorUsers::setClientDataStreamingInPort(int i){ + return myDetector->setClientDataStreamingInPort(i); +} + int64_t slsDetectorUsers::getModuleFirmwareVersion(){ return myDetector->getModuleFirmwareVersion(); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index ea8011326..dbaa75340 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -439,13 +439,34 @@ class slsDetectorUsers virtual void finalizeDataset(double *a, double *v, double *e, int &np); - /** - Enable data streaming from receiver (zmq) - \param i 1 to set, 0 to reset and -1 to get - \returns data streaming enable - */ + /** Enable or disable streaming data from receiver (creates transmitting sockets) + * @param enable 0 to disable 1 to enable -1 to only get the value + * @returns data streaming from receiver enable + */ int enableDataStreamingFromReceiver(int i=-1); + /** + * Enable data streaming to client (creates receiving sockets) + * @param i 0 to disable, 1 to enable, -1 to get the value + * @returns data streaming to client enable + */ + int enableDataStreamingToClient(int i=-1); + + /** + * Set/Get receiver streaming out ZMQ port + * For multi modules, it calculates (increments) and sets the ports + * @param i sets, -1 gets + * @returns receiver streaming out ZMQ port () + */ + int setReceiverDataStreamingOutPort(int i=-1); + + /** + * Set/Get client streaming in ZMQ port + * For multi modules, it calculates (increments) and sets the ports + * @param i sets, -1 gets + * @returns client streaming in ZMQ port + */ + int setClientDataStreamingInPort(int i=-1); /** get get Module Firmware Version diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 1050c9c5b..c5698d3f5 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -30,6 +30,7 @@ extern "C" { #include #include #include +#include using namespace std; @@ -99,7 +100,32 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { int enableFlatFieldCorrection(int i=-1) {if (i>0) setFlatFieldCorrectionFile("default"); else if (i==0) setFlatFieldCorrectionFile(""); return getFlatFieldCorrection();}; int enablePixelMaskCorrection(int i=-1) {if (i>0) setBadChannelCorrection("default"); else if (i==0) setBadChannelCorrection(""); return getBadChannelCorrection();}; int enableCountRateCorrection(int i=-1) {if (i>0) setRateCorrection(i); else if (i==0) setRateCorrection(0); return getRateCorrection();}; - // string getFilePath(){return fileIO::getFilePath();};; + + + /** + * Set/Get receiver streaming out ZMQ port + * For multi modules, it calculates (increments) and sets the ports + * @param i sets, -1 gets + * @returns receiver streaming out ZMQ port + */ + int setReceiverDataStreamingOutPort(int i) { \ + if (i >= 0) { ostringstream ss; ss << i; string s = ss.str(); \ + setNetworkParameter(RECEIVER_STREAMING_PORT, s);} \ + return atoi(getNetworkParameter(RECEIVER_STREAMING_PORT).c_str());}; \ + + /** + * Set/Get client streaming in ZMQ port + * For multi modules, it calculates (increments) and sets the ports + * @param i sets, -1 gets + * @returns client streaming in ZMQ port + */ + int setClientDataStreamingInPort(int i){ \ + if (i >= 0) { ostringstream ss; ss << i; string s = ss.str(); \ + setNetworkParameter(CLIENT_STREAMING_PORT, s);} \ + return atoi(getNetworkParameter(CLIENT_STREAMING_PORT).c_str());}; \ + + +// string getFilePath(){return fileIO::getFilePath();};; // string setFilePath(string s){return fileIO::setFilePath(s);}; // string getFileName(){return fileIO::getFileName();}; @@ -760,9 +786,9 @@ virtual ROI* getROI(int &n)=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 +/** 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 from receiver enable */ virtual int enableDataStreamingFromReceiver(int enable=-1)=0;