Client.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #pragma once
11 
12 #include <mrpt/system/COutputLogger.h>
13 #include <mrpt/system/CTimeLogger.h>
14 #include <mvsim/Comms/common.h>
15 #include <mvsim/Comms/zmq_fwrds.h>
16 
17 #include <atomic>
18 #include <memory>
19 #include <thread>
20 
21 namespace mvsim::internal
22 {
23 struct InfoPerService;
24 struct InfoPerSubscribedTopic;
25 } // namespace mvsim::internal
26 
27 namespace mvsim
28 {
48 class Client : public mrpt::system::COutputLogger
49 {
50  public:
51  Client();
52  Client(const std::string& nodeName);
53 
54  ~Client();
55 
58  void setName(const std::string& nodeName);
59 
60  const std::string& serverHostAddress() const { return serverHostAddress_; }
61  void serverHostAddress(const std::string& serverIpOrAddressName)
62  {
63  ASSERT_(!connected());
64  serverHostAddress_ = serverIpOrAddressName;
65  }
66 
71  void connect();
72 
74  bool connected() const;
75 
79  void shutdown() noexcept;
80 
81  template <typename T>
82  void advertiseTopic(const std::string& topicName);
83 
84  void publishTopic(const std::string& topicName, const google::protobuf::Message& msg);
85 
86  template <typename MSG_T>
87  void subscribeTopic(
88  const std::string& topicName, const std::function<void(const MSG_T&)>& callback);
89 
90  template <typename INPUT_MSG_T, typename OUTPUT_MSG_T>
91  void advertiseService(
92  const std::string& serviceName,
93  const std::function<OUTPUT_MSG_T(const INPUT_MSG_T&)>& callback);
94 
95  template <typename INPUT_MSG_T, typename OUTPUT_MSG_T>
96  void callService(
97  const std::string& serviceName, const INPUT_MSG_T& input, OUTPUT_MSG_T& output);
98 
100  std::string callService(const std::string& serviceName, const std::string& inputSerializedMsg);
101 
103  void subscribeTopic(
104  const std::string& topicName,
105  const std::function<
106  void(const std::string& /*msgType*/, const std::vector<uint8_t>& /*serializedMsg*/)>&
107  callback);
108 
109  struct InfoPerNode
110  {
111  std::string name;
112  };
113  std::vector<InfoPerNode> requestListOfNodes();
114 
116  {
117  std::string name;
118  std::string type;
119  std::vector<std::string> endpoints, publishers;
120  };
121  std::vector<InfoPerTopic> requestListOfTopics();
122 
123  using topic_callback_t = std::function<void(const zmq::message_t& /*m*/)>;
124 
125  void subscribe_topic_raw(const std::string& topicName, const topic_callback_t& callback);
126 
129  const mrpt::system::CTimeLogger& profiler() const { return profiler_; }
130  void enable_profiler(bool enable) { profiler_.enable(enable); }
131 
132  private:
133  struct ZMQImpl;
134  std::unique_ptr<ZMQImpl> zmq_;
135 
136  std::string serverHostAddress_ = "localhost";
137  std::string nodeName_ = "anonymous";
138 
140  std::thread topicUpdatesThread_;
141 
142  std::map<std::string, std::string> serviceToEndPointCache_;
144 
145  mrpt::system::CTimeLogger profiler_{false, "mvsim::Client"};
146 
147  void doRegisterClient();
148  void doUnregisterClient();
149 
152  void internalTopicSubscribeThread(internal::InfoPerSubscribedTopic& ipt);
153 
154  using service_callback_t = std::function<std::shared_ptr<google::protobuf::Message>(
155  const std::string& /*inAsString*/)>;
156 
157  void doAdvertiseTopic(
158  const std::string& topicName, const google::protobuf::Descriptor* descriptor);
159  void doAdvertiseService(
160  const std::string& serviceName, const google::protobuf::Descriptor* descIn,
161  const google::protobuf::Descriptor* descOut, service_callback_t callback);
162 
163  void doSubscribeTopic(
164  const std::string& topicName, const google::protobuf::Descriptor* descriptor,
165  const topic_callback_t& callback);
166  void doCallService(
167  const std::string& serviceName, const std::string& inputSerializedMsg,
168  mrpt::optional_ref<google::protobuf::Message> outputMsg,
169  mrpt::optional_ref<std::string> outputSerializedMsg = std::nullopt,
170  mrpt::optional_ref<std::string> outputMsgTypeName = std::nullopt);
171 
174 };
175 
176 template <typename T>
177 void Client::advertiseTopic(const std::string& topicName)
178 {
179  doAdvertiseTopic(topicName, T::descriptor());
180 }
181 
182 template <typename INPUT_MSG_T, typename OUTPUT_MSG_T>
184  const std::string& serviceName, const std::function<OUTPUT_MSG_T(const INPUT_MSG_T&)>& callback)
185 {
187  serviceName, INPUT_MSG_T::descriptor(), OUTPUT_MSG_T::descriptor(),
189  [callback](const std::string& inData)
190  {
191  INPUT_MSG_T in;
192  in.ParseFromString(inData);
193  return std::make_shared<OUTPUT_MSG_T>(callback(in));
194  }));
195 }
196 
197 template <typename MSG_T>
199  const std::string& topicName, const std::function<void(const MSG_T&)>& callback)
200 {
202  topicName, MSG_T::descriptor(),
204  [callback](const zmq::message_t& m)
205  {
206  MSG_T in;
207  mvsim::parseMessage(m, in);
208  callback(in);
209  }));
210 }
211 
212 template <typename INPUT_MSG_T, typename OUTPUT_MSG_T>
214  const std::string& serviceName, const INPUT_MSG_T& input, OUTPUT_MSG_T& output)
215 {
216  doCallService(serviceName, input.SerializeAsString(), output);
217 }
218 
219 } // namespace mvsim
mvsim::Client::internalTopicUpdatesThread
void internalTopicUpdatesThread()
Definition: src/Comms/Client.cpp:602
mvsim::Client::publishTopic
void publishTopic(const std::string &topicName, const google::protobuf::Message &msg)
Definition: src/Comms/Client.cpp:486
mvsim::Client::~Client
~Client()
Definition: src/Comms/Client.cpp:125
mvsim
Definition: Client.h:21
mvsim::Client::connected
bool connected() const
Definition: src/Comms/Client.cpp:129
mvsim::Client::subscribeTopic
void subscribeTopic(const std::string &topicName, const std::function< void(const MSG_T &)> &callback)
Definition: Client.h:198
zmq_fwrds.h
mvsim::Client::doCallService
void doCallService(const std::string &serviceName, const std::string &inputSerializedMsg, mrpt::optional_ref< google::protobuf::Message > outputMsg, mrpt::optional_ref< std::string > outputSerializedMsg=std::nullopt, mrpt::optional_ref< std::string > outputMsgTypeName=std::nullopt)
Definition: src/Comms/Client.cpp:720
mvsim::Client::serverHostAddress
const std::string & serverHostAddress() const
Definition: Client.h:60
mvsim::Client::InfoPerTopic::publishers
std::vector< std::string > publishers
Definition: Client.h:119
mvsim::Client
Definition: Client.h:48
mvsim::Client::internalServiceServingThread
void internalServiceServingThread()
Definition: src/Comms/Client.cpp:530
mvsim::Client::ZMQImpl
Definition: src/Comms/Client.cpp:95
mvsim::Client::InfoPerNode
Definition: Client.h:109
mvsim::Client::InfoPerSubscribedTopic
friend struct internal::InfoPerSubscribedTopic
Definition: Client.h:173
mvsim::Client::advertiseService
void advertiseService(const std::string &serviceName, const std::function< OUTPUT_MSG_T(const INPUT_MSG_T &)> &callback)
Definition: Client.h:183
mvsim::Client::InfoPerService
friend struct internal::InfoPerService
Definition: Client.h:172
mvsim::Client::serviceToEndPointCache_
std::map< std::string, std::string > serviceToEndPointCache_
Definition: Client.h:142
mvsim::Client::serverHostAddress_
std::string serverHostAddress_
Definition: Client.h:136
mvsim::Client::InfoPerTopic::endpoints
std::vector< std::string > endpoints
Definition: Client.h:119
mvsim::Client::doAdvertiseTopic
void doAdvertiseTopic(const std::string &topicName, const google::protobuf::Descriptor *descriptor)
Definition: src/Comms/Client.cpp:359
mvsim::Client::topicUpdatesThread_
std::thread topicUpdatesThread_
Definition: Client.h:140
mvsim::Client::profiler
const mrpt::system::CTimeLogger & profiler() const
Definition: Client.h:129
mvsim::Client::connect
void connect()
Definition: src/Comms/Client.cpp:138
mvsim::Client::nodeName_
std::string nodeName_
Definition: Client.h:137
mvsim::Client::setName
void setName(const std::string &nodeName)
Definition: src/Comms/Client.cpp:127
void
typedef void(GLAD_API_PTR *GLDEBUGPROC)(GLenum source
mvsim::Client::InfoPerTopic::name
std::string name
Definition: Client.h:117
mvsim::Client::requestListOfTopics
std::vector< InfoPerTopic > requestListOfTopics()
Definition: src/Comms/Client.cpp:316
mvsim::Client::serviceToEndPointCacheMtx_
std::mutex serviceToEndPointCacheMtx_
Definition: Client.h:143
mvsim::Client::profiler_
mrpt::system::CTimeLogger profiler_
Definition: Client.h:145
mvsim::Client::internalTopicSubscribeThread
void internalTopicSubscribeThread(internal::InfoPerSubscribedTopic &ipt)
Definition: src/Comms/Client.cpp:849
mvsim::Client::InfoPerTopic::type
std::string type
Definition: Client.h:118
mvsim::Client::doRegisterClient
void doRegisterClient()
Definition: src/Comms/Client.cpp:229
mvsim::Client::serverHostAddress
void serverHostAddress(const std::string &serverIpOrAddressName)
Definition: Client.h:61
mvsim::Client::enable_profiler
void enable_profiler(bool enable)
Definition: Client.h:130
mvsim::Client::doAdvertiseService
void doAdvertiseService(const std::string &serviceName, const google::protobuf::Descriptor *descIn, const google::protobuf::Descriptor *descOut, service_callback_t callback)
Definition: src/Comms/Client.cpp:430
mvsim::Client::zmq_
std::unique_ptr< ZMQImpl > zmq_
Definition: Client.h:133
common.h
mvsim::Client::subscribe_topic_raw
void subscribe_topic_raw(const std::string &topicName, const topic_callback_t &callback)
Definition: src/Comms/Client.cpp:790
mvsim::Client::shutdown
void shutdown() noexcept
Definition: src/Comms/Client.cpp:196
std
mvsim::Client::doUnregisterClient
void doUnregisterClient()
Definition: src/Comms/Client.cpp:257
mvsim::Client::topic_callback_t
std::function< void(const zmq::message_t &)> topic_callback_t
Definition: Client.h:123
mvsim::Client::InfoPerNode::name
std::string name
Definition: Client.h:111
mvsim::Client::serviceInvokerThread_
std::thread serviceInvokerThread_
Definition: Client.h:139
mvsim::Client::requestListOfNodes
std::vector< InfoPerNode > requestListOfNodes()
Definition: src/Comms/Client.cpp:286
mvsim::Client::advertiseTopic
void advertiseTopic(const std::string &topicName)
Definition: Client.h:177
mvsim::internal
Definition: Client.h:21
mvsim::Client::service_callback_t
std::function< std::shared_ptr< google::protobuf::Message >(const std::string &)> service_callback_t
Definition: Client.h:155
mvsim::Client::Client
Client()
Definition: src/Comms/Client.cpp:119
google
Definition: zmq_fwrds.h:19
mvsim::Client::callService
void callService(const std::string &serviceName, const INPUT_MSG_T &input, OUTPUT_MSG_T &output)
Definition: Client.h:213
mvsim::Client::doSubscribeTopic
void doSubscribeTopic(const std::string &topicName, const google::protobuf::Descriptor *descriptor, const topic_callback_t &callback)
Definition: src/Comms/Client.cpp:795
mvsim::Client::InfoPerTopic
Definition: Client.h:115


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:07