15 #ifndef RCLCPP__EVENT_HANDLER_HPP_
16 #define RCLCPP__EVENT_HANDLER_HPP_
24 #include "rcl/error_handling.h"
25 #include "rcl/event_callback.h"
26 #include "rmw/impl/cpp/demangle.hpp"
27 #include "rmw/incompatible_qos_events_statuses.h"
28 #include "rmw/events_statuses/incompatible_type.h"
30 #include "rcutils/logging_macros.h"
32 #include "rclcpp/detail/cpp_callback_trampoline.hpp"
33 #include "rclcpp/exceptions.hpp"
34 #include "rclcpp/function_traits.hpp"
35 #include "rclcpp/logging.hpp"
36 #include "rclcpp/waitable.hpp"
41 using QOSDeadlineRequestedInfo = rmw_requested_deadline_missed_status_t;
42 using QOSDeadlineOfferedInfo = rmw_offered_deadline_missed_status_t;
43 using QOSLivelinessChangedInfo = rmw_liveliness_changed_status_t;
44 using QOSLivelinessLostInfo = rmw_liveliness_lost_status_t;
45 using QOSMessageLostInfo = rmw_message_lost_status_t;
46 using QOSOfferedIncompatibleQoSInfo = rmw_offered_qos_incompatible_event_status_t;
47 using QOSRequestedIncompatibleQoSInfo = rmw_requested_qos_incompatible_event_status_t;
49 using IncompatibleTypeInfo = rmw_incompatible_type_status_t;
50 using MatchedInfo = rmw_matched_status_t;
52 using QOSDeadlineRequestedCallbackType = std::function<void (QOSDeadlineRequestedInfo &)>;
53 using QOSDeadlineOfferedCallbackType = std::function<void (QOSDeadlineOfferedInfo &)>;
54 using QOSLivelinessChangedCallbackType = std::function<void (QOSLivelinessChangedInfo &)>;
55 using QOSLivelinessLostCallbackType = std::function<void (QOSLivelinessLostInfo &)>;
56 using QOSMessageLostCallbackType = std::function<void (QOSMessageLostInfo &)>;
57 using QOSOfferedIncompatibleQoSCallbackType = std::function<void (QOSOfferedIncompatibleQoSInfo &)>;
58 using QOSRequestedIncompatibleQoSCallbackType =
59 std::function<void (QOSRequestedIncompatibleQoSInfo &)>;
61 using IncompatibleTypeCallbackType = std::function<void (IncompatibleTypeInfo &)>;
62 using PublisherMatchedCallbackType = std::function<void (MatchedInfo &)>;
63 using SubscriptionMatchedCallbackType = std::function<void (MatchedInfo &)>;
68 QOSDeadlineOfferedCallbackType deadline_callback;
69 QOSLivelinessLostCallbackType liveliness_callback;
70 QOSOfferedIncompatibleQoSCallbackType incompatible_qos_callback;
71 IncompatibleTypeCallbackType incompatible_type_callback;
72 PublisherMatchedCallbackType matched_callback;
78 QOSDeadlineRequestedCallbackType deadline_callback;
79 QOSLivelinessChangedCallbackType liveliness_callback;
80 QOSRequestedIncompatibleQoSCallbackType incompatible_qos_callback;
81 QOSMessageLostCallbackType message_lost_callback;
82 IncompatibleTypeCallbackType incompatible_type_callback;
83 SubscriptionMatchedCallbackType matched_callback;
92 const rcl_error_state_t * error_state,
93 const std::string & prefix);
98 const std::string & prefix);
104 enum class EntityType : std::size_t
167 throw std::invalid_argument(
168 "The callback passed to set_on_ready_callback "
174 [callback,
this](
size_t number_of_events) {
176 callback(number_of_events,
static_cast<int>(EntityType::Event));
177 }
catch (
const std::exception & exception) {
181 "rclcpp::EventHandlerBase@" <<
this <<
182 " caught " << rmw::impl::cpp::demangle(exception) <<
183 " exception in user-provided callback for the 'on ready' callback: " <<
188 "rclcpp::EventHandlerBase@" <<
this <<
189 " caught unhandled exception in user-provided callback " <<
190 "for the 'on ready' callback");
194 std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
199 set_on_new_event_callback(
200 rclcpp::detail::cpp_callback_trampoline<decltype(new_callback),
const void *,
size_t>,
201 static_cast<const void *
>(&new_callback));
204 on_new_event_callback_ = new_callback;
207 set_on_new_event_callback(
208 rclcpp::detail::cpp_callback_trampoline<
209 decltype(on_new_event_callback_),
const void *,
size_t>,
210 static_cast<const void *
>(&on_new_event_callback_));
217 std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
218 if (on_new_event_callback_) {
219 set_on_new_event_callback(
nullptr,
nullptr);
220 on_new_event_callback_ =
nullptr;
227 set_on_new_event_callback(rcl_event_callback_t callback,
const void * user_data);
229 std::recursive_mutex callback_mutex_;
230 std::function<void(
size_t)> on_new_event_callback_{
nullptr};
233 size_t wait_set_event_index_;
236 using QOSEventHandlerBase [[deprecated(
"Use rclcpp::EventHandlerBase")]] = EventHandlerBase;
238 template<
typename EventCallbackT,
typename ParentHandleT>
242 template<
typename InitFuncT,
typename EventTypeEnum>
244 const EventCallbackT & callback,
246 ParentHandleT parent_handle,
247 EventTypeEnum event_type)
248 : parent_handle_(parent_handle), event_callback_(callback)
251 rcl_ret_t ret = init_func(&event_handle_, parent_handle.get(), event_type);
258 rclcpp::exceptions::throw_from_rcl_error(ret,
"Failed to initialize event");
274 std::shared_ptr<void>
277 EventCallbackInfoT callback_info;
280 RCUTILS_LOG_ERROR_NAMED(
282 "Couldn't take event info: %s", rcl_get_error_string().str);
285 return std::static_pointer_cast<void>(std::make_shared<EventCallbackInfoT>(callback_info));
288 std::shared_ptr<void>
297 execute(
const std::shared_ptr<void> & data)
override
300 throw std::runtime_error(
"'data' is empty");
302 auto callback_ptr = std::static_pointer_cast<EventCallbackInfoT>(data);
303 event_callback_(*callback_ptr);
304 callback_ptr.reset();
308 using EventCallbackInfoT =
typename std::remove_reference<
typename
311 ParentHandleT parent_handle_;
312 EventCallbackT event_callback_;
315 template<
typename EventCallbackT,
typename ParentHandleT>
316 using QOSEventHandler [[deprecated(
"Use rclcpp::EventHandler")]] = EventHandler<EventCallbackT,
RCLCPP_PUBLIC size_t get_number_of_ready_events() override
Get the number of ready events.
RCLCPP_PUBLIC void add_to_wait_set(rcl_wait_set_t &wait_set) override
Add the Waitable to a wait set.
void set_on_ready_callback(std::function< void(size_t, int)> callback) override
Set a callback to be called when each new event instance occurs.
RCLCPP_PUBLIC bool is_ready(const rcl_wait_set_t &wait_set) override
Check if the Waitable is ready.
void clear_on_ready_callback() override
Unset the callback registered for new events, if any.
void execute(const std::shared_ptr< void > &data) override
Execute any entities of the Waitable that are ready.
std::shared_ptr< void > take_data() override
Take data so that the callback cannot be scheduled again.
std::shared_ptr< void > take_data_by_entity_id(size_t id) override
Take the data so that it can be consumed with execute.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_take_event(const rcl_event_t *event, void *event_info)
RCL_PUBLIC RCL_WARN_UNUSED rcl_event_t rcl_get_zero_initialized_event(void)
Return a rcl_event_t struct with members set to NULL.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
RCLCPP_PUBLIC Logger get_logger(const std::string &name)
Return a named logger.
Structure which encapsulates a ROS QoS event handle.
Container for subscription's, guard condition's, etc to be waited on.
Contains callbacks for various types of events a Publisher can receive from the middleware.
Contains callbacks for non-message events that a Subscription can receive from the middleware.
#define RCL_RET_UNSUPPORTED
Unsupported return code.
#define RCL_RET_OK
Success return code.
rmw_ret_t rcl_ret_t
The type that holds an rcl return code.