diff --git a/rclcpp/include/rclcpp/node.hpp b/rclcpp/include/rclcpp/node.hpp index 9f14f8a481..d3ced5ef42 100644 --- a/rclcpp/include/rclcpp/node.hpp +++ b/rclcpp/include/rclcpp/node.hpp @@ -160,6 +160,13 @@ class Node const std::vector & key_values, std::function)> callback = nullptr); + std::shared_future> + async_list_parameters( + const std::string & node_name, + const std::vector & parameter_groups, bool recursive, + std::function>)> callback = + nullptr); + private: RCLCPP_DISABLE_COPY(Node); @@ -198,6 +205,10 @@ class Node template void set_parameter(const parameter::ParameterName & key, const ParamTypeT & value); + + std::vector + list_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 1e4e530334..b5fbe261a8 100644 --- a/rclcpp/include/rclcpp/node_impl.hpp +++ b/rclcpp/include/rclcpp/node_impl.hpp @@ -28,8 +28,7 @@ #include #include -#include -#include +#include #include #ifndef RCLCPP_RCLCPP_NODE_HPP_ @@ -293,6 +292,34 @@ Node::get_parameters(const std::vector & queries) con return result; } +std::vector +Node::list_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; + })) + { + result.push_back(kv.first); + } + } + return result; +} + template std::shared_future Node::async_get_parameter( @@ -546,4 +573,34 @@ Node::async_has_parameters( return future_result; } +std::shared_future> +Node::async_list_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->list_parameters(parameter_groups, recursive)); + if (callback != nullptr) { + callback(future_result); + } + } else { + auto client = this->create_client("list_parameters"); + auto request = std::make_shared(); + request->parameter_group = parameter_groups; + request->recurse = recursive; + client->async_send_request( + request, [&promise_result, &future_result, &callback]( + rclcpp::client::Client::SharedFuture cb_f) { + promise_result.set_value(cb_f.get()->sub_groups); + if (callback != nullptr) { + callback(future_result); + } + }); + } + return future_result; +} #endif /* RCLCPP_RCLCPP_NODE_IMPL_HPP_ */