diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 9f6d60a1d..ecaa2f42c 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -2201,8 +2201,8 @@ class Detector(CppDetectorApi): [Jungfrau] Detector gain mode. Enum: gainMode Note ----- - - [Jungfrau] NORMAL_GAIN_MODE, FORCE_SWITCH_G1, FORCE_SWITCH_G2 + [Jungfrau] NORMAL_GAIN_MODE, FORCE_SWITCH_G1, FORCE_SWITCH_G2, FIX_G1, FIX_G2, FIX_G0, FIX_HG0 \n + CAUTION: Do not use FIX_G0 and FIX_HG0 blindly, you can damage the detector!!! """ return element_if_equal(self.getGainMode()) diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 200b1a03f..2d3745681 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -1075,15 +1075,27 @@ enum detectorSettings setSettings(enum detectorSettings sett) { configureChip(); } - return thisSettings; + return getSettings(); } -enum detectorSettings getSettings() { return thisSettings; } +enum detectorSettings getSettings() { + if (bus_r(DAQ_REG) & DAQ_HIGH_GAIN_MSK) + return DYNAMICHG0; + return DYNAMICGAIN; +} enum gainMode getGainMode() { - uint32_t retval = bus_r(DAQ_REG) & DAQ_FRCE_SWTCH_GAIN_MSK; + uint32_t regval = bus_r(DAQ_REG); + uint32_t retval_force = regval & DAQ_FRCE_SWTCH_GAIN_MSK; + uint32_t retval_fix = regval & DAQ_FIX_GAIN_MSK; + uint32_t retval_cmp_rst = regval & DAQ_CMP_RST_MSK; - switch (retval) { + // only one set should be valid + if ((retval_force && retval_fix) || (retval_fix && retval_cmp_rst) || + (retval_force && retval_cmp_rst)) { + LOG(logERROR, ("undefined gain mode. DAQ reg: 0x%x\n", regval)); + } + switch (retval_force) { case DAQ_FRCE_GAIN_STG_0_VAL: return NORMAL_GAIN_MODE; case DAQ_FRCE_GAIN_STG_1_VAL: @@ -1091,10 +1103,25 @@ enum gainMode getGainMode() { case DAQ_FRCE_GAIN_STG_2_VAL: return FORCE_SWITCH_G2; default: - LOG(logERROR, ("This gain mode %d is not defined [DAQ reg: %d]\n", - (retval << DAQ_FRCE_SWTCH_GAIN_OFST), retval)); - return -1; + break; } + switch (retval_fix) { + case DAQ_FIX_GAIN_STG_1_VAL: + return FIX_G1; + case DAQ_FIX_GAIN_STG_2_VAL: + return FIX_G2; + default: + break; + } + + if (retval_cmp_rst) { + if (getSettings() == DYNAMICGAIN) { + return FIX_G0; + } + return FIX_HG0; + } + LOG(logERROR, ("This gain mode is undefined [DAQ reg: %d]\n", regval)); + return -1; } void setGainMode(enum gainMode mode) { diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 08eaa8bc8..a26c5497f 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -1179,7 +1179,9 @@ class Detector { /** [Jungfrau]*/ Result getGainMode(Positions pos = {}) const; - /** [Jungfrau] Options: NORMAL_GAIN_MODE, FORCE_SWITCH_G1, FORCE_SWITCH_G2\n + /** [Jungfrau] Options: NORMAL_GAIN_MODE, FORCE_SWITCH_G1, FORCE_SWITCH_G2, + * FIX_G1, FIX_G2, FIX_G0, FIX_HG0 \n\CAUTION: Do not use FIX_G0 and FIX_HG0 + * blindly, you can damage the detector!!!\n */ void setGainMode(const defs::gainMode mode, Positions pos = {}); diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index 036f8b972..a60f6ef57 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1877,7 +1877,9 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( gainmode, getGainMode, setGainMode, sls::StringTo, - "[forceswitchg1, forceswitchg2]\n\t[Jungfrau] Gain mode."); + "[forceswitchg1|forceswitchg2|fixgain1|fixgain2|fixgain0|" + "fixhighgain0]\n\t[Jungfrau] Gain mode.\n\tCAUTION: Do not use " + "fixgain0 and fixhighgain0 blindly, you can damage the detector!!!"); /* Gotthard Specific */ TIME_GET_COMMAND(exptimel, getExptimeLeft, diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index b4ce1bf87..65472c488 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -414,7 +414,15 @@ typedef struct { enum vetoAlgorithm { DEFAULT_ALGORITHM }; - enum gainMode { NORMAL_GAIN_MODE, FORCE_SWITCH_G1, FORCE_SWITCH_G2 }; + enum gainMode { + NORMAL_GAIN_MODE, + FORCE_SWITCH_G1, + FORCE_SWITCH_G2, + FIX_G1, + FIX_G2, + FIX_G0, + FIX_HG0 + }; #ifdef __cplusplus diff --git a/slsSupportLib/src/ToString.cpp b/slsSupportLib/src/ToString.cpp index 23882768a..95fb57f1f 100644 --- a/slsSupportLib/src/ToString.cpp +++ b/slsSupportLib/src/ToString.cpp @@ -587,6 +587,14 @@ std::string ToString(const defs::gainMode s) { return std::string("forceswitchg1"); case defs::FORCE_SWITCH_G2: return std::string("forceswitchg2"); + case defs::FIX_G1: + return std::string("fixg1"); + case defs::FIX_G2: + return std::string("fixg2"); + case defs::FIX_G0: + return std::string("fixg0"); + case defs::FIX_HG0: + return std::string("fixhg0"); default: return std::string("Unknown"); } @@ -982,6 +990,14 @@ template <> defs::gainMode StringTo(const std::string &s) { return defs::FORCE_SWITCH_G1; if (s == "forceswitchg2") return defs::FORCE_SWITCH_G2; + if (s == "fixg1") + return defs::FIX_G1; + if (s == "fixg2") + return defs::FIX_G2; + if (s == "fixg0") + return defs::FIX_G0; + if (s == "fixhg0") + return defs::FIX_HG0; throw sls::RuntimeError("Unknown gain mode " + s); }