diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index c69a53240..e249ffb6e 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -50,9 +50,9 @@ using namespace std; #define PREPARE_ACQUISITION 0x0000100000000000ULL #define CLEANUP_ACQUISITION 0x0000080000000000ULL #define REGISER_WRITE_READ 0x0000040000000000ULL -// 0xFFFFFFF000000000ULL +// 0xFFFFFF0000000000ULL -// 0x0000000FFFFFFFFFULL +// 0x000000FFFFFFFFFFULL #define COULDNOT_SET_NETWORK_PARAMETER 0x0000000000000001ULL #define COULDNOT_SET_ROI 0x0000000000000002ULL #define RECEIVER_READ_FREQUENCY 0x0000000000000004ULL @@ -89,7 +89,8 @@ using namespace std; #define RECEIVER_SILENT_MODE_NOT_SET 0x0000000200000000ULL #define RESTREAM_STOP_FROM_RECEIVER 0x0000000400000000ULL #define TEMPERATURE_CONTROL 0x0000000800000000ULL -// 0x0000000FFFFFFFFFULL +#define AUTO_COMP_DISABLE 0x0000001000000000ULL +// 0x000000FFFFFFFFFFULL /** @short class returning all error messages for error mask */ class errorDefs { @@ -280,7 +281,8 @@ public: if(slsErrorMask&TEMPERATURE_CONTROL) retval.append("Could not set/get threshold temperature, temp control or temp event.\n"); - + if(slsErrorMask&AUTO_COMP_DISABLE) + retval.append("Could not set/get auto comparator disable\n"); //------------------------------------------------------ length of message diff --git a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h index ac0788ff0..c4d2f5c5a 100644 --- a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h @@ -116,6 +116,8 @@ enum detFuncs{ F_THRESHOLD_TEMP, /** < set threshold temperature */ F_TEMP_CONTROL, /** < set temperature control */ F_TEMP_EVENT, /** < set temperature event */ + + F_AUTO_COMP_DISABLE, /** < auto comp disable mode */ /* Always append functions hereafter!!! */ /* Always append functions before!!! */ diff --git a/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h b/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h index af194bec0..ebd2d94b5 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h +++ b/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h @@ -291,7 +291,7 @@ #define VREF_COMP_MOD_REG (0x5C << 11) #define VREF_COMP_MOD_OFST (0) -#define VREF_COMP_MOD_MSK (0x00000FFF << VREF_COMP_OFST) +#define VREF_COMP_MOD_MSK (0x00000FFF << VREF_COMP_MOD_OFST) #define VREF_COMP_MOD_ENABLE_OFST (31) #define VREF_COMP_MOD_ENABLE_MSK (0x00000FFF << VREF_COMP_MOD_ENABLE_OFST) diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.1.0 b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.1.0 deleted file mode 100755 index 8d8c9992e..000000000 Binary files a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.1.0 and /dev/null differ diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.1.1 b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.1.1 new file mode 100755 index 000000000..2040d86b7 Binary files /dev/null and b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.1.1 differ diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c index 164ae5f71..9d3d44d00 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -395,6 +395,24 @@ int powerChip (int on){ //return ((bus_r(CHIP_POWER_REG) & CHIP_POWER_STATUS_MSK) >> CHIP_POWER_STATUS_OFST); } + + +int autoCompDisable(int on) { + if(on != -1){ + if(on){ + cprintf(BLUE, "\n*** Auto comp disable mode: enabling ***\n"); + bus_w(VREF_COMP_MOD_REG, bus_r(VREF_COMP_MOD_REG) | VREF_COMP_MOD_ENABLE_MSK); + } + else{ + cprintf(BLUE, "\n*** Auto comp disable mode: disabling *** \n"); + bus_w(VREF_COMP_MOD_REG, bus_r(VREF_COMP_MOD_REG) & ~VREF_COMP_MOD_ENABLE_MSK); + } + } + + return (bus_r(VREF_COMP_MOD_REG) & VREF_COMP_MOD_ENABLE_MSK); +} + + void cleanFifos() { printf("\nClearing Acquisition Fifos\n"); bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_ACQ_FIFO_CLR_MSK); @@ -879,6 +897,11 @@ void setDAC(enum DACINDEX ind, int val, int imod, int mV, int retval[]){ DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); dacValues[ind] = dacval; + + if (ind == VREF_COMP) { + bus_w (VREF_COMP_MOD_REG, (bus_r(VREF_COMP_MOD_REG) &~ (VREF_COMP_MOD_MSK)) // reset + | ((val << VREF_COMP_MOD_OFST) & VREF_COMP_MOD_MSK)); // or it with value + } } printf("Getting DAC %d : ",ind); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index fa36a98db..c0ab275a4 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4595,6 +4595,22 @@ int multiSlsDetector::powerChip(int ival){ } +int multiSlsDetector::setAutoComparatorDisableMode(int ival) { + int ret=OK, ret1=OK; + + for (int i=0; inumberOfDetectors; ++i) { + if (detectors[i]) { + ret=detectors[i]->setAutoComparatorDisableMode(ival); + if(detectors[i]->getErrorMask()) + setErrorMask(getErrorMask()|(1<myDetectorType != JUNGFRAU){ + std::cout << "Not implemented for this detector" << std::endl; + return FAIL; + } +#ifdef VERBOSE + std::cout<< "Enabling/disabling Auto comp disable mode " << endl; +#endif + if (thisDetector->onlineFlag==ONLINE_FLAG) { + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&ival,sizeof(ival)); + //check opening error + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL) { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(AUTO_COMP_DISABLE)); + }else + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } + return retval; + +} + + int slsDetector::loadSettingsFile(string fname, int imod) { sls_detector_module *myMod=NULL; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 0561b5664..3a7674522 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -551,6 +551,12 @@ class slsDetector : public slsDetectorUtils, public energyConversion { */ int powerChip(int ival= -1); + /** automatic comparator disable for Jungfrau only + \param ival on is 1, off is 0, -1 to get + \returns OK or FAIL + */ + int setAutoComparatorDisableMode(int ival= -1); + /** loads the modules settings/trimbits reading from a file \param fname file name . If not specified, extension is automatically generated! diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 6d69b8f23..32fee72ff 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -234,7 +234,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { - /*! \page config Configuration commands Commands to configure the detector. these commands are often left to the configuration file. - \ref configstructure "Data Structure": commands to configure detector data structure @@ -461,6 +460,13 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; ++i; + /*! \page config + - auto_comp_disable i this mode disables the on-chip gain switching comparator automatically after 93.75% of exposure time (only for longer than 100us). 1 enables mode, 0 disables mode. By default, mode is disabled (comparator is enabled throughout). (JUNGFRAU only). \c Returns \c (int) + */ + descrToFuncMap[i].m_pFuncName="auto_comp_disable"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + ++i; + /*! \page config - pulse [n] [x] [y] pulses pixel at coordinates (x,y) n number of times. Used in EIGER only. Only put! \c Returns \c ("successful", "unsuccessful") */ @@ -5854,7 +5860,9 @@ string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action) { } sprintf(ans,"%d",myDet->powerChip()); return string(ans); - } else if (cmd=="led") { + } + + else if (cmd=="led") { char ans[100]; int val=0; myDet->setOnline(ONLINE_FLAG); @@ -5868,6 +5876,19 @@ string slsDetectorCommand::cmdAdvanced(int narg, char *args[], int action) { sprintf(ans,"%d",~(myDet->readRegister(0x4d))&1); return string(ans); } + + else if (cmd=="auto_comp_disable") { + char ans[100]; + myDet->setOnline(ONLINE_FLAG); + if (action==PUT_ACTION){ + int ival = -1; + if (!sscanf(args[1],"%d",&ival)) + return string("could not scan auto_comp_control parameter " + string(args[1])); + myDet->setAutoComparatorDisableMode(ival); + } + sprintf(ans,"%d",myDet->setAutoComparatorDisableMode()); + return string(ans); + } else return string("unknown command ")+cmd; @@ -5887,6 +5908,7 @@ string slsDetectorCommand::helpAdvanced(int narg, char *args[], int action) { os << "led s \t sets led status (0 off, 1 on)" << std::endl; os << "powerchip i \t powers on or off the chip. i = 1 for on, i = 0 for off" << std::endl; + os << "auto_comp_disable i \t this mode disables the on-chip gain switching comparator automatically after 93.75% of exposure time (only for longer than 100us). 1 enables mode, 0 disables mode. By default, mode is disabled (comparator is enabled throughout). (JUNGFRAU only). " << std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { @@ -5896,6 +5918,7 @@ string slsDetectorCommand::helpAdvanced(int narg, char *args[], int action) { os << "led \t returns led status (0 off, 1 on)" << std::endl; os << "flags \t gets the readout flags. can be none, storeinram, tot, continous, parallel, nonparallel, safe, unknown" << std::endl; os << "powerchip \t gets if the chip has been powered on or off" << std::endl; + os << "auto_comp_disable \t gets if the automatic comparator diable mode is enabled/disabled" << std::endl; } return os.str(); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 9e20d7ac6..9d69afa55 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -582,6 +582,12 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { */ virtual int powerChip(int ival= -1)=0; + /** automatic comparator disable for Jungfrau only + \param ival on is 1, off is 0, -1 to get + \returns OK or FAIL + */ + virtual int setAutoComparatorDisableMode(int ival= -1)=0; + /** saves the modules settings/trimbits writing to a file \param fname file name . Axtension is automatically generated! \param imod module number, -1 means all modules diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 9f6e9e7f2..13be6e2c2 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -69,6 +69,7 @@ uint32_t readRegister(uint32_t offset); // firmware functions (resets) #ifdef JUNGFRAUD int powerChip (int on); +int autoCompDisable(int on); void cleanFifos(); void resetCore(); void resetPeripheral(); diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 617343135..c254f72e6 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -184,6 +184,7 @@ const char* getFunctionName(enum detFuncs func) { case F_THRESHOLD_TEMP: return "F_THRESHOLD_TEMP"; case F_TEMP_CONTROL: return "F_TEMP_CONTROL"; case F_TEMP_EVENT: return "F_TEMP_EVENT"; + case F_AUTO_COMP_DISABLE: return "F_AUTO_COMP_DISABLE"; default: return "Unknown Function"; } @@ -266,6 +267,7 @@ void function_table() { flist[F_THRESHOLD_TEMP] = &threshold_temp; flist[F_TEMP_CONTROL] = &temp_control; flist[F_TEMP_EVENT] = &temp_event; + flist[F_AUTO_COMP_DISABLE] = &auto_comp_disable; // check if (NUM_DET_FUNCTIONS >= TOO_MANY_FUNCTIONS_DEFINED) { @@ -4734,7 +4736,7 @@ int power_chip(int file_des) { } else { ret=FAIL; if(setTemperatureEvent(-1) == 1) - sprintf(mess,"Powering chip failed due to over-temperature event. Clear event & power chip again.\n", arg, retval); + sprintf(mess,"Powering chip failed due to over-temperature event. Clear event & power chip again. Wrote %d, read %d \n", arg, retval); else sprintf(mess,"Powering chip failed, wrote %d but read %d\n", arg, retval); cprintf(RED, "Warning: %s", mess); @@ -5086,3 +5088,70 @@ int temp_event(int file_des) { return ret; } + + + + +int auto_comp_disable(int file_des) { + int ret=OK,ret1=OK; + int n=0; + int retval=-1; + sprintf(mess,"auto comp disable failed\n"); + +#ifndef JUNGFRAUD + //to receive any arguments + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + ret = FAIL; + sprintf(mess,"Function (Auto Comp Disable) is not implemented for this detector\n"); + cprintf(RED, "%s", mess); +#else + + // receive arguments + int arg=-1; + n = receiveData(file_des,&arg,sizeof(arg),INT32); + if (n < 0) return printSocketReadError(); + + // execute action + if (differentClients && lockStatus && arg!=-1) { + ret = FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + cprintf(RED, "Warning: %s", mess); + } +#ifdef SLS_DETECTOR_FUNCTION_LIST + else { +#ifdef VERBOSE + printf("Auto Comp Disable to %d\n", arg); +#endif + retval=autoCompDisable(arg); + +#ifdef VERBOSE + printf("Auto comp disable set to: %d\n",retval); +#endif + if (retval==arg || arg<0) { + ret=OK; + } else { + ret=FAIL; + sprintf(mess,"Atuo Comp Disable failed, wrote %d but read %d\n", arg, retval); + cprintf(RED, "Warning: %s", mess); + } + } +#endif + if (ret==OK && differentClients) + ret=FORCE_UPDATE; +#endif + + // ret could be swapped during sendData + ret1 = ret; + // send ok / fail + n = sendData(file_des,&ret1,sizeof(ret),INT32); + // send return argument + if (ret==FAIL) { + n += sendData(file_des,mess,sizeof(mess),OTHER); + } else + n += sendData(file_des,&retval,sizeof(retval),INT32); + + // return ok / fail + return ret; +} + diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h index 4e4084020..e593b0bf4 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h @@ -91,5 +91,6 @@ int cleanup_acquisition(int); int threshold_temp(int); int temp_control(int); int temp_event(int); +int auto_comp_disable(int); #endif