diff --git a/slsDetectorSoftware/generator/Caller.in.h b/slsDetectorSoftware/generator/Caller.in.h index f7128620e..e18dec02c 100644 --- a/slsDetectorSoftware/generator/Caller.in.h +++ b/slsDetectorSoftware/generator/Caller.in.h @@ -54,6 +54,9 @@ class Caller { return ToString(value, unit); } + std::string OutString(const Result &value, + const std::string &unit); + std::vector getAllCommands(); std::map GetDeprecatedCommands(); std::string list(int action); @@ -96,6 +99,7 @@ class Caller { defs::dacIndex parseDacIndex(int argIndex, bool isCtb); bool parseMV(int argIndex); defs::powerIndex parsePowerIndex(int argIndex); + defs::FrequencyUnit parseFrequencyUnit(const std::string &s); FunctionMap functions{ {"list", &Caller::list}, diff --git a/slsDetectorSoftware/src/Caller.h b/slsDetectorSoftware/src/Caller.h index ce9e7cc93..d35ffe569 100644 --- a/slsDetectorSoftware/src/Caller.h +++ b/slsDetectorSoftware/src/Caller.h @@ -54,6 +54,9 @@ class Caller { return ToString(value, unit); } + std::string OutString(const Result &value, + const std::string &unit); + std::vector getAllCommands(); std::map GetDeprecatedCommands(); std::string list(int action); @@ -421,6 +424,7 @@ class Caller { defs::dacIndex parseDacIndex(int argIndex, bool isCtb); bool parseMV(int argIndex); defs::powerIndex parsePowerIndex(int argIndex); + defs::FrequencyUnit parseFrequencyUnit(const std::string &s); FunctionMap functions{ {"list", &Caller::list}, diff --git a/slsDetectorSoftware/src/CallerSpecial.cpp b/slsDetectorSoftware/src/CallerSpecial.cpp index cf339ee5d..50cd1e72d 100644 --- a/slsDetectorSoftware/src/CallerSpecial.cpp +++ b/slsDetectorSoftware/src/CallerSpecial.cpp @@ -11,6 +11,14 @@ namespace sls { // some helper functions to print +std::string Caller::OutString(const Result &value, + const std::string &unit) { + auto u = parseFrequencyUnit(unit); + if (value.equal()) + return ToString(value.front(), u); + return ToString(value, u); +} + std::vector Caller::getAllCommands() { std::vector ret; for (auto it : functions) @@ -2105,4 +2113,21 @@ std::string Caller::powervalues(int action) { return os.str(); } +defs::FrequencyUnit Caller::parseFrequencyUnit(const std::string &unit) { + auto unitLower = [&] { + std::string result = unit; + std::transform(result.begin(), result.end(), result.begin(), + [](unsigned char c) { return std::tolower(c); }); + return result; + }(); + if (unitLower == "hz") + return defs::FrequencyUnit::Hz; + if (unitLower == "khz") + return defs::FrequencyUnit::kHz; + if (unitLower == "mhz") + return defs::FrequencyUnit::MHz; + + throw std::runtime_error("Unknown frequency unit: " + unit); +} + } // namespace sls \ No newline at end of file diff --git a/slsSupportLib/include/sls/ToString.h b/slsSupportLib/include/sls/ToString.h index 569e84a54..7035f9c38 100644 --- a/slsSupportLib/include/sls/ToString.h +++ b/slsSupportLib/include/sls/ToString.h @@ -109,42 +109,10 @@ ToString(From t) { } /** Convert frequency with specified output unit */ -template -typename std::enable_if::value, std::string>::type -ToString(T f, const std::string &unit) { - double val = static_cast(f.value); - - auto unitLower = [&] { - std::string result = unit; - std::transform(result.begin(), result.end(), result.begin(), - [](unsigned char c) { return std::tolower(c); }); - return result; - }(); - std::ostringstream os; - if (unitLower == "hz") - os << val << unit; - else if (unitLower == "khz") - os << val / (static_cast(1e3)) << unit; - else if (unitLower == "mhz") - os << val / (static_cast(1e6)) << unit; - else - throw std::runtime_error("Unknown unit: " + unit); - return os.str(); -} +std::string ToString(defs::Hz f, defs::FrequencyUnit unit); /** Convert frequency automatically selecting the unit */ -template -typename std::enable_if::value, std::string>::type -ToString(From f) { - int val = f.value; - if (val < 1e3) { - return ToString(f, "Hz"); - } else if (val < 1e6) { - return ToString(f, "kHz"); - } else { - return ToString(f, "MHz"); - } -} +std::string ToString(defs::Hz f); /** Conversion of floating point values, removes trailing zeros*/ template @@ -317,6 +285,22 @@ ToString(const T &container, const std::string &unit) { return os.str(); } +/** Container and specified unit, call ToString(value, FrequencyUnit) */ +template +typename std::enable_if::value, std::string>::type +ToString(const T &container, defs::FrequencyUnit unit) { + std::ostringstream os; + os << '['; + if (!container.empty()) { + auto it = container.cbegin(); + os << ToString(*it++, unit); + while (it != container.cend()) + os << ", " << ToString(*it++, unit); + } + os << ']'; + return os.str(); +} + template ::value, int> = 0> T StringTo(const std::string &t, const std::string &unit) { double tval{0}; diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index 79aec83a1..9ab24a16d 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -219,6 +219,8 @@ class slsDetectorDefs { } }; + enum class FrequencyUnit { Hz, kHz, MHz }; + #endif enum frameDiscardPolicy { NO_DISCARD, diff --git a/slsSupportLib/src/ToString.cpp b/slsSupportLib/src/ToString.cpp index f8ac4c684..26c94f2b2 100644 --- a/slsSupportLib/src/ToString.cpp +++ b/slsSupportLib/src/ToString.cpp @@ -739,6 +739,36 @@ std::string ToString(const defs::collectionMode s) { const std::string &ToString(const std::string &s) { return s; } +std::string ToString(defs::Hz f, defs::FrequencyUnit unit) { + double val = static_cast(f.value); + std::ostringstream os; + switch (unit) { + case defs::FrequencyUnit::Hz: + os << val << "Hz"; + break; + case defs::FrequencyUnit::kHz: + os << val / (static_cast(1e3)) << "kHz"; + break; + case defs::FrequencyUnit::MHz: + os << val / (static_cast(1e6)) << "MHz"; + break; + default: + throw std::runtime_error("Unknown frequency unit"); + } + return os.str(); +} + +std::string ToString(defs::Hz f) { + int val = f.value; + if (val < 1e3) { + return ToString(f, defs::FrequencyUnit::Hz); + } else if (val < 1e6) { + return ToString(f, defs::FrequencyUnit::kHz); + } else { + return ToString(f, defs::FrequencyUnit::MHz); + } +} + template <> defs::detectorType StringTo(const std::string &s) { if (s == "Eiger") return defs::EIGER; diff --git a/slsSupportLib/tests/test-ToString.cpp b/slsSupportLib/tests/test-ToString.cpp index a7ef24c7f..0c35bdfc0 100644 --- a/slsSupportLib/tests/test-ToString.cpp +++ b/slsSupportLib/tests/test-ToString.cpp @@ -80,9 +80,9 @@ TEST_CASE("conversion from frequency to string", "[support]") { REQUIRE(ToString(defs::Hz(150)) == "150Hz"); REQUIRE(ToString(defs::Hz(1500)) == "1.5kHz"); REQUIRE(ToString(defs::Hz(1500000)) == "1.5MHz"); - REQUIRE(ToString(defs::Hz(150), "Hz") == "150Hz"); - REQUIRE(ToString(defs::Hz(150), "kHz") == "0.15kHz"); - REQUIRE(ToString(defs::Hz(150), "MHz") == "0.00015MHz"); + REQUIRE(ToString(defs::Hz(150), defs::FrequencyUnit::Hz) == "150Hz"); + REQUIRE(ToString(defs::Hz(150), defs::FrequencyUnit::kHz) == "0.15kHz"); + REQUIRE(ToString(defs::Hz(150), defs::FrequencyUnit::MHz) == "0.00015MHz"); } TEST_CASE("Convert vector of time", "[support]") {