From a5ee9fbdbaae1e1b50a2607751830dd5aee32120 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 7 Feb 2019 16:51:18 +0100 Subject: [PATCH] ctb bug fixes: pattern generator, vchip, dacs --- .../slsDetectorFunctionList.c | 33 +- .../slsDetectorServer_funcs.c | 461 +++++++++--------- .../multiSlsDetector/multiSlsDetector.cpp | 2 +- .../multiSlsDetector/multiSlsDetector.h | 2 +- .../slsDetector/slsDetector.cpp | 8 +- 5 files changed, 250 insertions(+), 256 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 088cc2834..132f31f1c 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -482,24 +482,13 @@ void setupDetector() { resetPeripheral(); cleanFifos(); - // dac defines here as it is used earlier - LTC2620_SetDefines(SPI_REG, SPI_DAC_SRL_CS_OTPT_MSK, SPI_DAC_SRL_CLK_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_OFST, NDAC, DAC_MIN_MV, DAC_MAX_MV); - // hv MAX1932_SetDefines(SPI_REG, SPI_HV_SRL_CS_OTPT_MSK, SPI_HV_SRL_CLK_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_OFST, HIGHVOLTAGE_MIN, HIGHVOLTAGE_MAX); MAX1932_Disable(); setHighVoltage(DEFAULT_HIGH_VOLTAGE); - // power regulators - // I2C - INA226_ConfigureI2CCore(I2C_SHUNT_RESISTER_OHMS, I2C_CONTROL_REG, I2C_RX_DATA_FIFO_LEVEL_REG, I2C_SCL_LOW_COUNT_REG, I2C_SCL_HIGH_COUNT_REG, I2C_SDA_HOLD_REG, I2C_TRANSFER_COMMAND_FIFO_REG); - INA226_CalibrateCurrentRegister(I2C_POWER_VIO_DEVICE_ID); - INA226_CalibrateCurrentRegister(I2C_POWER_VA_DEVICE_ID); - INA226_CalibrateCurrentRegister(I2C_POWER_VB_DEVICE_ID); - INA226_CalibrateCurrentRegister(I2C_POWER_VC_DEVICE_ID); - INA226_CalibrateCurrentRegister(I2C_POWER_VD_DEVICE_ID); + // power off voltage regulators powerOff(); - setVchip(VCHIP_MIN_MV); // adcs AD9257_SetDefines(ADC_SPI_REG, ADC_SPI_SRL_CS_OTPT_MSK, ADC_SPI_SRL_CLK_OTPT_MSK, ADC_SPI_SRL_DT_OTPT_MSK, ADC_SPI_SRL_DT_OTPT_OFST); @@ -512,7 +501,7 @@ void setupDetector() { AD7689_Configure(); // dacs - // defined earlier as power regulators (above) require them + LTC2620_SetDefines(SPI_REG, SPI_DAC_SRL_CS_OTPT_MSK, SPI_DAC_SRL_CLK_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_OFST, NDAC, DAC_MIN_MV, DAC_MAX_MV); //has to be before setvchip LTC2620_Disable(); LTC2620_Configure(); //FIXME: @@ -521,14 +510,24 @@ void setupDetector() { { int idac = 0; for (idac = 0; idac < NDAC; ++idac) { - setDAC(idac, LTC2620_PWR_DOWN_VAL, 0); + setDAC(idac, LTC2620_PWR_DOWN_VAL, 0); //has to be before setvchip } } + // power regulators + // I2C + INA226_ConfigureI2CCore(I2C_SHUNT_RESISTER_OHMS, I2C_CONTROL_REG, I2C_RX_DATA_FIFO_LEVEL_REG, I2C_SCL_LOW_COUNT_REG, I2C_SCL_HIGH_COUNT_REG, I2C_SDA_HOLD_REG, I2C_TRANSFER_COMMAND_FIFO_REG); + INA226_CalibrateCurrentRegister(I2C_POWER_VIO_DEVICE_ID); + INA226_CalibrateCurrentRegister(I2C_POWER_VA_DEVICE_ID); + INA226_CalibrateCurrentRegister(I2C_POWER_VB_DEVICE_ID); + INA226_CalibrateCurrentRegister(I2C_POWER_VC_DEVICE_ID); + INA226_CalibrateCurrentRegister(I2C_POWER_VD_DEVICE_ID); + setVchip(VCHIP_MIN_MV); + // altera pll ALTERA_PLL_SetDefines(PLL_CNTRL_REG, PLL_PARAM_REG, PLL_CNTRL_RCNFG_PRMTR_RST_MSK, PLL_CNTRL_WR_PRMTR_MSK, PLL_CNTRL_PLL_RST_MSK, PLL_CNTRL_ADDR_MSK, PLL_CNTRL_ADDR_OFST); - bus_w(ADC_PORT_INVERT_REG, ADC_PORT_INVERT_VAL);//FIXME: got from moench config file + bus_w(ADC_PORT_INVERT_REG, 0);// depends on chip FILE_LOG(logINFOBLUE, ("Setting Default parameters\n")); cleanFifos(); // FIXME: why twice? @@ -1728,7 +1727,7 @@ uint64_t readPatternWord(int addr) { uint64_t writePatternWord(int addr, uint64_t word) { // get - if (word != -1) + if (word == -1) return readPatternWord(addr); // error (handled in tcp) @@ -1833,7 +1832,7 @@ uint64_t setPatternWaitTime(int level, uint64_t t) { } // get - uint32_t regval = get64BitReg(regl, regm); + uint64_t regval = get64BitReg(regl, regm); FILE_LOG(logDEBUG1, ("Wait Time (level:%d, t:%lld)\n", level, (long long int)regval)); return regval; } diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 6046c4f6c..6eeee91aa 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -784,60 +784,68 @@ int set_dac(int file_des) { case V_POWER_C: case V_POWER_D: case V_POWER_IO: - if (!mV) { - ret = FAIL; - sprintf(mess,"Could not set power. Power regulator %d should be in mV and not dac units.\n", ind); - FILE_LOG(logERROR,(mess)); - } else if (checkVLimitCompliant(val) == FAIL) { - ret = FAIL; - sprintf(mess,"Could not set power. Power regulator %d exceeds voltage limit %d.\n", ind, getVLimit()); - FILE_LOG(logERROR,(mess)); - } else if (!isPowerValid(val)) { - ret = FAIL; - sprintf(mess,"Could not set power. Power regulator %d should be between %d and %d mV\n", ind, POWER_RGLTR_MIN, POWER_RGLTR_MAX); - FILE_LOG(logERROR,(mess)); - } else { - if (val != -1) + if (val != -1) { + if (!mV) { + ret = FAIL; + sprintf(mess,"Could not set power. Power regulator %d should be in mV and not dac units.\n", ind); + FILE_LOG(logERROR,(mess)); + } else if (checkVLimitCompliant(val) == FAIL) { + ret = FAIL; + sprintf(mess,"Could not set power. Power regulator %d exceeds voltage limit %d.\n", ind, getVLimit()); + FILE_LOG(logERROR,(mess)); + } else if (!isPowerValid(val)) { + ret = FAIL; + sprintf(mess,"Could not set power. Power regulator %d should be between %d and %d mV\n", ind, POWER_RGLTR_MIN, POWER_RGLTR_MAX); + FILE_LOG(logERROR,(mess)); + } else { setPower(serverDacIndex, val); - retval = getPower(serverDacIndex); - FILE_LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval)); - validate(val, retval, "set power regulator", DEC); + + } } + retval = getPower(serverDacIndex); + FILE_LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval)); + validate(val, retval, "set power regulator", DEC); break; case V_POWER_CHIP: - if (!mV) { - ret = FAIL; - sprintf(mess,"Could not set Vchip. Should be in mV and not dac units.\n"); - FILE_LOG(logERROR,(mess)); - } else if (!isVchipValid(val)) { - ret = FAIL; - sprintf(mess,"Could not set Vchip. Should be between %d and %d mV\n", VCHIP_MIN_MV, VCHIP_MAX_MV); - FILE_LOG(logERROR,(mess)); - } else { - if (val >= 0) // not letting user set to -100, it will affect setting + if (val >= 0) { + if (!mV) { + ret = FAIL; + sprintf(mess,"Could not set Vchip. Should be in mV and not dac units.\n"); + FILE_LOG(logERROR,(mess)); + } else if (!isVchipValid(val)) { + ret = FAIL; + sprintf(mess,"Could not set Vchip. Should be between %d and %d mV\n", VCHIP_MIN_MV, VCHIP_MAX_MV); + FILE_LOG(logERROR,(mess)); + } else { setVchip(val); - retval = getVchip(); - FILE_LOG(logDEBUG1, ("Vchip: %d\n", retval)); - validate(val, retval, "set vchip", DEC); + } + } + retval = getVchip(); + FILE_LOG(logDEBUG1, ("Vchip: %d\n", retval)); + if (ret == OK && val != -1 && val != -100 && retval != val) { + ret = FAIL; + sprintf(mess, "Could not set vchip. Set %d, but read %d\n", val, retval); + FILE_LOG(logERROR,(mess)); } break; #endif #if defined(CHIPTESTBOARDD) || defined(MOENCHD) case V_LIMIT: - if (!mV) { - ret = FAIL; - strcpy(mess,"Could not set power. VLimit should be in mV and not dac units.\n"); - FILE_LOG(logERROR,(mess)); - } else { - if (val >= 0) + if (val >= 0) { + if (!mV) { + ret = FAIL; + strcpy(mess,"Could not set power. VLimit should be in mV and not dac units.\n"); + FILE_LOG(logERROR,(mess)); + } else { setVLimit(val); - retval = getVLimit(); - FILE_LOG(logDEBUG1, ("VLimit: %d\n", retval)); - validate(val, retval, "set vlimit", DEC); + } } + retval = getVLimit(); + FILE_LOG(logDEBUG1, ("VLimit: %d\n", retval)); + validate(val, retval, "set vlimit", DEC); break; #endif @@ -2478,221 +2486,208 @@ int set_all_trimbits(int file_des) { int set_ctb_pattern(int file_des) { - ret = OK; - memset(mess, 0, sizeof(mess)); + ret = OK; + memset(mess, 0, sizeof(mess)); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) - int retval32 = -1; - int64_t retval64 = -1; - int retvals[3] = {-1, -1, -1}; -#endif - - int mode = -1; - // mode 0: control or word - int addr = -1; - uint64_t word = -1; - // mode 1: pattern loop - int loopLevel = -1; - int startAddr = -1; - int stopAddr = -1; - int numLoops = -1; - // mode 2: wait address - // mode 3: wait time - uint64_t timeval = -1; - // mode 4: set word - uint64_t pattern[MAX_PATTERN_LENGTH] = {0}; - - if (receiveData(file_des, &mode, sizeof(mode), INT32) < 0) + // receive mode + uint64_t arg = -1; + if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0) return printSocketReadError(); - switch (mode) { - case 0:// control or word - if (receiveData(file_des, &addr, sizeof(addr), INT32) < 0) + int mode = (int)arg; + FILE_LOG(logDEBUG1, ("Setting Pattern: mode %d\n", mode)); + + + + // mode 0: control or word + if (mode == 0) { + // receive arguments + uint64_t args[2] = {-1, -1}; + if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); - if (receiveData(file_des, &word, sizeof(word), INT64) < 0) - return printSocketReadError(); - break; - case 1:// pattern loop - if (receiveData(file_des, &loopLevel, sizeof(loopLevel), INT32) < 0) - return printSocketReadError(); - if (receiveData(file_des, &startAddr, sizeof(startAddr), INT32) < 0) - return printSocketReadError(); - if (receiveData(file_des, &stopAddr, sizeof(stopAddr), INT32) < 0) - return printSocketReadError(); - if (receiveData(file_des, &numLoops, sizeof(numLoops), INT32) < 0) - return printSocketReadError(); - break; - case 2: // wait address - if (receiveData(file_des, &loopLevel, sizeof(loopLevel), INT32) < 0) - return printSocketReadError(); - if (receiveData(file_des, &addr, sizeof(addr), INT32) < 0) - return printSocketReadError(); - break; - case 3:// wait time - if (receiveData(file_des, &loopLevel, sizeof(loopLevel), INT32) < 0) - return printSocketReadError(); - if (receiveData(file_des, &timeval, sizeof(timeval), INT64) < 0) - return printSocketReadError(); - case 4:// set word - if (receiveData(file_des, &pattern, sizeof(pattern), INT64) < 0) - return printSocketReadError(); - break; - default: - break; - } + int addr = (int)args[0]; + uint64_t word = args[1]; + int64_t retval64 = -1; #if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) - functionNotImplemented(); + functionNotImplemented(); + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); #else - FILE_LOG(logDEBUG1, ("Setting Pattern: mode %d\n", mode)); - char tempName[100]; - memset(tempName, 0, 100); - int failCount = 0; + if ((word == -1) || (Server_VerifyLock() == OK)) { - switch (mode) { - - case 0: - // control or word - if ((word == -1) || (Server_VerifyLock() == OK)) { - - // address for set word should be valid (if not -1 or -2, it goes to setword) - if (addr < -2 || addr > MAX_PATTERN_LENGTH) { - ret = FAIL; - sprintf(mess, "Cannot set Pattern (Word, addr:%d). Addr must be less than %d\n", - addr, MAX_PATTERN_LENGTH); - FILE_LOG(logERROR, (mess)); - } else { - switch (addr) { - case -1: - strcpy(tempName, "Pattern (I/O Control Register)"); - FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int) word)); - retval64 = writePatternIOControl(word); - break; - case -2: - strcpy(tempName, "Pattern (Clock Control Register)"); - FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int) word)); - retval64 = writePatternClkControl(word); - break; - default: - sprintf(tempName, "Pattern (Word, addr:0x%x)", addr); - FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int) word)); - retval64 = writePatternWord(addr, word); - break; - } - FILE_LOG(logDEBUG1, ("%s: 0x%llx\n", tempName, (long long int)retval64)); - validate64(word, retval64, tempName, HEX); - } - } - return Server_SendResult(file_des, INT64, UPDATE, &retval64, sizeof(retval64)); - - - // pattern loop - case 1: - if (loopLevel < -1 || loopLevel > 2) { // -1 complete pattern - modeNotImplemented("Pattern (Pattern Loop) Level", loopLevel); - } - - // level 0-2, addr upto patternlength + 1 - else if ((loopLevel != -1) && (startAddr > (MAX_PATTERN_LENGTH + 1) || stopAddr > (MAX_PATTERN_LENGTH + 1))) { + // address for set word should be valid (if not -1 or -2, it goes to setword) + if (addr < -2 || addr > MAX_PATTERN_LENGTH) { ret = FAIL; - sprintf(mess, "Cannot set Pattern (Pattern Loop, level:%d, startaddr:%d, stopaddr:%d). " - "Addr must be less than %d\n", - loopLevel, startAddr, stopAddr, MAX_PATTERN_LENGTH + 1); + sprintf(mess, "Cannot set Pattern (Word, addr:%d). Addr must be less than %d\n", + addr, MAX_PATTERN_LENGTH); FILE_LOG(logERROR, (mess)); - } + } else { + char tempName[100]; + memset(tempName, 0, 100); - //level -1, addr upto patternlength - else if ((loopLevel == -1) && (startAddr > MAX_PATTERN_LENGTH || stopAddr > MAX_PATTERN_LENGTH)) { - ret = FAIL; - sprintf(mess, "Cannot set Pattern (Pattern Loop, complete pattern, startaddr:%d, stopaddr:%d). " - "Addr must be less than %d\n", - startAddr, stopAddr, MAX_PATTERN_LENGTH); - FILE_LOG(logERROR, (mess)); - } - - else if ((startAddr == -1 && stopAddr == -1 && numLoops == -1) || (Server_VerifyLock() == OK)) { - setPatternLoop(loopLevel, &startAddr, &stopAddr, &numLoops); - } - retvals[0] = startAddr; - retvals[1] = stopAddr; - retvals[2] = numLoops; - return Server_SendResult(file_des, INT32, UPDATE, retvals, sizeof(retvals)); - - - case 2: - // wait address - if ((addr == -1) || (Server_VerifyLock() == OK)) { - if (loopLevel < 0 || loopLevel > 2) { - modeNotImplemented("Pattern (Wait Address) Level", loopLevel); - } else if (addr > (MAX_PATTERN_LENGTH + 1)) { - ret = FAIL; - sprintf(mess, "Cannot set Pattern (Wait Address, addr:%d). Addr must be less than %d\n", - addr, MAX_PATTERN_LENGTH + 1); - FILE_LOG(logERROR, (mess)); - } else { - sprintf(tempName, "Pattern (Wait Address, Level:%d)", loopLevel); - FILE_LOG(logDEBUG1, ("Setting %s to 0x%x\n", tempName, addr)); - retval32 = setPatternWaitAddress(loopLevel, addr); - FILE_LOG(logDEBUG1, ("%s: 0x%x\n", tempName, retval32)); - validate(addr, retval32, tempName, HEX); + switch (addr) { + case -1: + strcpy(tempName, "Pattern (I/O Control Register)"); + FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int) word)); + retval64 = writePatternIOControl(word); + break; + case -2: + strcpy(tempName, "Pattern (Clock Control Register)"); + FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int) word)); + retval64 = writePatternClkControl(word); + break; + default: + sprintf(tempName, "Pattern (Word, addr:0x%x)", addr); + FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int) word)); + retval64 = writePatternWord(addr, word); + break; } + FILE_LOG(logDEBUG1, ("%s: 0x%llx\n", tempName, (long long int)retval64)); + validate64(word, retval64, tempName, HEX); } - return Server_SendResult(file_des, INT32, UPDATE, &retval32, sizeof(retval32)); + } +#endif + return Server_SendResult(file_des, INT64, UPDATE, &retval64, sizeof(retval64)); + } - case 3: - // wait time - if ((timeval == -1) || (Server_VerifyLock() == OK)) { - if (loopLevel < 0 || loopLevel > 2) { - modeNotImplemented("Pattern (Wait Time) Level", loopLevel); - } else { - sprintf(tempName, "Pattern (Wait Time, Level:%d)", loopLevel); - FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int)timeval)); - retval64 = setPatternWaitTime(loopLevel, timeval); - FILE_LOG(logDEBUG1, ("%s: 0x%llx\n", tempName, (long long int)retval64)); - validate64(timeval, retval64, tempName, HEX); - } - } - return Server_SendResult(file_des, INT64, UPDATE, &retval64, sizeof(retval64)); + // mode 1: pattern loop + else if (mode == 1) { + // receive arguments + uint64_t args[4] = {-1, -1, -1, -1}; + if (receiveData(file_des, args, sizeof(args), INT64) < 0) + return printSocketReadError(); + int loopLevel = (int)args[0]; + int startAddr = (int)args[1]; + int stopAddr = (int)args[2]; + int numLoops = (int)args[3]; + int retvals[3] = {-1, -1, -1}; - case 4: - // set word array(set only) - if (Server_VerifyLock() == OK) { - FILE_LOG(logDEBUG1, ("Setting Pattern (Word Array)\n")); - failCount = 0; - int iaddr = 0; // if warning change to addr // FIXME - for (iaddr = 0; iaddr < MAX_PATTERN_LENGTH; ++iaddr) { - sprintf(tempName, "Pattern (Word Array, addr:%d)", iaddr); - FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int) pattern[iaddr])); - retval64 = writePatternWord(iaddr, pattern[iaddr]);//FIXME: earlier was word, but makes no sense (random value) - FILE_LOG(logDEBUG1, ("%s: 0x%llx\n", tempName, (long long int)retval64)); - validate64(pattern[iaddr], retval64, tempName, HEX); - if (ret == FAIL) { - ++failCount; - ret = OK; - } - } - if (failCount) { - ret = FAIL; - sprintf(mess, "Could not set Pattern (Word Array) %d addresses.\n", failCount); - FILE_LOG(logERROR,(mess)); - } - } - return Server_SendResult(file_des, INT64, UPDATE, NULL, 0); - - - default: - modeNotImplemented("Pattern mode index", mode); - break; +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) + functionNotImplemented(); + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +#else + if (loopLevel < -1 || loopLevel > 2) { // -1 complete pattern + ret = FAIL; + sprintf(mess, "Pattern (Pattern Loop) Level (%d) is not implemented for this detector\n", loopLevel); + FILE_LOG(logERROR,(mess)); } + // level 0-2, addr upto patternlength + 1 + else if ((loopLevel != -1) && (startAddr > (MAX_PATTERN_LENGTH + 1) || stopAddr > (MAX_PATTERN_LENGTH + 1))) { + ret = FAIL; + sprintf(mess, "Cannot set Pattern (Pattern Loop, level:%d, startaddr:%d, stopaddr:%d). " + "Addr must be less than %d\n", + loopLevel, startAddr, stopAddr, MAX_PATTERN_LENGTH + 1); + FILE_LOG(logERROR, (mess)); + } + + //level -1, addr upto patternlength + else if ((loopLevel == -1) && (startAddr > MAX_PATTERN_LENGTH || stopAddr > MAX_PATTERN_LENGTH)) { + ret = FAIL; + sprintf(mess, "Cannot set Pattern (Pattern Loop, complete pattern, startaddr:%d, stopaddr:%d). " + "Addr must be less than %d\n", + startAddr, stopAddr, MAX_PATTERN_LENGTH); + FILE_LOG(logERROR, (mess)); + } + + else if ((startAddr == -1 && stopAddr == -1 && numLoops == -1) || (Server_VerifyLock() == OK)) { + setPatternLoop(loopLevel, &startAddr, &stopAddr, &numLoops); + } + retvals[0] = startAddr; + retvals[1] = stopAddr; + retvals[2] = numLoops; #endif - return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); + return Server_SendResult(file_des, INT32, UPDATE, retvals, sizeof(retvals)); + } + + + + // mode 2: wait address + else if (mode == 1) { + // receive arguments + uint64_t args[2] = {-1, -1}; + if (receiveData(file_des, args, sizeof(args), INT64) < 0) + return printSocketReadError(); + int loopLevel = (int)args[0]; + int addr = (int)args[1]; + int retval32 = -1; + +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) + functionNotImplemented(); + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +#else + if ((addr == -1) || (Server_VerifyLock() == OK)) { + if (loopLevel < 0 || loopLevel > 2) { + ret = FAIL; + sprintf(mess, "Pattern (Wait Address) Level (%d) is not implemented for this detector\n", loopLevel); + FILE_LOG(logERROR,(mess)); + } else if (addr > (MAX_PATTERN_LENGTH + 1)) { + ret = FAIL; + sprintf(mess, "Cannot set Pattern (Wait Address, addr:%d). Addr must be less than %d\n", + addr, MAX_PATTERN_LENGTH + 1); + FILE_LOG(logERROR, (mess)); + } else { + char tempName[100]; + memset(tempName, 0, 100); + sprintf(tempName, "Pattern (Wait Address, Level:%d)", loopLevel); + + FILE_LOG(logDEBUG1, ("Setting %s to 0x%x\n", tempName, addr)); + retval32 = setPatternWaitAddress(loopLevel, addr); + FILE_LOG(logDEBUG1, ("%s: 0x%x\n", tempName, retval32)); + validate(addr, retval32, tempName, HEX); + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval32, sizeof(retval32)); + } + + + + // mode 3: wait time + else if (mode == 1) { + // receive arguments + uint64_t args[2] = {-1, -1}; + if (receiveData(file_des, args, sizeof(args), INT64) < 0) + return printSocketReadError(); + int loopLevel = (int)args[1]; + uint64_t timeval = (int)args[2]; + int64_t retval64 = -1; + +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) + functionNotImplemented(); + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +#else + if ((timeval == -1) || (Server_VerifyLock() == OK)) { + if (loopLevel < 0 || loopLevel > 2) { + ret = FAIL; + sprintf(mess, "Pattern (Wait Time) Level (%d) is not implemented for this detector\n", loopLevel); + FILE_LOG(logERROR,(mess)); + } else { + char tempName[100]; + memset(tempName, 0, 100); + sprintf(tempName, "Pattern (Wait Time, Level:%d)", loopLevel); + + FILE_LOG(logDEBUG1, ("Setting %s to 0x%llx\n", tempName, (long long int)timeval)); + retval64 = setPatternWaitTime(loopLevel, timeval); + FILE_LOG(logDEBUG1, ("%s: 0x%llx\n", tempName, (long long int)retval64)); + validate64(timeval, retval64, tempName, HEX); + } + } +#endif + return Server_SendResult(file_des, INT64, UPDATE, &retval64, sizeof(retval64)); + } + + + // mode not defined + else { + ret = FAIL; + sprintf(mess, "Pattern mode index (%d) is not implemented for this detector\n", mode); + FILE_LOG(logERROR,(mess)); + return Server_SendResult(file_des, INT64, UPDATE, NULL, 0); + } } - - - int write_adc_register(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index c63e41f32..a34fd562a 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3503,7 +3503,7 @@ int multiSlsDetector::setCTBPatWaitAddr(int level, int addr, int detPos) { return sls::minusOneIfDifferent(r); } -int multiSlsDetector::setCTBPatWaitTime(int level, uint64_t t, int detPos) { +uint64_t multiSlsDetector::setCTBPatWaitTime(int level, uint64_t t, int detPos) { // single if (detPos >= 0) { return detectors[detPos]->setCTBPatWaitTime(level, t); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 094dd138a..836de2513 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1690,7 +1690,7 @@ class multiSlsDetector : public virtual slsDetectorDefs, * @param detPos -1 for all detectors in list or specific detector position * @returns actual value */ - int setCTBPatWaitTime(int level, uint64_t t = -1, int detPos = -1); + uint64_t setCTBPatWaitTime(int level, uint64_t t = -1, int detPos = -1); /** * Loads the detector setup from file diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index e46ac8fde..064344ba4 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -4776,7 +4776,7 @@ uint64_t slsDetector::setCTBWord(int addr, uint64_t word) { int mode = 0; // sets word uint64_t args[3] = {(uint64_t)mode, (uint64_t)addr, word}; uint64_t retval = -1; - FILE_LOG(logDEBUG1) << "Setting CTB word, addr: 0x" << std::hex << addr << ", word: 0x" << word << std::dec; + FILE_LOG(logINFO) << "Setting CTB word, addr: 0x" << std::hex << addr << ", word: 0x" << word << std::dec; if (thisDetector->onlineFlag == ONLINE_FLAG) { auto client = sls::ClientSocket(thisDetector->hostname, thisDetector->controlPort); @@ -4798,7 +4798,7 @@ int slsDetector::setCTBPatLoops(int level, int &start, int &stop, int &n) { int ret = FAIL; int mode = 1; // sets loop uint64_t args[5] = {(uint64_t)mode, (uint64_t)level, (uint64_t)start, (uint64_t)stop, (uint64_t)n}; - uint64_t retvals[3] = {0, 0, 0}; + int retvals[3] = {0, 0, 0}; FILE_LOG(logDEBUG1) << "Setting CTB Pat Loops, " "level: " << level << ", start: " << start << ", stop: " << stop << ", n: " << n; @@ -4823,11 +4823,11 @@ int slsDetector::setCTBPatLoops(int level, int &start, int &stop, int &n) { return ret; } -uint64_t slsDetector::setCTBPatWaitAddr(uint64_t level, uint64_t addr) { +int slsDetector::setCTBPatWaitAddr(uint64_t level, uint64_t addr) { int fnum = F_SET_CTB_PATTERN; int ret = FAIL; uint64_t mode = 2; // sets loop - uint64_t retval = -1; + int retval = -1; std::array args{mode, level, addr}; FILE_LOG(logDEBUG1) << "Setting CTB Wait Addr, " "level: "