diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index aa8f25aa5..221e3dbbb 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1178,34 +1178,50 @@ slsDetectorDefs::detectorSettings multiSlsDetector::getSettings(int pos) { slsDetectorDefs::detectorSettings multiSlsDetector::setSettings(detectorSettings isettings, int pos) { + int posmin, posmax; + int ret1=-1, ret=-100; - int i, posmin, posmax; - detectorSettings ret1=GET_SETTINGS, ret; + if (pos<0) { + posmin=0; + posmax=thisMultiDetector->numberOfDetectors; + } else { + posmin=pos; + posmax=pos+1; + } - if (pos<0) { - posmin=0; - posmax=thisMultiDetector->numberOfDetectors; - } else { - posmin=pos; - posmax=pos+1; - } + if(!threadpool){ + cout << "Error in creating threadpool. Exiting" << endl; + return GET_SETTINGS; + }else{ + //return storage values + int* iret[posmax-posmin]; + for(int idet=posmin; idet(&slsDetector::setSettings, + detectors[idet],isettings,-1,iret[idet])); + threadpool->add_task(task); + } + } + threadpool->wait_for_tasks_to_complete(); + for(int idet=posmin; idetgetErrorMask()) + setErrorMask(getErrorMask()|(1<setSettings(isettings); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<currentSettings=ret1; - - return ret1; + thisMultiDetector->currentSettings=(detectorSettings)ret1; + return (detectorSettings)ret1; } @@ -3873,16 +3889,8 @@ int multiSlsDetector::loadSettingsFile(string fname, int imod) { } } } -/* - for (int idet=0; idetnumberOfDetectors; idet++) { - if (detectors[idet]) { - ret=detectors[idet]->loadSettingsFile(fname, imod); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=0) { if (detectors[id]) { @@ -3927,15 +3935,35 @@ int multiSlsDetector::setAllTrimbits(int val, int imod){ } } else if (imod<0) { - for (int idet=0; idetnumberOfDetectors; idet++) { - if (detectors[idet]) { - ret1=detectors[idet]->setAllTrimbits(val,imod); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + iret[idet]= new int(-1); + Task* task = new Task(new func2_t (&slsDetector::setAllTrimbits, + detectors[idet],val,imod,iret[idet])); + threadpool->add_task(task); + } + } + threadpool->wait_for_tasks_to_complete(); + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + if(iret[idet] != NULL){ + ret1 = *iret[idet]; + delete iret[idet]; + } + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; idet++) - if (detectors[idet]){ - ret1=detectors[idet]->pulsePixel(n,x,y); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + iret[idet]= new int(-1); + Task* task = new Task(new func3_t (&slsDetector::pulsePixel, + detectors[idet],n,x,y,iret[idet])); + threadpool->add_task(task); + } } + threadpool->wait_for_tasks_to_complete(); + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + if(iret[idet] != NULL){ + ret1 = *iret[idet]; + delete iret[idet]; + } + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; idet++) - if (detectors[idet]){ - ret1=detectors[idet]->pulsePixelNMove(n,x,y); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + iret[idet]= new int(-1); + Task* task = new Task(new func3_t (&slsDetector::pulsePixelNMove, + detectors[idet],n,x,y,iret[idet])); + threadpool->add_task(task); + } } + threadpool->wait_for_tasks_to_complete(); + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + if(iret[idet] != NULL){ + ret1 = *iret[idet]; + delete iret[idet]; + } + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; idet++) - if (detectors[idet]){ - ret1=detectors[idet]->pulseChip(n); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + iret[idet]= new int(-1); + Task* task = new Task(new func1_t (&slsDetector::pulseChip, + detectors[idet],n,iret[idet])); + threadpool->add_task(task); + } } + threadpool->wait_for_tasks_to_complete(); + for(int idet=0; idetnumberOfDetectors; idet++){ + if(detectors[idet]){ + if(iret[idet] != NULL){ + ret1 = *iret[idet]; + delete iret[idet]; + } + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1< +class func3_t{ +public: + func3_t(_Ret (_Class::*fn)(_Arg1,_Arg2,_Arg3),_Class* ptr,_Arg1 arg1,_Arg2 arg2,_Arg3 arg3,_Store* sto): + m_fn(fn),m_ptr(ptr),m_arg1(arg1),m_arg2(arg2),m_arg3(arg3),m_store(sto){} + ~func3_t() {} + void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1,m_arg2,m_arg3));} +private: + _Class* m_ptr; + _Ret (_Class::*m_fn)(_Arg1,_Arg2,_Arg3); + _Arg1 m_arg1; + _Arg2 m_arg2; + _Arg3 m_arg3; + _Store* m_store; +}; + template class func4_t{ public: @@ -65,42 +81,53 @@ private: class Task: public virtual slsDetectorDefs{ public: - Task(func1_t * t): - m_int1(t),m_string1(0),m_chararr1(0),m_f2_1(0),m_settings(0){}; - Task(func1_t * t): - m_int1(0),m_string1(t),m_chararr1(0),m_f2_1(0),m_settings(0){}; - Task(func1_t * t): - m_int1(0),m_string1(0),m_chararr1(t),m_f2_1(0),m_settings(0){}; + /* Return: int, Param: int */ + Task(func1_t * t): m1(t),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0){}; + /* Return: int, Param: string,int */ + Task(func2_t * t): m1(0),m2(t),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0){}; + /* Return: string, Param: string */ + Task(func1_t * t): m1(0),m2(0),m3(t),m4(0),m5(0),m6(0),m7(0),m8(0){}; + /* Return: char*, Param: char* */ + Task(func1_t * t): m1(0),m2(0),m3(0),m4(t),m5(0),m6(0),m7(0),m8(0){}; + /* Return: detectorSettings, Param: int */ + Task(func1_t * t): m1(0),m2(0),m3(0),m4(0),m5(t),m6(0),m7(0),m8(0){}; + /* Return: detectorSettings, Param: detectorSettings,int */ + Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(t),m7(0),m8(0){}; + /* Return: int, Param: int,int */ + Task(func2_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(t),m8(0){}; + /* Return: int, Param: int,int */ + Task(func3_t * t): m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(t){}; - Task(func2_t * t): - m_int1(0),m_string1(0),m_chararr1(0),m_f2_1(t),m_settings(0){}; - - //specialized - Task(func1_t * t): - m_int1(0),m_string1(0),m_chararr1(0),m_f2_1(0),m_settings(t){}; ~Task(){} void operator()(){ - if(m_int1) (*m_int1)(); - else if(m_string1) (*m_string1)(); - else if(m_chararr1) (*m_chararr1)(); - - else if(m_f2_1) (*m_f2_1)(); - - //specialized - else if(m_settings) (*m_settings)(); + if(m1) (*m1)(); + else if(m2) (*m2)(); + else if(m3) (*m3)(); + else if(m4) (*m4)(); + else if(m5) (*m5)(); + else if(m6) (*m6)(); + else if(m7) (*m7)(); } private: - func1_t * m_int1; - func1_t * m_string1; - func1_t * m_chararr1; - func2_t * m_f2_1; - - //specialized - func1_t * m_settings; - + /* Return: int, Param: int */ + func1_t * m1; + /* Return: int, Param: string,int */ + func2_t * m2; + /* Return: string, Param: string */ + func1_t * m3; + /* Return: char*, Param: char* */ + func1_t * m4; + /* Return: detectorSettings, Param: int */ + func1_t * m5; + /* Return: detectorSettings, Param: detectorSettings,int */ + func2_t * m6; + /* Return: int, Param: int,int */ + func2_t * m7; + /* Return: int, Param: int,int */ + func3_t * m8; };