diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 82440f60b..fa3b8f37e 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -1000,6 +1000,18 @@ int Feb_Control_StopAcquisition() { return Feb_Control_Reset(); } int Feb_Control_SoftwareTrigger() { if (Feb_Control_activated) { + // read exp toggle value + int prev_toggle = 0; + unsigned int value = 0; + if (!Feb_Interface_ReadRegister(Feb_Control_AddressToAll, + FEB_REG_STATUS, &value)) { + LOG(logERROR, ("Could not read FEB_REG_STATUS reg\n")); + return 0; + } + int prev_toggle = ((value & FEB_REG_STATUS_EXP_TGL_MSK) >> + FEB_REG_STATUS_EXP_TGL_OFST); + + // send software trigger unsigned int orig_value = 0; if (!Feb_Interface_ReadRegister(Feb_Control_AddressToAll(), DAQ_REG_CHIP_CMDS, &orig_value)) { @@ -1024,6 +1036,32 @@ int Feb_Control_SoftwareTrigger() { return 0; } LOG(logINFO, ("Software Internal Trigger Sent!\n")); + + // wait for trigger for 20ms + usleep(20 * 1000); + if (!Feb_Interface_ReadRegister(Feb_Control_AddressToAll, + FEB_REG_STATUS, &value)) { + LOG(logERROR, ("Could not read FEB_REG_STATUS reg\n")); + return 0; + } + int toggle = ((value & FEB_REG_STATUS_EXP_TGL_MSK) >> + FEB_REG_STATUS_EXP_TGL_OFST); + + // no toggle, so no trigger + if (toggle == prev_toggle) { + LOG(logERROR, ("Software trigger failed. No exposure toggle " + "detected in 20ms.\n")); + return 0; + } + + // read that it exposed + int exposure = + ((value & FEB_REG_STATUS_EXP_MSK) >> FEB_REG_STATUS_EXP_OFST); + if (!exposure) { + LOG(logERROR, + ("Software trigger failed. No exposure detected in 20ms.\n")); + return 0; + } } return 1; } @@ -1883,15 +1921,15 @@ int Feb_Control_GetLeftFPGATemp() { if (!Feb_Control_activated) { return 0; } - unsigned int temperature = 0; + unsigned int value = 0; if (!Feb_Interface_ReadRegister(Feb_Control_leftAddress, FEB_REG_STATUS, - &temperature)) { + &value)) { LOG(logERROR, ("Trouble reading FEB_REG_STATUS reg to get left feb " "temperature\n")); return 0; } - - temperature = temperature >> 16; + unsigned int temperature = + ((value & FEB_REG_STATUS_TEMP_MSK) >> FEB_REG_STATUS_TEMP_OFST); temperature = ((((float)(temperature) / 65536.0f) / 0.00198421639f) - 273.15f) * 1000; // Static conversation, copied from xps sysmon standalone driver diff --git a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h index 5c8d1db9c..83dd5c16c 100644 --- a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h @@ -31,6 +31,14 @@ #define DAQ_REG_RO_OFFSET 20 #define DAQ_REG_STATUS (DAQ_REG_RO_OFFSET + 0) // also pg and fifo status register #define FEB_REG_STATUS (DAQ_REG_RO_OFFSET + 3) + +#define FEB_REG_STATUS_EXP_OFST (5) +#define FEB_REG_STATUS_EXP_MSK (0x00000001 << FEB_REG_STATUS_EXP_OFST) +#define FEB_REG_STATUS_EXP_TGL_OFST (6) +#define FEB_REG_STATUS_EXP_TGL_MSK (0x00000001 << FEB_REG_STATUS_EXP_TGL_OFST) +#define FEB_REG_STATUS_TEMP_OFST (16) +#define FEB_REG_STATUS_TEMP_MSK (0x0000FFFF << FEB_REG_STATUS_TEMP_OFST) + #define MEAS_SUBPERIOD_REG (DAQ_REG_RO_OFFSET + 4) #define MEAS_PERIOD_REG (DAQ_REG_RO_OFFSET + 5) // clang-format on