diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f8090b989..eb902d955 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4959,27 +4959,27 @@ int multiSlsDetector::resetFramesCaught() { void multiSlsDetector::readFrameFromReceiver(){ - int value; + //Note:num threads = (num slsDets = num tasks) + //so, half slsdet readouts read serially in each task (eiger udp ports) + + //create zmq threads if(createThreadPool(&zmqthreadpool) == FAIL){ cprintf(BG_RED,"Error: Could not create the zmq threads\n"); return; } - zmqthreadpool->setzeromqThread(); + zmqthreadpool->setzeromqThread(); //for debugging //determine number of half readouts and maxX and maxY int maxX=0,maxY=0; - int numReadout = 1; - bool checkbottom = false; - + int numReadoutPerDetector = 1; if(getDetectorsType() == EIGER){ - numReadout = 2; + numReadoutPerDetector = 2; maxX = thisMultiDetector->numberOfChannel[X]; maxY = thisMultiDetector->numberOfChannel[Y]; - checkbottom = true; } + int numReadouts = numReadoutPerDetector * thisMultiDetector->numberOfDetectors; + - //Note:num threads correspond to num detectors as task calls each slsdet - //(eiger udp ports/half readouts will have to do it serially) //start all socket tasks volatile uint64_t runningMask = 0x0; @@ -4990,11 +4990,13 @@ void multiSlsDetector::readFrameFromReceiver(){ }else{ for(int idet=0; idetnumberOfDetectors; idet++){ if(detectors[idet]){ - sem_init(&sem_slswait[idet*numReadout],1,0); - sem_init(&sem_slsdone[idet*numReadout],1,0); - if(numReadout>1){ - sem_init(&sem_slswait[idet*numReadout+1],1,0); - sem_init(&sem_slsdone[idet*numReadout+1],1,0); + sem_init(&sem_slswait[idet*numReadoutPerDetector],1,0); + sem_init(&sem_slsdone[idet*numReadoutPerDetector],1,0); + sem_init(&sem_multiwait[idet*numReadoutPerDetector],1,0); + if(numReadoutPerDetector>1){ + sem_init(&sem_slswait[idet*numReadoutPerDetector+1],1,0); + sem_init(&sem_slsdone[idet*numReadoutPerDetector+1],1,0); + sem_init(&sem_multiwait[idet*numReadoutPerDetector+1],1,0); } Task* task = new Task(new func00_t(&slsDetector::readFrameFromReceiver,detectors[idet])); zmqthreadpool->add_task(task); @@ -5006,19 +5008,21 @@ void multiSlsDetector::readFrameFromReceiver(){ slsmaxY = detectors[idet]->getTotalNumberOfChannels(Y); } //set mask - runningMask|=(1<<(idet*numReadout)); - if(numReadout>1) - runningMask|=(1<<(idet*numReadout+1)); + runningMask|=(1<<(idet*numReadoutPerDetector)); + if(numReadoutPerDetector>1) + runningMask|=(1<<(idet*numReadoutPerDetector+1)); } } } + zmqthreadpool->startExecuting(); //tell them to start + for(int i=0;istartExecuting();//tell them to start int nel=(thisMultiDetector->dataBytes)/sizeof(int); - if(nel <= 0){ cout << "Multislsdetector databytes not valid :" << thisMultiDetector->dataBytes << endl; return; @@ -5026,51 +5030,43 @@ void multiSlsDetector::readFrameFromReceiver(){ int* multiframe=new int[nel]; int* p = multiframe; int idet,offsetY,offsetX; - int halfreadoutoffset = (slsmaxX/numReadout); + int halfreadoutoffset = (slsmaxX/numReadoutPerDetector); //after reconstruction int framecount=0; int nx =getTotalNumberOfChannels(slsDetectorDefs::X); int ny =getTotalNumberOfChannels(slsDetectorDefs::Y); - - + //construct complete image and send to callback while(true){ - memset(((char*)multiframe),0x0,slsdatabytes*thisMultiDetector->numberOfDetectors); - - for(int ireadout=0; ireadoutnumberOfDetectors*numReadout; ++ireadout){ - idet = ireadout/numReadout; - + memset(((char*)multiframe),0x0,slsdatabytes*thisMultiDetector->numberOfDetectors); //reset frame memory + for(int ireadout=0; ireadoutoffsetY[idet] + slsmaxY)) * maxX * bytesperchannel; - if(!(ireadout%numReadout)) offsetX = thisMultiDetector->offsetX[idet]; - else offsetX = thisMultiDetector->offsetX[idet] + halfreadoutoffset; + //the left half or right half + if(!(ireadout%numReadoutPerDetector)) + offsetX = thisMultiDetector->offsetX[idet]; + else + offsetX = thisMultiDetector->offsetX[idet] + halfreadoutoffset; offsetX *= bytesperchannel; //cprintf(BLUE,"offsetx:%d offsety:%d maxx:%d slsmaxX:%d slsmaxY:%d bytesperchannel:%d\n", // offsetX,offsetY,maxX,slsmaxX,slsmaxY,bytesperchannel); - //cprintf(BLUE,"copying bytes:%d\n", (slsmaxX/numReadout)*bytesperchannel); //itnerleaving with other detectors @@ -5078,21 +5074,16 @@ void multiSlsDetector::readFrameFromReceiver(){ if(((idet+1)%2) == 0){ for(int i=0;iwait_for_tasks_to_complete(); + for(int i=0;idataBytes)/sizeof(int); - if(nel <= 0){ - cout << "Multislsdetector databytes not valid :" << thisMultiDetector->dataBytes << endl; - acquisitionIndex = -1; - return NULL; - } - int n,complete=OK; - int i,k,offsetX, offsetY, maxX, maxY; double dr; - int* retval=new int[nel]; - int *retdet = NULL, *p=retval; - string fullFName=""; - string ext=""; - int index=-1,f_index=-1,p_index=-1,det_index=-1; - double sv0=-1,sv1=-1; - - if(getDetectorsType() == EIGER){ - maxX = thisMultiDetector->numberOfChannel[X]; - maxY = thisMultiDetector->numberOfChannel[Y]; - } - - - for (int id=0; idnumberOfDetectors; id++) { - if (detectors[id]) { - n=detectors[id]->getDataBytes(); - retdet=detectors[id]->readFrameFromReceiver(fName, acquisitionIndex, frameIndex, subFrameIndex); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getDataBytes(); - if(getDetectorsType() == EIGER){ - //cout << "fname:"<getMaxNumberOfChannels()<<" n:"<getMaxNumberOfChannels(); - k=(int)(detectors[id]->getMaxNumberOfChannels(X)*dr);//bit mode - //cout << "dr:"<offsetY[id] + detectors[id]->getMaxNumberOfChannels(Y))) * maxX)*dr);//bit mode - offsetX = (int)(thisMultiDetector->offsetX[id]*dr); - //cout << "offsetY"<slsframe[readoutId+i]=new int[nel]; } @@ -7172,69 +7171,51 @@ void slsDetector::readFrameFromReceiver(){ for(int i=0;isem_multiwait[readoutId+i]); //let multi know socket created } - cout<sem_slswait[readoutId+idet]);//wait for it to be copied - - //update indices - if(!idet) framecount++; //count only once + if(!idet) framecount++; //update indices, count only once // receive a message, this is a blocking function len = zmq_msg_init (&message); /* is this required? Xiaoqiang didnt have it*/ if(len) {cprintf(RED,"Failed to initialize message %d for %d\n",len,readoutId+idet); continue; }//error len = zmq_msg_recv(&message, zmqsocket[idet], 0); - //int size = zmq_msg_size (&message); + //end of socket if (len <= 3 ) { if(!len) cprintf(RED,"Received no data in socket for %d\n", readoutId+idet); //cout<slsframe[readoutId+idet] = NULL; - sem_post(&parentDet->sem_slsdone[readoutId+idet]);//let multi know is ready - + sem_post(&parentDet->sem_slsdone[readoutId+idet]); //let multi know is ready runningMask^=(1<dataBytes/numReadout){//hoow to solve this memcpy((char*)(parentDet->slsframe[readoutId+idet]),(char*)zmq_msg_data(&message),thisDetector->dataBytes/numReadout); - //memcpy((char*)(parentDet->slsframe[readoutId+idet]),zmq_msg_data(&message[idet]),thisDetector->dataBytes); - //check header, if incorrect frame, copy somewhere and assign a blank subframe - //parentDet->slsframe[readoutId+idet] = (int*)zmq_msg_data(&message[idet]); + //check header, if incorrect frame, copy somewhere and assign a blank subframe and also check size //jungfrau masking adcval if(thisDetector->myDetectorType == JUNGFRAU){ @@ -7244,29 +7225,23 @@ void slsDetector::readFrameFromReceiver(){ } //} sem_post(&parentDet->sem_slsdone[readoutId+idet]);//let multi know is ready - } }//end of for loop if(!runningMask){ break; } - } zmq_msg_close(&message); - - //close socket for(int i=0;islsframe[readoutId+i]; } - -}; +} diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 54d6b27e5..7ae8579fc 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1568,8 +1568,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion { */ int resetFramesCaught(); - /** - * Reads frames from receiver through a constant socket + /** Reads frames from receiver through a constant socket */ void readFrameFromReceiver(); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 9ccf313e5..8bbb145a3 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -506,8 +506,7 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef virtual int lockReceiver(int lock=-1)=0; - /** - * Reads frames from receiver through a constant socket + /** Reads frames from receiver through a constant socket */ virtual void readFrameFromReceiver()=0; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index 792359f86..cc10d0c12 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -157,7 +157,8 @@ int slsDetectorUtils::acquire(int delflag){ if (*threadedProcessing) { - sem_init(&dataThreadStartedSemaphore,1,0); + if(dataReady) + sem_init(&dataThreadStartedSemaphore,1,0); startThread(delflag); } #ifdef VERBOSE @@ -171,6 +172,7 @@ int slsDetectorUtils::acquire(int delflag){ if(*threadedProcessing && dataReady) sem_wait(&dataThreadStartedSemaphore); + for(int im=0;im