diff --git a/slsDetectorSoftware/CMakeLists.txt b/slsDetectorSoftware/CMakeLists.txt index b09cc757f..9e7136a8d 100755 --- a/slsDetectorSoftware/CMakeLists.txt +++ b/slsDetectorSoftware/CMakeLists.txt @@ -1,5 +1,6 @@ set(SOURCES src/multiSlsDetector.cpp + src/multiSlsDetectorClient.cpp src/slsDetectorUsers.cpp src/slsDetectorCommand.cpp src/slsDetector.cpp diff --git a/slsDetectorSoftware/include/multiSlsDetectorClient.h b/slsDetectorSoftware/include/multiSlsDetectorClient.h index e72e61332..55d1939d8 100755 --- a/slsDetectorSoftware/include/multiSlsDetectorClient.h +++ b/slsDetectorSoftware/include/multiSlsDetectorClient.h @@ -1,46 +1,17 @@ #pragma once #include -#include - #include "CmdLineParser.h" -#include "CmdProxy.h" -#include "Detector.h" -#include "container_utils.h" -#include "multiSlsDetector.h" -#include "slsDetectorCommand.h" -#include "sls_detector_exceptions.h" -#include "string_utils.h" -#include -#include - -using sls::RuntimeError; - -inline int dummyCallback(detectorData *d, int p, void *) { - std::cout << "got data " << p << std::endl; - return 0; -}; +class multiSlsDetector; class multiSlsDetectorClient { public: multiSlsDetectorClient(int argc, char *argv[], int action, multiSlsDetector *myDetector = nullptr, - std::ostream &output = std::cout) - : action_(action), detPtr(myDetector), os(output) { - parser.Parse(argc, argv); - if (parser.isHelp()) - action_ = slsDetectorDefs::HELP_ACTION; - runCommand(); - } + std::ostream &output = std::cout); multiSlsDetectorClient(const std::string &args, int action, multiSlsDetector *myDetector = nullptr, - std::ostream &output = std::cout) - : action_(action), detPtr(myDetector), os(output) { - parser.Parse(args); - if (parser.isHelp()) - action_ = slsDetectorDefs::HELP_ACTION; - runCommand(); - } + std::ostream &output = std::cout); private: int action_; @@ -48,97 +19,5 @@ class multiSlsDetectorClient { multiSlsDetector *detPtr = nullptr; std::ostream &os; - void runCommand() { - bool verify = true; - bool update = true; - if (action_ == slsDetectorDefs::PUT_ACTION && - parser.n_arguments() == 0) { - os << "Wrong usage - should be: " << parser.executable() - << "[id-][pos:]channel arg" << std::endl; - os << std::endl; - return; - }; - if (action_ == slsDetectorDefs::GET_ACTION && - parser.command().empty()) { - os << "Wrong usage - should be: " << parser.executable() - << "[id-][pos:]channel arg" << std::endl; - os << std::endl; - return; - }; - - if (action_ == slsDetectorDefs::READOUT_ACTION && - parser.detector_id() != -1) { - os << "detector_id: " << parser.detector_id() - << " ,readout of individual detectors is not allowed!" - << std::endl; - return; - } - - // special commands - if (parser.command() == "free") { - multiSlsDetector::freeSharedMemory(parser.multi_id(), - parser.detector_id()); - return; - } // get user details without verify sharedMultiSlsDetector version - else if ((parser.command() == "user") && - (action_ == slsDetectorDefs::GET_ACTION)) { - verify = false; - update = false; - } - - // create multiSlsDetector class if required - std::unique_ptr localDet; - if (detPtr == nullptr) { - try { - localDet = sls::make_unique(parser.multi_id(), - verify, update); - detPtr = localDet.get(); - } catch (const RuntimeError &e) { - /*os << e.GetMessage() << std::endl;*/ - return; - } catch (...) { - os << " caught exception\n"; - return; - } - } - if (parser.detector_id() >= static_cast(detPtr->size())) { - os << "position is out of bounds.\n"; - return; - } - - // Call CmdProxy which execute the command if it exists, on success - // returns an empty string If the command is not in CmdProxy but - // deprecated the new command is returned - if (action_ != slsDetectorDefs::READOUT_ACTION) { - int multi_id = 0; - if (detPtr != nullptr) - multi_id = detPtr->getMultiId(); - sls::Detector d(multi_id); - sls::CmdProxy proxy(&d); - // sls::CmdProxy proxy(detPtr); - auto cmd = proxy.Call(parser.command(), parser.arguments(), - parser.detector_id(), action_); - if (cmd.empty()) { - return; - } else { - parser.setCommand(cmd); - } - } - - // call multi detector command line - slsDetectorCommand myCmd(detPtr); - std::string answer = - myCmd.executeLine(parser.n_arguments() + 1, parser.argv().data(), - action_, parser.detector_id()); - - if (parser.multi_id() != 0) - os << parser.multi_id() << '-'; - if (parser.detector_id() != -1) - os << parser.detector_id() << ':'; - - if (action_ != slsDetectorDefs::READOUT_ACTION) { - os << parser.command() << " "; - } - os << answer << std::endl; - } + void runCommand(); }; diff --git a/slsDetectorSoftware/src/multiSlsDetectorClient.cpp b/slsDetectorSoftware/src/multiSlsDetectorClient.cpp new file mode 100644 index 000000000..754dff440 --- /dev/null +++ b/slsDetectorSoftware/src/multiSlsDetectorClient.cpp @@ -0,0 +1,119 @@ +#include "multiSlsDetectorClient.h" +#include "CmdProxy.h" +#include "Detector.h" +#include "multiSlsDetector.h" +#include "slsDetectorCommand.h" +#include "sls_detector_exceptions.h" + +#include + +multiSlsDetectorClient::multiSlsDetectorClient(int argc, char *argv[], + int action, + multiSlsDetector *myDetector, + std::ostream &output) + : action_(action), detPtr(myDetector), os(output) { + parser.Parse(argc, argv); + runCommand(); +} + +multiSlsDetectorClient::multiSlsDetectorClient(const std::string &args, + int action, + multiSlsDetector *myDetector, + std::ostream &output) + : action_(action), detPtr(myDetector), os(output) { + parser.Parse(args); + runCommand(); +} + +void multiSlsDetectorClient::runCommand() { + if (parser.isHelp()) + action_ = slsDetectorDefs::HELP_ACTION; + bool verify = true; + bool update = true; + if (action_ == slsDetectorDefs::PUT_ACTION && parser.n_arguments() == 0) { + os << "Wrong usage - should be: " << parser.executable() + << "[id-][pos:]channel arg" << std::endl; + os << std::endl; + return; + }; + if (action_ == slsDetectorDefs::GET_ACTION && parser.command().empty()) { + os << "Wrong usage - should be: " << parser.executable() + << "[id-][pos:]channel arg" << std::endl; + os << std::endl; + return; + }; + + if (action_ == slsDetectorDefs::READOUT_ACTION && + parser.detector_id() != -1) { + os << "detector_id: " << parser.detector_id() + << " ,readout of individual detectors is not allowed!" << std::endl; + return; + } + + // special commands + if (parser.command() == "free") { + multiSlsDetector::freeSharedMemory(parser.multi_id(), + parser.detector_id()); + return; + } // get user details without verify sharedMultiSlsDetector version + else if ((parser.command() == "user") && + (action_ == slsDetectorDefs::GET_ACTION)) { + verify = false; + update = false; + } + + // create multiSlsDetector class if required + std::unique_ptr localDet; + if (detPtr == nullptr) { + try { + localDet = sls::make_unique(parser.multi_id(), + verify, update); + detPtr = localDet.get(); + } catch (const sls::RuntimeError &e) { + /*os << e.GetMessage() << std::endl;*/ + return; + } catch (...) { + os << " caught exception\n"; + return; + } + } + if (parser.detector_id() >= static_cast(detPtr->size())) { + os << "position is out of bounds.\n"; + return; + } + + // Call CmdProxy which execute the command if it exists, on success + // returns an empty string If the command is not in CmdProxy but + // deprecated the new command is returned + if (action_ != slsDetectorDefs::READOUT_ACTION) { + int multi_id = 0; + if (detPtr != nullptr) + multi_id = detPtr->getMultiId(); + sls::Detector d(multi_id); + sls::CmdProxy proxy(&d); + // sls::CmdProxy proxy(detPtr); + auto cmd = proxy.Call(parser.command(), parser.arguments(), + parser.detector_id(), action_); + if (cmd.empty()) { + return; + } else { + parser.setCommand(cmd); + } + } + + // call multi detector command line + slsDetectorCommand myCmd(detPtr); + std::string answer = + myCmd.executeLine(parser.n_arguments() + 1, parser.argv().data(), + action_, parser.detector_id()); + + if (parser.multi_id() != 0) + os << parser.multi_id() << '-'; + if (parser.detector_id() != -1) + os << parser.detector_id() << ':'; + + if (action_ != slsDetectorDefs::READOUT_ACTION) { + os << parser.command() << " "; + } + os << answer << std::endl; +} \ No newline at end of file diff --git a/slsDetectorSoftware/src/sls_detector_client.cpp b/slsDetectorSoftware/src/sls_detector_client.cpp index e140fa18d..264b98029 100755 --- a/slsDetectorSoftware/src/sls_detector_client.cpp +++ b/slsDetectorSoftware/src/sls_detector_client.cpp @@ -1,6 +1,8 @@ #include "multiSlsDetectorClient.h" +#include "sls_detector_defs.h" #include "versionAPI.h" -#include + +#include //strcmp int main(int argc, char *argv[]) { for (int i = 1; i < argc; ++i) {