From 929e441dc60abf2971bac4a6b4a0da2f5223d0a7 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 1 Jul 2025 17:31:49 +0200 Subject: [PATCH] refactor command line parsing of roi --- slsDetectorSoftware/generator/Caller.in.h | 1 + slsDetectorSoftware/src/Caller.h | 1 + slsDetectorSoftware/src/CallerSpecial.cpp | 42 ++++++++++------------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/slsDetectorSoftware/generator/Caller.in.h b/slsDetectorSoftware/generator/Caller.in.h index de91b2abc..715922dfb 100644 --- a/slsDetectorSoftware/generator/Caller.in.h +++ b/slsDetectorSoftware/generator/Caller.in.h @@ -22,6 +22,7 @@ class Caller { int GetLevelAndInsertIntoArgs(std::string levelSeparatedCommand); void WrongNumberOfParameters(size_t expected); std::vector parseRoiVector(const std::string &input); + defs::ROI parseRoi(const std::vector &args); template std::string OutStringHex(const V &value) { if (value.equal()) diff --git a/slsDetectorSoftware/src/Caller.h b/slsDetectorSoftware/src/Caller.h index 5a667938f..068aca94c 100644 --- a/slsDetectorSoftware/src/Caller.h +++ b/slsDetectorSoftware/src/Caller.h @@ -22,6 +22,7 @@ class Caller { int GetLevelAndInsertIntoArgs(std::string levelSeparatedCommand); void WrongNumberOfParameters(size_t expected); std::vector parseRoiVector(const std::string &input); + defs::ROI parseRoi(const std::vector &args); template std::string OutStringHex(const V &value) { if (value.equal()) diff --git a/slsDetectorSoftware/src/CallerSpecial.cpp b/slsDetectorSoftware/src/CallerSpecial.cpp index 5b9426ceb..f7c08a5bd 100644 --- a/slsDetectorSoftware/src/CallerSpecial.cpp +++ b/slsDetectorSoftware/src/CallerSpecial.cpp @@ -770,18 +770,8 @@ std::string Caller::rx_roi(int action) { try { // single roi in previous format: [xmin,xmax,ymin,ymax] if (!isVectorInput) { - if (args.size() == 2 || args.size() == 4) { - defs::ROI t; - t.xmin = StringTo(args[0]); - t.xmax = StringTo(args[1]); - if (args.size() == 4) { - t.ymin = StringTo(args[2]); - t.ymax = StringTo(args[3]); - } - rois.emplace_back(t); - } else { - WrongNumberOfParameters(2); - } + auto t = parseRoi(args); + rois.emplace_back(t); } // multiple roi or single roi with brackets // multiple roi: multiple args with bracketed ROIs, or single arg @@ -831,22 +821,28 @@ std::vector Caller::parseRoiVector(const std::string &input) { parts.push_back(num); } - if (parts.size() != 2 && parts.size() != 4) { - throw RuntimeError("ROI must have 2 or 4 comma-separated integers"); - } - - defs::ROI roi; - roi.xmin = StringTo(parts[0]); - roi.xmax = StringTo(parts[1]); - if (parts.size() == 4) { - roi.ymin = StringTo(parts[2]); - roi.ymax = StringTo(parts[3]); - } + auto roi = parseRoi(parts); rois.emplace_back(roi); } return rois; } +defs::ROI Caller::parseRoi(const std::vector &parts) { + if (parts.size() != 2 && parts.size() != 4) { + throw RuntimeError( + "Could not parse ROI. A ROI must have 2 or 4 integers"); + } + + defs::ROI roi; + roi.xmin = StringTo(parts[0]); + roi.xmax = StringTo(parts[1]); + if (parts.size() == 4) { + roi.ymin = StringTo(parts[2]); + roi.ymax = StringTo(parts[3]); + } + return roi; +} + std::string Caller::ratecorr(int action) { std::ostringstream os; if (action == defs::HELP_ACTION) {