SRS-control 0.1.4
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include "srs/Application.hpp"
6#include <CLI/CLI.hpp>
7#include <cstdlib>
8#include <exception>
9#include <fmt/format.h>
10#include <fmt/ranges.h>
11#include <format>
12#include <print>
13#include <spdlog/common.h>
14#include <spdlog/spdlog.h>
15#include <string>
16#include <utility>
17#include <vector>
18
19#ifdef HAS_ROOT
20#include <TROOT.h>
21#endif
22
26
30
34
35// NOLINTNEXTLINE (bugprone-exception-escape)
36auto main(int argc, char** argv) -> int
37{
38 auto cli_args = CLI::App{ "SRS system command line interface" };
39 try
40 {
41 argv = cli_args.ensure_utf8(argv);
42
43 auto app_config = srs::Config{};
44
45 auto spdlog_level = spdlog::level::info;
47 auto output_filenames = std::vector<std::string>{ "" };
48 auto is_version_print = false;
49 auto is_root_version_print = false;
50 auto is_dump_needed = false;
51 auto n_output_split = 1;
52 const auto home_dir = []() -> std::string
53 {
54 const auto* home_var = getenv("HOME");
55 if (home_var != nullptr)
56 {
57 return std::string{ home_var };
58 }
59 return {};
60 }();
61 auto json_filepath = home_dir.empty() ? "" : std::format("{}/.config/srs-control/config.json", getenv("HOME"));
62 auto action_mode_enum = srs::common::ActionMode::all;
63 auto dump_config_callback = [&json_filepath, &is_dump_needed](const std::string& filename)
64 {
65 is_dump_needed = true;
66 json_filepath = filename;
67 };
68 cli_args.add_flag("-v, --version", is_version_print, "Show the current version");
69 cli_args.add_flag("--root-version", is_root_version_print, "Show the ROOT version if used");
70
71 cli_args
72 .add_option(
73 "-a, --action",
74 action_mode_enum,
75 fmt::format("Set the action of program\nAvailable options: [{}]", fmt::join(ACTION_MODE_NAMES, ", ")))
76 ->transform(CLI::CheckedTransformer(action_mode_map, CLI::ignore_case).description(""))
77 ->default_str(get_enum_dashed_name(action_mode_enum));
78
79 cli_args
80 .add_option("-l, --log-level",
81 spdlog_level,
82 fmt::format("Set log level\nAvailable options: [{}]", fmt::join(SPDLOG_LOG_NAMES, ", ")))
83 ->transform(CLI::CheckedTransformer(spdlog_map, CLI::ignore_case).description(""))
84 ->default_str(get_enum_dashed_name(spdlog_level));
85
86 cli_args
87 .add_option("-p, --print-mode",
88 print_mode,
89 fmt::format("Set data print mode\nAvailable options: [{}]", fmt::join(PRINT_MODE_NAMES, ", ")))
90 ->transform(CLI::CheckedTransformer(print_mode_map, CLI::ignore_case).description(""))
91 ->default_str(get_enum_dashed_name(print_mode));
92
93 cli_args.add_option("-c, --config-file", json_filepath, "Set the path of the JSON config file")
94 ->capture_default_str();
95 cli_args.add_option("-s, --split-output", n_output_split, "Splitting the output data into different files.")
96 ->capture_default_str();
97 cli_args
98 .add_option_function<std::string>(
99 "--dump-config", dump_config_callback, "Dump default configuration to the file")
100 ->default_val(json_filepath)
101 ->run_callback_for_default()
102 ->expected(0, 1);
103
104 cli_args.add_option("-o, --output-files", output_filenames, "Set output file (or socket) names")
105 ->capture_default_str()
106 ->expected(0, -1);
107 cli_args.parse(argc, argv);
108
109 if (is_version_print)
110 {
111 std::println("{}", SRS_PROJECT_VERSION);
112 return 0;
113 }
114
115 if (is_dump_needed)
116 {
117 srs::config::output_config_to_json(app_config, json_filepath);
118 return 0;
119 }
120
121 if (is_root_version_print)
122 {
123#ifdef HAS_ROOT
124 std::println("{}", gROOT->GetVersion());
125#else
126 std::println("ROOT is not built");
127#endif
128 return 0;
129 }
130
131 spdlog::set_level(spdlog_level);
132
133 auto app = srs::App{};
134
135 srs::config::set_config_from_json(app_config, json_filepath);
136 app.set_options(std::move(app_config));
137 app.set_print_mode(print_mode);
138 app.set_output_filenames(output_filenames, n_output_split);
139
140 app.init();
141
142 switch (action_mode_enum)
143 {
144 using enum srs::common::ActionMode;
145 case all:
146 {
147 app.start_workflow();
148 app.read_data();
149 app.switch_on();
150 app.wait_for_workflow();
151 break;
152 }
153 case acq_on:
154 {
155 app.switch_on();
156 break;
157 }
158 case acq_off:
159 {
160 app.switch_off();
161 break;
162 }
163 case read_only:
164 {
165
166 app.start_workflow();
167 app.read_data();
168 app.wait_for_workflow();
169 break;
170 }
171 default:
172 return 0;
173 }
174
175 // app.wait_for_finish();
176 }
177 catch (const CLI::ParseError& e)
178 {
179 cli_args.exit(e);
180 }
181 catch (std::exception& ex)
182 {
183 spdlog::critical("Exception occurred: {}", ex.what());
184 }
185 catch (...)
186 {
187 spdlog::critical("A unrecognized exception occurred!");
188 }
189
190 return 0;
191}
constexpr auto ACTION_MODE_NAMES
Definition main.cpp:27
const auto action_mode_map
Definition main.cpp:33
constexpr auto get_enum_dashed_names()
constexpr auto PRINT_MODE_NAMES
Definition main.cpp:29
constexpr auto get_enum_dashed_name()
const auto print_mode_map
Definition main.cpp:31
auto main(int argc, char **argv) -> int
Definition main.cpp:36
constexpr auto get_enum_dash_map()
const auto spdlog_map
Definition main.cpp:32
constexpr auto SPDLOG_LOG_NAMES
Definition main.cpp:28
The primary interface class of SRS-Control.
constexpr auto get_enum_dashed_names()
constexpr auto get_enum_dashed_name()
@ print_speed
Print the data reading rate.
void output_config_to_json(const Config &app_config, std::string_view json_filename)
void set_config_from_json(Config &app_config, std::string_view json_filename)
Main configuration struct.