From 09922ddfb74ebc6b259b8477b4b45a6376abba24 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 28 Apr 2026 16:01:36 +0200 Subject: [PATCH] intro frequency unit enums, removed unnecessary template behavior for ToString with freq unit, switching from parsing string unit argument to the enum argument for ToString, adding parsing string to unit at CLI boundary --- slsDetectorSoftware/generator/Caller.in.h | 4 ++ slsDetectorSoftware/src/Caller.h | 4 ++ slsDetectorSoftware/src/CallerSpecial.cpp | 25 +++++++++ slsSupportLib/include/sls/ToString.h | 52 +++++++------------ slsSupportLib/include/sls/sls_detector_defs.h | 2 + slsSupportLib/src/ToString.cpp | 30 +++++++++++ slsSupportLib/tests/test-ToString.cpp | 6 +-- 7 files changed, 86 insertions(+), 37 deletions(-) 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]") {