Merge branch 'developer' of git.psi.ch:sls_detectors_software/sls_detector_software into developer

This commit is contained in:
2017-11-21 12:10:33 +01:00
18 changed files with 452 additions and 263 deletions

View File

@ -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;i<MAXDET;++i)
zmqSocket[i] = 0;
threadpool = 0;
@ -3728,10 +3729,26 @@ string multiSlsDetector::setNetworkParameter(networkParameter p, string s){
// disable data streaming before changing zmq port (but only if they were on)
int prev_streaming = 0;
if (p == RECEIVER_STREAMING_PORT || p == RECEIVER_STREAMING_SRC_IP) {
prev_streaming = getStreamingSocketsCreatedInClient();
enableDataStreamingFromReceiver(0);
}
switch (p) {
case RECEIVER_STREAMING_PORT:
prev_streaming = enableDataStreamingFromReceiver();
enableDataStreamingFromReceiver(0);
break;
case CLIENT_STREAMING_PORT:
prev_streaming = enableDataStreamingToClient();
enableDataStreamingToClient(0);
break;
case RECEIVER_STREAMING_SRC_IP:
prev_streaming = enableDataStreamingFromReceiver();
enableDataStreamingFromReceiver(0);
break;
case CLIENT_STREAMING_SRC_IP:
prev_streaming = enableDataStreamingToClient();
enableDataStreamingToClient(0);
break;
default: break;
}
if (s.find('+')==string::npos) {
@ -3742,7 +3759,7 @@ string multiSlsDetector::setNetworkParameter(networkParameter p, string s){
string* sret[thisMultiDetector->numberOfDetectors];
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; ++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<string,networkParameter,string>(&slsDetector::setNetworkParameter,
@ -3786,8 +3803,23 @@ 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;
case CLIENT_STREAMING_SRC_IP:
enableDataStreamingToClient(1);
break;
default: break;
}
}
return getNetworkParameter(p);
@ -5740,7 +5772,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,16 +5780,11 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){
cprintf(MAGENTA,"Going to create data sockets\n");
for(int i=0;i<numSockets; ++i){
uint32_t portnum;
sscanf(detectors[i/numSocketsPerDetector]->getReceiverStreamingPort().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);
zmqSocket[i] = new ZmqSocket(detectors[i/numSocketsPerDetector]->getClientStreamingIP().c_str(), portnum);
if (zmqSocket[i]->IsError()) {
cprintf(RED, "Error: Could not create Zmq socket on port %d\n", portnum);
createReceivingDataSockets(true);
@ -5766,7 +5793,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;
}
@ -5876,8 +5903,6 @@ void multiSlsDetector::readFrameFromReceiver(){
if (jungfrau)
multiframegain = new char[multidatabytes]();
int nch;
bool runningList[numSockets];
int numRunning = 0;
@ -6340,71 +6365,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; idet<thisMultiDetector->numberOfDetectors; ++idet){
if(detectors[idet]){
iret[idet]= new int(-1);
Task* task = new Task(new func1_t<int,int>(&slsDetector::enableDataStreamingFromReceiver,
detectors[idet],enable,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; ++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<<idet));
}
}
}
thisMultiDetector->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; idet<thisMultiDetector->numberOfDetectors; ++idet){
if(detectors[idet]){
iret[idet]= new int(-1);
Task* task = new Task(new func1_t<int,int>(&slsDetector::enableDataStreamingFromReceiver,
detectors[idet],enable,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; ++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<<idet));
}
}
}
if (!thisMultiDetector->externalgui) {
if (ret != dataSocketsStarted)
ret = -1;
}
return ret;
return thisMultiDetector->receiver_datastream;
}
int multiSlsDetector::enableReceiverCompression(int i){