diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index 7433ce6..5448cef 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -353,6 +353,14 @@ public: size_t count_graph_users(); + /// Register the callback for parameter changes + /** + * \param[in] User defined callback function, It is expected to atomically set parameters. + * \note Repeated invocations of this function will overwrite previous callbacks + */ + template + void register_param_change_callback(CallbackT && callback); + std::atomic_bool has_executor; private: @@ -400,6 +408,10 @@ private: /* graph_users_count_ is atomic so that it can be accessed without acquiring the graph_mutex_ */ std::atomic_size_t graph_users_count_; + std::function & + )> parameters_callback_ = nullptr; + std::map parameters_; publisher::Publisher::SharedPtr events_publisher_; diff --git a/rclcpp/include/rclcpp/node_impl.hpp b/rclcpp/include/rclcpp/node_impl.hpp index f0f81a5..7c018ad 100644 --- a/rclcpp/include/rclcpp/node_impl.hpp +++ b/rclcpp/include/rclcpp/node_impl.hpp @@ -362,6 +362,12 @@ Node::create_service( return serv; } +template +void Node::register_param_change_callback(CallbackT && callback) +{ + this->parameters_callback_ = callback; +} + } // namespace node } // namespace rclcpp diff --git a/rclcpp/src/rclcpp/node.cpp b/rclcpp/src/rclcpp/node.cpp index f57b6b6..84fbf3e 100644 --- a/rclcpp/src/rclcpp/node.cpp +++ b/rclcpp/src/rclcpp/node.cpp @@ -189,6 +189,18 @@ Node::set_parameters_atomically( std::map tmp_map; auto parameter_event = std::make_shared(); + // TODO(jacquelinekay): handle parameter constraints + rcl_interfaces::msg::SetParametersResult result; + if (parameters_callback_) { + result = parameters_callback_(parameters); + } else { + result.successful = true; + } + + if (!result.successful) { + return result; + } + for (auto p : parameters) { if (parameters_.find(p.get_name()) == parameters_.end()) { if (p.get_type() != rclcpp::parameter::ParameterType::PARAMETER_NOT_SET) { @@ -206,10 +218,6 @@ Node::set_parameters_atomically( tmp_map.insert(parameters_.begin(), parameters_.end()); std::swap(tmp_map, parameters_); - // TODO(jacquelinekay): handle parameter constraints - rcl_interfaces::msg::SetParametersResult result; - result.successful = true; - events_publisher_->publish(parameter_event); return result;