Merge branch 'ctbBugFixes' into refactor

This commit is contained in:
maliakal_d 2019-02-21 16:24:56 +01:00
commit b2e6b78e20
19 changed files with 454 additions and 169 deletions

View File

@ -28,4 +28,4 @@ clean:
rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb

View File

@ -1,9 +1,9 @@
Path: slsDetectorPackage/slsDetectorServers/ctbDetectorServer
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repsitory UUID: c93f88b7e5afe231ec43c47d60278c6acdb520af
Revision: 19
Branch: refactor
Repsitory UUID: a4f1b7670f7a6e5bfae9f34f561350643eab6ca5
Revision: 23
Branch: ctbBugFixes
Last Changed Author: Dhanya_Thattil
Last Changed Rev: 4333
Last Changed Date: 2019-02-20 08:12:50.000000002 +0100 ./RegisterDefs.h
Last Changed Rev: 4340
Last Changed Date: 2019-02-21 11:22:00.000000002 +0100 ./Makefile

View File

@ -1,6 +1,6 @@
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
#define GITREPUUID "c93f88b7e5afe231ec43c47d60278c6acdb520af"
#define GITREPUUID "a4f1b7670f7a6e5bfae9f34f561350643eab6ca5"
#define GITAUTH "Dhanya_Thattil"
#define GITREV 0x4333
#define GITDATE 0x20190220
#define GITBRANCH "refactor"
#define GITREV 0x4340
#define GITDATE 0x20190221
#define GITBRANCH "ctbBugFixes"

View File

@ -523,6 +523,9 @@ void setupDetector() {
INA226_CalibrateCurrentRegister(I2C_POWER_VD_DEVICE_ID);
setVchip(VCHIP_MIN_MV);
// set vio to minimum for fpga to function
setPower(D_PWR_IO, VIO_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);
@ -967,6 +970,11 @@ int64_t getTimeLeft(enum timerIndex ind){
FILE_LOG(logINFO, ("Getting number of frames left: %lld\n",(long long int)retval));
break;
case FRAME_PERIOD:
retval = get64BitReg(PERIOD_LEFT_LSB_REG, PERIOD_LEFT_MSB_REG) / (1E-3 * clkDivider[ADC_CLK]);
FILE_LOG(logINFO, ("Getting period left: %lldns\n", (long long int)retval));
break;
case DELAY_AFTER_TRIGGER:
retval = get64BitReg(DELAY_LEFT_LSB_REG, DELAY_LEFT_MSB_REG) / (1E-3 * clkDivider[ADC_CLK]);
FILE_LOG(logINFO, ("Getting delay left: %lldns\n", (long long int)retval));
@ -1214,8 +1222,11 @@ int getADCIndexFromDACIndex(enum DACINDEX ind) {
}
}
int isPowerValid(int val) {
if (val != 0 && (val < POWER_RGLTR_MIN || val > POWER_RGLTR_MAX)) {
int isPowerValid(enum DACINDEX ind, int val) {
int min = (ind == D_PWR_IO) ? VIO_MIN_MV : POWER_RGLTR_MIN;
// not power_rgltr_max because it is allowed only upto vchip max - 200
if (val != 0 && (val != LTC2620_PWR_DOWN_VAL) && (val < min || val > (VCHIP_MAX_MV - VCHIP_POWER_INCRMNT))) {
return 0;
}
return 1;
@ -1280,8 +1291,9 @@ void setPower(enum DACINDEX ind, int val) {
FILE_LOG(logINFO, ("Setting Power to %d mV\n", val));
// validate value (already checked at tcp)
if (!isPowerValid(val)) {
FILE_LOG(logERROR, ("Invalid value of %d mV for Power %d. Is not between %d and %d mV\n", val, ind, POWER_RGLTR_MIN, POWER_RGLTR_MAX));
if (!isPowerValid(ind, val)) {
FILE_LOG(logERROR, ("Invalid value of %d mV for Power %d. Is not between %d and %d mV\n",
val, ind, (ind == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN), POWER_RGLTR_MAX));
return;
}
@ -1314,10 +1326,7 @@ void setPower(enum DACINDEX ind, int val) {
// convert it to dac (power off is anyway done with power enable)
if (val != LTC2620_PWR_DOWN_VAL) {
FILE_LOG(logDEBUG1, ("Convert Power of %d mV to dac units\n", val));
/*
val = (double)val * 0.95;
FILE_LOG(logDEBUG1, ("Convert new Power of %d mV to dac units\n", val));
*/
int dacval = -1;
// convert voltage to dac
if (ConvertToDifferentRange(POWER_RGLTR_MIN, POWER_RGLTR_MAX, LTC2620_MAX_VAL, LTC2620_MIN_VAL,
@ -1326,11 +1335,7 @@ void setPower(enum DACINDEX ind, int val) {
ind, val, POWER_RGLTR_MIN, vchip - VCHIP_POWER_INCRMNT));
return;
}
/*
if (dacval > LTC2620_MAX_VAL)
dacval = LTC2620_MAX_VAL;
FILE_LOG(logDEBUG1, ("Converted new dac val: %d\n", dacval));
*/
// set and power on/ update dac
FILE_LOG(logINFO, ("Setting P%d (DAC %d): %d dac (%d mV)\n", adcIndex, ind, dacval, val));
setDAC(ind, dacval, 0);
@ -1725,12 +1730,12 @@ uint64_t writePatternClkControl(uint64_t word) {
uint64_t readPatternWord(int addr) {
// error (handled in tcp)
if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
FILE_LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr %d. "
"Should be within %d\n", addr, MAX_PATTERN_LENGTH));
FILE_LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. "
"Should be within 0x%x\n", addr, MAX_PATTERN_LENGTH));
return -1;
}
FILE_LOG(logDEBUG1, ("Reading Pattern - Word (addr:%d)\n", addr));
FILE_LOG(logDEBUG1, ("Reading Pattern - Word (addr:0x%x)\n", addr));
uint32_t reg = PATTERN_CNTRL_REG;
// overwrite with only addr
@ -1739,13 +1744,13 @@ uint64_t readPatternWord(int addr) {
// set read strobe
bus_w(reg, bus_r(reg) | PATTERN_CNTRL_RD_MSK);
// read value
uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
FILE_LOG(logDEBUG1, ("Word(addr:%d): 0x%llx\n", addr, (long long int) retval));
// unset read strobe
bus_w(reg, bus_r(reg) & (~PATTERN_CNTRL_RD_MSK));
// read value
uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
FILE_LOG(logDEBUG1, ("Word(addr:0x%x): 0x%llx\n", addr, (long long int) retval));
return retval;
}
@ -1756,16 +1761,17 @@ uint64_t writePatternWord(int addr, uint64_t word) {
// error (handled in tcp)
if (addr < 0 || addr >= MAX_PATTERN_LENGTH) {
FILE_LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr %d. "
"Should be within %d\n", addr, MAX_PATTERN_LENGTH));
FILE_LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. "
"Should be within 0x%x\n", addr, MAX_PATTERN_LENGTH));
return -1;
}
FILE_LOG(logINFO, ("Setting Pattern - Word (addr:%d, word:0x%llx)\n", addr, (long long int) word));
FILE_LOG(logINFO, ("Setting Pattern - Word (addr:0x%x, word:0x%llx)\n", addr, (long long int) word));
uint32_t reg = PATTERN_CNTRL_REG;
// write word
set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG);
FILE_LOG(logDEBUG1, ("Wrote word. PatternIn Reg: 0x%llx\n", get64BitReg(PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG)));
// overwrite with only addr
bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK));
@ -1783,8 +1789,8 @@ int setPatternWaitAddress(int level, int addr) {
// error (handled in tcp)
if (addr >= (MAX_PATTERN_LENGTH + 1)) {
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid addr %d. "
"Should be within %d\n", addr, MAX_PATTERN_LENGTH + 1));
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid addr 0x%x. "
"Should be within 0x%x\n", addr, MAX_PATTERN_LENGTH + 1));
return -1;
}
@ -1809,20 +1815,20 @@ int setPatternWaitAddress(int level, int addr) {
mask = PATTERN_WAIT_2_ADDR_MSK;
break;
default:
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid level %d. "
FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid level 0x%x. "
"Should be between 0 and 2.\n", level));
return -1;
}
// set
if (addr >= 0) {
FILE_LOG(logINFO, ("Setting Pattern - Wait Address (level:%d, addr:%d)\n", level, addr));
FILE_LOG(logINFO, ("Setting Pattern - Wait Address (level:%d, addr:0x%x)\n", level, addr));
bus_w(reg, ((addr << offset) & mask));
}
// get
uint32_t regval = bus_r((reg & mask) >> offset);
FILE_LOG(logDEBUG1, ("Wait Address (level:%d, addr:%d)\n", level, regval));
FILE_LOG(logDEBUG1, ("Wait Address (level:%d, addr:0x%x)\n", level, regval));
return regval;
}
@ -1866,16 +1872,16 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
// level 0-2, addr upto patternlength + 1 (checked at tcp)
if ((level != -1) &&
(*startAddr >= 0 || *stopAddr > (MAX_PATTERN_LENGTH + 1))) {
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, level:%d, startaddr:%d, stopaddr:%d). "
"Addr must be less than %d\n",
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, level:%d, startaddr:0x%x, stopaddr:0x%x). "
"Addr must be less than 0x%x\n",
level, *startAddr, *stopAddr, MAX_PATTERN_LENGTH + 1));
}
//level -1, addr upto patternlength (checked at tcp)
else if ((level == -1) &&
(*startAddr >= 0 || *stopAddr > MAX_PATTERN_LENGTH)) {
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, complete pattern, stopaddr:%d). "
"Addr must be less than %d\n",
FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, complete pattern, stopaddr:0x%x). "
"Addr must be less than 0x%x\n",
*startAddr, *stopAddr, MAX_PATTERN_LENGTH));
}
@ -1939,17 +1945,17 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) {
// set start and stop addr
if (*startAddr == -1) {
*startAddr = ((bus_r(addr) >> startOffset) & startMask);
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop Start Address (level:%d, startAddr:%d was -1)\n",
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop Start Address (level:%d, startAddr:0x%x was -1)\n",
level, *startAddr));
}
if (*stopAddr == -1) {
*stopAddr = ((bus_r(addr) >> stopOffset) & stopMask);
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop Stop Address (level:%d, stopAddr:%d, was -1)\n",
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop Stop Address (level:%d, stopAddr:0x%x, was -1)\n",
level, *stopAddr));
}
// writing start and stop addr
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, startaddr:%d, stopaddr:%d)\n",
FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n",
level, *startAddr, *stopAddr));
bus_w(addr, ((*startAddr << startOffset) & startMask) | ((*stopAddr << stopOffset) & stopMask));
}

View File

@ -69,11 +69,12 @@ enum DACINDEX {D0, D1, D2, D3, D4, D5, D6, D7, D8, D9,
#define HIGHVOLTAGE_MAX (200) // min dac val
#define DAC_MIN_MV (0)
#define DAC_MAX_MV (2500)
#define VCHIP_MIN_MV (1700)
#define VCHIP_MAX_MV (2700) // min dac val
#define POWER_RGLTR_MIN (600)
#define POWER_RGLTR_MAX (2500) // min dac val
#define VCHIP_MIN_MV (1673)
#define VCHIP_MAX_MV (2668) // min dac val
#define POWER_RGLTR_MIN (636)
#define POWER_RGLTR_MAX (2638) // min dac val (not vchip-max) because of dac conversions
#define VCHIP_POWER_INCRMNT (200)
#define VIO_MIN_MV (1200) // for fpga to function
/* Defines in the Firmware */
#define WAIT_TME_US_FR_LK_AT_ME_REG (100) // wait time in us after acquisition done to ensure there is no data in fifo

View File

@ -1,6 +1,7 @@
#pragma once
#include "I2C.h"
#include "math.h"
/**
* To be defined in
@ -52,6 +53,9 @@
#define INA226_getConvertedCurrentUnits(shuntV, calibReg) ((double)shuntV * (double)calibReg / (double)2048)
double INA226_Shunt_Resistor_Ohm = 0.0;
int INA226_Calibration_Register_Value = 0;
#define INA226_CALIBRATION_CURRENT_TOLERANCE (1.2268)
/**
@ -84,7 +88,11 @@ void INA226_CalibrateCurrentRegister(uint32_t deviceId) {
FILE_LOG(logINFO, ("Calibrating Current Register for Device ID: 0x%x\n", deviceId));
// get calibration value based on shunt resistor
uint16_t calVal = ((uint16_t)INA226_getCalibrationValue(INA226_Shunt_Resistor_Ohm)) & INA226_CALIBRATION_MSK;
FILE_LOG(logINFO, ("\tWriting to Calibration reg: 0x%0x\n", calVal));
FILE_LOG(logINFO, ("\tCalculated calibration reg value: 0x%0x (%d)\n", calVal, calVal));
calVal = ((double)calVal / INA226_CALIBRATION_CURRENT_TOLERANCE) + 0.5;
FILE_LOG(logINFO, ("\tRealculated (for tolerance) calibration reg value: 0x%0x (%d)\n", calVal, calVal));
INA226_Calibration_Register_Value = calVal;
// calibrate current register
I2C_Write(deviceId, INA226_CALIBRATION_REG, calVal);
@ -132,71 +140,38 @@ int INA226_ReadCurrent(uint32_t deviceId) {
// read shunt voltage register
FILE_LOG(logDEBUG1, (" Reading shunt voltage reg\n"));
uint32_t shuntVoltageRegVal = I2C_Read(deviceId, INA226_SHUNT_VOLTAGE_REG);
FILE_LOG(logDEBUG1, (" shunt voltage reg: 0x%x\n", shuntVoltageRegVal));
FILE_LOG(logDEBUG1, (" shunt voltage reg: %d\n", shuntVoltageRegVal));
// read it once more as this error has occured once
if (shuntVoltageRegVal == 0xFFFF) {
FILE_LOG(logDEBUG1, (" Reading shunt voltage reg again\n"));
shuntVoltageRegVal = I2C_Read(deviceId, INA226_SHUNT_VOLTAGE_REG);
FILE_LOG(logDEBUG1, (" shunt voltage reg: 0x%x\n", shuntVoltageRegVal));
FILE_LOG(logDEBUG1, (" shunt voltage reg: %d\n", shuntVoltageRegVal));
}
// get absolute value and if negative
int negative = (shuntVoltageRegVal & INA226_SHUNT_NEGATIVE_MSK) ? 1: 0;
int shuntabsnV = shuntVoltageRegVal & INA226_SHUNT_ABS_VALUE_MSK;
FILE_LOG(logDEBUG1, (" negative: %d, absolute: 0x%x\n", negative, shuntabsnV));
// negative, convert absolute to 2s complement
if (negative) {
shuntabsnV = ((~shuntabsnV) + 1);
FILE_LOG(logDEBUG1, (" new absolute for negative (2's comple): 0x%x\n", shuntabsnV));
}
// calculate shunt voltage
int shuntVoltagenV = 0;
ConvertToDifferentRange(0, INA226_SHUNT_VOLTAGE_MX_STPS,
INA226_SHUNT_VOLTAGE_VMIN_NV, INA226_SHUNT_VOLTAGE_VMAX_NV,
shuntabsnV, &shuntVoltagenV);
// if negative, put the sign
if (negative)
shuntVoltagenV = -(shuntVoltagenV);
FILE_LOG(logDEBUG1, (" shunt voltage: %d nV\n", shuntVoltagenV));
int shuntVoltageUV = shuntVoltagenV / 1000;
FILE_LOG(logDEBUG1, (" shunt voltage: %d uV\n\n", shuntVoltageUV));
// read calibration register
FILE_LOG(logDEBUG1, (" Reading calibration reg\n"));
uint32_t calibrationRegVal = I2C_Read(deviceId, INA226_CALIBRATION_REG);
FILE_LOG(logDEBUG1, (" calibration reg: 0x%08x\n\n", calibrationRegVal));
// read it once more as this error has occured once
if (calibrationRegVal == 0xFFFF) {
FILE_LOG(logDEBUG1, (" Reading calibration reg again\n"));
calibrationRegVal = I2C_Read(deviceId, INA226_CALIBRATION_REG);
FILE_LOG(logDEBUG1, (" calibration reg: 0x%x\n", calibrationRegVal));
}
// value for current
int retval = INA226_getConvertedCurrentUnits(shuntVoltageUV, calibrationRegVal);
int retval = INA226_getConvertedCurrentUnits(shuntVoltageRegVal, INA226_Calibration_Register_Value);
FILE_LOG(logDEBUG1, (" current unit value: %d\n", retval));
FILE_LOG(logDEBUG1, (" To TEST: should be same as curent unit value\n"
" Reading current reg\n"));
// reading directly the current reg
FILE_LOG(logDEBUG1, (" Reading current reg\n"));
int cuurentRegVal = I2C_Read(deviceId, INA226_CURRENT_REG);
FILE_LOG(logDEBUG1, (" current reg: 0x%x\n", cuurentRegVal));
FILE_LOG(logDEBUG1, (" current reg: %d\n", cuurentRegVal));
// read it once more as this error has occured once
if (cuurentRegVal >= 0xFFF0) {
FILE_LOG(logDEBUG1, (" Reading current reg again\n"));
cuurentRegVal = I2C_Read(deviceId, INA226_CURRENT_REG);
FILE_LOG(logDEBUG1, (" current reg: 0x%x\n", cuurentRegVal));
FILE_LOG(logDEBUG1, (" current reg: %d\n", cuurentRegVal));
}
// should be the same
FILE_LOG(logDEBUG1, (" ===============current reg: %d, current unit cal:%d=================================\n", cuurentRegVal, retval));
// current in uA
int currentuA = retval * INA226_CURRENT_IMIN_UA;
int currentuA = cuurentRegVal * INA226_CURRENT_IMIN_UA;
FILE_LOG(logDEBUG1, (" current: %d uA\n", currentuA));
// current in mA
int currentmA = currentuA / 1000;
int currentmA = (currentuA / 1000.00) + 0.5;
FILE_LOG(logDEBUG1, (" current: %d mA\n", currentmA));
FILE_LOG(logINFO, ("Current via I2C (Device: 0x%x): %d mA\n", deviceId, currentmA));

View File

@ -200,12 +200,14 @@ void LTC2620_SetDaisy(int cmd, int data, int dacaddr, int chipIndex) {
*/
void LTC2620_Set(int cmd, int data, int dacaddr, int chipIndex) {
FILE_LOG(logDEBUG1, ("cmd:0x%x, data:%d, dacaddr:%d, chipIndex:%d\n", cmd, data, dacaddr, chipIndex));
FILE_LOG(logDEBUG1, (" ================================================\n"));
// ctb
if (LTC2620_Ndac > LTC2620_NUMCHANNELS)
LTC2620_SetDaisy(cmd, data, dacaddr, chipIndex);
// others
else
LTC2620_SetSingle(cmd, data, dacaddr);
FILE_LOG(logDEBUG1, (" ================================================\n"));
}

View File

@ -38,7 +38,7 @@ int ConvertToDifferentRange(int inputMin, int inputMax, int outputMin, int outpu
}
*outputValue = value;
FILE_LOG(logDEBUG1, (" Converted Ouput Value: %d\n", *outputValue));
FILE_LOG(logDEBUG1, (" Converted Output Value: %d\n", *outputValue));
return OK;
}

View File

@ -178,7 +178,7 @@ void setVchip(int val);
int getVChipToSet(enum DACINDEX ind, int val);
int getDACIndexFromADCIndex(enum ADCINDEX ind);
int getADCIndexFromDACIndex(enum DACINDEX ind);
int isPowerValid(int val);
int isPowerValid(enum DACINDEX ind, int val);
int getPower();
void setPower(enum DACINDEX ind, int val);
void powerOff();

View File

@ -63,7 +63,7 @@ int main(int argc, char *argv[]){
FILE_LOG(logINFO, ("Detected phase shift of %d\n", phaseShift));
}
#endif
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD)
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
else if(!strcasecmp(argv[i],"-update")){
FILE_LOG(logINFO, ("Detected update mode\n"));
debugflag = PROGRAMMING_MODE;

View File

@ -63,7 +63,7 @@ void init_detector() {
#endif
if (isControlServer) {
basictests();
#ifdef JUNGFRAUD
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
if (debugflag != PROGRAMMING_MODE)
#endif
initControlServer();
@ -91,7 +91,7 @@ int decode_function(int file_des) {
FILE_LOG(logDEBUG3, ("Received %d bytes\n", n ));
// jungfrau in programming mode
#ifdef JUNGFRAUD
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
if ((debugflag == PROGRAMMING_MODE) &&
(fnum != F_PROGRAM_FPGA) &&
(fnum != F_GET_DETECTOR_TYPE) &&
@ -501,7 +501,7 @@ int get_id(int file_des) {
// get
switch (arg) {
#if defined(EIGERD) || defined(JUNGFRAUD)
#ifndef GOTTHARDD
case SOFTWARE_FIRMWARE_API_VERSION:
case DETECTOR_SERIAL_NUMBER:
#endif
@ -800,9 +800,10 @@ int set_dac(int file_des) {
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)) {
} else if (!isPowerValid(serverDacIndex, 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);
sprintf(mess,"Could not set power. Power regulator %d should be between %d and %d mV\n",
ind, (serverDacIndex == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN), (VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
FILE_LOG(logERROR,(mess));
} else {
setPower(serverDacIndex, val);
@ -817,6 +818,10 @@ int set_dac(int file_des) {
case V_POWER_CHIP:
if (val >= 0) {
ret = FAIL;
sprintf(mess,"Can not set Vchip. Can only be set automatically in the background (+200mV from highest power regulator voltage).\n");
FILE_LOG(logERROR,(mess));
/* restrict users from setting vchip
if (!mV) {
ret = FAIL;
sprintf(mess,"Could not set Vchip. Should be in mV and not dac units.\n");
@ -828,6 +833,7 @@ int set_dac(int file_des) {
} else {
setVchip(val);
}
*/
}
retval = getVchip();
FILE_LOG(logDEBUG1, ("Vchip: %d\n", retval));
@ -1550,7 +1556,7 @@ int set_timer(int file_des) {
case FRAME_PERIOD:
case CYCLES_NUMBER:
case SAMPLES:
#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
#ifndef EIGERD
case DELAY_AFTER_TRIGGER:
#endif
retval = setTimer(ind, tns);
@ -1695,6 +1701,7 @@ int get_time_left(int file_des) {
case ACTUAL_TIME:
case MEASUREMENT_TIME:
case FRAME_NUMBER:
case FRAME_PERIOD:
case DELAY_AFTER_TRIGGER:
case CYCLES_NUMBER:
#elif MOENCHD
@ -1703,6 +1710,7 @@ int get_time_left(int file_des) {
case ACTUAL_TIME:
case MEASUREMENT_TIME:
case FRAME_NUMBER:
case FRAME_PERIOD:
case DELAY_AFTER_TRIGGER:
case CYCLES_NUMBER:
#endif
@ -1795,7 +1803,7 @@ int set_readout_flags(int file_des) {
return printSocketReadError();
FILE_LOG(logDEBUG1, ("Setting readout flags to %d\n", arg));
#ifndef EIGERD
#if defined(JUNGFRAUD) || defined(GOTTHARDD)
functionNotImplemented();
#else
// set & get
@ -1809,6 +1817,11 @@ int set_readout_flags(int file_des) {
case SAFE:
case SHOW_OVERFLOW:
case NOOVERFLOW:
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
case NORMAL_READOUT:
case DIGITAL_ONLY:
case ANALOG_AND_DIGITAL:
#endif
retval = setReadOutFlags(arg);
FILE_LOG(logDEBUG1, ("Read out flags: 0x%x\n", retval));
validate((int)arg, (int)(retval & arg), "set readout flag", HEX);
@ -1868,7 +1881,7 @@ int set_roi(int file_des) {
}
}
#if !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD)
#if defined(JUNGFRAUD) || defined(EIGERD)
functionNotImplemented();
#else
// set & get
@ -2083,7 +2096,7 @@ int set_port(int file_des) {
int update_client(int file_des) {
ret = FORCE_UPDATE;
memset(mess, 0, sizeof(mess));
#ifdef JUNGFRAUD
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
if (debugflag == PROGRAMMING_MODE) {
ret = OK;
}
@ -2114,9 +2127,11 @@ int send_update(int file_des) {
n = sendData(file_des,&i32,sizeof(i32),INT32);
if (n < 0) return printSocketReadError();
#if defined(EIGERD) || defined(JUNGFRAUD) || defined(GOTTHARDD)
i32 = (int)getSettings();
n = sendData(file_des,&i32,sizeof(i32),INT32);
if (n < 0) return printSocketReadError();
#endif
#ifdef EIGERD
i32 = getThresholdEnergy(GET_FLAG);
@ -2128,7 +2143,7 @@ int send_update(int file_des) {
n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError();
#ifndef CHIPTESTBOARDD
#if defined(EIGERD) || defined(JUNGFRAUD) || defined(GOTTHARDD)
i64 = setTimer(ACQUISITION_TIME,GET_FLAG);
n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError();
@ -2158,16 +2173,18 @@ int send_update(int file_des) {
n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError();
#ifdef CHIPTESTBOARDD
i64 = setTimer(SAMPLES,GET_FLAG);
n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError();
#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
i32 = setReadOutFlags(GET_READOUT_FLAGS);
n = sendData(file_des,&i32,sizeof(i32),INT32);
if (n < 0) return printSocketReadError();
#endif
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
i64 = setTimer(SAMPLES,GET_FLAG);
n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError();
#endif
if (lockStatus == 0) {
strcpy(lastClientIP,thisClientIP);
}
@ -2524,13 +2541,14 @@ int set_ctb_pattern(int file_des) {
#else
int addr = (int)args[0];
uint64_t word = args[1];
FILE_LOG(logDEBUG1, ("addr:0x%x word:0x%llx\n", addr, 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",
sprintf(mess, "Cannot set Pattern (Word, addr:0x%x). Addr must be less than 0x%x\n",
addr, MAX_PATTERN_LENGTH);
FILE_LOG(logERROR, (mess));
} else {
@ -2580,6 +2598,7 @@ int set_ctb_pattern(int file_des) {
int startAddr = (int)args[1];
int stopAddr = (int)args[2];
int numLoops = (int)args[3];
FILE_LOG(logDEBUG1, ("loopLevel:%d startAddr:0x%x stopAddr:0x%x numLoops:%d word:0x%llx\n", loopLevel, startAddr, stopAddr, numLoops));
if (loopLevel < -1 || loopLevel > 2) { // -1 complete pattern
ret = FAIL;
@ -2590,8 +2609,8 @@ int set_ctb_pattern(int file_des) {
// 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",
sprintf(mess, "Cannot set Pattern (Pattern Loop, level:%d, startaddr:0x%x, stopaddr:0x%x). "
"Addr must be less than 0x%x\n",
loopLevel, startAddr, stopAddr, MAX_PATTERN_LENGTH + 1);
FILE_LOG(logERROR, (mess));
}
@ -2599,8 +2618,8 @@ int set_ctb_pattern(int file_des) {
//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",
sprintf(mess, "Cannot set Pattern (Pattern Loop, complete pattern, startaddr:0x%x, stopaddr:0x%x). "
"Addr must be less than 0x%x\n",
startAddr, stopAddr, MAX_PATTERN_LENGTH);
FILE_LOG(logERROR, (mess));
}
@ -2618,7 +2637,7 @@ int set_ctb_pattern(int file_des) {
// mode 2: wait address
else if (mode == 1) {
else if (mode == 2) {
// receive arguments
uint64_t args[2] = {-1, -1};
if (receiveData(file_des, args, sizeof(args), INT64) < 0)
@ -2631,15 +2650,16 @@ int set_ctb_pattern(int file_des) {
#else
int loopLevel = (int)args[0];
int addr = (int)args[1];
FILE_LOG(logDEBUG1, ("loopLevel:%d addr:0x%x\n", loopLevel, addr));
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);
sprintf(mess, "Pattern (Wait Address) Level (0x%x) 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",
sprintf(mess, "Cannot set Pattern (Wait Address, addr:0x%x). Addr must be less than 0x%x\n",
addr, MAX_PATTERN_LENGTH + 1);
FILE_LOG(logERROR, (mess));
} else {
@ -2660,7 +2680,7 @@ int set_ctb_pattern(int file_des) {
// mode 3: wait time
else if (mode == 1) {
else if (mode == 3) {
// receive arguments
uint64_t args[2] = {-1, -1};
if (receiveData(file_des, args, sizeof(args), INT64) < 0)
@ -2671,8 +2691,9 @@ int set_ctb_pattern(int file_des) {
functionNotImplemented();
return Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
#else
int loopLevel = (int)args[1];
uint64_t timeval = (int)args[2];
int loopLevel = (int)args[0];
uint64_t timeval = args[1];
FILE_LOG(logDEBUG1, ("loopLevel:%d timeval:0x%lld\n", loopLevel, timeval));
if ((timeval == -1) || (Server_VerifyLock() == OK)) {
if (loopLevel < 0 || loopLevel > 2) {
@ -2684,9 +2705,9 @@ int set_ctb_pattern(int file_des) {
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));
FILE_LOG(logDEBUG1, ("Setting %s to 0x%lld\n", tempName, (long long int)timeval));
retval64 = setPatternWaitTime(loopLevel, timeval);
FILE_LOG(logDEBUG1, ("%s: 0x%llx\n", tempName, (long long int)retval64));
FILE_LOG(logDEBUG1, ("%s: 0x%lld\n", tempName, (long long int)retval64));
validate64(timeval, retval64, tempName, HEX);
}
}
@ -2721,7 +2742,7 @@ int write_adc_register(int file_des) {
#ifndef VIRTUAL
// only set
if (Server_VerifyLock() == OK) {
#ifdef JUNGFRAUD
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD)
AD9257_Set(addr, val);
#elif GOTTHARDD
if (getBoardRevision() == 1) {
@ -2985,7 +3006,7 @@ int program_fpga(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
#ifndef JUNGFRAUD
#if defined(EIGERD) || defined(GOTTHARDD)
//to receive any arguments
int n = 1;
while (n > 0)
@ -3078,7 +3099,7 @@ int program_fpga(int file_des) {
}
}
printf("\n");
FILE_LOG(logINFO, ("Done copying program\n"));
FILE_LOG(logINFO, ("Done copying program or due to failure earlier\n"));
// closing file pointer to flash and informing FPGA
stopWritingFPGAprogram(fp);
@ -3091,7 +3112,7 @@ int program_fpga(int file_des) {
FILE_LOG(logDEBUG1, ("Done with program receiving command\n"));
if (isControlServer) {
if (ret != FAIL && isControlServer) {
basictests();
initControlServer();
}
@ -3111,7 +3132,7 @@ int reset_fpga(int file_des) {
memset(mess, 0, sizeof(mess));
FILE_LOG(logDEBUG1, ("Reset FPGA\n"));
#ifndef JUNGFRAUD
#if defined(EIGERD) || defined(GOTTHARDD)
functionNotImplemented();
#else
// only set

View File

@ -1955,6 +1955,53 @@ std::string multiSlsDetector::getAdditionalJsonParameter(const std::string &key,
return sls::concatenateIfDifferent(r);
}
int multiSlsDetector::setDetectorMinMaxEnergyThreshold(const int index, int value, int detPos) {
std::string parameter = (index ? "emax" : "emin");
std::string result;
if (value < 0) {
result = getAdditionalJsonParameter(parameter, detPos);
} else {
result = setAdditionalJsonParameter(parameter, std::to_string(value), detPos);
}
// convert to integer
try {
return stoi(result);
}
// not found or cannot scan integer
catch(...) {
return -1;
}
}
int multiSlsDetector::setFrameMode(frameModeType value, int detPos) {
std::string parameter = "frameMode";
std::string result;
if (value == GET_FRAME_MODE) {
result = getAdditionalJsonParameter(parameter, detPos);
} else {
result = setAdditionalJsonParameter(parameter, getFrameModeType(value), detPos);
}
return getFrameModeType(result);
}
int multiSlsDetector::setDetectorMode(detectorModeType value, int detPos) {
std::string parameter = "detectorMode";
std::string result;
if (value == GET_DETECTOR_MODE) {
result = getAdditionalJsonParameter(parameter, detPos);
} else {
result = setAdditionalJsonParameter(parameter, getDetectorModeType(value), detPos);
}
return getDetectorModeType(result);
}
int multiSlsDetector::setReceiverUDPSocketBufferSize(int udpsockbufsize, int detPos) {
// single
if (detPos >= 0) {

View File

@ -1087,6 +1087,30 @@ class multiSlsDetector : public virtual slsDetectorDefs,
*/
std::string getAdditionalJsonParameter(const std::string& key, int detPos = -1);
/**
* Sets the detector minimum/maximum energy threshold in processor (for Moench only)
* @param index 0 for emin, antyhing else for emax
* @param v value to set (-1 gets)
* @returns detector minimum/maximum energy threshold (-1 for not found or error in computing json parameter value)
*/
int setDetectorMinMaxEnergyThreshold(const int index, int value, int detPos = -1);
/**
* Sets the frame mode in processor (Moench only)
* @param value frameModeType (-1 gets)
* @param detPos -1 for all detectors in list or specific detector position
* @returns frame mode (-1 for not found or error in computing json parameter value)
*/
int setFrameMode(frameModeType value, int detPos = -1);
/**
* Sets the detector mode in processor (Moench only)
* @param value detectorModetype (-1 gets)
* @param detPos -1 for all detectors in list or specific detector position
* @returns detector mode (-1 for not found or error in computing json parameter value)
*/
int setDetectorMode(detectorModeType value, int detPos = -1);
/**
* Sets the receiver UDP socket buffer size
* @param udpsockbufsize additional json header

View File

@ -84,6 +84,9 @@ int slsDetector::checkDetectorVersionCompatibility() {
case CHIPTESTBOARD:
arg = APICTB;
break;
case MOENCH:
arg = APIMOENCH;
break;
default:
FILE_LOG(logERROR) << "Check version compatibility is not implemented for this detector";
setErrorMask((getErrorMask()) | (VERSION_COMPATIBILITY));
@ -290,6 +293,7 @@ void slsDetector::setDetectorSpecificParameters(detectorType type, detParameterL
list.nGappixelsY = 0;
break;
case CHIPTESTBOARD:
case MOENCH:
list.nChanX = 36;
list.nChanY = 1;
list.nChipX = 1;
@ -420,6 +424,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
thisDetector->receiver_framesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
break;
case CHIPTESTBOARD:
case MOENCH:
thisDetector->receiver_framesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
break;
default:
@ -455,7 +460,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
thisDetector->dynamicRange / 8;
// special for jctb
if (thisDetector->myDetectorType == CHIPTESTBOARD) {
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
getTotalNumberOfChannels();
}
@ -735,7 +740,7 @@ std::string slsDetector::getDetectorTypeAsString() {
int slsDetector::getTotalNumberOfChannels() {
FILE_LOG(logDEBUG1) << "Get total number of channels";
if (thisDetector->myDetectorType == CHIPTESTBOARD) {
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
if (thisDetector->roFlags & DIGITAL_ONLY) {
thisDetector->nChan[X] = 4;
} else if (thisDetector->roFlags & ANALOG_AND_DIGITAL) {
@ -1033,28 +1038,37 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) {
n += client.receiveData(lastClientIP, sizeof(lastClientIP));
FILE_LOG(logDEBUG1) << "Updating detector last modified by " << lastClientIP;
// dr
n += client.receiveData(&i32, sizeof(i32));
thisDetector->dynamicRange = i32;
// databytes
n += client.receiveData(&i32, sizeof(i32));
thisDetector->dataBytes = i32;
n += client.receiveData(&i32, sizeof(i32));
thisDetector->currentSettings = (detectorSettings)i32;
// settings
if ((thisDetector->myDetectorType != CHIPTESTBOARD) && (thisDetector->myDetectorType != MOENCH)) {
n += client.receiveData(&i32, sizeof(i32));
thisDetector->currentSettings = (detectorSettings)i32;
}
// threshold
if (thisDetector->myDetectorType == EIGER) {
n += client.receiveData(&i32, sizeof(i32));
thisDetector->currentThresholdEV = i32;
}
// frame number
n += client.receiveData(&i64, sizeof(i64));
thisDetector->timerValue[FRAME_NUMBER] = i64;
if (thisDetector->myDetectorType != CHIPTESTBOARD) {
// exptime
if ((thisDetector->myDetectorType != CHIPTESTBOARD) && (thisDetector->myDetectorType != MOENCH)) {
n += client.receiveData(&i64, sizeof(i64));
thisDetector->timerValue[ACQUISITION_TIME] = i64;
}
// subexptime, subdeadtime
if (thisDetector->myDetectorType == EIGER) {
n += client.receiveData(&i64, sizeof(i64));
thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME] = i64;
@ -1063,29 +1077,37 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) {
thisDetector->timerValue[SUBFRAME_DEADTIME] = i64;
}
// period
n += client.receiveData(&i64, sizeof(i64));
thisDetector->timerValue[FRAME_PERIOD] = i64;
// delay
if (thisDetector->myDetectorType != EIGER) {
n += client.receiveData(&i64, sizeof(i64));
thisDetector->timerValue[DELAY_AFTER_TRIGGER] = i64;
}
// cycles
n += client.receiveData(&i64, sizeof(i64));
thisDetector->timerValue[CYCLES_NUMBER] = i64;
if (thisDetector->myDetectorType == CHIPTESTBOARD) {
// readout flags
if (thisDetector->myDetectorType == EIGER ||
thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
n += client.receiveData(&i32, sizeof(i32));
thisDetector->roFlags = (readOutFlags)i32;
}
// samples
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
n += client.receiveData(&i64, sizeof(i64));
if (i64 >= 0) {
thisDetector->timerValue[SAMPLES] = i64;
}
n += client.receiveData(&i32, sizeof(i32));
thisDetector->roFlags = (readOutFlags)i32;
getTotalNumberOfChannels();
}
if (!n) {
FILE_LOG(logERROR) << "Could not update detector, received 0 bytes";
}
@ -1170,6 +1192,10 @@ int slsDetector::writeConfigurationFile(std::ofstream &outfile, multiSlsDetector
case CHIPTESTBOARD:
names.emplace_back("vhighvoltage");
break;
case MOENCH:
names.emplace_back("powerchip");
names.emplace_back("vhighvoltage");
break;
default:
FILE_LOG(logERROR) << "Unknown detector type " << thisDetector->myDetectorType;
setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE));
@ -2032,7 +2058,7 @@ int slsDetector::setDynamicRange(int n) {
(thisDetector->nChip[Y] * thisDetector->nChan[Y] +
thisDetector->gappixels * thisDetector->nGappixels[Y]) *
retval / 8;
if (thisDetector->myDetectorType == CHIPTESTBOARD) {
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
getTotalNumberOfChannels();
}
FILE_LOG(logDEBUG1) << "Data bytes " << thisDetector->dataBytes;
@ -2366,7 +2392,7 @@ std::string slsDetector::setReceiver(const std::string &receiverIP) {
thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]);
setTimer(SUBFRAME_DEADTIME, thisDetector->timerValue[SUBFRAME_DEADTIME]);
}
if (thisDetector->myDetectorType == CHIPTESTBOARD) {
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]);
}
setDynamicRange(thisDetector->dynamicRange);
@ -3015,7 +3041,7 @@ int slsDetector::setROI(int n, ROI roiLimits[]) {
int ret = sendROI(n, roiLimits);
if(ret==FAIL)
setErrorMask((getErrorMask())|(COULDNOT_SET_ROI));
if (thisDetector->myDetectorType == CHIPTESTBOARD) {
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
getTotalNumberOfChannels();
}
return ret;
@ -3024,7 +3050,7 @@ int slsDetector::setROI(int n, ROI roiLimits[]) {
slsDetectorDefs::ROI *slsDetector::getROI(int &n) {
sendROI(-1, nullptr);
n = thisDetector->nROI;
if (thisDetector->myDetectorType == CHIPTESTBOARD) {
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
getTotalNumberOfChannels();
}
return thisDetector->roiLimits;
@ -3482,7 +3508,8 @@ int slsDetector::setStoragecellStart(int pos) {
int slsDetector::programFPGA(const std::string &fname) {
// only jungfrau implemented (client processing, so check now)
if (thisDetector->myDetectorType != JUNGFRAU && thisDetector->myDetectorType != CHIPTESTBOARD) {
if (thisDetector->myDetectorType != JUNGFRAU &&
thisDetector->myDetectorType != CHIPTESTBOARD && thisDetector->myDetectorType != MOENCH) {
FILE_LOG(logERROR) << "Not implemented for this detector";
setErrorMask((getErrorMask()) | (PROGRAMMING_ERROR));
return FAIL;
@ -3511,7 +3538,7 @@ int slsDetector::programFPGA(const std::string &fname) {
}
// create temp destination file
char destfname[] = "/tmp/Jungfrau_MCB.XXXXXX";
char destfname[] = "/tmp/SLS_DET_MCB.XXXXXX";
int dst = mkstemp(destfname); // create temporary file and open it in r/w
if (dst == -1) {
FILE_LOG(logERROR) << "Could not create destination file in /tmp for programming: " << destfname;
@ -4865,7 +4892,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(logINFO) << "Setting CTB word, addr: 0x" << std::hex << addr << ", word: 0x" << word << std::dec;
FILE_LOG(logDEBUG1) << "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);

View File

@ -63,7 +63,7 @@ The commands are sudivided into different pages depending on their functionaliti
- \ref output "Output": commands to define output file destination and format
- \ref network "Network": commands to setup the network between client, detector and receiver
- \ref receiver "Receiver": commands to configure the receiver
- \ref prototype "Prototype (Chip Test Board / Moench)": commands specific for the chiptest board or moench
- \ref prototype "Chip Test Board / Moench": commands specific for the chiptest board or moench
- \ref test "Developer": commands to be used only for software debugging. Avoid using them!
*/
@ -1196,7 +1196,7 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
++i;
/*! \page settings
- <b>v_io [i] mv</b> Sets/gets value for Vio on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"])
- <b>v_io [i] mv</b> Sets/gets value for Vio on the new chiptest board. Must be in mV. It should be minimum 1200 mV and must be the first power regulator to be set after server start up (fpga reset). To change again, reset fpga first. \c Returns \c (int ["mV"])
*/
descrToFuncMap[i].m_pFuncName = "v_io"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdDAC;
@ -1796,10 +1796,37 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
/* pattern generator */
/*! \page prototype Protoype (Chip Test Board / Moench)
/*! \page prototype Chip Test Board / Moench
Commands specific for the chiptest board or moench
*/
/*! \page prototype
- <b>emin [i] </b> Sets/gets detector minimum energy threshold for Moench (soft setting in processor)
*/
descrToFuncMap[i].m_pFuncName = "emin"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdProcessor;
++i;
/*! \page prototype
- <b>emax [i] </b> Sets/gets detector maximum energy threshold for Moench (soft setting in processor)
*/
descrToFuncMap[i].m_pFuncName = "emax"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdProcessor;
++i;
/*! \page prototype
- <b>framemode [i] </b> Sets/gets frame mode for Moench (soft setting in processor). Options: pedestal, newpedestal, flatfield, newflatfield
*/
descrToFuncMap[i].m_pFuncName = "framemode"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdProcessor;
++i;
/*! \page prototype
- <b>detectormode [i] </b> Sets/gets detector mode for Moench (soft setting in processor). Options: counting, interpolating, analog
*/
descrToFuncMap[i].m_pFuncName = "detectormode"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdProcessor;
++i;
/*! \page prototype
- <b>adcinvert [mask]</b> Sets/gets ADC inversion mask (8 digits hex format)
@ -5443,3 +5470,62 @@ std::string slsDetectorCommand::cmdPulse(int narg, char *args[], int action, int
}
std::string slsDetectorCommand::helpProcessor(int action) {
std::ostringstream os;
if (action == PUT_ACTION || action == HELP_ACTION) {
os << "emin [n] \t Sets detector minimum energy threshold to x for Moench (soft setting in processor)" << std::endl;
os << "emax [n] \t Sets detector maximum energy threshold to x for Moench (soft setting in processor)" << std::endl;
os << "framemode [n] \t Sets frame mode for Moench (soft setting in processor). Options: pedestal, newpedestal, flatfield, newflatfield" << std::endl;
os << "detectormode [n] \t Sets detector mode for Moench (soft setting in processor). Options: counting, interpolating, analog" << std::endl;
}
if (action == GET_ACTION || action == HELP_ACTION) {
os << "emin [n] \t Gets detector minimum energy threshold to x for Moench (soft setting in processor)" << std::endl;
os << "emax [n] \t Gets detector maximum energy threshold to x for Moench (soft setting in processor)" << std::endl;
os << "framemode [n] \t Gets frame mode for Moench (soft setting in processor). Options: pedestal, newpedestal, flatfield, newflatfield" << std::endl;
os << "detectormode [n] \t Gets detector mode for Moench (soft setting in processor). Options: counting, interpolating, analog" << std::endl;
}
return os.str();
}
std::string slsDetectorCommand::cmdProcessor(int narg, char *args[], int action, int detPos) {
if (action == HELP_ACTION)
return helpProcessor(action);
myDet->setOnline(ONLINE_FLAG, detPos);
myDet->setReceiverOnline(ONLINE_FLAG, detPos);
if (cmd == "emin" || cmd == "emax") {
if (action == PUT_ACTION) {
int ival = -1;
if(!sscanf(args[1],"%d",&ival))
return std::string("cannot parse emin/emax value");
myDet->setDetectorMinMaxEnergyThreshold((cmd == "emin" ? 0 : 1), ival, detPos);
}
return std::to_string(myDet->setDetectorMinMaxEnergyThreshold(0, -1, detPos));
}
else if (cmd == "framemode") {
if (action == PUT_ACTION) {
frameModeType ival = getFrameModeType(args[1]);
if (ival == GET_FRAME_MODE)
return std::string("cannot parse frame mode value");
myDet->setFrameMode(ival, detPos);
}
return getFrameModeType(frameModeType(myDet->setFrameMode(GET_FRAME_MODE, detPos)));
}
else if (cmd == "detectorMode") {
if (action == PUT_ACTION) {
detectorModeType ival = getDetectorModeType(args[1]);
if (ival == GET_DETECTOR_MODE)
return std::string("cannot parse detector mode value");
myDet->setDetectorMode(ival, detPos);
}
return getDetectorModeType(detectorModeType(myDet->setDetectorMode(GET_DETECTOR_MODE, detPos)));
}
return std::string("unknown action");
}

View File

@ -79,7 +79,7 @@ class slsDetectorCommand : public virtual slsDetectorDefs {
static std::string helpReceiver(int action);
static std::string helpPattern(int action);
static std::string helpPulse(int action);
static std::string helpProcessor(int action);
@ -141,6 +141,7 @@ class slsDetectorCommand : public virtual slsDetectorDefs {
std::string cmdReceiver(int narg, char *args[], int action, int detPos = -1);
std::string cmdPattern(int narg, char *args[], int action, int detPos = -1);
std::string cmdPulse(int narg, char *args[], int action, int detPos = -1);
std::string cmdProcessor(int narg, char *args[], int action, int detPos = -1);
int numberOfCommands;
std::string cmd;

View File

@ -359,14 +359,19 @@ int slsDetectorUsers::setReceiverFramesPerFile(int f, int detPos) {
return detector.setReceiverFramesPerFile(f, detPos);
}
std::string slsDetectorUsers::setAdditionalJsonParameter(const std::string& key, const std::string& value, int detPos) {
return detector.setAdditionalJsonParameter(key, value, detPos);
int slsDetectorUsers::setDetectorMinMaxEnergyThreshold(const int index, int v, int detPos) {
return detector.setDetectorMinMaxEnergyThreshold(index, v, detPos);
}
std::string slsDetectorUsers::getAdditionalJsonParameter(const std::string& key, int detPos) {
return detector.getAdditionalJsonParameter(key, detPos);
int slsDetectorUsers::setFrameMode(int value, int detPos) {
return detector.setFrameMode(slsDetectorDefs::frameModeType(value), detPos);
}
int slsDetectorUsers::setDetectorMode(int value, int detPos) {
return detector.setDetectorMode(slsDetectorDefs::detectorModeType(value), detPos);
}
/************************************************************************
CALLBACKS & COMMAND LINE PARSING

View File

@ -769,24 +769,34 @@ public:
*/
int setReceiverFramesPerFile(int f = -1, int detPos = -1);
/**
* Sets the value for the additional json header parameter if found, else append it
* @param key additional json header parameter
* @param value additional json header parameter value (cannot be empty)
/**
* Sets the detector minimum/maximum energy threshold in processor (for Moench only)
* @param index 0 for emin, antyhing else for emax
* @param v value to set (-1 gets)
* @param detPos -1 for all detectors in list or specific detector position
* @returns the additional json header parameter value,
* empty if no parameter found in additional json header
*/
std::string setAdditionalJsonParameter(const std::string& key, const std::string& value, int detPos = -1);
* @returns detector minimum/maximum energy threshold
*/
int setDetectorMinMaxEnergyThreshold(const int index, int v, int detPos = -1);
/**
* Sets the frame mode in processor (Moench only)
* @param value frame mode value (-1 gets)
* Options (slsDetectorDefs::frameModeType)
* PEDESTAL, NEW_PEDESTAL, FLATFIELD, NEW_FLATFIELD
* @param detPos -1 for all detectors in list or specific detector position
* @returns frame mode (-1 for not found or error in computing json parameter value)
*/
int setFrameMode(int value, int detPos = -1);
/**
* Returns the additional json header parameter value
* @param key additional json header parameter
* Sets the detector mode in processor (Moench only)
* @param value detector mode value (-1 gets)
* Options (slsDetectorDefs::detectorModeType)
* COUNTING, INTERPOLATING, ANALOG
* @param detPos -1 for all detectors in list or specific detector position
* @returns the additional json header parameter value,
* empty if no parameter found in additional json header
* @returns detector mode (-1 for not found or error in computing json parameter value)
*/
std::string getAdditionalJsonParameter(const std::string& key, int detPos = -1);
int setDetectorMode(int value, int detPos = -1);
/************************************************************************

View File

@ -557,6 +557,28 @@ public:
};
/**
* frame mode for processor
*/
enum frameModeType {
GET_FRAME_MODE = -1,
PEDESTAL, /** < pedestal */
NEW_PEDESTAL, /** < new pedestal */
FLATFIELD, /** < flatfield */
NEW_FLATFIELD /** < new flatfield */
};
/**
* detector mode for processor
*/
enum detectorModeType {
GET_DETECTOR_MODE = -1,
COUNTING, /** < counting */
INTERPOLATING, /** < interpolating */
ANALOG /** < analog */
};
#ifdef __cplusplus
/** returns string from enabled/disabled
\param b true or false
@ -875,6 +897,64 @@ public:
}}; \
/**
* returns frameModeType as enum
* @param s pedestal, newpedestal, flatfield, newflatfield
* @returns PEDESTAL, NEW_PEDESTAL, FLATFIELD, NEW_FLATFIELD, GET_FRAME_MODE (if unknown)
*/
static frameModeType getFrameModeType(std::string s) { \
for (auto &c: s) \
c = std::tolower(c); \
if (s == "pedestal") return PEDESTAL; \
if (s == "newpedestal") return NEW_PEDESTAL; \
if (s == "flatfield") return FLATFIELD; \
if (s == "newflatfield")return NEW_FLATFIELD; \
return GET_FRAME_MODE; \
} \
/**
* returns frameModeType as string
* @param f PEDESTAL, NEW_PEDESTAL, FLATFIELD, NEW_FLATFIELD
* @return string pedestal, newpedestal, flatfield, newflatfield, unknown
*/
static std::string getFrameModeType(frameModeType f) { \
switch(f) { \
case PEDESTAL: return std::string("pedestal"); \
case NEW_PEDESTAL: return std::string("newPedestal"); \
case FLATFIELD: return std::string("flatfield"); \
case NEW_FLATFIELD: return std::string("newFlatfield"); \
default: return std::string("unknown"); \
} \
} \
/**
* returns detectorModeType as enum
* @param s counting, interpolating, analog
* @returns COUNTING, INTERPOLATING, ANALOG, GET_DETECTOR_MODE (if unknown)
*/
static detectorModeType getDetectorModeType(std::string s) { \
for (auto &c: s) \
c = std::tolower(c); \
if (s == "counting") return COUNTING; \
if (s == "interpolating") return INTERPOLATING; \
if (s == "analog") return ANALOG; \
return GET_DETECTOR_MODE; \
} \
/**
* returns frameModeType as string
* @param f COUNTING, INTERPOLATING, ANALOG
* @return string counting, interpolating, analog, unknown
*/
static std::string getDetectorModeType(detectorModeType f) { \
switch(f) { \
case COUNTING: return std::string("counting"); \
case INTERPOLATING: return std::string("interpolating"); \
case ANALOG: return std::string("analog"); \
default: return std::string("unknown"); \
} \
} \
#endif
#ifdef __cplusplus