diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index d3ced5ef42..33f7080970 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -167,6 +167,13 @@ class Node std::function>)> callback = nullptr); + std::shared_future> + async_describe_parameters( + const std::string & node_name, + const std::vector & parameter_groups, bool recursive, + std::function>)> callback = + nullptr); + private: RCLCPP_DISABLE_COPY(Node); @@ -209,6 +216,10 @@ class Node std::vector list_parameters( const std::vector & parameter_groups, bool recursive) const; + + std::vector + describe_parameters( + const std::vector & parameter_groups, bool recursive) const; }; } /* namespace node */ diff --git a/rclcpp/include/rclcpp/node_impl.hpp b/rclcpp/include/rclcpp/node_impl.hpp index f40482f650..b15267daa4 100644 --- a/rclcpp/include/rclcpp/node_impl.hpp +++ b/rclcpp/include/rclcpp/node_impl.hpp @@ -26,6 +26,7 @@ #include +#include #include #include #include @@ -320,6 +321,37 @@ Node::list_parameters( return result; } +std::vector +Node::describe_parameters( + const std::vector & parameter_groups, bool recursive) const +{ + std::vector result; + + // TODO: define parameter separator + for (auto & kv: parameters_) { + if (std::any_of(parameter_groups.cbegin(), parameter_groups.cend(), + [&kv, &recursive](const parameter::ParameterName & parameter_group) { + if (kv.first.find(parameter_group + ".") == 0) { + if (recursive) { + return true; + } else { + size_t length = parameter_group.length(); + std::string substr = kv.first.substr(length); + return substr.find_first_of(".") == substr.find_last_of("."); + } + } + return false; + })) + { + rcl_interfaces::ParameterDescription parameter_description; + parameter_description.name = kv.first; + parameter_description.parameter_type = kv.second.get_typeID(); + result.push_back(parameter_description); + } + } + return result; +} + template std::shared_future Node::async_get_parameter( @@ -603,4 +635,36 @@ Node::async_list_parameters( } return future_result; } + +std::shared_future> +Node::async_describe_parameters( + const std::string & node_name, + const std::vector & parameter_groups, + bool recursive, + std::function>)> callback) +{ + std::promise> promise_result; + auto future_result = promise_result.get_future().share(); + if (node_name == this->get_name()) { + promise_result.set_value(this->describe_parameters(parameter_groups, recursive)); + if (callback != nullptr) { + callback(future_result); + } + } else { + auto client = this->create_client("describe_parameters"); + auto request = std::make_shared(); + request->parameter_group = parameter_groups; + request->recursive = recursive; + client->async_send_request( + request, [&promise_result, &future_result, &callback]( + rclcpp::client::Client::SharedFuture cb_f) { + promise_result.set_value(cb_f.get()->parameter_descriptions); + if (callback != nullptr) { + callback(future_result); + } + }); + } + return future_result; +} + #endif /* RCLCPP_RCLCPP_NODE_IMPL_HPP_ */ diff --git a/rclcpp/include/rclcpp/parameter.hpp b/rclcpp/include/rclcpp/parameter.hpp index 4b11b3302b..87d03a8d38 100644 --- a/rclcpp/include/rclcpp/parameter.hpp +++ b/rclcpp/include/rclcpp/parameter.hpp @@ -57,9 +57,6 @@ class ParameterContainer const std::string & name, const bool bool_value) : name_(name), typeID_(BOOL_PARAMETER), bool_value_(bool_value) {} - ParameterName name_; - ParameterDataType typeID_; - /* Templated getter */ template T @@ -70,6 +67,8 @@ class ParameterContainer inline ParameterDataType get_typeID() const {return typeID_; } private: + ParameterName name_; + ParameterDataType typeID_; int64_t int_value_; double double_value_; std::string string_value_;