#include "Caller.h" #include "CmdParser.h" #include "inferAction.h" #include "sls/Detector.h" #include "sls/logger.h" #include "sls/versionAPI.h" #include int main(int argc, char *argv[]) { // To genereate sepereate binaries for put, get, acquire and help #ifdef PUT int action = slsDetectorDefs::PUT_ACTION; #endif #ifdef GET int action = slsDetectorDefs::GET_ACTION; #endif #ifdef READOUT int action = slsDetectorDefs::READOUT_ACTION; #endif #ifdef READOUTZMQ int action = slsDetectorDefs::READOUT_ZMQ_ACTION; #endif #ifdef HELP int action = slsDetectorDefs::HELP_ACTION; #endif #ifdef INFER int action = -1; #endif // Check for --version in the arguments for (int i = 1; i < argc; ++i) { if (!(strcmp(argv[i], "--version")) || !(strcmp(argv[i], "-v"))) { std::cout << argv[0] << " " << APILIB << std::endl; return 0; } } sls::CmdParser parser; parser.Parse(argc, argv); if (action == slsDetectorDefs::READOUT_ACTION || action == slsDetectorDefs::READOUT_ZMQ_ACTION) parser.setCommand("acquire"); if (parser.isHelp()) action = slsDetectorDefs::HELP_ACTION; else { // Free shared memory should work also without a detector if (parser.command() == "free") { if (parser.detector_id() != -1) std::cout << "Cannot free shared memory of sub-detector\n"; else sls::freeSharedMemory(parser.multi_id()); return EXIT_SUCCESS; } // Get user details from shared memory should work also without a // detector if (parser.command() == "user") { if (action == slsDetectorDefs::PUT_ACTION) { std::cout << "Cannot set user details\n"; return EXIT_FAILURE; } if (parser.detector_id() != -1) std::cout << "Cannot get user details of only a sub-detector\n"; else std::cout << sls::getUserDetails(parser.multi_id()) << std::endl; return EXIT_SUCCESS; } } if (parser.command() == "config" && action == slsDetectorDefs::PUT_ACTION) { sls::freeSharedMemory(parser.multi_id()); } sls::InferAction inferAction = sls::InferAction(); try { if (action == -1) { action = inferAction.infer(parser); std::string actionString = (action == slsDetectorDefs::GET_ACTION) ? "GET" : "PUT"; std::cout << "inferred action: " << actionString << std::endl; } std::unique_ptr d{nullptr}; if (action != slsDetectorDefs::HELP_ACTION) { d = sls::make_unique(parser.multi_id()); } sls::Caller c(d.get()); c.call(parser.command(), parser.arguments(), parser.detector_id(), action, std::cout, parser.receiver_id()); } catch (sls::RuntimeError &e) { return EXIT_FAILURE; } return EXIT_SUCCESS; }