diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 4f6b99dfb..0a492511c 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -998,15 +998,17 @@ int Feb_Control_StartAcquisition() { int Feb_Control_StopAcquisition() { return Feb_Control_Reset(); } -int Feb_Control_GetExposureStatus(int *toggle, int *exposure) { +int Feb_Control_GetExposureStatus(int *rising, int *falling, int *exposure) { 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; } - *toggle = - ((value & FEB_REG_STATUS_EXP_TGL_MSK) >> FEB_REG_STATUS_EXP_TGL_OFST); + *rising = ((value & FEB_REG_STATUS_EXP_TGL_RISING_MSK) >> + FEB_REG_STATUS_EXP_TGL_RISING_OFST); + *falling = ((value & FEB_REG_STATUS_EXP_TGL_FALLING_MSK) >> + FEB_REG_STATUS_EXP_TGL_FALLING_OFST); *exposure = ((value & FEB_REG_STATUS_EXP_MSK) >> FEB_REG_STATUS_EXP_OFST); return 1; } @@ -1037,30 +1039,37 @@ int Feb_Control_SendSoftwareTrigger() { return 0; } LOG(logINFO, ("Software Internal Trigger Sent!\n")); + return 1; } int Feb_Control_SoftwareTrigger(int block) { if (Feb_Control_activated) { - int prev_toggle = 0, toggle = 0, prev_exposure = 0, exposure = 0; - - // remember previous toggle - if (!Feb_Control_GetExposureStatus(&prev_toggle, &exposure)) { + int rising = 0, falling = 0, exposure = 0; + if (!Feb_Control_GetExposureStatus(&rising, &falling, &exposure)) { return 0; } + if (exposure) { + LOG(logERROR, ("Software trigger failed. Still exposing.\n")); + return 0; + } + + // remember previous rising toggle + int prev_toggle = rising; + Feb_Control_SendSoftwareTrigger(); - // wait for trigger for 20ms - usleep(0); + // will need to wait if delay after trigger introduced + // usleep(0); // get current toggle value - if (!Feb_Control_GetExposureStatus(&toggle, &exposure)) { + if (!Feb_Control_GetExposureStatus(&rising, &falling, &exposure)) { return 0; } // no toggle error - if (toggle == prev_toggle) { + if (rising == prev_toggle) { LOG(logERROR, ("Software trigger failed. No exposure toggle " "detected.\n")); return 0; @@ -1071,16 +1080,23 @@ int Feb_Control_SoftwareTrigger(int block) { LOG(logERROR, ("Software trigger failed. No exposure detected.\n")); return 0; } - prev_exposure = exposure; // wait for exposure to be done if (block) { - while (prev_exposure == exposure) { + prev_toggle = falling; + while (prev_toggle == falling) { usleep(5000); - if (!Feb_Control_GetExposureStatus(&prev_toggle, &exposure)) { + if (!Feb_Control_GetExposureStatus(&rising, &falling, + &exposure)) { return 0; } } + // exposure low + if (exposure) { + LOG(logERROR, ("Software trigger failed. Still exposing after " + "exposure finished toggled.\n")); + return 0; + } } } return 1; diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 9d4e9e6af..4ec9efd11 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -55,7 +55,7 @@ int Feb_Control_PrepareForAcquisition(); void Feb_Control_PrintAcquisitionSetup(); int Feb_Control_StartAcquisition(); int Feb_Control_StopAcquisition(); -int Feb_Control_GetExposureStatus(int *toggle, int *exposure); +int Feb_Control_GetExposureStatus(int *rising, int *falling, int *exposure); int Feb_Control_SendSoftwareTrigger(); int Feb_Control_SoftwareTrigger(int block); diff --git a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h index 83dd5c16c..09b2b609d 100644 --- a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h @@ -32,12 +32,14 @@ #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 FEB_REG_STATUS_EXP_OFST (5) +#define FEB_REG_STATUS_EXP_MSK (0x00000001 << FEB_REG_STATUS_EXP_OFST) +#define FEB_REG_STATUS_EXP_TGL_FALLING_OFST (6) +#define FEB_REG_STATUS_EXP_TGL_FALLING_MSK (0x00000001 << FEB_REG_STATUS_EXP_TGL_FALLING_OFST) +#define FEB_REG_STATUS_EXP_TGL_RISING_OFST (7) +#define FEB_REG_STATUS_EXP_TGL_RISING_MSK (0x00000001 << FEB_REG_STATUS_EXP_TGL_RISING_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)