ifw-daq 3.1.0
IFW Data Acquisition modules
Loading...
Searching...
No Matches
requestor.hpp
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup daq_ocm_serverctl
4 * @copyright ESO - European Southern Observatory
5 *
6 * @brief
7 */
8#ifndef OCF_OCM_SERVERCTL_REQUESTOR_HPP_
9#define OCF_OCM_SERVERCTL_REQUESTOR_HPP_
10
11#include <iostream>
12#include <type_traits>
13#include <unordered_map>
14#include <vector>
15
16#include <CLI/App.hpp>
17#include <boost/asio/io_service.hpp>
18
19#include <Daqif.hpp>
20#include <Stdif.hpp>
21#include <rad/logger.hpp>
22
23std::ostream& operator<<(std::ostream& os, std::shared_ptr<daqif::DaqStatus> const& s);
24std::ostream& operator<<(std::ostream& os, std::shared_ptr<daqif::DaqReply> const& s);
25std::ostream& operator<<(std::ostream& os, std::vector<std::shared_ptr<daqif::DaqStatus>> const& s);
26std::ostream&
27operator<<(std::ostream& os, std::vector<std::shared_ptr<daqif::AwaitDaqReply>> const& s);
28
29template <class T>
30struct JsonPrint {
31 JsonPrint(T const& t_arg) : t(t_arg) {
32 }
33 T const& t;
34};
35
36std::ostream& operator<<(std::ostream& os, JsonPrint<std::shared_ptr<daqif::DaqStatus>> const& s);
37std::ostream& operator<<(std::ostream& os, JsonPrint<std::shared_ptr<daqif::DaqReply>> const& s);
38std::ostream&
39operator<<(std::ostream& os, JsonPrint<std::shared_ptr<daqif::AwaitDaqReply>> const& s);
40std::ostream& operator<<(std::ostream& os, JsonPrint<std::string> const& s);
41std::ostream&
42operator<<(std::ostream& os, JsonPrint<std::vector<std::shared_ptr<daqif::DaqStatus>>> const& s);
43
44struct CommonArgs {
45 bool json = false;
46 bool status = false;
47 unsigned timeout = 10;
48 std::string req_addr;
49 std::string pub_addr;
50 elt::mal::Mal* mal;
51
52 CommonArgs() = default;
53 CommonArgs(CommonArgs const&) = delete;
54 CommonArgs& operator=(CommonArgs const&) = delete;
55};
56
57struct Requestor {
58 explicit Requestor(CommonArgs& args);
59 virtual ~Requestor() {
60 }
61 /**
62 * Add arguments to command.
63 */
64 virtual void AddOptions(CLI::App* app);
65
66 /**
67 * Receives a parsed variables_map that include the options added with AddOptions.
68 */
69 virtual void
70 Handle(::stdif::StdCmdsSync& std_cmds, ::daqif::OcmDaqControlSync& daq_cmds, CLI::App* arg) = 0;
71
72protected:
74};
75
78 virtual void AddOptions(CLI::App* app) override;
79 virtual void Handle(::stdif::StdCmdsSync& std_cmds,
80 ::daqif::OcmDaqControlSync& daq_cmds,
81 CLI::App* arg) override;
82
83private:
84 std::string m_logger;
85 std::string m_level;
86};
87
88/**
89 * Simple requestor for commands without argument
90 *
91 * @tparam Func is either a StdCmdsSync or OcmDaqControlSync member function pointer, taking no
92 * arguments and returning a type that has an ostream << operator: E.g.: `using Func =
93 * decltype(&daqif::StdCmds::Enable)`;
94 */
95template <class Func>
97 SimpleRequestor(Func func, CommonArgs& args) : Requestor(args), m_func(func) {
98 }
99 void Handle(::stdif::StdCmdsSync& std_cmds,
100 ::daqif::OcmDaqControlSync& daq_cmds,
101 CLI::App* arg) override {
102 if constexpr (std::is_invocable_v<Func, decltype(std_cmds)>) {
103 auto reply = (std_cmds.*m_func)();
104 if (m_args.json) {
105 std::cout << JsonPrint(reply);
106 } else {
107 std::cout << reply << std::endl;
108 }
109 } else if constexpr (std::is_invocable_v<Func, decltype(daq_cmds)>) {
110 auto reply = (daq_cmds.*m_func)();
111 if (m_args.json) {
112 std::cout << JsonPrint(reply);
113 } else {
114 std::cout << reply << std::endl;
115 }
116 } else {
117 }
118 }
119
120 Func m_func;
121};
122
123/**
124 * Simple Daq commands that accepts a single argument `id` and returns a shared_ptr type
125 * that can be formatted with ostream<< operator when dereferenced.
126 */
127template <class Func>
129 SimpleDaqRequestor(Func func, CommonArgs& args) : Requestor(args), m_func(func) {
130 }
131
132 void AddOptions(CLI::App* sub) override {
133 sub->add_option("id", m_id, "DAQ ID");
134 }
135
136 void Handle(::stdif::StdCmdsSync& std_cmds,
137 ::daqif::OcmDaqControlSync& daq_cmds,
138 CLI::App* arg) override {
139 auto reply = (daq_cmds.*m_func)(m_id);
140 if (m_args.json) {
141 std::cout << JsonPrint(reply);
142 } else {
143 std::cout << reply << std::endl;
144 }
145 }
146
147private:
148 std::string m_id;
149 Func m_func;
150};
151
152template <class Func>
154 NoArgRequestor(Func func, CommonArgs& args) : Requestor(args), m_func(func) {
155 }
156
157 void Handle(::stdif::StdCmdsSync& std_cmds,
158 ::daqif::OcmDaqControlSync& daq_cmds,
159 CLI::App* arg) override {
160 auto reply = (daq_cmds.*m_func)();
161 if (m_args.json) {
162 std::cout << JsonPrint(reply);
163 } else {
164 std::cout << reply << std::endl;
165 }
166 }
167
168 Func m_func;
169};
170
172 std::string m_id;
173 std::string m_prefix;
174 std::string m_primary_sources;
176 std::string m_properties;
177
179
180 void AddOptions(CLI::App* app) override;
181 void Handle(::stdif::StdCmdsSync& std_cmds,
182 ::daqif::OcmDaqControlSync& daq_cmds,
183 CLI::App* arg) override;
184
185private:
186};
187
189 std::string m_spec;
190
192
193 void AddOptions(CLI::App* app) override;
194 void Handle(::stdif::StdCmdsSync& std_cmds,
195 ::daqif::OcmDaqControlSync& daq_cmds,
196 CLI::App* arg) override;
197
198private:
199};
200
203
204 void AddOptions(CLI::App* app) override;
205 void Handle(::stdif::StdCmdsSync& std_cmds,
206 ::daqif::OcmDaqControlSync& daq_cmds,
207 CLI::App* arg) override;
208
209private:
210 std::string m_id;
211 std::string m_keywords;
212};
213
216
217 void AddOptions(CLI::App* app) override;
218 void Handle(::stdif::StdCmdsSync& std_cmds,
219 ::daqif::OcmDaqControlSync& daq_cmds,
220 CLI::App* arg) override;
221
222private:
223 std::string m_id;
224 std::string m_state;
225 std::string m_substate;
226 double m_timeout;
227};
228
229#endif // #ifndef OCF_OCM_SERVERCTL_REQUESTOR_HPP_
std::ostream & operator<<(std::ostream &os, std::shared_ptr< daqif::DaqStatus > const &s)
Definition: requestor.cpp:36
void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:245
void AddOptions(CLI::App *app) override
Add arguments to command.
Definition: requestor.cpp:230
unsigned timeout
Definition: requestor.hpp:47
CommonArgs()=default
std::string req_addr
Definition: requestor.hpp:48
CommonArgs & operator=(CommonArgs const &)=delete
elt::mal::Mal * mal
Definition: requestor.hpp:50
CommonArgs(CommonArgs const &)=delete
std::string pub_addr
Definition: requestor.hpp:49
bool status
Definition: requestor.hpp:46
T const & t
Definition: requestor.hpp:33
JsonPrint(T const &t_arg)
Definition: requestor.hpp:31
void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.hpp:157
NoArgRequestor(Func func, CommonArgs &args)
Definition: requestor.hpp:154
virtual void AddOptions(CLI::App *app)
Add arguments to command.
Definition: requestor.cpp:125
Requestor(CommonArgs &args)
Definition: requestor.cpp:122
CommonArgs & m_args
Definition: requestor.hpp:73
virtual void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg)=0
Receives a parsed variables_map that include the options added with AddOptions.
virtual ~Requestor()
Definition: requestor.hpp:59
virtual void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:133
virtual void AddOptions(CLI::App *app) override
Add arguments to command.
Definition: requestor.cpp:128
Simple Daq commands that accepts a single argument id and returns a shared_ptr type that can be forma...
Definition: requestor.hpp:128
void AddOptions(CLI::App *sub) override
Add arguments to command.
Definition: requestor.hpp:132
void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.hpp:136
SimpleDaqRequestor(Func func, CommonArgs &args)
Definition: requestor.hpp:129
Simple requestor for commands without argument.
Definition: requestor.hpp:96
void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.hpp:99
SimpleRequestor(Func func, CommonArgs &args)
Definition: requestor.hpp:97
std::string m_primary_sources
Definition: requestor.hpp:174
std::string m_id
Definition: requestor.hpp:172
void AddOptions(CLI::App *app) override
Add arguments to command.
Definition: requestor.cpp:147
void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:161
std::string m_prefix
Definition: requestor.hpp:173
std::string m_metadata_sources
Definition: requestor.hpp:175
std::string m_properties
Definition: requestor.hpp:176
void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:203
std::string m_spec
Definition: requestor.hpp:189
void AddOptions(CLI::App *app) override
Add arguments to command.
Definition: requestor.cpp:173
void AddOptions(CLI::App *app) override
Add arguments to command.
Definition: requestor.cpp:214
void Handle(::stdif::StdCmdsSync &std_cmds, ::daqif::OcmDaqControlSync &daq_cmds, CLI::App *arg) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:219