diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 3592691d1..26777f4be 100755 Binary files a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer and b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer differ diff --git a/slsDetectorSoftware/include/CmdProxy.h b/slsDetectorSoftware/include/CmdProxy.h index c89ef8fc1..0ea66c0a8 100644 --- a/slsDetectorSoftware/include/CmdProxy.h +++ b/slsDetectorSoftware/include/CmdProxy.h @@ -233,7 +233,7 @@ WrongNumberOfParameters(1); \ } \ auto t = det->GETFCN(DAC_INDEX, mv, {det_id}); \ - os << OutString(t) << (args.size() > 1 ? " mv\n" : "\n"); \ + os << OutString(t) << (args.size() > 0 ? " mv\n" : "\n"); \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ bool mv = false; \ if (args.size() == 2) { \ @@ -423,10 +423,17 @@ class CmdProxy { return ToString(value, unit); } - inline unsigned int stoui(const std::string& s) { - unsigned long lresult = stoul(s, 0, 10); + inline unsigned int stoiHex(const std::string& s) { + unsigned long lresult = stoul(s, 0, 16); unsigned int result = lresult; - if (result != lresult) throw std::out_of_range("cannot convert to unsigned int"); + if (result != lresult) { + throw std::out_of_range("cannot convert to unsigned int"); + } + return result; + } + + inline unsigned long int stoulHex(const std::string& s) { + unsigned long result = stoul(s, 0, 16); return result; } @@ -882,7 +889,7 @@ class CmdProxy { GET_COMMAND(rx_framescaught, getFramesCaught, "\n\tNumber of frames caught by receiver."); - INTEGER_COMMAND(startingfnum, getStartingFrameNumber, setStartingFrameNumber, std::stoul, + INTEGER_COMMAND(startingfnum, getStartingFrameNumber, setStartingFrameNumber, std::stoull, "[n_value]\n\t[Eiger[Jungfrau] Starting frame number for next acquisition."); EXECUTE_SET_COMMAND(trigger, sendSoftwareTrigger, @@ -1181,25 +1188,25 @@ class CmdProxy { GET_IND_COMMAND(vm_io, getMeasuredVoltage, defs::V_POWER_IO, "", "\n\t[Ctb] Measured voltage of power supply io in mV."); - GET_IND_COMMAND(im_a, getMeasuredVoltage, defs::I_POWER_A, "", + GET_IND_COMMAND(im_a, getMeasuredCurrent, defs::I_POWER_A, "", "\n\t[Ctb] Measured current of power supply a in mA."); - GET_IND_COMMAND(im_b, getMeasuredVoltage, defs::I_POWER_B, "", + GET_IND_COMMAND(im_b, getMeasuredCurrent, defs::I_POWER_B, "", "\n\t[Ctb] Measured current of power supply b in mA."); - GET_IND_COMMAND(im_c, getMeasuredVoltage, defs::I_POWER_C, "", + GET_IND_COMMAND(im_c, getMeasuredCurrent, defs::I_POWER_C, "", "\n\t[Ctb] Measured current of power supply c in mA."); - GET_IND_COMMAND(im_d, getMeasuredVoltage, defs::I_POWER_D, "", + GET_IND_COMMAND(im_d, getMeasuredCurrent, defs::I_POWER_D, "", "\n\t[Ctb] Measured current of power supply d in mA."); - GET_IND_COMMAND(im_io, getMeasuredVoltage, defs::I_POWER_IO, "", + GET_IND_COMMAND(im_io, getMeasuredCurrent, defs::I_POWER_IO, "", "\n\t[Ctb] Measured current of power supply io in mA."); - INTEGER_COMMAND(adcenable, getADCEnableMask, setADCEnableMask, stoui, + INTEGER_COMMAND_HEX(adcenable, getADCEnableMask, setADCEnableMask, stoiHex, "[bitmask]\n\t[Ctb] ADC Enable Mask."); - INTEGER_COMMAND(adcinvert, getADCInvert, setADCInvert, stoui, + INTEGER_COMMAND_HEX(adcinvert, getADCInvert, setADCInvert, stoiHex, "[bitmask]\n\t[Ctb] ADC Inversion Mask."); INTEGER_COMMAND(extsampling, getExternalSampling, setExternalSampling, std::stoi, @@ -1220,10 +1227,10 @@ class CmdProxy { EXECUTE_SET_COMMAND_NOID_1ARG(savepattern, savePattern, "[fname]\n\t[Ctb] Saves pattern to file (ascii). Also executes pattern."); - INTEGER_COMMAND_HEX(patioctrl, getPatternIOControl, setPatternIOControl, std::stoul, + INTEGER_COMMAND_HEX(patioctrl, getPatternIOControl, setPatternIOControl, std::stoull, "[64 bit mask]\n\t[Ctb] 64 bit mask defining input (0) and output (1) signals."); - INTEGER_COMMAND_HEX(patclkctrl, getPatternClockControl, setPatternClockControl, std::stoul, + INTEGER_COMMAND_HEX(patclkctrl, getPatternClockControl, setPatternClockControl, std::stoull, "[64 bit mask]\n\t[Ctb] 64 bit mask defining output clock enable."); diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 782374f3a..67ffb2f0f 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -294,39 +294,48 @@ std::string CmdProxy::Speed(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[0 or full_speed|1 or half_speed|2 or quarter_speed]\n\t[Eiger][Jungfrau] Readout speed of chip.\n\tJungfrau also overwrites adcphase to recommended default. " << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 0) { - WrongNumberOfParameters(0); - } - auto t = det->getSpeed({det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - defs::speedLevel t; - try{ - int ival = std::stoi(args[0]); - switch (ival) { - case 0: - t = defs::FULL_SPEED; - break; - case 1: - t = defs::HALF_SPEED; - break; - case 2: - t = defs::QUARTER_SPEED; - break; - default: - throw sls::RuntimeError("Unknown speed " + args[0]); - } - } catch (...) { - t = sls::StringTo(args[0]); + } else { + defs::detectorType type = det->getDetectorType().squash(); + if (type == defs::CHIPTESTBOARD || type == defs::MOENCH) { + throw sls::RuntimeError("Speed not implemented. Did you mean runclk?"); + } + if (type != defs::EIGER && type != defs::JUNGFRAU) { + throw sls::RuntimeError("Speed not implemented."); // setspped one function problem. tbr after change + } + if (action == defs::GET_ACTION) { + if (args.size() != 0) { + WrongNumberOfParameters(0); + } + auto t = det->getSpeed({det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + defs::speedLevel t; + try{ + int ival = std::stoi(args[0]); + switch (ival) { + case 0: + t = defs::FULL_SPEED; + break; + case 1: + t = defs::HALF_SPEED; + break; + case 2: + t = defs::QUARTER_SPEED; + break; + default: + throw sls::RuntimeError("Unknown speed " + args[0]); + } + } catch (...) { + t = sls::StringTo(args[0]); + } + det->setSpeed(t, {det_id}); + os << sls::ToString(t) << '\n'; // no args to convert 0,1,2 as well + } else { + throw sls::RuntimeError("Unknown action"); } - det->setSpeed(t, {det_id}); - os << sls::ToString(t) << '\n'; // no args to convert 0,1,2 as well - } else { - throw sls::RuntimeError("Unknown action"); } return os.str(); } @@ -1000,7 +1009,7 @@ std::string CmdProxy::DigitalIODelay(int action) { if (args.size() != 2) { WrongNumberOfParameters(2); } - det->setDigitalIODelay(std::stoul(args[0]), std::stoi(args[2])); + det->setDigitalIODelay(stoulHex(args[0]), std::stoi(args[1])); os << sls::ToString(args) << '\n'; } else { throw sls::RuntimeError("Unknown action"); @@ -1039,13 +1048,13 @@ std::string CmdProxy::PatternWord(int action) { if (args.size() != 1) { WrongNumberOfParameters(1); } - auto t = det->getPatternWord(std::stoi(args[0]), {det_id}); + auto t = det->getPatternWord(stoiHex(args[0]), {det_id}); os << OutStringHex(t) << '\n'; } else if (action == defs::PUT_ACTION) { if (args.size() != 2) { WrongNumberOfParameters(2); } - det->setPatternWord(std::stoi(args[0]), std::stoul(args[1])); + det->setPatternWord(stoiHex(args[0]), stoulHex(args[1])); os << sls::ToString(args) << '\n'; } else { throw sls::RuntimeError("Unknown action"); diff --git a/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp b/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp index 3d9b05bda..fc927cb9a 100644 --- a/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp +++ b/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp @@ -11,21 +11,29 @@ auto PUT = slsDetectorDefs::PUT_ACTION; TEST_CASE("patword", "[.cmd][.ctb]") { if (test::type == slsDetectorDefs::CHIPTESTBOARD) { + uint64_t prev_value = 0; + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("patword 0x23", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("patword ")); + prev_value = stoul(s, 0, 16); + } { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("patword 0x23 0xc15004808d0a21a4", PUT, nullptr, oss)); - REQUIRE(oss.str() == "patword 0x23 0xc15004808d0a21a4\n"); + REQUIRE(oss.str() == "patword [0x23, 0xc15004808d0a21a4]\n"); } { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("patword 0x23 0x0", PUT, nullptr, oss)); - REQUIRE(oss.str() == "patword 0x23 0x0\n"); + REQUIRE(oss.str() == "patword [0x23, 0x0]\n"); } { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("patword 0x23", GET, nullptr, oss)); - REQUIRE(oss.str() == "patword 0x23 0x0\n"); - } + REQUIRE(oss.str() == "patword 0x0\n"); + } + REQUIRE_NOTHROW(multiSlsDetectorClient("patword 0x23 " + std::to_string(prev_value), PUT)); } else { REQUIRE_THROWS(multiSlsDetectorClient("patword 0x23", GET)); } @@ -33,6 +41,13 @@ TEST_CASE("patword", "[.cmd][.ctb]") { TEST_CASE("patclkctrl", "[.cmd][.ctb]") { if (test::type == slsDetectorDefs::CHIPTESTBOARD) { + uint64_t prev_value = 0; + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("patclkctrl", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("patclkctrl ")); + prev_value = stoul(s, 0, 16); + } { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("patclkctrl 0xc15004808d0a21a4", PUT, nullptr, oss)); @@ -47,7 +62,8 @@ TEST_CASE("patclkctrl", "[.cmd][.ctb]") { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("patclkctrl", GET, nullptr, oss)); REQUIRE(oss.str() == "patclkctrl 0x0\n"); - } + } + REQUIRE_NOTHROW(multiSlsDetectorClient("patclkctrl " + std::to_string(prev_value), PUT)); } else { REQUIRE_THROWS(multiSlsDetectorClient("patclkctrl", GET)); } @@ -56,6 +72,13 @@ TEST_CASE("patclkctrl", "[.cmd][.ctb]") { TEST_CASE("patioctrl", "[.cmd][.ctb]") { if (test::type == slsDetectorDefs::CHIPTESTBOARD) { + uint64_t prev_value = 0; + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("patioctrl", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("patioctrl ")); + prev_value = stoul(s, 0, 16); + } { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("patioctrl 0xc15004808d0a21a4", PUT, nullptr, oss)); @@ -70,7 +93,8 @@ TEST_CASE("patioctrl", "[.cmd][.ctb]") { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("patioctrl", GET, nullptr, oss)); REQUIRE(oss.str() == "patioctrl 0x0\n"); - } + } + REQUIRE_NOTHROW(multiSlsDetectorClient("patioctrl " + std::to_string(prev_value), PUT)); } else { REQUIRE_THROWS(multiSlsDetectorClient("patioctrl", GET)); } @@ -126,10 +150,10 @@ TEST_CASE("diodelay", "[.cmd][.ctb]") { { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("diodelay 0x01010 775", PUT, nullptr, oss)); - REQUIRE(oss.str() == "diodelay 0x01010 775\n"); + REQUIRE(oss.str() == "diodelay [0x01010, 775]\n"); } REQUIRE_NOTHROW(multiSlsDetectorClient("diodelay 0x01010 0", PUT)); - REQUIRE_THROWS(multiSlsDetectorClient("diodelay 0x01010 776", PUT)); + REQUIRE_THROWS(multiSlsDetectorClient("diodelay [0x01010, 776]", PUT)); } else { REQUIRE_THROWS(multiSlsDetectorClient("diodelay", GET)); } @@ -145,7 +169,7 @@ TEST_CASE("rx_dbitoffset", "[.cmd][.ctb]") { } { std::ostringstream oss; - REQUIRE_NOTHROW(multiSlsDetectorClient("extsamplirx_dbitoffsetngsrc 0", PUT, nullptr, oss)); + REQUIRE_NOTHROW(multiSlsDetectorClient("rx_dbitoffset 0", PUT, nullptr, oss)); REQUIRE(oss.str() == "rx_dbitoffset 0\n"); } { @@ -318,13 +342,13 @@ TEST_CASE("v_a", "[.cmd][.ctb]") { } { std::ostringstream oss; - REQUIRE_NOTHROW(multiSlsDetectorClient("v_limit 1000", PUT, nullptr, oss)); - REQUIRE(oss.str() == "vlimit 1000\n"); + REQUIRE_NOTHROW(multiSlsDetectorClient("v_limit 1500", PUT, nullptr, oss)); + REQUIRE(oss.str() == "v_limit 1500\n"); } { std::ostringstream oss; REQUIRE_NOTHROW(multiSlsDetectorClient("v_limit", GET, nullptr, oss)); - REQUIRE(oss.str() == "vlimit 1000\n"); + REQUIRE(oss.str() == "v_limit 1500\n"); } REQUIRE_NOTHROW(multiSlsDetectorClient(s, PUT)); { @@ -398,7 +422,7 @@ TEST_CASE("adcvpp", "[.cmd][.ctb]") { { REQUIRE_NOTHROW(multiSlsDetectorClient("adcvpp 1140 mv", PUT)); std::ostringstream oss; - REQUIRE_NOTHROW(multiSlsDetectorClient("adcvpp", GET, nullptr, oss)); + REQUIRE_NOTHROW(multiSlsDetectorClient("adcvpp mv", GET, nullptr, oss)); REQUIRE(oss.str() == "adcvpp 1140 mv\n"); } REQUIRE_NOTHROW(multiSlsDetectorClient("adcvpp " + std::to_string(prev_val), PUT)); @@ -430,7 +454,7 @@ TEST_CASE("dbitpipeline", "[.cmd][.ctb]") { REQUIRE_NOTHROW(multiSlsDetectorClient("dbitpipeline", GET, nullptr, oss)); REQUIRE(oss.str() == "dbitpipeline 15\n"); } - REQUIRE_THROWS(multiSlsDetectorClient("dbitpipeline 16", PUT)); + REQUIRE_NOTHROW(multiSlsDetectorClient("dbitpipeline 0", PUT)); } else { REQUIRE_THROWS(multiSlsDetectorClient("dbitpipeline", GET)); } @@ -458,7 +482,7 @@ TEST_CASE("adcpipeline", "[.cmd][.ctb]") { REQUIRE_NOTHROW(multiSlsDetectorClient("adcpipeline", GET, nullptr, oss)); REQUIRE(oss.str() == "adcpipeline 15\n"); } - REQUIRE_THROWS(multiSlsDetectorClient("adcpipeline 16", PUT)); + REQUIRE_NOTHROW(multiSlsDetectorClient("adcpipeline 0", PUT)); } else { REQUIRE_THROWS(multiSlsDetectorClient("adcpipeline", GET)); } @@ -496,7 +520,7 @@ TEST_CASE("dbitphase", "[.cmd][.ctb]") { REQUIRE_NOTHROW(multiSlsDetectorClient("dbitphase", GET, nullptr, oss)); REQUIRE(oss.str() == "dbitphase 0\n"); } - if (test::type != slsDetectorDefs::GOTTHARD) { + if (test::type == slsDetectorDefs::GOTTHARD) { REQUIRE_THROWS(multiSlsDetectorClient("dbitphase deg", GET)); } else { REQUIRE_NOTHROW(multiSlsDetectorClient("dbitphase 20 deg", PUT)); @@ -538,10 +562,25 @@ TEST_CASE("romode", "[.cmd][.ctb]") { TEST_CASE("samples", "[.cmd][.ctb]") { if (test::type == slsDetectorDefs::CHIPTESTBOARD) { + uint64_t prev_value1 = 0; + { + std::ostringstream oss; + REQUIRE_NOTHROW(multiSlsDetectorClient("asamples", GET, nullptr, oss)); + std::string s = (oss.str()).erase (0, strlen("asamples ")); + prev_value1 = std::stoi(s); + } + std::cout<<"asamples:"<("Eiger") == dt::EIGER); REQUIRE(StringTo
("Gotthard") == dt::GOTTHARD); REQUIRE(StringTo
("Jungfrau") == dt::JUNGFRAU); - REQUIRE(StringTo
("JungfrauCTB") == dt::CHIPTESTBOARD); + REQUIRE(StringTo
("ChipTestBoard") == dt::CHIPTESTBOARD); REQUIRE(StringTo
("Moench") == dt::MOENCH); REQUIRE(StringTo
("Mythen3") == dt::MYTHEN3); REQUIRE(StringTo
("Gotthard2") == dt::GOTTHARD2);