diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 3cb56ea51..227aecd01 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1814,7 +1814,7 @@ std::string CmdProxy::PatternWaitTime(int action) { if (args.size() != 1) { WrongNumberOfParameters(1); } - det->setPatternWaitTime(level, std::stoul(args[0]), {det_id}); + det->setPatternWaitTime(level, StringTo(args[0]), {det_id}); os << args.front() << '\n'; } else { throw sls::RuntimeError("Unknown action"); diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index b5a965e80..7a3eb920f 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1027,16 +1027,16 @@ class CmdProxy { /* acquisition parameters */ INTEGER_COMMAND_NOID(frames, getNumberOfFrames, setNumberOfFrames, - std::stol, + StringTo, "[n_frames]\n\tNumber of frames per aquire. In trigger mode, number of frames per trigger." "\n\t[Gotthard2] Burst mode has a maximum of 2720 frames."); INTEGER_COMMAND_NOID(triggers, getNumberOfTriggers, setNumberOfTriggers, - std::stol, + StringTo, "[n_triggers]\n\tNumber of triggers per aquire. Use timing command to set timing mode."); INTEGER_COMMAND_NOID(bursts, getNumberOfBursts, setNumberOfBursts, - std::stol, + StringTo, "[n_bursts]\n\t[Gotthard2] Number of bursts per aquire. Only in auto timing mode and burst mode. Use timing command to set timing mode and burstmode command to set burst mode."); TIME_COMMAND(exptime, getExptime, setExptime, @@ -1374,7 +1374,7 @@ class CmdProxy { GET_COMMAND(rx_missingpackets, getNumMissingPackets, "\n\tNumber of missing packets for each port in receiver."); - INTEGER_COMMAND(startingfnum, getStartingFrameNumber, setStartingFrameNumber, std::stoull, + INTEGER_COMMAND(startingfnum, getStartingFrameNumber, setStartingFrameNumber, StringTo, "[n_value]\n\t[Eiger[Jungfrau] Starting frame number for next acquisition."); EXECUTE_SET_COMMAND(trigger, sendSoftwareTrigger, @@ -1454,7 +1454,7 @@ class CmdProxy { "receiver. 0 does not pad partial frames(fastest), 1 " "(default) pads partial frames"); - INTEGER_COMMAND(rx_udpsocksize, getRxUDPSocketBufferSize, setRxUDPSocketBufferSize, std::stol, + INTEGER_COMMAND(rx_udpsocksize, getRxUDPSocketBufferSize, setRxUDPSocketBufferSize, StringTo, "[n_size]\n\tUDP socket buffer size in receiver. Tune rmem_default and rmem_max accordingly. rx_hostname sets it to defaults."); GET_COMMAND(rx_realudpsocksize, getRxRealUDPSocketBufferSize, @@ -1478,7 +1478,7 @@ class CmdProxy { STRING_COMMAND(fname, getFileNamePrefix, setFileNamePrefix, "[path]\n\tFile name prefix for output data file. Default is run. File name: [file name prefix]_d[detector index]_f[sub file index]_[acquisition/file index].raw."); - INTEGER_COMMAND(findex, getAcquisitionIndex, setAcquisitionIndex, std::stol, + INTEGER_COMMAND(findex, getAcquisitionIndex, setAcquisitionIndex, StringTo, "[0, 1]\n\tFile or Acquisition index."); INTEGER_COMMAND(fwrite, getFileWrite, setFileWrite, StringTo, diff --git a/slsSupportLib/include/ToString.h b/slsSupportLib/include/ToString.h index 1e1cc922a..64e442e6d 100644 --- a/slsSupportLib/include/ToString.h +++ b/slsSupportLib/include/ToString.h @@ -628,6 +628,12 @@ inline int StringTo(const std::string &s) { return std::stoi(s, nullptr, base); } +template <> +inline int64_t StringTo(const std::string &s) { + int base = s.find("0x") != std::string::npos ? 16 : 10; + return std::stol(s, nullptr, base); +} + /** For types with a .str() method use this for conversion */ template typename std::enable_if::value, std::string>::type diff --git a/slsSupportLib/tests/test-ToString.cpp b/slsSupportLib/tests/test-ToString.cpp index 599be4520..b469b2b2f 100644 --- a/slsSupportLib/tests/test-ToString.cpp +++ b/slsSupportLib/tests/test-ToString.cpp @@ -179,3 +179,18 @@ TEST_CASE("int from string"){ REQUIRE(StringTo("0xffffff") == 0xffffff); } + + +TEST_CASE("int64_t from string"){ + REQUIRE(StringTo("-1") == -1); + REQUIRE(StringTo("-0x1") == -0x1); + REQUIRE(StringTo("-0x1") == -1); + REQUIRE(StringTo("0") == 0); + REQUIRE(StringTo("5") == 5); + REQUIRE(StringTo("16") == 16); + REQUIRE(StringTo("20") == 20); + REQUIRE(StringTo("0x14") == 20); + REQUIRE(StringTo("0x15") == 21); + REQUIRE(StringTo("0xffffff") == 0xffffff); + +}