diff --git a/.gitea/workflows/rh8-local-tests.yml b/.gitea/workflows/rh8-local-tests.yml index 7c0a379fb..f820d0603 100644 --- a/.gitea/workflows/rh8-local-tests.yml +++ b/.gitea/workflows/rh8-local-tests.yml @@ -2,6 +2,8 @@ name: Run Simulator Tests on local RHEL8 on: push: + branches-ignore: + - dev/xilinx_power_cmd workflow_dispatch: env: diff --git a/.gitea/workflows/rh9-local-tests.yml b/.gitea/workflows/rh9-local-tests.yml index 5efc5569f..7057f860e 100644 --- a/.gitea/workflows/rh9-local-tests.yml +++ b/.gitea/workflows/rh9-local-tests.yml @@ -2,6 +2,8 @@ name: Run Simulator Tests on local RHEL9 on: push: + branches-ignore: + - dev/xilinx_power_cmd workflow_dispatch: env: diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 1fa4fe417..6d12f309e 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1363,6 +1363,15 @@ int processDACEnums(enum dacIndex ind, int val, bool mV) { LOG(logERROR, (mess)); return retval; } + if (!mV) { + ret = FAIL; + sprintf(mess, + "Could not set power. Can get Vchip only in mV and not dac " + "units.\n", + ind); + LOG(logERROR, (mess)); + return retval; + } ret = getVchip(&retval, mess); return retval; @@ -1370,8 +1379,8 @@ int processDACEnums(enum dacIndex ind, int val, bool mV) { if (val != GET_FLAG) { if (!mV) { ret = FAIL; - strcpy(mess, "Could not set vlimit. VLimit should be in " - "mV and not dac units.\n"); + strcpy(mess, "Could not set vlimit. VLimit should be in mV and " + "not dac units.\n"); LOG(logERROR, (mess)); return retval; } @@ -1388,18 +1397,18 @@ int processDACEnums(enum dacIndex ind, int val, bool mV) { serverDacIndex = getDACIndex(ind); if (ret == FAIL) return retval; - if (val != GET_FLAG) { - if (!mV) { - ret = FAIL; - sprintf(mess, - "Could not set power. Power regulator %d should be in " - "mV and not dac units.\n", - ind); - LOG(logERROR, (mess)); - return retval; - } + if (!mV) { + ret = FAIL; + sprintf(mess, + "Could not set/get power. Power regulator %d is in mV and " + "not dac units.\n", + ind); + LOG(logERROR, (mess)); + return retval; + } + if (val != GET_FLAG) ret = setPower(serverDacIndex, val, mess); - } else + else ret = getPower(serverDacIndex, &retval, mess); return retval; @@ -1427,8 +1436,8 @@ int processDACEnums(enum dacIndex ind, int val, bool mV) { if (val != GET_FLAG) { if (!mV) { ret = FAIL; - strcpy(mess, "Could not set vlimit. VLimit should be in " - "mV and not dac units.\n"); + strcpy(mess, "Could not set vlimit. VLimit should be in mV and " + "not dac units.\n"); LOG(logERROR, (mess)); return retval; } @@ -1445,18 +1454,18 @@ int processDACEnums(enum dacIndex ind, int val, bool mV) { serverDacIndex = getDACIndex(ind); if (ret == FAIL) return retval; - if (val != GET_FLAG) { - if (!mV) { - ret = FAIL; - sprintf(mess, - "Could not set power. Power regulator %d should be in " - "mV and not dac units.\n", - ind); - LOG(logERROR, (mess)); - return retval; - } + if (!mV) { + ret = FAIL; + sprintf(mess, + "Could not set/get power. Power regulator %d is in mV and " + "not dac units.\n", + ind); + LOG(logERROR, (mess)); + return retval; + } + if (val != GET_FLAG) ret = setPower(serverDacIndex, val, mess); - } else + else ret = getPower(serverDacIndex, &retval, mess); return retval; diff --git a/slsDetectorSoftware/generator/Caller.in.h b/slsDetectorSoftware/generator/Caller.in.h index dbecfd5b9..b0355a611 100644 --- a/slsDetectorSoftware/generator/Caller.in.h +++ b/slsDetectorSoftware/generator/Caller.in.h @@ -92,6 +92,8 @@ class Caller { // applicable RegisterAddress getRegisterAddress(const std::string &saddr) const; BitAddress getBitAddress() const; + defs::dacIndex parseDacIndex(int argIndex, bool isCtb); + bool parseMV(int argIndex); FunctionMap functions{ {"list", &Caller::list}, diff --git a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh index b82958148..dface82d3 100644 --- a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh +++ b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh @@ -524,21 +524,21 @@ __dac() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="mV mv" +FCN_RETURN="0 1" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "4" ]]; then -FCN_RETURN="mV mv" +FCN_RETURN="0 1" fi fi return 0 diff --git a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh index 0f6a96183..b64f8e3b3 100644 --- a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh +++ b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh @@ -448,21 +448,21 @@ __dac() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="mV mv" +FCN_RETURN="0 1" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "4" ]]; then -FCN_RETURN="mV mv" +FCN_RETURN="0 1" fi fi return 0 diff --git a/slsDetectorSoftware/generator/commands.yaml b/slsDetectorSoftware/generator/commands.yaml index a66f3e608..70f31592c 100644 --- a/slsDetectorSoftware/generator/commands.yaml +++ b/slsDetectorSoftware/generator/commands.yaml @@ -2788,6 +2788,25 @@ clearbit: arg_types: [ std::string, std::string, special::validate ] +dac: + is_description: true + actions: + PUT: + args: + - argc: 2 + arg_types: [ std::string, int ] + - argc: 3 + arg_types: [ std::string, int, bool ] + GET: + args: + - argc: 1 + arg_types: [ std::string ] + - argc: 2 + arg_types: [ std::string, bool ] + + + + ################# special commands ########################## virtual: @@ -3268,56 +3287,6 @@ extsig: cast_input: [ true, true ] output: [ 'args[0]', "' '", 'args[1]' ] -dac: - help: "code: return GetHelpDacWrapper(cmd, args);\n" # this is a special case - actions: - GET: - exceptions: - - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD" - message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' - extra_variables: - - name: dacIndex - type: defs::dacIndex - value: "((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" - function: getDAC - require_det_id: true - input_types: [ defs::dacIndex, bool ] - cast_input: [ false, true ] - args: - - argc: 1 - arg_types: [defs::dacIndex] - input: [ dacIndex, '"0"' ] - output: [ 'args[0]', "' '", OutString(t) ] - - argc: 2 - exceptions: - - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD" - message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' - - condition: 'args[1] != "mv" && args[1] != "mV"' - message: '"Unknown argument " + args[1] + ". Did you mean mV?"' - arg_types: [defs::dacIndex, special::mv] - input: [ dacIndex, '"1"' ] - output: [ 'args[0]', "' '" , OutString(t), '" mV"' ] - PUT: - exceptions: - - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD" - message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' - extra_variables: - - name: dacIndex - type: defs::dacIndex - value: "((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" - function: setDAC - require_det_id: true - input_types: [ defs::dacIndex, int, bool ] - cast_input: [ false, true, true ] - args: - - argc: 2 - arg_types: [defs::dacIndex, int] - input: [ dacIndex, "args[1]", '"0"' ] - output: [ "args[0]", "' '", "args[1]" ] - - argc: 3 - arg_types: [defs::dacIndex, int, special::mv] - input: [ dacIndex, "args[1]", '"1"' ] - output: [ "args[0]", "' '", "args[1]", '" mV"' ] resetdacs: help: "[(optional) hard] \n\t[Eiger][Jungfrau][Moench][Gotthard2][Mythen3]Reset dac values to the defaults. A 'hard' optional reset will reset the dacs to the hardcoded defaults in on-board detector server." diff --git a/slsDetectorSoftware/generator/extended_commands.yaml b/slsDetectorSoftware/generator/extended_commands.yaml index f5c26acee..d8df48b3d 100644 --- a/slsDetectorSoftware/generator/extended_commands.yaml +++ b/slsDetectorSoftware/generator/extended_commands.yaml @@ -1772,155 +1772,64 @@ dac: GET: args: - arg_types: - - defs::dacIndex + - std::string argc: 1 - cast_input: - - false - - true + cast_input: [] check_det_id: false convert_det_id: true - exceptions: - - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD - && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD - message: '"Dac indices can only be used for chip test board. Use daclist - to get list of dac names for current detector."' - extra_variables: - - name: dacIndex - type: defs::dacIndex - value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() - == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) - : StringTo(args[0])' - function: getDAC - input: - - dacIndex - - '"0"' - input_types: - - defs::dacIndex - - bool - output: - - args[0] - - ''' ''' - - OutString(t) - require_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false store_result_in_t: true - arg_types: - - defs::dacIndex - - special::mv + - std::string + - bool argc: 2 - cast_input: - - false - - true + cast_input: [] check_det_id: false convert_det_id: true - exceptions: - - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD - && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD - message: '"Dac indices can only be used for chip test board. Use daclist - to get list of dac names for current detector."' - - condition: args[1] != "mv" && args[1] != "mV" - message: '"Unknown argument " + args[1] + ". Did you mean mV?"' - extra_variables: - - name: dacIndex - type: defs::dacIndex - value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() - == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) - : StringTo(args[0])' - function: getDAC - input: - - dacIndex - - '"1"' - input_types: - - defs::dacIndex - - bool - output: - - args[0] - - ''' ''' - - OutString(t) - - '" mV"' - require_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false store_result_in_t: true PUT: args: - arg_types: - - defs::dacIndex + - std::string - int argc: 2 - cast_input: - - false - - true - - true + cast_input: [] check_det_id: false convert_det_id: true - exceptions: - - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD - && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD - message: '"Dac indices can only be used for chip test board. Use daclist - to get list of dac names for current detector."' - extra_variables: - - name: dacIndex - type: defs::dacIndex - value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() - == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) - : StringTo(args[0])' - function: setDAC - input: - - dacIndex - - args[1] - - '"0"' - input_types: - - defs::dacIndex - - int - - bool - output: - - args[0] - - ''' ''' - - args[1] - require_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false store_result_in_t: false - arg_types: - - defs::dacIndex - - int - - special::mv - argc: 3 - cast_input: - - false - - true - - true - check_det_id: false - convert_det_id: true - exceptions: - - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD - && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD - message: '"Dac indices can only be used for chip test board. Use daclist - to get list of dac names for current detector."' - extra_variables: - - name: dacIndex - type: defs::dacIndex - value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() - == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) - : StringTo(args[0])' - function: setDAC - input: - - dacIndex - - args[1] - - '"1"' - input_types: - - defs::dacIndex + - std::string - int - bool - output: - - args[0] - - ''' ''' - - args[1] - - '" mV"' - require_det_id: true + argc: 3 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false store_result_in_t: false command_name: dac function_alias: dac - help: 'code: return GetHelpDacWrapper(cmd, args); - - ' + help: '' infer_action: true + is_description: true dacindex: actions: GET: diff --git a/slsDetectorSoftware/src/Caller.cpp b/slsDetectorSoftware/src/Caller.cpp index f48dd44f2..b6d104b9f 100644 --- a/slsDetectorSoftware/src/Caller.cpp +++ b/slsDetectorSoftware/src/Caller.cpp @@ -2229,199 +2229,6 @@ std::string Caller::configtransceiver(int action) { return os.str(); } -std::string Caller::dac(int action) { - - std::ostringstream os; - // print help - if (action == slsDetectorDefs::HELP_ACTION) { - return GetHelpDacWrapper(cmd, args); - } - - // check if action and arguments are valid - if (action == slsDetectorDefs::GET_ACTION) { - if (1 && args.size() != 1 && args.size() != 2) { - throw RuntimeError("Wrong number of arguments for action GET"); - } - - if (args.size() == 1) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - try { - StringTo("0"); - } catch (...) { - throw RuntimeError("Could not convert argument 1 to bool"); - } - } - - if (args.size() == 2) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - try { - StringTo("1"); - } catch (...) { - throw RuntimeError("Could not convert argument 1 to bool"); - } - } - - } - - else if (action == slsDetectorDefs::PUT_ACTION) { - if (1 && args.size() != 2 && args.size() != 3) { - throw RuntimeError("Wrong number of arguments for action PUT"); - } - - if (args.size() == 2) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - try { - StringTo(args[1]); - } catch (...) { - throw RuntimeError("Could not convert argument 1 to int"); - } - try { - StringTo("0"); - } catch (...) { - throw RuntimeError("Could not convert argument 2 to bool"); - } - } - - if (args.size() == 3) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - try { - StringTo(args[1]); - } catch (...) { - throw RuntimeError("Could not convert argument 1 to int"); - } - try { - StringTo("1"); - } catch (...) { - throw RuntimeError("Could not convert argument 2 to bool"); - } - } - - } - - else { - - throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " - "are ['GET', 'PUT']"); - } - - // generate code for each action - if (action == slsDetectorDefs::GET_ACTION) { - if (args.size() == 1) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD && - det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { - throw RuntimeError( - "Dac indices can only be used for chip test board. Use " - "daclist to get list of dac names for current detector."); - } - auto arg1 = StringTo("0"); - auto t = det->getDAC(dacIndex, arg1, std::vector{det_id}); - os << args[0] << ' ' << OutString(t) << '\n'; - } - - if (args.size() == 2) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD && - det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { - throw RuntimeError( - "Dac indices can only be used for chip test board. Use " - "daclist to get list of dac names for current detector."); - } - if (args[1] != "mv" && args[1] != "mV") { - throw RuntimeError("Unknown argument " + args[1] + - ". Did you mean mV?"); - } - auto arg1 = StringTo("1"); - auto t = det->getDAC(dacIndex, arg1, std::vector{det_id}); - os << args[0] << ' ' << OutString(t) << " mV" << '\n'; - } - } - - if (action == slsDetectorDefs::PUT_ACTION) { - if (args.size() == 2) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD && - det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { - throw RuntimeError( - "Dac indices can only be used for chip test board. Use " - "daclist to get list of dac names for current detector."); - } - auto arg1 = StringTo(args[1]); - auto arg2 = StringTo("0"); - det->setDAC(dacIndex, arg1, arg2, std::vector{det_id}); - os << args[0] << ' ' << args[1] << '\n'; - } - - if (args.size() == 3) { - defs::dacIndex dacIndex = - ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || - det->getDetectorType().squash() == - defs::XILINX_CHIPTESTBOARD) && - !is_int(args[0])) - ? det->getDacIndex(args[0]) - : StringTo(args[0]); - if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD && - det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { - throw RuntimeError( - "Dac indices can only be used for chip test board. Use " - "daclist to get list of dac names for current detector."); - } - auto arg1 = StringTo(args[1]); - auto arg2 = StringTo("1"); - det->setDAC(dacIndex, arg1, arg2, std::vector{det_id}); - os << args[0] << ' ' << args[1] << " mV" << '\n'; - } - } - - return os.str(); -} - std::string Caller::dacindex(int action) { std::ostringstream os; diff --git a/slsDetectorSoftware/src/Caller.h b/slsDetectorSoftware/src/Caller.h index 79ce07e33..1e7646f2c 100644 --- a/slsDetectorSoftware/src/Caller.h +++ b/slsDetectorSoftware/src/Caller.h @@ -415,6 +415,8 @@ class Caller { // applicable RegisterAddress getRegisterAddress(const std::string &saddr) const; BitAddress getBitAddress() const; + defs::dacIndex parseDacIndex(int argIndex, bool isCtb); + bool parseMV(int argIndex); FunctionMap functions{ {"list", &Caller::list}, diff --git a/slsDetectorSoftware/src/CallerSpecial.cpp b/slsDetectorSoftware/src/CallerSpecial.cpp index 5b73a1f80..29f86c963 100644 --- a/slsDetectorSoftware/src/CallerSpecial.cpp +++ b/slsDetectorSoftware/src/CallerSpecial.cpp @@ -1809,4 +1809,84 @@ BitAddress Caller::getBitAddress() const { throw RuntimeError("Invalid number of parameters for bit address."); } +std::string Caller::dac(int action) { + std::ostringstream os; + + if (action == defs::HELP_ACTION) { + if (args.size() == 0) + os << GetHelpDac(""); + else + os << args[0] << GetHelpDac(args[0]) << '\n'; + return os.str(); + } + + bool isCtb = false; + auto detType = det->getDetectorType().squash(defs::GENERIC); + if (detType == defs::CHIPTESTBOARD || + detType == defs::XILINX_CHIPTESTBOARD) { + isCtb = true; + } + + if (action == defs::GET_ACTION) { + auto index = parseDacIndex(0, isCtb); + auto mV = parseMV(1); + auto t = det->getDAC(index, mV, std::vector{det_id}); + os << args[0] << ' ' << OutString(t) << (mV ? " mV" : "") << '\n'; + } + + else if (action == defs::PUT_ACTION) { + auto index = parseDacIndex(0, isCtb); + if (args.size() < 2) { + WrongNumberOfParameters(2); + } + auto val = StringTo(args[1]); + auto mV = parseMV(2); + det->setDAC(index, val, mV, std::vector{det_id}); + os << args[0] << ' ' << args[1] << (mV ? " mV" : "") << '\n'; + } + + else { + throw RuntimeError("Unknown action"); + } + + return os.str(); +} + +defs::dacIndex Caller::parseDacIndex(int argIndex, bool isCtb) { + if (argIndex >= (int)args.size()) { + throw RuntimeError("Invalid arguments. DAC index is required."); + } + auto arg = args[argIndex]; + + if (isCtb) { + // dac index or power dacs + if (is_int(arg) || arg == "v_a" || arg == "v_b" || arg == "v_c" || + arg == "v_d" || arg == "v_io" || arg == "v_chip") { + return StringTo(arg); + } + // dac name for ctb gui + return det->getDacIndex(arg); + } + + // not ctb + if (is_int(arg)) { + throw RuntimeError("DAC index is not supported for your detector. " + "Please use dac name. Use daclist command to get " + "the list of dac names for your detector."); + } + return StringTo(arg); +} + +bool Caller::parseMV(int argIndex) { + if (argIndex < (int)args.size()) { + auto arg = args[argIndex]; + if (arg != "mv" && arg != "mV") { + throw RuntimeError("Unknown argument " + arg + + ". Did you mean mV?"); + } + return true; + } + return false; +} + } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/src/HelpDacs.cpp b/slsDetectorSoftware/src/HelpDacs.cpp index aaa67cbcf..8b40ad244 100644 --- a/slsDetectorSoftware/src/HelpDacs.cpp +++ b/slsDetectorSoftware/src/HelpDacs.cpp @@ -7,7 +7,7 @@ namespace sls { std::string GetHelpDac(std::string dac) { - if (sls::is_int(dac)) { + if (dac.empty() || sls::is_int(dac)) { return std::string("[dac name] [dac or mV value] [(optional unit) mV] " "\n\t[Ctb] Use dac index for dac name."); } @@ -280,24 +280,52 @@ std::string GetHelpDac(std::string dac) { return std::string( "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 7"); } + if (dac == "vtgstv") { + return std::string(""); + } - // clang-format off - if (dac == "vtgstv") { return std::string(""); } - // clang-format on + if (dac == "v_a") { + return std::string( + "[mV value] mV \n\t[Ctb][Xilinx Ctb] Dac for Power supply a. Can " + "only be set in mV. Default to minimum values. To switch off must " + "switch off power rails using 'power' command.\n\t[Ctb] Changes " + "vchip (max of power supply voltages + 200mV)."); + } + if (dac == "v_b") { + return std::string( + "[mV value] mV \n\t[Ctb][Xilinx Ctb] Dac for Power supply b. Can " + "only be set in mV. Default to minimum values. To switch off must " + "switch off power rails using 'power' command.\n\t[Ctb] Changes " + "vchip (max of power supply voltages + 200mV)."); + } + if (dac == "v_c") { + return std::string( + "[mV value] mV \n\t[Ctb][Xilinx Ctb] Dac for Power supply c. Can " + "only be set in mV. Default to minimum values. To switch off must " + "switch off power rails using 'power' command.\n\t[Ctb] Changes " + "vchip (max of power supply voltages + 200mV)."); + } + if (dac == "v_d") { + return std::string( + "[mV value] mV \n\t[Ctb][Xilinx Ctb] Dac for Power supply d. Can " + "only be set in mV. Default to minimum values. To switch off must " + "switch off power rails using 'power' command.\n\t[Ctb] Changes " + "vchip (max of power supply voltages + 200mV)."); + } + if (dac == "v_io") { + return std::string( + "[mV value] mV \n\t[Ctb][Xilinx Ctb] Dac for Power supply IO. Can " + "only be set in mV. Default to minimum values. To switch off must " + "switch off power rails using 'power' command.\n\t[Ctb] Changes " + "vchip (max of power supply voltages + 200mV)."); + } + if (dac == "v_chip") { + return std::string("mV \n\t[Ctb] Dac for Vchip. Can only get. Default " + "to minimum values. Vchip is set in the background " + "when v_a, b, c, d or io are set."); + } throw sls::RuntimeError("Unknown dac command"); } -std::string GetHelpDacWrapper(const std::string &cmd, - const std::vector &args) { - std::ostringstream os; - os << cmd << ' '; - if (args.size() == 0) { - os << GetHelpDac(std::to_string(0)) << '\n'; - } else { - os << args[0] << ' ' << GetHelpDac(args[0]) << '\n'; - } - return os.str(); -} - } // namespace sls diff --git a/slsDetectorSoftware/src/HelpDacs.h b/slsDetectorSoftware/src/HelpDacs.h index 4c2c8cd9e..45f085d89 100644 --- a/slsDetectorSoftware/src/HelpDacs.h +++ b/slsDetectorSoftware/src/HelpDacs.h @@ -7,7 +7,4 @@ namespace sls { std::string GetHelpDac(std::string dac); -std::string GetHelpDacWrapper(const std::string &cmd, - const std::vector &args); - } // namespace sls diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp index 5c1cb5324..22ad78908 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp @@ -594,13 +594,15 @@ TEST_CASE("dac", "[.detectorintegration][.dacs]") { defs::V_POWER_A, defs::V_POWER_B, defs::V_POWER_C, defs::V_POWER_D, defs::V_POWER_IO}; for (size_t iPower = 0; iPower < names.size(); ++iPower) { - auto prev_val = det.getDAC(indices[iPower]); + auto prev_val = det.getDAC(indices[iPower], true); // this is the first command touching power dacs, should not be // -100 - if (det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::XILINX_CHIPTESTBOARD || + det_type == defs::CHIPTESTBOARD) { REQUIRE(prev_val.any(-100) == false); REQUIRE(prev_val.any(-1) == false); + REQUIRE(prev_val.any(0) == false); } REQUIRE_THROWS( @@ -613,6 +615,11 @@ TEST_CASE("dac", "[.detectorintegration][.dacs]") { caller.call("dac", {names[iPower], "0"}, -1, PUT)); REQUIRE_THROWS( caller.call("dac", {names[iPower], "4096"}, -1, PUT)); + // not mV + REQUIRE_THROWS( + caller.call("dac", {names[iPower], "1200"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dac", {names[iPower]}, -1, GET)); + // min if (names[iPower] == "v_io") REQUIRE_THROWS(caller.call( @@ -634,33 +641,19 @@ TEST_CASE("dac", "[.detectorintegration][.dacs]") { REQUIRE_THROWS(caller.call( "dac", {names[iPower], "2469", "mV"}, -1, PUT)); } - { - std::ostringstream oss; - caller.call("dac", {names[iPower], "800", "mV"}, -1, PUT, - oss); - REQUIRE(oss.str() == "dac " + names[iPower] + " 800 mV\n"); - } { std::ostringstream oss1, oss2; caller.call("dac", {names[iPower], "1200", "mV"}, -1, PUT, oss1); REQUIRE(oss1.str() == "dac " + names[iPower] + " 1200 mV\n"); - caller.call("dac", {names[iPower], "1200", "mV"}, -1, GET, - oss2); + caller.call("dac", {names[iPower], "mV"}, -1, GET, oss2); REQUIRE(oss2.str() == "dac " + names[iPower] + " 1200 mV\n"); } - { - std::ostringstream oss1, oss2; - caller.call("dac", {names[iPower], "1200"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "dac " + names[iPower] + " 1200\n"); - caller.call("dac", {names[iPower], "1200"}, -1, GET, oss2); - REQUIRE(oss2.str() == "dac " + names[iPower] + " 1200\n"); - } // Reset all dacs to previous value for (int imod = 0; imod != det.size(); ++imod) { - det.setDAC(indices[iPower], prev_val[imod], false, {imod}); + det.setDAC(indices[iPower], prev_val[imod], true, {imod}); } } } diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp index e79e58673..b3c2d1f00 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp @@ -48,6 +48,7 @@ void test_dac_caller(defs::dacIndex index, const std::string &dacname, std::vector args = {dac, value}; if (mV) args.push_back("mV"); + std::cout << "args:" << ToString(args) << std::endl; caller.call("dac", args, -1, PUT, oss); REQUIRE(oss.str() == std::string("dac ") + dac + " " + value + (mV ? " mV\n" : "\n")); @@ -57,7 +58,7 @@ void test_dac_caller(defs::dacIndex index, const std::string &dacname, std::vector args = {dac}; if (mV) args.push_back("mV"); - caller.call(dacname, args, -1, GET, oss); + caller.call("dac", args, -1, GET, oss); REQUIRE(oss.str() == "dac " + dac + " " + value + (mV ? " mV\n" : "\n")); } diff --git a/slsSupportLib/tests/test-bit_utils.cpp b/slsSupportLib/tests/test-bit_utils.cpp index ac9ddad8a..7e9a8319f 100644 --- a/slsSupportLib/tests/test-bit_utils.cpp +++ b/slsSupportLib/tests/test-bit_utils.cpp @@ -121,8 +121,7 @@ TEST_CASE("Convert BitAddress using classes", "[support]") { } } -TEST_CASE("Output operator gives same result as string", - "[support]") { +TEST_CASE("Output operator gives same result as string", "[support]") { { RegisterAddress addr{0x3456af}; std::ostringstream os;