From 389f356a3abb5381548b251b98277746e6743dd1 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 10 Aug 2017 11:09:44 +0200 Subject: [PATCH 1/4] high voltage reflects the master only, if 2 masters reflects -1 --- ....0.16.4 => eigerDetectorServerv3.0.0.16.5} | Bin 288566 -> 288605 bytes .../eigerDetectorServer/gitInfo.txt | 8 ++--- .../eigerDetectorServer/gitInfoEiger.h | 8 ++--- .../slsDetectorFunctionList.c | 28 +++++++++++++----- .../slsDetectorServer_defs.h | 2 ++ slsDetectorSoftware/gitInfo.txt | 8 ++--- .../multiSlsDetector/multiSlsDetector.cpp | 16 +++++++--- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++--- .../slsDetectorServer_funcs.c | 2 +- 9 files changed, 51 insertions(+), 29 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv3.0.0.16.4 => eigerDetectorServerv3.0.0.16.5} (61%) diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.4 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.5 similarity index 61% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.4 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.5 index 420f70f0635972c70c9becbec95c0fe878117642..19f1ac075adc72fd9f06ee9893f600ccd3d98e7a 100755 GIT binary patch delta 47642 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 z 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 JwwuQs{}0T`eyjih diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index 0986ac158..5314965df 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: d3b24894af8a588e6945240c3b80c2b7024608c4 -Revision: 295 +Repsitory UUID: 2dfbd9016b501eca6ee2c00a08e49a3f7e7990d8 +Revision: 296 Branch: 3.0-rc Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1448 -Last Changed Date: 2017-07-25 13:53:46.000000002 +0200 ./Beb.c +Last Changed Rev: 1457 +Last Changed Date: 2017-08-08 15:23:10.000000002 +0200 ./Makefile diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index a5accdc4f..c01ec39e8 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "d3b24894af8a588e6945240c3b80c2b7024608c4" -//#define SVNREV 0x1448 +#define SVNREPUUID "2dfbd9016b501eca6ee2c00a08e49a3f7e7990d8" +//#define SVNREV 0x1457 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x1448 -#define SVNDATE 0x20170725 +#define SVNREV 0x1457 +#define SVNDATE 0x20170808 // diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 9d5b17a27..2bfa2ae5e 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -30,6 +30,7 @@ dacs_t *detectorDacs=NULL; dacs_t *detectorAdcs=NULL; int eiger_highvoltage = 0; +int eiger_theo_highvoltage = 0; int eiger_iodelay = 0; int eiger_photonenergy = 0; int eiger_dynamicrange = 0; @@ -745,22 +746,33 @@ int getADC(enum ADCINDEX ind, int imod){ int setHighVoltage(int val){ - if(val!=-1){ - eiger_highvoltage = val; - if(master){ + if (master) { + + // set + if(val!=-1){ + eiger_theo_highvoltage = val; int ret = Feb_Control_SetHighVoltage(val); if(!ret) //could not set return -2; else if (ret == -1) //outside range return -1; } + + // get + if (!Feb_Control_GetHighVoltage(&eiger_highvoltage)) { + cprintf(RED,"Warning: Could not read high voltage\n"); + return -3; + } + + // tolerance of 5 + if (abs(eiger_theo_highvoltage-eiger_highvoltage) > HIGH_VOLTAGE_TOLERANCE) { + cprintf(BLUE, "High voltage still ramping: %d\n", eiger_highvoltage); + return eiger_highvoltage; + } + return eiger_theo_highvoltage; } - if(master && !Feb_Control_GetHighVoltage(&eiger_highvoltage)){ - cprintf(RED,"Warning: Could not read high voltage\n"); - return -3; - } - return eiger_highvoltage; + return SLAVE_HIGH_VOLTAGE_READ_VAL; } diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index 1847b84d0..836c3aa9a 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -84,6 +84,8 @@ enum NETWORKINDEX {TXN_LEFT, TXN_RIGHT, TXN_FRAME,FLOWCTRL_10G}; #define MAX_SUBFRAME_EXPOSURE_VAL_IN_10NS (0x1FFFFFFF) /** 29 bit register for max subframe exposure value */ +#define SLAVE_HIGH_VOLTAGE_READ_VAL (-999) +#define HIGH_VOLTAGE_TOLERANCE (5) #endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index d89dcf565..f80b69fa5 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: ef36cb7a54e1ae34ad1e85a46da6c121902108e6 -Revision: 1451 +Repsitory UUID: 2dfbd9016b501eca6ee2c00a08e49a3f7e7990d8 +Revision: 1452 Branch: 3.0-rc Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1456 -Last Changed Date: 2017-08-08 18:21:02.000000002 +0200 ./multiSlsDetector/multiSlsDetector.cpp +Last Changed Rev: 1457 +Last Changed Date: 2017-08-09 11:36:51.000000002 +0200 ./multiSlsDetector/multiSlsDetector.cpp diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index b0d06c481..f4a4cc5ec 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3009,16 +3009,24 @@ dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) { for(int idet=posmin; idetgetErrorMask()) setErrorMask(getErrorMask()|(1< Date: Thu, 10 Aug 2017 14:49:02 +0200 Subject: [PATCH 2/4] posisibility to read adnd write registers in the front end board for eiger --- .../eigerDetectorServer/FebControl.c | 31 ++++++++++++++++++ .../eigerDetectorServer/FebControl.h | 2 ++ ....0.16.5 => eigerDetectorServerv3.0.0.16.6} | Bin 288605 -> 288747 bytes .../slsDetectorFunctionList.c | 7 ++++ .../slsDetector/slsDetectorCommand.cpp | 22 ++++++------- .../slsDetectorFunctionList.h | 3 ++ .../slsDetectorServer_funcs.c | 20 ----------- 7 files changed, 54 insertions(+), 31 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv3.0.0.16.5 => eigerDetectorServerv3.0.0.16.6} (62%) diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index ce68ef7ce..76028a105 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -1921,4 +1921,35 @@ int Feb_Control_GetRightFPGATemp(){ } +uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { + uint32_t value=0; + if(Module_TopAddressIsValid(&modules[1])){ + if(!Feb_Interface_WriteRegister(Module_GetTopRightAddress (&modules[1]),offset, data,0, 0)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } else { + if(!Feb_Interface_WriteRegister(Module_GetBottomRightAddress (&modules[1]),offset, data,0, 0)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } + return Feb_Control_ReadRegister(offset); +} + +uint32_t Feb_Control_ReadRegister(uint32_t offset) { + uint32_t value=0; + if(Module_TopAddressIsValid(&modules[1])){ + if(!Feb_Interface_ReadRegister(Module_GetTopRightAddress (&modules[1]),offset, &value)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } else { + if(!Feb_Interface_ReadRegister(Module_GetBottomRightAddress (&modules[1]),offset, &value)) { + cprintf(RED,"Could not read value. Value read:%d\n", value); + value = 0; + } + } + return value; +} diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.h b/slsDetectorSoftware/eigerDetectorServer/FebControl.h index fb75c8a67..892d6b22c 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.h @@ -198,4 +198,6 @@ int Feb_Control_GetModuleNumber(); int Feb_Control_GetLeftFPGATemp(); int Feb_Control_GetRightFPGATemp(); + uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data); + uint32_t Feb_Control_ReadRegister(uint32_t offset); #endif diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.5 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.6 similarity index 62% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.5 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.6 index 19f1ac075adc72fd9f06ee9893f600ccd3d98e7a..1d201568e1eb80d8f4e173f60f337dd8bab1be85 100755 GIT binary patch delta 40277 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 O2PbPLdbS4l*8Cq{X-5wL diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 2bfa2ae5e..9ab1467ab 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -342,7 +342,14 @@ void setupDetector() { +/* advanced read/write reg */ +uint32_t writeRegister(uint32_t offset, uint32_t data) { + return Feb_Control_WriteRegister(offset, data); +} +uint32_t readRegister(uint32_t offset) { + return Feb_Control_ReadRegister(offset); +} /* set parameters - nmod, dr, roi */ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 12bb191fe..d33e5e4dd 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3359,9 +3359,9 @@ string slsDetectorCommand::cmdDetectorSize(int narg, char *args[], int action) { return string("unknown detector size ")+cmd; if (cmd=="roimask") - sprintf(ans,"%x",ret); + sprintf(ans,"0x%x",ret); else - sprintf(ans,"%d",ret); + sprintf(ans,"0x%d",ret); return string(ans); @@ -3689,7 +3689,7 @@ string slsDetectorCommand::cmdDigiTest(int narg, char *args[], int action) { if (cmd=="bustest"){ if (action==PUT_ACTION) return string("cannot set ")+cmd; - sprintf(answer,"%x",myDet->digitalTest(DETECTOR_BUS_TEST)); + sprintf(answer,"0x%x",myDet->digitalTest(DETECTOR_BUS_TEST)); return string(answer); } @@ -3698,7 +3698,7 @@ string slsDetectorCommand::cmdDigiTest(int narg, char *args[], int action) { return string("cannot set ")+cmd; int ival=-1; if (sscanf(args[0],"digitest:%d",&ival)) { - sprintf(answer,"%x",myDet->digitalTest(CHIP_TEST, ival)); + sprintf(answer,"0x%x",myDet->digitalTest(CHIP_TEST, ival)); return string(answer); } else return string("undefined module number"); @@ -3710,7 +3710,7 @@ string slsDetectorCommand::cmdDigiTest(int narg, char *args[], int action) { int ival=-1; if (sscanf(args[1],"%d",&ival)) { if((ival==0)||(ival==1)){ - sprintf(answer,"%x",myDet->digitalTest(DIGITAL_BIT_TEST,ival)); + sprintf(answer,"0x%x",myDet->digitalTest(DIGITAL_BIT_TEST,ival)); return string(answer); } else @@ -3783,13 +3783,13 @@ string slsDetectorCommand::cmdRegister(int narg, char *args[], int action) { ; else return string("Could not scan value (hexadecimal fomat) ")+string(args[2]); - sprintf(answer,"%x",myDet->writeRegister(addr,val)); + sprintf(answer,"0x%x",myDet->writeRegister(addr,val)); } else if (cmd=="adcreg") { if (sscanf(args[2],"%x",&val)) ; else return string("Could not scan value (hexadecimal fomat) ")+string(args[2]); - sprintf(answer,"%x",myDet->writeAdcRegister(addr,val)); + sprintf(answer,"0x%x",myDet->writeAdcRegister(addr,val)); } else { if (sscanf(args[2],"%d",&n)) @@ -3801,9 +3801,9 @@ string slsDetectorCommand::cmdRegister(int narg, char *args[], int action) { return string("Bit number out of range")+string(args[2]); if (cmd=="setbit") - sprintf(answer,"%x",myDet->writeRegister(addr,myDet->readRegister(addr)| 1<writeRegister(addr,myDet->readRegister(addr)| 1<writeRegister(addr,myDet->readRegister(addr) & ~(1<writeRegister(addr,myDet->readRegister(addr) & ~(1<readRegister(addr)); + sprintf(answer,"0x%x",myDet->readRegister(addr)); } @@ -3861,7 +3861,7 @@ string slsDetectorCommand::helpRegister(int narg, char *args[], int action) { ostringstream os; if (action==PUT_ACTION || action==HELP_ACTION) { - os << "reg addr val \n writes the register addr with the value val"<< std::endl; + os << "reg addr val \n writes the register addr with the value val (hexadecimal format)"<< std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { os << "reg addr \n reads the register addr"<< std::endl; diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 14a08a07d..145af32fa 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -59,6 +59,9 @@ void setupDetector(); #ifndef EIGERD extern u_int32_t writeRegister(u_int32_t offset, u_int32_t data); // blackfin.h extern u_int32_t readRegister(u_int32_t offset); // blackfin.h +#else +uint32_t writeRegister(uint32_t offset, uint32_t data); +uint32_t readRegister(uint32_t offset); #endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 8caad22fe..7e7ef4e65 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -1242,15 +1242,6 @@ int write_register(int file_des) { int retval=-1; sprintf(mess,"write to register failed\n"); -#ifdef EIGERD - //to receive any arguments - while (n > 0) - n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); - ret = FAIL; - sprintf(mess,"Function (Write Register) is not implemented for this detector\n"); - cprintf(RED, "Warning: %s", mess); -#else - // receive arguments int arg[2]={-1,-1}; n = receiveData(file_des,arg,sizeof(arg),INT32); @@ -1282,7 +1273,6 @@ int write_register(int file_des) { #endif if (ret==OK && differentClients) ret=FORCE_UPDATE; -#endif // ret could be swapped during sendData ret1 = ret; @@ -1310,15 +1300,6 @@ int read_register(int file_des) { int retval=-1; sprintf(mess,"read register failed\n"); -#ifdef EIGERD - //to receive any arguments - while (n > 0) - n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); - ret = FAIL; - sprintf(mess,"Function (Read Register) is not implemented for this detector\n"); - cprintf(RED, "Warning: %s", mess); -#else - // receive arguments int arg=0; n = receiveData(file_des,&arg,sizeof(arg),INT32); @@ -1337,7 +1318,6 @@ int read_register(int file_des) { #endif if (ret==OK && differentClients) ret=FORCE_UPDATE; -#endif // ret could be swapped during sendData ret1 = ret; From f084efd2639c7b28a80a91ecc762a5264e7fceae Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 10 Aug 2017 17:25:18 +0200 Subject: [PATCH 3/4] sending and writing subexptime in the receiver files, adding 0x in front of all numbers printed in command line which is hexa --- slsDetectorSoftware/commonFiles/error_defs.h | 4 ++ .../slsDetector/slsDetector.cpp | 48 ++++++++++--------- .../slsDetector/slsDetectorBase.h | 24 ++++++++++ .../slsDetector/slsDetectorCommand.cpp | 14 +++--- 4 files changed, 61 insertions(+), 29 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index c353670c6..9044911ac 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -79,6 +79,7 @@ using namespace std; #define RECEIVER_FLIPPED_DATA_NOT_SET 0x0000000020000000ULL #define THRESHOLD_NOT_SET 0x0000000040000000ULL #define RECEIVER_FILE_FORMAT 0x0000000080000000ULL +#define RECEIVER_SUBF_TIME_NOT_SET 0x0000000100000000ULL // 0x0000000FFFFFFFFFULL /** @short class returning all error messages for error mask */ @@ -251,6 +252,9 @@ public: if(slsErrorMask&RECEIVER_FILE_FORMAT) retval.append("Could not set receiver file format\n"); + if(slsErrorMask&RECEIVER_SUBF_TIME_NOT_SET) + retval.append("Could not set sub exposure time in receiver.\n"); + //------------------------------------------------------ length of message diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 7535d1562..e15b3a878 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -4450,7 +4450,8 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ //send acquisiton period/frame number to receiver - if((index==FRAME_NUMBER)||(index==FRAME_PERIOD)||(index==CYCLES_NUMBER)||(index==ACQUISITION_TIME)){ + if((index==FRAME_NUMBER)||(index==FRAME_PERIOD)||(index==CYCLES_NUMBER)||(index==ACQUISITION_TIME) || (index==SUBFRAME_ACQUISITION_TIME)){ + string timername = getTimerType(index); if(ret != FAIL){ int64_t args[2]; retval = -1; @@ -4459,25 +4460,21 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ - //set #frames, #cycles + //set #frames * #cycles if((index==FRAME_NUMBER)||(index==CYCLES_NUMBER)){ + timername.assign("(Number of Frames) * (Number of cycles)"); #ifdef VERBOSE - std::cout << "Setting/Getting number of frames*cycles " << index <<" to/from receiver " << args[1] << std::endl; + std::cout << "Setting/Getting " << timername << " " << index <<" to/from receiver " << args[1] << std::endl; #endif if(thisDetector->timerValue[CYCLES_NUMBER]==0) args[1] = thisDetector->timerValue[FRAME_NUMBER]; else args[1] = thisDetector->timerValue[FRAME_NUMBER]*thisDetector->timerValue[CYCLES_NUMBER]; } - //set period/exptime - else{ #ifdef VERBOSE - if(index==ACQUISITION_TIME) - std::cout << "Setting/Getting acquisition time " << index << " to/from receiver " << args[1] << std::endl; - else - std::cout << "Setting/Getting acquisition period " << index << " to/from receiver " << args[1] << std::endl; + // set period/exptime/subexptime + else std::cout << "Setting/Getting " << timername << " " << index << " to/from receiver " << args[1] << std::endl; #endif - } char mess[MAX_STR_LENGTH]=""; if (connectData() == OK){ @@ -4486,18 +4483,23 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ } if((args[1] != retval)|| (ret==FAIL)){ ret = FAIL; - if(index==ACQUISITION_TIME){ - if(strstr(mess,"receiver not idle")==NULL) - cout << "ERROR:Acquisition Time in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; - setErrorMask((getErrorMask())|(RECEIVER_ACQ_TIME_NOT_SET)); - }else if(index==FRAME_PERIOD){ - if(strstr(mess,"receiver not idle")==NULL) - cout << "ERROR:Acquisition Period in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; - setErrorMask((getErrorMask())|(RECEIVER_ACQ_PERIOD_NOT_SET)); - }else{ - if(strstr(mess,"receiver not idle")==NULL) - cout << "ERROR:Number of Frames (* Number of cycles) in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; - setErrorMask((getErrorMask())|(RECEIVER_FRAME_NUM_NOT_SET)); + cout << "ERROR: " << timername << " in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; + + if(strstr(mess,"receiver not idle")==NULL) { + switch(index) { + case ACQUISITION_TIME: + setErrorMask((getErrorMask())|(RECEIVER_ACQ_TIME_NOT_SET)); + break; + case FRAME_PERIOD: + setErrorMask((getErrorMask())|(RECEIVER_ACQ_PERIOD_NOT_SET)); + break; + case SUBFRAME_ACQUISITION_TIME: + setErrorMask((getErrorMask())|(RECEIVER_SUBF_TIME_NOT_SET)); + break; + default: + setErrorMask((getErrorMask())|(RECEIVER_FRAME_NUM_NOT_SET)); + break; + } } } if(ret==FORCE_UPDATE) @@ -5990,6 +5992,7 @@ string slsDetector::setReceiver(string receiverIP){ std::cout << "frame index needed:" << ((thisDetector->timerValue[FRAME_NUMBER]*thisDetector->timerValue[CYCLES_NUMBER])>1) << endl; std::cout << "frame period:" << thisDetector->timerValue[FRAME_PERIOD] << endl; std::cout << "frame number:" << thisDetector->timerValue[FRAME_NUMBER] << endl; + std::cout << "sub exp time:" << thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME] << endl; std::cout << "dynamic range:" << thisDetector->dynamicRange << endl << endl; std::cout << "flippeddatax:" << thisDetector->flippedData[d] << endl; std::cout << "10GbE:" << thisDetector->tenGigaEnable << endl << endl; @@ -6026,6 +6029,7 @@ string slsDetector::setReceiver(string receiverIP){ setTimer(FRAME_PERIOD,thisDetector->timerValue[FRAME_PERIOD]); setTimer(FRAME_NUMBER,thisDetector->timerValue[FRAME_NUMBER]); setTimer(ACQUISITION_TIME,thisDetector->timerValue[ACQUISITION_TIME]); + setTimer(SUBFRAME_ACQUISITION_TIME,thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]); setDynamicRange(thisDetector->dynamicRange); if(thisDetector->myDetectorType == EIGER){ setFlippedData(X,-1); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index e19cb992d..e9d5e71f6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -751,6 +751,30 @@ virtual void readFrameFromReceiver()=0; default: return string("unknown"); \ }}; + /** returns string from timer index + \param s can be FRAME_NUMBER,ACQUISITION_TIME,FRAME_PERIOD, DELAY_AFTER_TRIGGER,GATES_NUMBER,PROBES_NUMBER, CYCLES_NUMBER, ACTUAL_TIME,MEASUREMENT_TIME, PROGRESS,MEASUREMENTS_NUMBER,FRAMES_FROM_START,FRAMES_FROM_START_PG,SAMPLES_JCTB,SUBFRAME_ACQUISITION_TIME + \returns string frame_number,acquisition_time,frame_period, delay_after_trigger,gates_number,probes_number, cycles_number, actual_time,measurement_time, progress,measurements_number,frames_from_start,frames_from_start_pg,samples_jctb,subframe_acquisition_time + */ + static string getTimerType(timerIndex t){ \ + switch (t) { \ + case FRAME_NUMBER: return string("frame_number"); \ + case ACQUISITION_TIME: return string("acquisition_time"); \ + case FRAME_PERIOD: return string("frame_period"); \ + case DELAY_AFTER_TRIGGER: return string("delay_after_trigger"); \ + case GATES_NUMBER: return string("gates_number"); \ + case PROBES_NUMBER: return string("probes_number"); \ + case CYCLES_NUMBER: return string("cycles_number"); \ + case ACTUAL_TIME: return string("actual_time"); \ + case MEASUREMENT_TIME: return string("measurement_time"); \ + case PROGRESS: return string("progress"); \ + case MEASUREMENTS_NUMBER: return string("measurements_number"); \ + case FRAMES_FROM_START: return string("frames_from_start"); \ + case FRAMES_FROM_START_PG: return string("frames_from_start_pg"); \ + case SAMPLES_JCTB: return string("samples_jctb"); \ + case SUBFRAME_ACQUISITION_TIME: return string("subframe_acquisition_time"); \ + default: return string("unknown"); \ + }}; + }; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index d33e5e4dd..da618ff80 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3586,7 +3586,7 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (retval < 0) sprintf(answer, "%d", -1); else - sprintf(answer,"%lx", retval); + sprintf(answer,"0x%lx", retval); return string(answer); } @@ -3600,7 +3600,7 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (retval < 0) sprintf(answer, "%d", -1); else - sprintf(answer,"%lx", retval); + sprintf(answer,"0x%lx", retval); return string(answer); } else return string("undefined module number"); @@ -3610,7 +3610,7 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (retval < 0) sprintf(answer, "%d", -1); else - sprintf(answer,"%lx", retval); + sprintf(answer,"0x%lx", retval); return string(answer); } if (cmd.find("modulenumber")!=string::npos) { @@ -3620,7 +3620,7 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (retval < 0) sprintf(answer, "%d", -1); else - sprintf(answer,"%lx", retval); + sprintf(answer,"0x%lx", retval); return string(answer); } else return string("undefined module number"); @@ -3631,7 +3631,7 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (retval < 0) sprintf(answer, "%d", -1); else - sprintf(answer,"%lx", retval); + sprintf(answer,"0x%lx", retval); return string(answer); } @@ -3640,7 +3640,7 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (retval < 0) sprintf(answer, "%d", -1); else - sprintf(answer,"%lx", retval); + sprintf(answer,"0x%lx", retval); return string(answer); } @@ -3650,7 +3650,7 @@ string slsDetectorCommand::cmdSN(int narg, char *args[], int action) { if (retval < 0) sprintf(answer, "%d", -1); else - sprintf(answer,"%lx", retval); + sprintf(answer,"0x%lx", retval); return string(answer); } return string("unknown id mode ")+cmd; From e8d83a085fa4657aa360c8248aaef6dedae76db8 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 10 Aug 2017 18:46:10 +0200 Subject: [PATCH 4/4] moved receiver start to status start and to startandreadall (acquire), parallelized status start, moved prepare and clean up to multi level and called by start and stop receiver for gotthard, moench and propix --- slsDetectorSoftware/commonFiles/error_defs.h | 9 +- .../multiSlsDetector/multiSlsDetector.cpp | 254 ++++++++++++++---- .../multiSlsDetector/multiSlsDetector.h | 10 + .../slsDetector/slsDetector.cpp | 104 ++++--- slsDetectorSoftware/slsDetector/slsDetector.h | 15 +- 5 files changed, 295 insertions(+), 97 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 9044911ac..ac4787cff 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -43,7 +43,8 @@ using namespace std; #define COULDNOT_STOP_RECEIVER 0x0000800000000000ULL #define RECEIVER_DET_POSID_NOT_SET 0x0000400000000000ULL #define RECEIVER_MULTI_DET_SIZE_NOT_SET 0x0000200000000000ULL - +#define PREPARE_ACQUISITION 0x0000100000000000ULL +#define CLEANUP_ACQUISITION 0x0000080000000000ULL // 0xFFFFFFF000000000ULL // 0x0000000FFFFFFFFFULL @@ -146,6 +147,12 @@ public: if(slsErrorMask&RECEIVER_MULTI_DET_SIZE_NOT_SET) retval.append("Could not set multi detector size\n"); + if(slsErrorMask&PREPARE_ACQUISITION) + retval.append("Could not prepare acquisition in detector\n"); + + if(slsErrorMask&CLEANUP_ACQUISITION) + retval.append("Could not clean up after acquisition in detector\n"); + diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f4a4cc5ec..d86ecc319 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1359,75 +1359,219 @@ int multiSlsDetector::getChanRegs(double* retval,bool fromDetector){ /* Communication to server */ +int multiSlsDetector::prepareAcquisition(){ + + int i=0; + int ret=OK; + int posmin=0, posmax=thisMultiDetector->numberOfDetectors; + + if(!threadpool){ + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + }else{ + int* iret[posmax-posmin]; + for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ + iret[idet]= new int(OK); + Task* task = new Task(new func0_t(&slsDetector::prepareAcquisition, + detectors[idet],iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ + if(iret[idet] != NULL){ + if(*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + }else ret = FAIL; + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<masterPosition; + if (thisMultiDetector->masterPosition>=0) { + if (detectors[i]) { + ret1=detectors[i]->prepareAcquisition(); + if(detectors[i]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; + + i=thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition>=0) { + if (detectors[i]) { + ret1=detectors[i]->cleanupAcquisition(); + if(detectors[i]->getErrorMask()) + setErrorMask(getErrorMask()|(1<masterPosition) && (detectors[idet])){ + iret[idet]= new int(OK); + Task* task = new Task(new func0_t(&slsDetector::cleanupAcquisition, + detectors[idet],iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ + if(iret[idet] != NULL){ + if(*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + }else ret = FAIL; + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; i++) { - if (i!=thisMultiDetector->masterPosition) - if (detectors[i]) { - ret=detectors[i]->startAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret=detectors[i]->startAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; + + if(!threadpool){ + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + }else{ + int* iret[posmax-posmin]; + for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ + iret[idet]= new int(OK); + Task* task = new Task(new func0_t(&slsDetector::startAcquisition, + detectors[idet],iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ + if(iret[idet] != NULL){ + if(*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + }else ret = FAIL; + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<masterPosition; + if (thisMultiDetector->masterPosition>=0) { + if (detectors[i]) { + ret1=detectors[i]->startAcquisition(); + if(detectors[i]->getErrorMask()) + setErrorMask(getErrorMask()|(1<numberOfDetectors; + i=thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition>=0) { + if (detectors[i]) { + ret1=detectors[i]->stopAcquisition(); + if(detectors[i]->getErrorMask()) + setErrorMask(getErrorMask()|(1<masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret=detectors[i]->stopAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; i++) { - if (detectors[i]) { - ret=detectors[i]->stopAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition) && (detectors[idet])){ + iret[idet]= new int(OK); + Task* task = new Task(new func0_t(&slsDetector::stopAcquisition, + detectors[idet],iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ + if(iret[idet] != NULL){ + if(*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + }else ret = FAIL; + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<onlineFlag==ONLINE_FLAG) { - - startAndReadAllNoWait(); + + if(getDetectorsType() == EIGER) { + if (prepareAcquisition() == FAIL) + return NULL; + } + startAndReadAllNoWait(); while ((retval=getDataFromDetector())){ i++; diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 2f9b0439e..3a095a20d 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -561,7 +561,17 @@ class multiSlsDetector : public slsDetectorUtils { // Acquisition functions + /** + prepares detector for acquisition + \returns OK if all detectors are properly started, FAIL otherwise + */ + int prepareAcquisition(); + /** + prepares detector for acquisition + \returns OK if all detectors are properly started, FAIL otherwise + */ + int cleanupAcquisition(); /** start detector acquisition (master is started as last) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index e15b3a878..927339e57 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -3976,6 +3976,62 @@ int slsDetector::updateDetector() { // Acquisition functions /* change these funcs accepting also ok/fail */ + +int slsDetector::prepareAcquisition() { + int fnum = F_PREPARE_ACQUISITION; + int ret=FAIL; + char mess[MAX_STR_LENGTH]=""; + + if (thisDetector->onlineFlag==ONLINE_FLAG) { +#ifdef VERBOSE + std::cout << "Preparing Detector for Acquisition" << std::endl; +#endif + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL){ + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(PREPARE_ACQUISITION)); + } + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + }else + std::cout << "cannot connect to detector" << endl; + + return ret; +} + +int slsDetector::cleanupAcquisition() { + int fnum = F_CLEANUP_ACQUISITION; + int ret=FAIL; + char mess[MAX_STR_LENGTH]=""; + + if (thisDetector->onlineFlag==ONLINE_FLAG) { +#ifdef VERBOSE + std::cout << "Cleaning up Detector after Acquisition " << std::endl; +#endif + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL){ + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(CLEANUP_ACQUISITION)); + } + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + }else + std::cout << "cannot connect to detector" << endl; + + return ret; + +} + int slsDetector::startAcquisition(){ @@ -4258,6 +4314,10 @@ int* slsDetector::startAndReadAll(){ int i=0; #endif //#endif + if(thisDetector->myDetectorType == EIGER) { + if (prepareAcquisition() == FAIL) + return NULL; + } startAndReadAllNoWait(); //#ifdef VERBOSE // std::cout<< "started" << std::endl; @@ -4485,7 +4545,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ ret = FAIL; cout << "ERROR: " << timername << " in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; - if(strstr(mess,"receiver not idle")==NULL) { + if(strstr(mess,"receiver is not idle")==NULL) { switch(index) { case ACQUISITION_TIME: setErrorMask((getErrorMask())|(RECEIVER_ACQ_TIME_NOT_SET)); @@ -7859,12 +7919,9 @@ int slsDetector::startReceiver(){ } } - //let detector prepare anyway even if receiver didnt work (for those not using the receiver) - if((thisDetector->myDetectorType != JUNGFRAU)) { - int ret1 = detectorSendToReceiver(true); - if (ret != FAIL) - ret = ret1; - } + // tell detector to send to receiver (if start receiver failed, this is not executed) + if((thisDetector->myDetectorType != JUNGFRAU && thisDetector->myDetectorType != EIGER && ret!= FAIL)) + return prepareAcquisition(); // send data to receiver for these detectors return ret; } @@ -7878,7 +7935,7 @@ int slsDetector::stopReceiver(){ char mess[MAX_STR_LENGTH] = ""; if(thisDetector->myDetectorType != EIGER && thisDetector->myDetectorType != JUNGFRAU) - detectorSendToReceiver(false); + cleanupAcquisition(); // reset (send data to receiver) for these detectors, so back to CPU (dont care about ok/fail at this point) if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { #ifdef VERBOSE @@ -7924,37 +7981,6 @@ slsDetectorDefs::runStatus slsDetector::startReceiverReadout(){ } -int slsDetector::detectorSendToReceiver(bool set){ - int fnum; - if(set) fnum=F_PREPARE_ACQUISITION; - else fnum=F_CLEANUP_ACQUISITION; - int ret = FAIL; - char mess[MAX_STR_LENGTH]=""; - - if (thisDetector->onlineFlag==ONLINE_FLAG) { -#ifdef VERBOSE - std::cout << "Setting detector to send packets via client to: " << set << std::endl; -#endif - if (connectControl() == OK){ - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; - } - disconnectControl(); - if (ret==FORCE_UPDATE) - updateDetector(); - } - }else - std::cout << "cannot connect to detector" << endl; - - return ret; -} - - - - diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index bcb8f6d0a..d6005448b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1063,6 +1063,17 @@ class slsDetector : public slsDetectorUtils, public energyConversion { // Acquisition functions + /** + prepares detector for acquisition + \returns OK/FAIL + */ + int prepareAcquisition(); + + /** + prepares detector for acquisition + \returns OK/FAIL + */ + int cleanupAcquisition(); /** start detector acquisition @@ -1614,10 +1625,6 @@ class slsDetector : public slsDetectorUtils, public energyConversion { */ runStatus startReceiverReadout(); - /** Sets(false) or Resets(true) the CPU bit in detector - \returns OK or FAIL - */ - int detectorSendToReceiver(bool set); /** gets the status of the listening mode of receiver \returns status