diff --git a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h index 6a16724a1..37e116557 100644 --- a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h @@ -463,6 +463,22 @@ Time before end of exposure when comparator is disabled */ #define COMP_DSBLE_TIME_REG (0x6C << MEM_MAP_SHIFT) +/* High Definition Register, timeout and activation time tT = T x 25 ns */ +#define HDR_REG (0x6D << MEM_MAP_SHIFT) + +#define HDR_TIMOUT_OFST (0) +#define HDR_MAX_TIMEOUT_VAL (0xFFFF) +#define HDR_TIMOUT_MSK (HDR_MAX_TIMEOUT_VAL << HDR_TIMOUT_OFST) +#define HDR_ACTIVATION_TIME_OFST (16) +#define HDR_MAX_ACTIVATION_TIME_VAL (0xFF) +#define HDR_ACTIVATION_TIME_MSK (HDR_MAX_ACTIVATION_TIME_VAL << HDR_ACTIVATION_TIME_OFST) +#define HDR_MODE_OFST (24) +#define HDR_MODE_MSK (0x00000001 << HDR_MODE_OFST) +#define HDR_MODE_SYNCHROTRON_VAL ((0x0 << HDR_MODE_OFST) & HDR_MODE_MSK) +#define HDR_MODE_FEL_VAL ((0x1 << HDR_MODE_OFST) & HDR_MODE_MSK) +#define HDR_ENABLE_OFST (31) +#define HDR_ENABLE_MSK (0x00000001 << HDR_ENABLE_OFST) + /* Trigger Delay 32 bit register */ #define SET_TRIGGER_DELAY_LSB_REG (0x70 << MEM_MAP_SHIFT) diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index c3c5987a8..7b9933b10 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -2944,6 +2944,79 @@ void setElectronCollectionMode(int enable) { configureChip(); } +int setHDR(bool enable, enum operationMode mode) { + LOG(logINFO, ("%s HDR\n", (enable ? "Enabling" : "Disabling"))); + + uint32_t timeout = 0; + uint64_t expTimeInClks = + get64BitReg(SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) + + ACQ_TIME_MIN_CLOCK; + uint32_t activationTime = 0; + uint32_t mode_val = 0; + switch (mode) { + case SYNCHROTRON: + LOG(logINFO, ("\tmode: synchrotron\n")); + timeout = HDR_SYNC_TIME_CLK_VAL; + activationTime = + (uint32_t)((expTimeInClks * HDR_SYNC_ACTIVATION_TIME_PERCENT) / + 100); + mode_val = HDR_MODE_SYNCHROTRON_VAL; + break; + case FEL: + LOG(logINFO, ("\tmode: FEL\n")); + timeout = HDR_FEL_TIMEOUT_CLK_VAL; + activationTime = + (uint32_t)((expTimeInClks * HDR_FEL_ACTIVATION_TIME_PERCENT) / 100); + mode_val = HDR_MODE_FEL_VAL; + break; + default: + LOG(logERROR, ("Unknown HDR mode %d\n", mode)); + return FAIL; + } + + if (activationTime > HDR_MAX_ACTIVATION_TIME_VAL) { + activationTime = HDR_MAX_ACTIVATION_TIME_VAL; + } + + uint32_t addr = HDR_REG; + uint32_t regval = bus_r(addr); + if (enable) { + uint32_t mask = HDR_TIMOUT_MSK | HDR_ACTIVATION_TIME_MSK | + HDR_MODE_MSK | HDR_ENABLE_MSK; + regval &= ~mask; + + regval |= ((timeout << HDR_TIMOUT_OFST) & HDR_TIMOUT_MSK); + regval |= ((activationTime << HDR_ACTIVATION_TIME_OFST) & + HDR_ACTIVATION_TIME_MSK); + regval |= mode_val; + regval |= HDR_ENABLE_MSK; + bus_w(addr, regval); + } else { + bus_w(addr, regval & ~HDR_ENABLE_MSK); + } + + return OK; +} + +int getHDR(bool *enable, enum operationMode *mode) { + uint32_t addr = HDR_REG; + uint32_t regval = bus_r(addr); + *enable = (regval & HDR_ENABLE_MSK) ? true : false; + uint32_t mode_val = (regval & HDR_MODE_MSK); + switch (mode_val) { + case HDR_MODE_SYNCHROTRON_VAL: + *mode = SYNCHROTRON; + break; + case HDR_MODE_FEL_VAL: + *mode = FEL; + break; + default: + LOG(logERROR, ("Unknown HDR mode value %d\n", mode_val)); + return FAIL; + } + return OK; +} + int getTenGigaFlowControl() { return ((bus_r(CONFIG_REG) & CONFIG_ETHRNT_FLW_CNTRL_MSK) >> CONFIG_ETHRNT_FLW_CNTRL_OFST); diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h index 98e474212..e967061ec 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h @@ -158,6 +158,11 @@ #define ADC_OFST_HALF_SPEED_BOARD2_VAL (0x10) #define ADC_OFST_QUARTER_SPEED_BOARD2_VAL (0x08) +#define HDR_SYNC_TIME_CLK_VAL (1) // 25ns +#define HDR_SYNC_ACTIVATION_TIME_PERCENT (8) +#define HDR_FEL_TIMEOUT_CLK_VAL (0) // undefined +#define HDR_FEL_ACTIVATION_TIME_PERCENT (0) // undefined + /* Struct Definitions */ typedef struct udp_header_struct { uint32_t udp_destmac_msb; diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 021330d0f..939ddc021 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -603,6 +603,8 @@ int setTimingInfoDecoder(enum timingInfoDecoder val); int getTimingInfoDecoder(enum timingInfoDecoder *retval); int getElectronCollectionMode(); void setElectronCollectionMode(int enable); +int setHDR(bool enable, enum operationMode mode); +int getHDR(bool *enable, enum operationMode *mode); #endif // eiger specific - iodelay, pulse, rate, temp, activate, delay nw parameter diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 862de936c..9bef774cb 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -11078,12 +11078,12 @@ int set_hdr(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int args[2] = {-1, -1}; - + if (receiveData(file_des, args, sizeof(args), INT32) < 0) + return printSocketReadError(); #ifndef JUNGFRAUD functionNotImplemented(); #else - if (receiveData(file_des, args, sizeof(args), INT32) < 0) - return printSocketReadError(); + if (Server_VerifyLock() == OK) { int enable = args[0]; enum operationMode mode = args[1]; @@ -11119,3 +11119,26 @@ int set_hdr(int file_des) { #endif return Server_SendResult(file_des, INT32, NULL, 0); } + +int get_hdr(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int retvals[2] = {-1, -1}; + LOG(logDEBUG1, ("Getting HDR\n")); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + bool enable = false; + enum operationMode mode = SYNCHROTRON; + ret = getHDR(&enable, &mode); + if (ret == FAIL) { + sprintf(mess, "Could not get HDR\n"); + LOG(logERROR, (mess)); + } else { + retvals[0] = enable; + retvals[1] = mode; + } +#endif + return Server_SendResult(file_des, INT32, retvals, sizeof(retvals)); +} diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index 558bbb0ea..71b6cead7 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -527,10 +527,7 @@ enum streamingInterface { enum polarity { POSITIVE, NEGATIVE }; enum timingInfoDecoder { SWISSFEL, SHINE }; enum collectionMode { HOLE, ELECTRON }; - enum operationMode { - SYNCHROTRON, - FEL - } + enum operationMode { SYNCHROTRON, FEL }; #ifdef __cplusplus @@ -578,6 +575,9 @@ enum streamingInterface { } } __attribute__((packed)); + static_assert(sizeof(hdrParameters) == 2 * sizeof(int), + "hdrParameters TCP layout must remain two INT32 values"); + struct currentSrcParameters { int enable; int fix; diff --git a/slsSupportLib/tests/test-ToString.cpp b/slsSupportLib/tests/test-ToString.cpp index 76ee87245..fc646f35d 100644 --- a/slsSupportLib/tests/test-ToString.cpp +++ b/slsSupportLib/tests/test-ToString.cpp @@ -379,4 +379,15 @@ TEST_CASE("string to timingInfoDecoder") { defs::timingInfoDecoder::SHINE); } +TEST_CASE("operationMode to string") { + REQUIRE(ToString(defs::operationMode::SYNCHROTRON) == "synchrotron"); + REQUIRE(ToString(defs::operationMode::FEL) == "fel"); +} + +TEST_CASE("string to operationMode") { + REQUIRE(StringTo("synchrotron") == + defs::operationMode::SYNCHROTRON); + REQUIRE(StringTo("fel") == defs::operationMode::FEL); +} + } // namespace sls