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(fmt::format("Unexpected envelope type {} (expected {})", env.type(), expected));
32 }
33 ResponseT rsp;
34 rsp.ParseFromString(env.payload());
35 return rsp;
36}
37} // namespace
38// ----------------------------------------------------------------------
39
40ControlClient::ControlClient(zmq::context_t& ctx, std::string_view ip, uint16_t port, Milliseconds timeout)
41 : socket_(ctx, zmq::socket_type::req)
42{
43 socket_.set(zmq::sockopt::rcvtimeo, static_cast<int>(timeout.count()));
44 socket_.set(zmq::sockopt::sndtimeo, static_cast<int>(timeout.count()));
45 socket_.connect(fmt::format("tcp://{}:{}", ip, port));
46}
47
48// ---------------------- API -------------------------------------------
49
50daphnemodules::ConfigureResponse
51ControlClient::configure(const daphnemodules::ConfigureRequest& req)
52{
53 auto bytes = make_envelope_bytes(daphnemodules::CONFIGURE_FE, req);
54 socket_.send(zmq::buffer(bytes), zmq::send_flags::none);
55
56 zmq::message_t reply;
57 socket_.recv(reply, zmq::recv_flags::none);
58
59 return parse_response<daphnemodules::ConfigureResponse>(reply, daphnemodules::CONFIGURE_FE);
60}
61
62daphnemodules::ConfigureCLKsResponse
63ControlClient::configure_clks(const daphnemodules::ConfigureCLKsRequest& req)
64{
65 auto bytes = make_envelope_bytes(daphnemodules::CONFIGURE_CLKS, req);
66 socket_.send(zmq::buffer(bytes), zmq::send_flags::none);
67
68 zmq::message_t reply;
69 socket_.recv(reply, zmq::recv_flags::none);
70
71 return parse_response<daphnemodules::ConfigureCLKsResponse>(reply, daphnemodules::CONFIGURE_CLKS);
72}
73
74} // 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 })