diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 4f78bc007..3e1503d63 100755 Binary files a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer and b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer differ diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 9a4eb1499..f8c71903c 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -1144,15 +1144,26 @@ int getNumTransceiverSamples() { return ntSamples; } int setExpTime(int64_t val, char *mess) { setPatternWaitInterval(0, val); - // validate for tolerance - int64_t retval = 0; - if (getExpTime(&retval, mess) == FAIL) { + // validate + uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[RUN_CLK]); + uint64_t retval_clocks = getPatternWaitClocks(0); + if (arg_clocks != retval_clocks) { + sprintf(mess, + "Failed to set exposure time. Could not set number of clocks " + "to %lld, read %lld\n", + (long long int)arg_clocks, (long long int)retval_clocks); + LOG(logERROR, (mess)); return FAIL; } - int ret = OK; - validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK], - "exposure time"); - return ret; + + // log rounding if any + int64_t retval = getPatternWaitInterval(0); + if (val != retval) { + LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n", + (long long int)retval)); + } + + return OK; } int getExpTime(int64_t *retval, char *mess) { @@ -1172,17 +1183,31 @@ int setPeriod(int64_t val, char *mess) { return FAIL; } LOG(logINFO, ("Setting period %lld ns\n", (long long int)val)); - uint64_t numClocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]); - set64BitReg(numClocks, PERIOD_LSB_REG, PERIOD_MSB_REG); + uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]); + set64BitReg(arg_clocks, PERIOD_LSB_REG, PERIOD_MSB_REG); - // validate for tolerance - int64_t retval = 0; - int ret = getPeriod(&retval, mess); - if (ret == FAIL) { + // validate + uint64_t retval_clocks = get64BitReg(PERIOD_LSB_REG, PERIOD_MSB_REG); + if (arg_clocks != retval_clocks) { + sprintf(mess, + "Failed to set period. Could not set number of clocks " + "to %lld, red %lld\n", + (long long int)arg_clocks, (long long int)retval_clocks); + LOG(logERROR, (mess)); return FAIL; } - validate64_timer(&ret, mess, val, retval, clkFrequency[SYNC_CLK], "period"); - return ret; + + // log rounding if any + int64_t retval = 0; + if (getPeriod(&retval, mess) == FAIL) { + return FAIL; + } + if (val != retval) { + LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n", + (long long int)retval)); + } + + return OK; } int getPeriod(int64_t *retval, char *mess) { @@ -1204,18 +1229,32 @@ int setDelayAfterTrigger(int64_t val, char *mess) { return FAIL; } LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val)); - uint64_t numClocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]); - set64BitReg(numClocks, DELAY_LSB_REG, DELAY_MSB_REG); + uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]); + set64BitReg(arg_clocks, DELAY_LSB_REG, DELAY_MSB_REG); - // validate for tolerance - int64_t retval = 0; - int ret = getDelayAfterTrigger(&retval, mess); - if (ret == FAIL) { + // validate + uint64_t retval_clocks = get64BitReg(DELAY_LSB_REG, DELAY_MSB_REG); + if (arg_clocks != retval_clocks) { + sprintf( + mess, + "Failed to set delay after trigger. Could not set number of clocks " + "to %lld, read %lld\n", + (long long int)arg_clocks, (long long int)retval_clocks); + LOG(logERROR, (mess)); return FAIL; } - validate64_timer(&ret, mess, val, retval, clkFrequency[SYNC_CLK], - "delay after trigger"); - return ret; + + // log rounding if any + int64_t retval = 0; + if (getDelayAfterTrigger(&retval, mess) == FAIL) { + return FAIL; + } + if (val != retval) { + LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n", + (long long int)retval)); + } + + return OK; } int getDelayAfterTrigger(int64_t *retval, char *mess) { diff --git a/slsDetectorServers/slsDetectorServer/include/common.h b/slsDetectorServers/slsDetectorServer/include/common.h index af4e397b3..6dbbaae4e 100644 --- a/slsDetectorServers/slsDetectorServer/include/common.h +++ b/slsDetectorServers/slsDetectorServer/include/common.h @@ -62,9 +62,6 @@ void validate(int *ret, char *mess, int arg, int retval, char *modename, void validate64(int *ret, char *mess, int64_t arg, int64_t retval, char *modename, enum numberMode nummode); -void validate64_timer(int *ret, char *message, uint64_t arg, uint64_t retval, - uint32_t runclk_hz, char *modename); - int getModuleIdInFile(int *ret, char *mess, char *fileName); int verifyChecksumFromBuffer(char *mess, char *functionType, char *clientChecksum, char *buffer, ssize_t bytes); diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 327546b89..2bfc79bb7 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -230,20 +230,6 @@ void validate64(int *ret, char *mess, int64_t arg, int64_t retval, } } -void validate64_timer(int *ret, char *message, uint64_t arg, uint64_t retval, - uint32_t clk_hz, char *modename) { - uint64_t arg_clks = ns_to_clocks(arg, clk_hz); - uint64_t retval_clks = ns_to_clocks(retval, clk_hz); - int64_t diff = (int64_t)retval_clks - (int64_t)arg_clks; - if (diff < 0) { - diff = -diff; - } - // tolerance = 1 clock - if (diff > 1) { - validate64(ret, message, arg, retval, modename, DEC); - } -} - int getModuleIdInFile(int *ret, char *mess, char *fileName) { const int fileNameSize = 128; char fname[fileNameSize]; diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index f9010ac10..d80d5e742 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -329,43 +329,50 @@ int validate_setPatternWaitClocksAndInterval(char *message, int level, return FAIL; } - uint64_t retval = 0; if (clocks) { setPatternWaitClocks(level, waittime); // validate result - retval = getPatternWaitClocks(level); + uint64_t retval = getPatternWaitClocks(level); LOG(logDEBUG1, ("Pattern wait time in clocks (level:%d) retval: %d\n", level, (long long int)retval)); - } else { - setPatternWaitInterval(level, waittime); - // validate result - retval = getPatternWaitInterval(level); - LOG(logDEBUG1, ("Pattern wait time (level:%d) retval: %d\n", level, - (long long int)retval)); - } - int ret = OK; - char mode[128]; - memset(mode, 0, sizeof(mode)); - sprintf(mode, "set pattern Loop %d wait time", level); - - if (clocks) { + int ret = OK; + char mode[128]; + memset(mode, 0, sizeof(mode)); + sprintf(mode, "set pattern Loop %d wait time (clocks)", level); validate64(&ret, message, waittime, retval, mode, DEC); - } else { - uint32_t runclk = 0; -#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) - runclk = clkFrequency[RUN_CLK]; -#elif MYTHEN3D - runclk = getFrequency(SYSTEM_C0); -#endif - if (retval == (uint64_t)-1) { - sprintf(message, "runclk is 0. Cannot divide by 0 for patttern " - "wait interval.\n"); - return FAIL; - } - validate64_timer(&ret, message, waittime, retval, runclk, mode); + return ret; } - return ret; + + // interval + setPatternWaitInterval(level, waittime); + + // validate + uint32_t runclk = 0; +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) + runclk = clkFrequency[RUN_CLK]; +#elif MYTHEN3D + runclk = getFrequency(SYSTEM_C0); +#endif + uint64_t arg_clocks = ns_to_clocks(waittime, runclk); + uint64_t retval_clocks = getPatternWaitClocks(0); + if (arg_clocks != retval_clocks) { + sprintf(message, + "Failed to set exposure time. Could not set number of clocks " + "to %lld, read %lld\n", + (long long int)arg_clocks, (long long int)retval_clocks); + LOG(logERROR, (message)); + return FAIL; + } + + // log rounding if any + int64_t retval = getPatternWaitInterval(0); + if (waittime != retval) { + LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n", + (long long int)retval)); + } + + return OK; } void setPatternWaitClocks(int level, uint64_t t) { diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index ac4fa6544..00b44294a 100755 Binary files a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer and b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer differ diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c index 53e1318ae..5cf745e27 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -779,15 +779,26 @@ int getNumTransceiverSamples() { int setExpTime(int64_t val, char *mess) { setPatternWaitInterval(0, val); - // validate for tolerance - int64_t retval = 0; - if (getExpTime(&retval, mess) == FAIL) { + // validate + uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[RUN_CLK]); + uint64_t retval_clocks = getPatternWaitClocks(0); + if (arg_clocks != retval_clocks) { + sprintf(mess, + "Failed to set exposure time. Could not set number of clocks " + "to %lld, read %lld\n", + (long long int)arg_clocks, (long long int)retval_clocks); + LOG(logERROR, (mess)); return FAIL; } - int ret = OK; - validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK], - "exposure time"); - return ret; + + // log rounding if any + int64_t retval = getPatternWaitInterval(0); + if (val != retval) { + LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n", + (long long int)retval)); + } + + return OK; } int getExpTime(int64_t *retval, char *mess) { @@ -807,17 +818,31 @@ int setPeriod(int64_t val, char *mess) { return FAIL; } LOG(logINFO, ("Setting period %lld ns\n", (long long int)val)); - uint64_t numClocks = ns_to_clocks(val, clkFrequency[RUN_CLK]); - setU64BitReg(numClocks, PERIOD_IN_REG_1, PERIOD_IN_REG_2); + uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]); + setU64BitReg(arg_clocks, PERIOD_IN_REG_1, PERIOD_IN_REG_2); - // validate for tolerance - int64_t retval = 0; - int ret = getPeriod(&retval, mess); - if (ret == FAIL) { + // validate + uint64_t retval_clocks = getU64BitReg(PERIOD_IN_REG_1, PERIOD_IN_REG_2); + if (arg_clocks != retval_clocks) { + sprintf(mess, + "Failed to set period. Could not set number of clocks " + "to %lld, red %lld\n", + (long long int)arg_clocks, (long long int)retval_clocks); + LOG(logERROR, (mess)); return FAIL; } - validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK], "period"); - return ret; + + // log rounding if any + int64_t retval = 0; + if (getPeriod(&retval, mess) == FAIL) { + return FAIL; + } + if (val != retval) { + LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n", + (long long int)retval)); + } + + return OK; } int getPeriod(int64_t *retval, char *mess) { @@ -839,18 +864,32 @@ int setDelayAfterTrigger(int64_t val, char *mess) { return FAIL; } LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val)); - uint64_t numClocks = ns_to_clocks(val, clkFrequency[RUN_CLK]); - setU64BitReg(numClocks, DELAY_IN_REG_1, DELAY_IN_REG_2); + uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]); + setU64BitReg(arg_clocks, DELAY_IN_REG_1, DELAY_IN_REG_2); - // validate for tolerance - int64_t retval = 0; - int ret = getDelayAfterTrigger(&retval, mess); - if (ret == FAIL) { + // validate + uint64_t retval_clocks = getU64BitReg(DELAY_IN_REG_1, DELAY_IN_REG_2); + if (arg_clocks != retval_clocks) { + sprintf( + mess, + "Failed to set delay after trigger. Could not set number of clocks " + "to %lld, read %lld\n", + (long long int)arg_clocks, (long long int)retval_clocks); + LOG(logERROR, (mess)); return FAIL; } - validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK], - "delay after trigger"); - return ret; + + // log rounding if any + int64_t retval = 0; + if (getDelayAfterTrigger(&retval, mess) == FAIL) { + return FAIL; + } + if (val != retval) { + LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n", + (long long int)retval)); + } + + return OK; } int getDelayAfterTrigger(int64_t *retval, char *mess) { diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 72cb648e1..b5061de20 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -3,10 +3,10 @@ /** API versions */ #define APILIB "0.0.0 0x250909" #define APIRECEIVER "0.0.0 0x250822" -#define APICTB "0.0.0 0x260501" +#define APICTB "0.0.0 0x260505" #define APIGOTTHARD2 "0.0.0 0x260427" #define APIMOENCH "0.0.0 0x260424" #define APIEIGER "0.0.0 0x260424" -#define APIXILINXCTB "0.0.0 0x260501" +#define APIXILINXCTB "0.0.0 0x260505" #define APIJUNGFRAU "0.0.0 0x260424" #define APIMYTHEN3 "0.0.0 0x260501"