diff --git a/rclcpp/include/rclcpp/parameter.hpp b/rclcpp/include/rclcpp/parameter.hpp index 26bba4f4cd..30cde6fb25 100644 --- a/rclcpp/include/rclcpp/parameter.hpp +++ b/rclcpp/include/rclcpp/parameter.hpp @@ -190,6 +190,14 @@ class ParameterVariant } } + rcl_interfaces::Parameter to_parameter() + { + rcl_interfaces::Parameter parameter; + parameter.name = name_; + parameter.value = value_; + return parameter; + } + private: std::string name_; rcl_interfaces::ParameterValue value_; diff --git a/rclcpp/include/rclcpp/parameter_client.hpp b/rclcpp/include/rclcpp/parameter_client.hpp index 1e175332ba..e8016e801a 100644 --- a/rclcpp/include/rclcpp/parameter_client.hpp +++ b/rclcpp/include/rclcpp/parameter_client.hpp @@ -67,8 +67,35 @@ class AsyncParametersClient std::function>)> callback = nullptr) { - std::shared_future> f; - return f; + std::promise> promise_result; + auto future_result = promise_result.get_future().share(); + + auto request = std::make_shared(); + request->names = names; + + get_parameters_client_->async_send_request( + request, + [&names, &promise_result, &future_result, &callback]( + rclcpp::client::Client::SharedFuture cb_f) { + std::vector parameter_variants; + auto & pvalues = cb_f.get()->values; + + std::transform(pvalues.begin(), pvalues.end(), std::back_inserter(parameter_variants), + [&names, &pvalues](rcl_interfaces::ParameterValue pvalue) { + auto i = &pvalue - &pvalues[0]; + rcl_interfaces::Parameter parameter; + parameter.name = names[i]; + parameter.value = pvalue; + return rclcpp::parameter::ParameterVariant::from_parameter(parameter); + }); + promise_result.set_value(parameter_variants); + if (callback != nullptr) { + callback(future_result); + } + } + ); + + return future_result; } std::shared_future> @@ -77,8 +104,28 @@ class AsyncParametersClient std::function>)> callback = nullptr) { - std::shared_future> f; - return f; + std::promise> promise_result; + auto future_result = promise_result.get_future().share(); + + auto request = std::make_shared(); + request->parameter_names = parameter_names; + + get_parameter_types_client_->async_send_request( + request, + [&promise_result, &future_result, &callback]( + rclcpp::client::Client::SharedFuture cb_f) { + std::vector parameter_types; + auto & pts = cb_f.get()->parameter_types; + std::transform(pts.begin(), pts.end(), std::back_inserter(parameter_types), + [](uint8_t pt) {return static_cast(pt); }); + promise_result.set_value(parameter_types); + if (callback != nullptr) { + callback(future_result); + } + } + ); + + return future_result; } std::shared_future> @@ -87,8 +134,27 @@ class AsyncParametersClient std::function>)> callback = nullptr) { - std::shared_future> f; - return f; + std::promise> promise_result; + auto future_result = promise_result.get_future().share(); + + auto request = std::make_shared(); + + std::transform(parameters.begin(), parameters.end(), std::back_inserter( + request->parameters), []( + rclcpp::parameter::ParameterVariant p) {return p.to_parameter(); }); + + set_parameters_client_->async_send_request( + request, + [&promise_result, &future_result, &callback]( + rclcpp::client::Client::SharedFuture cb_f) { + promise_result.set_value(cb_f.get()->results); + if (callback != nullptr) { + callback(future_result); + } + } + ); + + return future_result; } std::shared_future @@ -97,8 +163,27 @@ class AsyncParametersClient std::function)> callback = nullptr) { - std::shared_future f; - return f; + std::promise promise_result; + auto future_result = promise_result.get_future().share(); + + auto request = std::make_shared(); + + std::transform(parameters.begin(), parameters.end(), std::back_inserter( + request->parameters), []( + rclcpp::parameter::ParameterVariant p) {return p.to_parameter(); }); + + set_parameters_atomically_client_->async_send_request( + request, + [&promise_result, &future_result, &callback]( + rclcpp::client::Client::SharedFuture cb_f) { + promise_result.set_value(cb_f.get()->result); + if (callback != nullptr) { + callback(future_result); + } + } + ); + + return future_result; } std::shared_future @@ -108,8 +193,25 @@ class AsyncParametersClient std::function)> callback = nullptr) { - std::shared_future f; - return f; + std::promise promise_result; + auto future_result = promise_result.get_future().share(); + + auto request = std::make_shared(); + request->parameter_prefixes = parameter_prefixes; + request->depth = depth; + + list_parameters_client_->async_send_request( + request, + [&promise_result, &future_result, &callback]( + rclcpp::client::Client::SharedFuture cb_f) { + promise_result.set_value(cb_f.get()->result); + if (callback != nullptr) { + callback(future_result); + } + } + ); + + return future_result; } private: