15 #ifndef RCLCPP__PARAMETER_EVENT_HANDLER_HPP_
16 #define RCLCPP__PARAMETER_EVENT_HANDLER_HPP_
21 #include <unordered_map>
25 #include "rclcpp/create_subscription.hpp"
26 #include "rclcpp/node_interfaces/get_node_base_interface.hpp"
27 #include "rclcpp/node_interfaces/get_node_topics_interface.hpp"
28 #include "rclcpp/node_interfaces/node_base_interface.hpp"
29 #include "rclcpp/node_interfaces/node_topics_interface.hpp"
30 #include "rclcpp/parameter.hpp"
31 #include "rclcpp/qos.hpp"
32 #include "rclcpp/subscription.hpp"
33 #include "rclcpp/visibility_control.hpp"
34 #include "rcl_interfaces/msg/parameter_event.hpp"
45 std::string parameter_name;
46 std::string node_name;
47 ParameterCallbackType callback;
54 using ParameterEventCallbackType =
55 std::function<void (
const rcl_interfaces::msg::ParameterEvent &)>;
57 ParameterEventCallbackType callback;
185 template<
typename NodeT>
190 : node_base_(
rclcpp::node_interfaces::get_node_base_interface(node))
192 auto node_topics = rclcpp::node_interfaces::get_node_topics_interface(node);
194 callbacks_ = std::make_shared<Callbacks>();
196 event_subscription_ = rclcpp::create_subscription<rcl_interfaces::msg::ParameterEvent>(
197 node_topics,
"/parameter_events", qos,
198 [callbacks = callbacks_](
const rcl_interfaces::msg::ParameterEvent & event) {
199 callbacks->event_callback(event);
203 using ParameterEventCallbackType =
204 ParameterEventCallbackHandle::ParameterEventCallbackType;
218 ParameterEventCallbackHandle::SharedPtr
220 const ParameterEventCallbackType & callback);
229 const ParameterEventCallbackHandle::SharedPtr & callback_handle);
231 using ParameterCallbackType = ParameterCallbackHandle::ParameterCallbackType;
252 ParameterCallbackHandle::SharedPtr
254 const std::string & parameter_name,
255 const ParameterCallbackType & callback,
256 const std::string & node_name =
"");
294 const ParameterCallbackHandle::SharedPtr & callback_handle);
310 const rcl_interfaces::msg::ParameterEvent & event,
312 const std::string & parameter_name,
313 const std::string & node_name =
"");
332 const rcl_interfaces::msg::ParameterEvent & event,
333 const std::string & parameter_name,
334 const std::string & node_name =
"");
342 static std::vector<rclcpp::Parameter>
344 const rcl_interfaces::msg::ParameterEvent & event);
346 using CallbacksContainerType = std::list<ParameterCallbackHandle::WeakPtr>;
356 inline void hash_combine(std::size_t & seed,
const T & v)
const
359 seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
362 inline size_t operator()(
const std::pair<std::string, std::string> & s)
const
365 hash_combine(seed, s.first);
366 hash_combine(seed, s.second);
374 std::recursive_mutex mutex_;
378 std::pair<std::string, std::string>,
379 CallbacksContainerType,
381 > parameter_callbacks_;
383 std::list<ParameterEventCallbackHandle::WeakPtr> event_callbacks_;
388 event_callback(
const rcl_interfaces::msg::ParameterEvent & event);
391 std::shared_ptr<Callbacks> callbacks_;
394 std::string resolve_path(
const std::string & path);
397 std::shared_ptr<rclcpp::node_interfaces::NodeBaseInterface> node_base_;
A class used to "handle" (monitor and respond to) changes to parameters.
static RCLCPP_PUBLIC bool get_parameter_from_event(const rcl_interfaces::msg::ParameterEvent &event, rclcpp::Parameter ¶meter, const std::string ¶meter_name, const std::string &node_name="")
Get an rclcpp::Parameter from a parameter event.
static RCLCPP_PUBLIC std::vector< rclcpp::Parameter > get_parameters_from_event(const rcl_interfaces::msg::ParameterEvent &event)
Get all rclcpp::Parameter values from a parameter event.
ParameterEventHandler(const NodeT &node, const rclcpp::QoS &qos=rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(rmw_qos_profile_parameter_events)))
Construct a parameter events monitor.
RCLCPP_PUBLIC RCUTILS_WARN_UNUSED ParameterCallbackHandle::SharedPtr add_parameter_callback(const std::string ¶meter_name, const ParameterCallbackType &callback, const std::string &node_name="")
Add a callback for a specified parameter.
RCLCPP_PUBLIC void remove_parameter_callback(const ParameterCallbackHandle::SharedPtr &callback_handle)
Remove a parameter callback registered with add_parameter_callback.
RCLCPP_PUBLIC bool configure_nodes_filter(const std::vector< std::string > &node_names)
Configure which node parameter events will be received.
RCLCPP_PUBLIC void remove_parameter_event_callback(const ParameterEventCallbackHandle::SharedPtr &callback_handle)
Remove parameter event callback registered with add_parameter_event_callback.
RCLCPP_PUBLIC RCUTILS_WARN_UNUSED ParameterEventCallbackHandle::SharedPtr add_parameter_event_callback(const ParameterEventCallbackType &callback)
Set a callback for all parameter events.
Structure to store an arbitrary parameter with templated get/set methods.
Encapsulation of Quality of Service settings.
Subscription implementation, templated on the type of message this subscription receives.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
RCLCPP_PUBLIC void event_callback(const rcl_interfaces::msg::ParameterEvent &event)
Callback for parameter events subscriptions.
static QoSInitialization from_rmw(const rmw_qos_profile_t &rmw_qos)
Create a QoSInitialization from an existing rmw_qos_profile_t, using its history and depth.