DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
ControlClient.cpp
Go to the documentation of this file.
1#include "daphnemodules/zmqclient/ControlClient.hpp"
2#include <fmt/core.h> // or ers::logging
3
4namespace daphne::zmq {
5
6// ----------------------------------------------------------------------
7// helper – builds envelope and serialises
8// ----------------------------------------------------------------------
9namespace {
10template <typename RequestT>
11std::string
12make_envelope_bytes(daphnemodules::MessageType type, const RequestT& req)
13{
14 daphnemodules::ControlEnvelope env;
15 env.set_type(type);
16 env.set_payload(req.SerializeAsString());
17
18 std::string bytes;
19 env.SerializeToString(&bytes);
20 return bytes; // NRVO / move-elided
21}
22
23template <typename ResponseT>
24ResponseT
25parse_response(const zmq::message_t& msg, daphnemodules::MessageType expected)
26{
27 daphnemodules::ControlEnvelope env;
28 env.ParseFromArray(msg.data(), static_cast<int>(msg.size()));
29
30 if (env.type() != expected) {
31 throw std::runtime_error(
32 fmt::format("Unexpected envelope type {} (expected {})",
33 env.type(), expected));
34 }
35 ResponseT rsp;
36 rsp.ParseFromString(env.payload());
37 return rsp;
38}
39} // namespace
40// ----------------------------------------------------------------------
41
42ControlClient::ControlClient(zmq::context_t& ctx,
43 std::string_view ip,
44 uint16_t port,
45 Milliseconds timeout)
46 : socket_(ctx, zmq::socket_type::req)
47{
48 socket_.set(zmq::sockopt::rcvtimeo, static_cast<int>(timeout.count()));
49 socket_.set(zmq::sockopt::sndtimeo, static_cast<int>(timeout.count()));
50 socket_.connect(fmt::format("tcp://{}:{}", ip, port));
51}
52
53// ---------------------- API -------------------------------------------
54
55daphnemodules::ConfigureResponse
56ControlClient::configure(const daphnemodules::ConfigureRequest& req)
57{
58 auto bytes = make_envelope_bytes(daphnemodules::CONFIGURE_FE, req);
59 socket_.send(zmq::buffer(bytes), zmq::send_flags::none);
60
61 zmq::message_t reply;
62 socket_.recv(reply, zmq::recv_flags::none);
63
64 return parse_response<daphnemodules::ConfigureResponse>(
65 reply, daphnemodules::CONFIGURE_FE);
66}
67
68daphnemodules::ConfigureCLKsResponse
70 const daphnemodules::ConfigureCLKsRequest& req)
71{
72 auto bytes = make_envelope_bytes(daphnemodules::CONFIGURE_CLKS, req);
73 socket_.send(zmq::buffer(bytes), zmq::send_flags::none);
74
75 zmq::message_t reply;
76 socket_.recv(reply, zmq::recv_flags::none);
77
78 return parse_response<daphnemodules::ConfigureCLKsResponse>(
79 reply, daphnemodules::CONFIGURE_CLKS);
80}
81
82} // namespace daphne::zmq
daphnemodules::ConfigureCLKsResponse configure_clks(const daphnemodules::ConfigureCLKsRequest &req)
daphnemodules::ConfigureResponse configure(const daphnemodules::ConfigureRequest &req)
std::chrono::milliseconds Milliseconds
ControlClient(zmq::context_t &ctx, std::string_view ip, uint16_t port, Milliseconds timeout=Milliseconds{500})