15 #ifndef RCLCPP__GENERIC_CLIENT_HPP_
16 #define RCLCPP__GENERIC_CLIENT_HPP_
27 #include "rclcpp/client.hpp"
28 #include "rclcpp/visibility_control.hpp"
29 #include "rcpputils/shared_library.hpp"
31 #include "rosidl_typesupport_introspection_cpp/message_introspection.hpp"
38 using Request =
void *;
39 using Response =
void *;
41 using SharedResponse = std::shared_ptr<void>;
43 using Promise = std::promise<SharedResponse>;
44 using SharedPromise = std::shared_ptr<Promise>;
46 using Future = std::future<SharedResponse>;
47 using SharedFuture = std::shared_future<SharedResponse>;
65 SharedFuture
share() noexcept {
return this->future.share();}
81 rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph,
82 const std::string & service_name,
83 const std::string & service_type,
88 create_response()
override;
91 std::shared_ptr<rmw_request_id_t>
92 create_request_header()
override;
97 std::shared_ptr<rmw_request_id_t> request_header,
98 std::shared_ptr<void> response)
override;
139 template<
typename AllocatorT = std::allocator<
int64_t>>
142 std::chrono::time_point<std::chrono::system_clock> time_point,
143 std::vector<int64_t, AllocatorT> * pruned_requests =
nullptr)
145 return detail::prune_requests_older_than_impl(
147 pending_requests_mutex_,
154 prune_pending_requests();
158 remove_pending_request(
182 using CallbackInfoVariant = std::variant<
183 std::promise<SharedResponse>>;
186 async_send_request_impl(
187 const Request request,
188 CallbackInfoVariant value);
190 std::optional<CallbackInfoVariant>
191 get_and_erase_pending_request(
192 int64_t request_number);
196 std::map<int64_t, std::pair<
197 std::chrono::time_point<std::chrono::system_clock>,
198 CallbackInfoVariant>> pending_requests_;
199 std::mutex pending_requests_mutex_;
202 std::shared_ptr<rcpputils::SharedLibrary> ts_lib_;
203 const rosidl_typesupport_introspection_cpp::MessageMembers * response_members_;
RCLCPP_PUBLIC bool take_type_erased_response(void *response_out, rmw_request_id_t &request_header_out)
Take the next response for this client as a type erased pointer.
RCLCPP_PUBLIC FutureAndRequestId async_send_request(const Request request)
Send a request to the service server.
RCLCPP_PUBLIC bool take_response(Response response_out, rmw_request_id_t &request_header_out)
Take the next response for this client.
size_t prune_requests_older_than(std::chrono::time_point< std::chrono::system_clock > time_point, std::vector< int64_t, AllocatorT > *pruned_requests=nullptr)
Clean all pending requests older than a time_point.
Pure virtual interface class for the NodeBase part of the Node API.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
Options available for a rcl_client_t.
A convenient GenericClient::Future and request id pair.
~FutureAndRequestId()=default
Destructor.
FutureAndRequestId(FutureAndRequestId &&other) noexcept=default
Move constructor.
FutureAndRequestId(const FutureAndRequestId &other)=delete
Deleted copy constructor, each instance is a unique owner of the future.
FutureAndRequestId & operator=(const FutureAndRequestId &other)=delete
Deleted copy assignment, each instance is a unique owner of the future.
SharedFuture share() noexcept
See std::future::share().
FutureAndRequestId & operator=(FutureAndRequestId &&other) noexcept=default
Move assignment.