15 #ifndef RCLCPP__CLIENT_HPP_ 16 #define RCLCPP__CLIENT_HPP_ 47 namespace node_interfaces
49 class NodeBaseInterface;
60 rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph);
63 virtual ~ClientBase();
67 get_service_name()
const;
75 get_client_handle()
const;
79 service_is_ready()
const;
81 template<
typename RatioT = std::milli>
86 return wait_for_service_nanoseconds(
87 std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
93 virtual void handle_response(
105 get_rcl_node_handle();
109 get_rcl_node_handle()
const;
118 template<
typename ServiceT>
140 rclcpp::node_interfaces::NodeBaseInterface * node_base,
141 rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph,
142 const
std::
string & service_name,
144 : ClientBase(node_base, node_graph)
146 using rosidl_typesupport_cpp::get_service_type_support_handle;
147 auto service_type_support_handle =
148 get_service_type_support_handle<ServiceT>();
150 this->get_client_handle().
get(),
151 this->get_rcl_node_handle(),
152 service_type_support_handle,
153 service_name.c_str(),
157 auto rcl_node_handle = this->get_rcl_node_handle();
195 int64_t sequence_number = request_header->sequence_number;
197 if (this->pending_requests_.count(sequence_number) == 0) {
200 "Received invalid sequence number. Ignoring...");
203 auto tuple = this->pending_requests_[sequence_number];
204 auto call_promise = std::get<0>(tuple);
205 auto callback = std::get<1>(tuple);
206 auto future = std::get<2>(tuple);
207 this->pending_requests_.erase(sequence_number);
211 call_promise->set_value(typed_response);
218 return async_send_request(request, [](
SharedFuture) {});
234 int64_t sequence_number;
242 pending_requests_[sequence_number] =
262 auto wrapping_cb = [future_with_request, promise, request, &cb](
SharedFuture future) {
263 auto response = future.
get();
265 cb(future_with_request);
268 async_send_request(request, wrapping_cb);
270 return future_with_request;
282 #endif // RCLCPP__CLIENT_HPP_ Definition: client.hpp:52
std::shared_ptr< rcl_client_t > client_handle_
Definition: client.hpp:115
std::shared_ptr< rclcpp::Context > context_
Definition: client.hpp:113
SharedFuture async_send_request(SharedRequest request)
Definition: client.hpp:216
#define RCLCPP_DISABLE_COPY(...)
Definition: macros.hpp:26
void handle_response(std::shared_ptr< rmw_request_id_t > request_header, std::shared_ptr< void > response) override
Definition: client.hpp:189
std::shared_ptr< rmw_request_id_t > create_request_header() override
Definition: client.hpp:181
Definition: allocator_common.hpp:24
typename rcl_interfaces::srv::GetParameters ::Request::SharedPtr SharedRequest
Definition: client.hpp:122
rcl_ret_t rcl_send_request(const rcl_client_t *client, const void *ros_request, int64_t *sequence_number)
std::string expand_topic_or_service_name(const std::string &name, const std::string &node_name, const std::string &namespace_, bool is_service=false)
Expand a topic or service name and throw if it is not valid.
Definition: client.hpp:119
rclcpp::node_interfaces::NodeGraphInterface::WeakPtr node_graph_
Definition: client.hpp:111
void throw_from_rcl_error(rcl_ret_t ret, const std::string &prefix="", const rcl_error_state_t *error_state=nullptr, void(*reset_error)()=rcl_reset_error)
Throw a C++ std::exception which was created based on an rcl error.
rcl_ret_t rcl_client_init(rcl_client_t *client, const rcl_node_t *node, const rosidl_service_type_support_t *type_support, const char *service_name, const rcl_client_options_t *options)
#define RCLCPP_SMART_PTR_DEFINITIONS(...)
Definition: macros.hpp:36
Definition: function_traits.hpp:143
Pure virtual interface class for the NodeBase part of the Node API.
Definition: node_base_interface.hpp:36
T static_pointer_cast(T... args)
#define RCLCPP_SMART_PTR_DEFINITIONS_NOT_COPYABLE(...)
Definition: macros.hpp:51
#define RCUTILS_LOG_ERROR_NAMED(name,...)
SharedFuture async_send_request(SharedRequest request, CallbackT &&cb)
Definition: client.hpp:231
#define RCLCPP_PUBLIC
Definition: visibility_control.hpp:50
typename rcl_interfaces::srv::GetParameters ::Response::SharedPtr SharedResponse
Definition: client.hpp:123
virtual ~Client()
Definition: client.hpp:170
#define RCL_RET_SERVICE_NAME_INVALID
SharedFutureWithRequest async_send_request(SharedRequest request, CallbackT &&cb)
Definition: client.hpp:257
std::shared_ptr< void > create_response() override
Definition: client.hpp:175
const char * rcl_node_get_name(const rcl_node_t *node)
const char * rcl_node_get_namespace(const rcl_node_t *node)
bool wait_for_service(std::chrono::duration< int64_t, RatioT > timeout=std::chrono::duration< int64_t, RatioT >(-1))
Definition: client.hpp:83
std::shared_ptr< rcl_node_t > node_handle_
Definition: client.hpp:112