From d7e2ab8ec4f3771821d7bcde1483d7eb2cbea333 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 8 Nov 2019 17:09:57 +0100 Subject: [PATCH] gotthard2: on chip dacs --- .../gotthard2DetectorServer/CMakeLists.txt | 1 + .../gotthard2DetectorServer/Makefile | 2 +- .../bin/gotthard2DetectorServer_developer | Bin 134900 -> 139392 bytes .../slsDetectorFunctionList.c | 59 +++++++- .../slsDetectorServer_defs.h | 24 ++- .../include/slsDetectorFunctionList.h | 7 + .../include/slsDetectorServer_funcs.h | 4 +- .../slsDetectorServer/src/DAC6571.c | 2 +- .../slsDetectorServer/src/LTC2620_Driver.c | 2 +- .../src/slsDetectorServer_funcs.c | 137 +++++++++++++++++- slsDetectorSoftware/include/CmdProxy.h | 59 +++++++- slsDetectorSoftware/include/Detector.h | 6 + slsDetectorSoftware/include/slsDetector.h | 6 + slsDetectorSoftware/src/Detector.cpp | 8 + slsDetectorSoftware/src/slsDetector.cpp | 14 ++ .../tests/test-multiSlsDetectorClient.cpp | 104 +++++++++++++ slsSupportLib/include/sls_detector_funcs.h | 5 + slsSupportLib/include/versionAPI.h | 2 +- 18 files changed, 431 insertions(+), 11 deletions(-) diff --git a/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt b/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt index 7e9dc9580..821df3f4a 100644 --- a/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt +++ b/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable(gotthard2DetectorServer_virtual ../slsDetectorServer/src/common.c ../slsDetectorServer/src/LTC2620_Driver.c ../slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c + ../slsDetectorServer/src/ASIC_Driver.c ) include_directories( diff --git a/slsDetectorServers/gotthard2DetectorServer/Makefile b/slsDetectorServers/gotthard2DetectorServer/Makefile index fbb66561a..020655c16 100755 --- a/slsDetectorServers/gotthard2DetectorServer/Makefile +++ b/slsDetectorServers/gotthard2DetectorServer/Makefile @@ -12,7 +12,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)common.c $(main_src)DAC6571.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)common.c $(main_src)DAC6571.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c $(main_src)ASIC_Driver.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 8464901ddc2556757786e11bb6a7cf01af8ab7a1..38f52965c0238b2c8441fb19d5055fc76c113f3c 100755 GIT binary patch literal 139392 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 literal 134900 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 diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 5f900d3a9..b6d013f9b 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -7,6 +7,7 @@ #include "LTC2620_Driver.h" #include "common.h" #include "ALTERA_PLL_CYCLONE10.h" +#include "ASIC_Driver.h" #ifdef VIRTUAL #include "communication_funcs_UDP.h" #endif @@ -37,6 +38,7 @@ int32_t clkPhase[NUM_CLOCKS] = {0, 0, 0, 0, 0, 0}; uint32_t clkFrequency[NUM_CLOCKS] = {0, 0, 0, 0, 0, 0}; int highvoltage = 0; int dacValues[NDAC] = {0}; +int onChipdacValues[ONCHIP_NDAC][NCHIP + 1] = {0}; int detPos[2] = {0, 0}; int isFirmwareCheckDone() { @@ -337,13 +339,17 @@ void setupDetector() { highvoltage = 0; { - int i; + int i, j; for (i = 0; i < NUM_CLOCKS; ++i) { clkPhase[i] = 0; } for (i = 0; i < NDAC; ++i) { dacValues[i] = 0; } + for (i = 0; i < ONCHIP_NDAC; ++i) { + for (j = 0; j < NCHIP + 1; ++j) + onChipdacValues[i][j] = -1; + } } @@ -356,12 +362,15 @@ void setupDetector() { DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME); // dacs LTC2620_D_SetDefines(DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC); + // on chip dacs + ASIC_Driver_SetDefines(ONCHIP_DAC_DRIVER_FILE_NAME); #endif // Default values setHighVoltage(DEFAULT_HIGH_VOLTAGE); setDefaultDacs(); - + setDefaultOnChipDacs(); + // Initialization of acquistion parameters setNumFrames(DEFAULT_NUM_FRAMES); setNumTriggers(DEFAULT_NUM_CYCLES); @@ -382,6 +391,20 @@ int setDefaultDacs() { return ret; } +int setDefaultOnChipDacs() { + int ret = OK; + FILE_LOG(logINFOBLUE, ("Setting Default On chip Dac values\n")); + { + int i = 0; + const int defaultOnChipVals[ONCHIP_NDAC] = DEFAULT_ONCHIP_DAC_VALS; + for(i = 0; i < ONCHIP_NDAC; ++i) { + setOnChipDAC((enum ONCHIP_DACINDEX)i, -1, defaultOnChipVals[i]); + } + } + return ret; +} + + /* set parameters - dr, roi */ int setDynamicRange(int dr){ @@ -467,6 +490,38 @@ int64_t getNumTriggersLeft() { /* parameters - dac, hv */ +int setOnChipDAC(enum ONCHIP_DACINDEX ind, int chipIndex, int val) { + char* names[] = {ONCHIP_DAC_NAMES}; + FILE_LOG(logDEBUG1, ("Setting on chip dac[%d - %s]: 0x%x\n", (int)ind, names[ind], val)); + + if (ind >= ONCHIP_NDAC) { + FILE_LOG(logERROR, ("Invalid dac index %d\n", (int)ind)); + return FAIL; + } + if (chipIndex >= NCHIP) { + FILE_LOG(logERROR, ("Invalid chip index %d\n", chipIndex)); + return FAIL; + } + if (val > ONCHIP_DAC_MAX_VAL) { + FILE_LOG(logERROR, ("Invalid val %d\n", val)); + return FAIL; + } + + char buffer[2]; + buffer[1] = ((val & 0xF) << 4) | (((int)ind) & 0xF); // LSB (4 bits) + ADDR (4 bits) + buffer[0] = (val >> 4) & 0x3F; // MSB (6 bits) + + if (ASIC_Driver_Set(chipIndex, sizeof(buffer), buffer) == FAIL) { + return FAIL; + } + onChipdacValues[ind][chipIndex + 1] = val; + return OK; +} + +int getOnChipDAC(enum ONCHIP_DACINDEX ind, int chipIndex) { + return onChipdacValues[ind][chipIndex + 1]; +} + void setDAC(enum DACINDEX ind, int val, int mV) { if (val < 0) { return; diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h index dcfff7bd8..052d3a499 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h @@ -9,12 +9,15 @@ #define NCHAN (128) #define NCHIP (10) #define NDAC (16) +#define ONCHIP_NDAC (6) #define DYNAMIC_RANGE (16) #define HV_SOFT_MAX_VOLTAGE (200) #define HV_HARD_MAX_VOLTAGE (530) #define HV_DRIVER_FILE_NAME ("/etc/devlinks/hvdac") #define DAC_DRIVER_FILE_NAME ("/etc/devlinks/dac") +#define ONCHIP_DAC_DRIVER_FILE_NAME ("/etc/devlinks/chipdac") #define DAC_MAX_MV (2048) +#define ONCHIP_DAC_MAX_VAL (0x3FF) /** Default Parameters */ #define DEFAULT_NUM_FRAMES (1) @@ -37,7 +40,6 @@ /** Other Definitions */ #define BIT16_MASK (0xFFFF) -#define DAC_NAMES "vref_h_adc", "dac_unused", "vb_comp_fe", "vb_comp_adc", "vcom_cds", "vref_restore", "vb_opa_1st", "vref_comp_fe", "vcom_adc1", "vref_prech", "vref_l_adc", "vref_cds", "vb_cs", "vb_opa_fd", "dac_unused2", "vcom_adc2" /* Enums */ enum DACINDEX {G2_VREF_H_ADC, /* 0 */ \ @@ -57,6 +59,7 @@ enum DACINDEX {G2_VREF_H_ADC, /* 0 */ \ G2_DAC_UNUSED2, /* 14 */ \ G2_VCOM_ADC2 /* 15*/ \ }; +#define DAC_NAMES "vref_h_adc", "dac_unused", "vb_comp_fe", "vb_comp_adc", "vcom_cds", "vref_restore", "vb_opa_1st", "vref_comp_fe", "vcom_adc1", "vref_prech", "vref_l_adc", "vref_cds", "vb_cs", "vb_opa_fd", "dac_unused2", "vcom_adc2" #define DEFAULT_DAC_VALS {2099, /* 0 (1050 mV) VREF_H_ADC*/ \ 0, /* 1 (0 mV) DAC_UNUSED*/ \ 0, /* 2 (0 mV) VB_COMP_FE*/ \ @@ -74,8 +77,27 @@ enum DACINDEX {G2_VREF_H_ADC, /* 0 */ \ 0, /* 14 (0 mV) DAC_UNUSED2*/ \ 1400 /* 15 (700 mV) VCOM_ADC2*/ \ }; + +enum ONCHIP_DACINDEX {G2_VCHIP_COMP_FE, /* 0 */ \ + G2_VCHIP_OPA_1ST, /* 1 */ \ + G2_VCHIP_OPA_FD, /* 2 */ \ + G2_VCHIP_COMP_ADC, /* 3 */ \ + G2_VCHIP_REF_COMP_FE, /* 4 */ \ + G2_VCHIP_CS /* 5 */ \ + }; +#define ONCHIP_DAC_NAMES "vchip_comp_fe", "vchip_opa_1st", "vchip_opa_fd", "vchip_comp_adc", "vchip_ref_comp_fe", "vchip_cs" + +#define DEFAULT_ONCHIP_DAC_VALS {0x137, /* 0 G2_VCHIP_COMP_FE*/ \ + 0x000, /* 1 G2_VCHIP_OPA_1ST*/ \ + 0x134, /* 2 G2_VCHIP_OPA_FD*/ \ + 0x3FF, /* 3 G2_VCHIP_COMP_ADC*/ \ + 0x100, /* 4 G2_VCHIP_REF_COMP_FE*/ \ + 0x0D0 /* 5 G2_VCHIP_CS*/ \ + }; + enum CLKINDEX {READOUT_C0, READOUT_C1, SYSTEM_C0, SYSTEM_C1, SYSTEM_C2, SYSTEM_C3, NUM_CLOCKS}; #define CLK_NAMES "READOUT_C0", "READOUT_C1", "SYSTEM_C0", "SYSTEM_C1", "SYSTEM_C2", "SYSTEM_C3" + enum PLLINDEX {READOUT_PLL, SYSTEM_PLL}; /* Struct Definitions */ diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 580fc067f..fcdc77e10 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -87,6 +87,9 @@ void updateDataBytes(); #if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MYTHEN3D) || GOTTHARD2D int setDefaultDacs(); #endif +#ifdef GOTTHARD2D +int setDefaultOnChipDacs(); +#endif // advanced read/write reg @@ -242,6 +245,10 @@ extern int AD9257_GetVrefVoltage(int mV); // AD9257.h extern int AD9257_SetVrefVoltage(int val, int mV); // AD9257.h #endif +#ifdef GOTTHARD2D +int setOnChipDAC(enum ONCHIP_DACINDEX ind, int chipIndex, int val); +int getOnChipDAC(enum ONCHIP_DACINDEX ind, int chipIndex); +#endif void setDAC(enum DACINDEX ind, int val, int mV); int getDAC(enum DACINDEX ind, int mV); int getMaxDacSteps(); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 8b8293808..2d66298eb 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -192,4 +192,6 @@ int get_max_clock_phase_shift(int); int set_clock_divider(int); int get_clock_divider(int); int set_pipeline(int); -int get_pipeline(int); \ No newline at end of file +int get_pipeline(int); +int set_on_chip_dac(int); +int get_on_chip_dac(int); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/DAC6571.c b/slsDetectorServers/slsDetectorServer/src/DAC6571.c index 28ab12fc5..5dd1714ab 100755 --- a/slsDetectorServers/slsDetectorServer/src/DAC6571.c +++ b/slsDetectorServers/slsDetectorServer/src/DAC6571.c @@ -15,7 +15,7 @@ int DAC6571_HardMaxVoltage = 0; char DAC6571_DriverFileName[MAX_STR_LENGTH]; void DAC6571_SetDefines(int hardMaxV, char* driverfname) { - FILE_LOG(logINFOBLUE, ("Configuring High Voltage\n")); + FILE_LOG(logINFOBLUE, ("Configuring High Voltage to %s (hard max: %dV)\n", driverfname, hardMaxV)); DAC6571_HardMaxVoltage = hardMaxV; memset(DAC6571_DriverFileName, 0, MAX_STR_LENGTH); strcpy(DAC6571_DriverFileName, driverfname); diff --git a/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c b/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c index f1a804820..f5007628b 100755 --- a/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c +++ b/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c @@ -17,7 +17,7 @@ char LTC2620_D_DriverFileName[MAX_STR_LENGTH]; int LTC2620_D_NumDacs = 0; void LTC2620_D_SetDefines(int hardMaxV, char* driverfname, int numdacs) { - FILE_LOG(logINFOBLUE, ("Configuring DACs (LTC2620)\n")); + FILE_LOG(logINFOBLUE, ("Configuring DACs (LTC2620) to %s (numdacs:%d, hard max: %dmV)\n", driverfname, numdacs, hardMaxV)); LTC2620_D_HardMaxVoltage = hardMaxV; memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH); strcpy(LTC2620_D_DriverFileName, driverfname); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 02d5c5674..20a2e4829 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -294,6 +294,8 @@ const char* getFunctionName(enum detFuncs func) { case F_GET_CLOCK_DIVIDER: return "F_GET_CLOCK_DIVIDER"; case F_SET_PIPELINE: return "F_SET_PIPELINE"; case F_GET_PIPELINE: return "F_GET_PIPELINE"; + case F_SET_ON_CHIP_DAC: return "F_SET_ON_CHIP_DAC"; + case F_GET_ON_CHIP_DAC: return "F_GET_ON_CHIP_DAC"; default: return "Unknown Function"; } @@ -465,6 +467,8 @@ void function_table() { flist[F_GET_CLOCK_DIVIDER] = &get_clock_divider; flist[F_SET_PIPELINE] = &set_pipeline; flist[F_GET_PIPELINE] = &get_pipeline; + flist[F_SET_ON_CHIP_DAC] = &set_on_chip_dac; + flist[F_GET_ON_CHIP_DAC] = &get_on_chip_dac; // check if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { @@ -1032,7 +1036,6 @@ int set_dac(int file_des) { serverDacIndex = J_VREF_COMP; break; #endif - default: #ifdef CHIPTESTBOARDD if (ind < NDAC_ONLY) { @@ -6007,3 +6010,135 @@ int get_pipeline(int file_des) { return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); } + + + +int set_on_chip_dac(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int args[3] = {-1, -1, -1}; + + if (receiveData(file_des, args, sizeof(args), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logDEBUG1, ("Setting On chip dac (%d), chip %d: 0x%x\n", args[0], args[1], args[2])); + +#ifndef GOTTHARD2D + functionNotImplemented(); +#else + + // only set + if (Server_VerifyLock() == OK) { + int ind = args[0]; + int chipIndex = args[1]; + int val = args[2]; + enum ONCHIP_DACINDEX dacIndex = 0; + switch (ind) { + case VB_COMP_FE: + dacIndex = G2_VCHIP_COMP_FE; + break; + case VB_OPA_1ST: + dacIndex = G2_VCHIP_OPA_1ST; + break; + case VB_OPA_FD: + dacIndex = G2_VCHIP_OPA_FD; + break; + case VB_COMP_ADC: + dacIndex = G2_VCHIP_COMP_ADC; + break; + case VREF_COMP_FE: + dacIndex = G2_VCHIP_REF_COMP_FE; + break; + case VB_CS: + dacIndex = G2_VCHIP_CS; + break; + default: + modeNotImplemented("on chip dac index", ind); + break; + } + + if (ret != FAIL) { + char* names[] = {ONCHIP_DAC_NAMES}; + char modeName[50] = ""; + sprintf(modeName, "on-chip-dac (%s, %d, chip:%d)", names[dacIndex], (int)dacIndex, chipIndex); + if (chipIndex < -1 || chipIndex >= NCHIP) { + ret = FAIL; + sprintf(mess, "Could not set %s to %d. Invalid Chip Index. Options[-1, 0 - %d]\n", modeName, val, NCHIP -1); + FILE_LOG(logERROR, (mess)); + } else if (val < 0 || val > ONCHIP_DAC_MAX_VAL ) { + ret = FAIL; + sprintf(mess, "Could not set %s to 0x%x. Invalid value. Options:[0 - 0x%x]\n", modeName, val, ONCHIP_DAC_MAX_VAL); + FILE_LOG(logERROR, (mess)); + } else { + ret = setOnChipDAC(dacIndex, chipIndex, val); + if (ret == FAIL) { + sprintf(mess, "Could not set %s to 0x%x.\n", modeName, val); + FILE_LOG(logERROR, (mess)); + } else { + int retval = getOnChipDAC(dacIndex, chipIndex); + FILE_LOG(logDEBUG1, ("retval %s: 0x%x\n", modeName, retval)); + validate(val, retval, modeName, DEC); + } + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + + +int get_on_chip_dac(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int args[2] = {-1, -1}; + int retval = -1; + + if (receiveData(file_des, args, sizeof(args), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logDEBUG1, ("Getting On chip dac (%d), chip %d\n", args[0], args[1])); + +#ifndef GOTTHARD2D + functionNotImplemented(); +#else + // get only + int ind = args[0]; + int chipIndex = args[1]; + enum ONCHIP_DACINDEX dacIndex = 0; + switch (ind) { + case VB_COMP_FE: + dacIndex = G2_VCHIP_COMP_FE; + break; + case VB_OPA_1ST: + dacIndex = G2_VCHIP_OPA_1ST; + break; + case VB_OPA_FD: + dacIndex = G2_VCHIP_OPA_FD; + break; + case VB_COMP_ADC: + dacIndex = G2_VCHIP_COMP_ADC; + break; + case VREF_COMP_FE: + dacIndex = G2_VCHIP_REF_COMP_FE; + break; + case VB_CS: + dacIndex = G2_VCHIP_CS; + break; + default: + modeNotImplemented("on chip dac index", ind); + break; + } + if (ret == OK) { + char* names[] = {ONCHIP_DAC_NAMES}; + char modeName[50] = ""; + sprintf(modeName, "on-chip-dac (%s, %d, chip:%d)", names[dacIndex], (int)dacIndex, chipIndex); + if (chipIndex < -1 || chipIndex >= NCHIP) { + ret = FAIL; + sprintf(mess, "Could not get %s. Invalid Chip Index. Options[-1, 0 - %d]\n", modeName, NCHIP -1); + FILE_LOG(logERROR, (mess)); + } else { + retval = getOnChipDAC(dacIndex, chipIndex); + FILE_LOG(logDEBUG1, ("retval %s: 0x%x\n", modeName, retval)); + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} \ No newline at end of file diff --git a/slsDetectorSoftware/include/CmdProxy.h b/slsDetectorSoftware/include/CmdProxy.h index 34df8be8b..39e4186ad 100644 --- a/slsDetectorSoftware/include/CmdProxy.h +++ b/slsDetectorSoftware/include/CmdProxy.h @@ -188,7 +188,7 @@ return os.str(); \ } -/** int with index, */ +/** int with index */ #define INTEGER_IND_COMMAND(CMDNAME, GETFCN, SETFCN, CONV, INDEX, HLPSTR) \ std::string CMDNAME(const int action) { \ std::ostringstream os; \ @@ -214,6 +214,32 @@ return os.str(); \ } +/** int with user index */ +#define INTEGER_USER_IND_COMMAND(CMDNAME, GETFCN, SETFCN, CONV, INDEX, HLPSTR) \ + std::string CMDNAME(const int action) { \ + std::ostringstream os; \ + os << cmd << ' '; \ + if (action == slsDetectorDefs::HELP_ACTION) \ + os << HLPSTR << '\n'; \ + else if (action == slsDetectorDefs::GET_ACTION) { \ + if (args.size() != 1) { \ + WrongNumberOfParameters(1); \ + } \ + auto t = det->GETFCN(INDEX, std::stoi(args[0]), {det_id}); \ + os << args [0] << ' ' << OutStringHex(t) << '\n'; \ + } else if (action == slsDetectorDefs::PUT_ACTION) { \ + if (args.size() != 2) { \ + WrongNumberOfParameters(2); \ + } \ + auto val = CONV(args[1]); \ + det->SETFCN(INDEX, std::stoi(args[0]), val, {det_id}); \ + os << args[0] << ' ' << args[1] << '\n'; \ + } else { \ + throw sls::RuntimeError("Unknown action"); \ + } \ + return os.str(); \ + } + /** dac */ #define DAC_COMMAND(CMDNAME, GETFCN, SETFCN, DAC_INDEX, HLPSTR) \ @@ -634,7 +660,14 @@ class CmdProxy { {"dac", &CmdProxy::Dac}, {"daclist", &CmdProxy::DacList}, {"dacvalues", &CmdProxy::DacValues}, - + + /* on chip dacs */ + {"vchip_comp_fe", &CmdProxy::vchip_comp_fe}, + {"vchip_opa_1st", &CmdProxy::vchip_opa_1st}, + {"vchip_opa_fd", &CmdProxy::vchip_opa_fd}, + {"vchip_comp_adc", &CmdProxy::vchip_comp_adc}, + {"vchip_ref_comp_fe", &CmdProxy::vchip_ref_comp_fe}, + {"vchip_cs", &CmdProxy::vchip_cs}, /* acquisition */ {"clearbusy", &CmdProxy::clearbusy}, @@ -866,6 +899,7 @@ class CmdProxy { std::string DacList(int action); std::string DacValues(int action); std::vector DacCommands(); + std::string OnChipDac(int action); /* acquisition */ /* Network Configuration (Detector<->Receiver) */ /* Receiver Config */ @@ -1195,6 +1229,27 @@ class CmdProxy { "[dac or mv value][(optional unit) mv] \n\t[Jungfrau] Dac for ??"); //TODO + /* on chip dacs */ + INTEGER_USER_IND_COMMAND(vchip_comp_fe, getOnChipDAC, setOnChipDAC, stoiHex, defs::VB_COMP_FE, + "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for comparator current of analogue front end."); + + INTEGER_USER_IND_COMMAND(vchip_opa_1st, getOnChipDAC, setOnChipDAC, stoiHex, defs::VB_OPA_1ST, + "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for opa current for driving the other DACs in chip."); + + INTEGER_USER_IND_COMMAND(vchip_opa_fd, getOnChipDAC, setOnChipDAC, stoiHex, defs::VB_OPA_FD, + "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac current for CDS opa stage."); + + INTEGER_USER_IND_COMMAND(vchip_comp_adc, getOnChipDAC, setOnChipDAC, stoiHex, defs::VB_COMP_ADC, + "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for comparator current of ADC."); + + INTEGER_USER_IND_COMMAND(vchip_ref_comp_fe, getOnChipDAC, setOnChipDAC, stoiHex, defs::VREF_COMP_FE, + "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for reference voltage of the comparator of analogue front end."); + + INTEGER_USER_IND_COMMAND(vchip_cs, getOnChipDAC, setOnChipDAC, stoiHex, defs::VB_CS, + "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for current injection into preamplifier."); + + + /* acquisition */ EXECUTE_SET_COMMAND_NOID(clearbusy, clearAcquiringFlag, diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index 2f19252d7..b29359cf0 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -235,6 +235,12 @@ class Detector { void setDAC(defs::dacIndex index, int value, bool mV, Positions pos = {}); + /* [Gotthard2] */ + Result getOnChipDAC(defs::dacIndex index, int chipIndex, Positions pos = {}) const; + + /* [Gotthard2] */ + void setOnChipDAC(defs::dacIndex index, int chipIndex, int value, Positions pos = {}); + Result getTimingMode(Positions pos = {}) const; /** diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h index 60f04c4d1..ed58cb36b 100755 --- a/slsDetectorSoftware/include/slsDetector.h +++ b/slsDetectorSoftware/include/slsDetector.h @@ -632,6 +632,12 @@ class slsDetector : public virtual slsDetectorDefs { */ int setDAC(int val, dacIndex index, int mV); + /* [Gotthard2] */ + int getOnChipDAC(slsDetectorDefs::dacIndex index, int chipIndex); + + /* [Gotthard2] */ + void setOnChipDAC(slsDetectorDefs::dacIndex index, int chipIndex, int value); + /** * Get adc value * @param index adc(DAC) index diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index ef7a4eac0..fdc5f4b9d 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -285,6 +285,14 @@ void Detector::setDAC(defs::dacIndex index, int value, bool mV, Positions pos) { pimpl->Parallel(&slsDetector::setDAC, pos, value, index, mV); } +Result Detector::getOnChipDAC(defs::dacIndex index, int chipIndex, Positions pos) const { + return pimpl->Parallel(&slsDetector::getOnChipDAC, pos, index, chipIndex); +} + +void Detector::setOnChipDAC(defs::dacIndex index, int chipIndex, int value, Positions pos) { + pimpl->Parallel(&slsDetector::setOnChipDAC, pos, index, chipIndex, value); +} + Result Detector::getTimingMode(Positions pos) const { return pimpl->Parallel(&slsDetector::setTimingMode, pos, defs::GET_TIMING_MODE); diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 018ea1356..022afffe8 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -1510,6 +1510,20 @@ int slsDetector::setDAC(int val, dacIndex index, int mV) { return retval; } +int slsDetector::getOnChipDAC(slsDetectorDefs::dacIndex index, int chipIndex) { + int args[]{static_cast(index), chipIndex}; + int retval = -1; + sendToDetector(F_GET_ON_CHIP_DAC, args, retval); + FILE_LOG(logDEBUG1) << "On chip DAC " << index << " (chip index:" << chipIndex << "): " << retval; + return retval; +} + +void slsDetector::setOnChipDAC(slsDetectorDefs::dacIndex index, int chipIndex, int value) { + int args[]{static_cast(index), chipIndex, value}; + FILE_LOG(logDEBUG1) << "Setting On chip DAC " << index << " (chip index:" << chipIndex << ") to " << value; + sendToDetector(F_SET_ON_CHIP_DAC, args, nullptr); +} + int slsDetector::getADC(dacIndex index) { int retval = -1; FILE_LOG(logDEBUG1) << "Getting ADC " << index; diff --git a/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp b/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp index a6492ad2f..0ea597571 100644 --- a/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp +++ b/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp @@ -9,6 +9,110 @@ auto GET = slsDetectorDefs::GET_ACTION; auto PUT = slsDetectorDefs::PUT_ACTION; +TEST_CASE("vchip", "[.cmd]") { + int prev_val = 0; + + if (test::type == slsDetectorDefs::GOTTHARD2) { + REQUIRE_THROWS(multiSlsDetectorClient("vchip_comp_fe", GET)); // needs a chip index + REQUIRE_THROWS(multiSlsDetectorClient("vchip_comp_fe -1 0x400", GET)); // max val is 0x3ff + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_fe -1", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("vchip_comp_fe -1 ")); + prev_val = stoul(s, 0, 16); + } + { + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_fe -1 0x137", PUT)); + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_fe -1", GET, nullptr, oss)); + REQUIRE(oss.str() == "vchip_comp_fe -1 0x137\n"); + } + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_fe -1 " + sls::ToStringHex(prev_val), PUT)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_opa_1st", GET)); // needs a chip index + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_1st -1", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("vchip_opa_1st -1 ")); + prev_val = stoul(s, 0, 16); + } + { + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_1st -1 0x137", PUT)); + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_1st -1", GET, nullptr, oss)); + REQUIRE(oss.str() == "vchip_opa_1st -1 0x137\n"); + } + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_1st -1 " + sls::ToStringHex(prev_val), PUT)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_opa_fd", GET)); // needs a chip index + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_fd -1", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("vchip_opa_fd -1 ")); + prev_val = stoul(s, 0, 16); + } + { + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_fd -1 0x137", PUT)); + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_fd -1", GET, nullptr, oss)); + REQUIRE(oss.str() == "vchip_opa_fd -1 0x137\n"); + } + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_opa_fd -1 " + sls::ToStringHex(prev_val), PUT)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_comp_adc", GET)); // needs a chip index + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_adc -1", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("vchip_comp_adc -1 ")); + prev_val = stoul(s, 0, 16); + } + { + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_adc -1 0x137", PUT)); + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_adc -1", GET, nullptr, oss)); + REQUIRE(oss.str() == "vchip_comp_adc -1 0x137\n"); + } + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_comp_adc -1 " + sls::ToStringHex(prev_val), PUT)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_ref_comp_fe", GET)); // needs a chip index + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_ref_comp_fe -1", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("vchip_ref_comp_fe -1 ")); + prev_val = stoul(s, 0, 16); + } + { + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_ref_comp_fe -1 0x137", PUT)); + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_ref_comp_fe -1", GET, nullptr, oss)); + REQUIRE(oss.str() == "vchip_ref_comp_fe -1 0x137\n"); + } + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_ref_comp_fe -1 " + sls::ToStringHex(prev_val), PUT)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_cs", GET)); // needs a chip index + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_cs -1", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("vchip_cs -1 ")); + prev_val = stoul(s, 0, 16); + } + { + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_cs -1 0x137", PUT)); + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_cs -1", GET, nullptr, oss)); + REQUIRE(oss.str() == "vchip_cs -1 0x137\n"); + } + REQUIRE_NOTHROW(multiSlsDetectorClient("vchip_cs -1 " + sls::ToStringHex(prev_val), PUT)); + } else { + REQUIRE_THROWS(multiSlsDetectorClient("vchip_comp_fe", GET)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_opa_1st", GET)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_opa_fd", GET)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_comp_adc", GET)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_ref_comp_fe", GET)); + REQUIRE_THROWS(multiSlsDetectorClient("vchip_cs", GET)); + } + +} + + + + + TEST_CASE("dacs", "[.cmd]") { REQUIRE_NOTHROW(multiSlsDetectorClient("daclist", GET)); diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index 64dc40827..4c3ae2825 100755 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -175,6 +175,8 @@ enum detFuncs{ F_GET_CLOCK_DIVIDER, F_SET_PIPELINE, F_GET_PIPELINE, + F_SET_ON_CHIP_DAC, + F_GET_ON_CHIP_DAC, NUM_DET_FUNCTIONS, RECEIVER_ENUM_START = 256, /**< detector function should not exceed this (detector server should not compile anyway) */ @@ -414,6 +416,9 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_CLOCK_DIVIDER: return "F_GET_CLOCK_DIVIDER"; case F_SET_PIPELINE: return "F_SET_PIPELINE"; case F_GET_PIPELINE: return "F_GET_PIPELINE"; + case F_SET_ON_CHIP_DAC: return "F_SET_ON_CHIP_DAC"; + case F_GET_ON_CHIP_DAC: return "F_GET_ON_CHIP_DAC"; + case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS"; case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START"; diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index b72f4cf91..b7bcf378e 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -6,7 +6,7 @@ #define APIMOENCH 0x190820 #define APIGOTTHARD 0x191106 #define APICTB 0x191106 -#define APIGOTTHARD2 0x191106 #define APIJUNGFRAU 0x191106 #define APIEIGER 0x191106 #define APIMYTHEN3 0x191107 +#define APIGOTTHARD2 0x191108