Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add timeout to SyncParametersClient methods #1493

Merged
merged 4 commits into from
Dec 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 98 additions & 12 deletions rclcpp/include/rclcpp/parameter_client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,9 +342,17 @@ class SyncParametersClient
qos_profile);
}

RCLCPP_PUBLIC
template<typename RepT = int64_t, typename RatioT = std::milli>
std::vector<rclcpp::Parameter>
get_parameters(const std::vector<std::string> & parameter_names);
fujitatomoya marked this conversation as resolved.
Show resolved Hide resolved
get_parameters(
const std::vector<std::string> & parameter_names,
std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{
return get_parameters(
parameter_names,
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
);
}

RCLCPP_PUBLIC
bool
Expand Down Expand Up @@ -388,27 +396,67 @@ class SyncParametersClient
);
}

RCLCPP_PUBLIC
template<typename RepT = int64_t, typename RatioT = std::milli>
std::vector<rcl_interfaces::msg::ParameterDescriptor>
describe_parameters(const std::vector<std::string> & parameter_names);
describe_parameters(
const std::vector<std::string> & parameter_names,
std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{
return describe_parameters(
parameter_names,
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
);
}

RCLCPP_PUBLIC
template<typename RepT = int64_t, typename RatioT = std::milli>
std::vector<rclcpp::ParameterType>
get_parameter_types(const std::vector<std::string> & parameter_names);
get_parameter_types(
const std::vector<std::string> & parameter_names,
std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{
return get_parameter_types(
parameter_names,
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
);
}

RCLCPP_PUBLIC
template<typename RepT = int64_t, typename RatioT = std::milli>
std::vector<rcl_interfaces::msg::SetParametersResult>
set_parameters(const std::vector<rclcpp::Parameter> & parameters);
set_parameters(
const std::vector<rclcpp::Parameter> & parameters,
std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{
return set_parameters(
parameters,
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
);
}

RCLCPP_PUBLIC
template<typename RepT = int64_t, typename RatioT = std::milli>
rcl_interfaces::msg::SetParametersResult
set_parameters_atomically(const std::vector<rclcpp::Parameter> & parameters);
set_parameters_atomically(
const std::vector<rclcpp::Parameter> & parameters,
std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{
return set_parameters_atomically(
parameters,
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
);
}

RCLCPP_PUBLIC
template<typename RepT = int64_t, typename RatioT = std::milli>
rcl_interfaces::msg::ListParametersResult
list_parameters(
const std::vector<std::string> & parameter_prefixes,
uint64_t depth);
uint64_t depth,
std::chrono::duration<RepT, RatioT> timeout = std::chrono::duration<RepT, RatioT>(-1))
{
return list_parameters(
parameter_prefixes,
depth,
std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
);
}

template<typename CallbackT>
typename rclcpp::Subscription<rcl_interfaces::msg::ParameterEvent>::SharedPtr
Expand Down Expand Up @@ -451,6 +499,44 @@ class SyncParametersClient
return async_parameters_client_->wait_for_service(timeout);
}

protected:
RCLCPP_PUBLIC
std::vector<rclcpp::Parameter>
get_parameters(
const std::vector<std::string> & parameter_names,
std::chrono::nanoseconds timeout);

RCLCPP_PUBLIC
std::vector<rcl_interfaces::msg::ParameterDescriptor>
describe_parameters(
const std::vector<std::string> & parameter_names,
std::chrono::nanoseconds timeout);

RCLCPP_PUBLIC
std::vector<rclcpp::ParameterType>
get_parameter_types(
const std::vector<std::string> & parameter_names,
std::chrono::nanoseconds timeout);

RCLCPP_PUBLIC
std::vector<rcl_interfaces::msg::SetParametersResult>
set_parameters(
const std::vector<rclcpp::Parameter> & parameters,
std::chrono::nanoseconds timeout);

RCLCPP_PUBLIC
rcl_interfaces::msg::SetParametersResult
set_parameters_atomically(
const std::vector<rclcpp::Parameter> & parameters,
std::chrono::nanoseconds timeout);

RCLCPP_PUBLIC
rcl_interfaces::msg::ListParametersResult
list_parameters(
const std::vector<std::string> & parameter_prefixes,
uint64_t depth,
std::chrono::nanoseconds timeout);

private:
rclcpp::Executor::SharedPtr executor_;
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_interface_;
Expand Down
43 changes: 26 additions & 17 deletions rclcpp/src/rclcpp/parameter_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,14 +342,16 @@ AsyncParametersClient::wait_for_service_nanoseconds(std::chrono::nanoseconds tim
}

std::vector<rclcpp::Parameter>
SyncParametersClient::get_parameters(const std::vector<std::string> & parameter_names)
SyncParametersClient::get_parameters(
const std::vector<std::string> & parameter_names,
std::chrono::nanoseconds timeout)
{
auto f = async_parameters_client_->get_parameters(parameter_names);
using rclcpp::executors::spin_node_until_future_complete;
if (
spin_node_until_future_complete(
*executor_, node_base_interface_,
f) == rclcpp::FutureReturnCode::SUCCESS)
*executor_, node_base_interface_, f,
timeout) == rclcpp::FutureReturnCode::SUCCESS)
{
return f.get();
}
Expand All @@ -367,29 +369,33 @@ SyncParametersClient::has_parameter(const std::string & parameter_name)
}

std::vector<rcl_interfaces::msg::ParameterDescriptor>
SyncParametersClient::describe_parameters(const std::vector<std::string> & parameter_names)
SyncParametersClient::describe_parameters(
const std::vector<std::string> & parameter_names,
std::chrono::nanoseconds timeout)
{
auto f = async_parameters_client_->describe_parameters(parameter_names);

using rclcpp::executors::spin_node_until_future_complete;
rclcpp::FutureReturnCode future =
spin_node_until_future_complete(*executor_, node_base_interface_, f);
spin_node_until_future_complete(*executor_, node_base_interface_, f, timeout);
if (future == rclcpp::FutureReturnCode::SUCCESS) {
return f.get();
}
return std::vector<rcl_interfaces::msg::ParameterDescriptor>();
}

std::vector<rclcpp::ParameterType>
SyncParametersClient::get_parameter_types(const std::vector<std::string> & parameter_names)
SyncParametersClient::get_parameter_types(
const std::vector<std::string> & parameter_names,
std::chrono::nanoseconds timeout)
{
auto f = async_parameters_client_->get_parameter_types(parameter_names);

using rclcpp::executors::spin_node_until_future_complete;
if (
spin_node_until_future_complete(
*executor_, node_base_interface_,
f) == rclcpp::FutureReturnCode::SUCCESS)
*executor_, node_base_interface_, f,
timeout) == rclcpp::FutureReturnCode::SUCCESS)
{
return f.get();
}
Expand All @@ -398,15 +404,16 @@ SyncParametersClient::get_parameter_types(const std::vector<std::string> & param

std::vector<rcl_interfaces::msg::SetParametersResult>
SyncParametersClient::set_parameters(
const std::vector<rclcpp::Parameter> & parameters)
const std::vector<rclcpp::Parameter> & parameters,
std::chrono::nanoseconds timeout)
{
auto f = async_parameters_client_->set_parameters(parameters);

using rclcpp::executors::spin_node_until_future_complete;
if (
spin_node_until_future_complete(
*executor_, node_base_interface_,
f) == rclcpp::FutureReturnCode::SUCCESS)
*executor_, node_base_interface_, f,
timeout) == rclcpp::FutureReturnCode::SUCCESS)
{
return f.get();
}
Expand All @@ -415,15 +422,16 @@ SyncParametersClient::set_parameters(

rcl_interfaces::msg::SetParametersResult
SyncParametersClient::set_parameters_atomically(
const std::vector<rclcpp::Parameter> & parameters)
const std::vector<rclcpp::Parameter> & parameters,
std::chrono::nanoseconds timeout)
{
auto f = async_parameters_client_->set_parameters_atomically(parameters);

using rclcpp::executors::spin_node_until_future_complete;
if (
spin_node_until_future_complete(
*executor_, node_base_interface_,
f) == rclcpp::FutureReturnCode::SUCCESS)
*executor_, node_base_interface_, f,
timeout) == rclcpp::FutureReturnCode::SUCCESS)
{
return f.get();
}
Expand All @@ -434,15 +442,16 @@ SyncParametersClient::set_parameters_atomically(
rcl_interfaces::msg::ListParametersResult
SyncParametersClient::list_parameters(
const std::vector<std::string> & parameter_prefixes,
uint64_t depth)
uint64_t depth,
std::chrono::nanoseconds timeout)
{
auto f = async_parameters_client_->list_parameters(parameter_prefixes, depth);

using rclcpp::executors::spin_node_until_future_complete;
if (
spin_node_until_future_complete(
*executor_, node_base_interface_,
f) == rclcpp::FutureReturnCode::SUCCESS)
*executor_, node_base_interface_, f,
timeout) == rclcpp::FutureReturnCode::SUCCESS)
{
return f.get();
}
Expand Down
20 changes: 11 additions & 9 deletions rclcpp/test/rclcpp/test_parameter_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

#include "rcl_interfaces/msg/parameter_event.hpp"

using namespace std::chrono_literals;

class TestParameterClient : public ::testing::Test
{
public:
Expand Down Expand Up @@ -293,7 +295,7 @@ TEST_F(TestParameterClient, sync_parameter_get_parameter_types) {
auto synchronous_client = std::make_shared<rclcpp::SyncParametersClient>(node);
std::vector<std::string> names{"foo"};
std::vector<rclcpp::ParameterType> parameter_types =
synchronous_client->get_parameter_types(names);
synchronous_client->get_parameter_types(names, 10s);
ASSERT_EQ(1u, parameter_types.size());
ASSERT_EQ(rclcpp::ParameterType::PARAMETER_INTEGER, parameter_types[0]);
}
Expand Down Expand Up @@ -429,14 +431,14 @@ TEST_F(TestParameterClient, sync_parameter_describe_parameters) {
{
std::vector<std::string> names{"none"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(0u, parameter_descs.size());
}

{
std::vector<std::string> names{"foo"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(1u, parameter_descs.size());
ASSERT_EQ("foo", parameter_descs[0].name);
ASSERT_EQ(rclcpp::ParameterType::PARAMETER_INTEGER, parameter_descs[0].type);
Expand All @@ -448,21 +450,21 @@ TEST_F(TestParameterClient, sync_parameter_describe_parameters) {
{
std::vector<std::string> names{"foo", "baz"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(0u, parameter_descs.size());
}

{
std::vector<std::string> names{"baz", "foo"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(0u, parameter_descs.size());
}

{
std::vector<std::string> names{"foo", "bar"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(2u, parameter_descs.size());
ASSERT_EQ("foo", parameter_descs[0].name);
ASSERT_EQ(rclcpp::ParameterType::PARAMETER_INTEGER, parameter_descs[0].type);
Expand Down Expand Up @@ -584,7 +586,7 @@ TEST_F(TestParameterClient, sync_parameter_describe_parameters_allow_undeclared)
{
std::vector<std::string> names{"none"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(1u, parameter_descs.size());
ASSERT_EQ("none", parameter_descs[0].name);
ASSERT_EQ(rclcpp::ParameterType::PARAMETER_NOT_SET, parameter_descs[0].type);
Expand All @@ -596,7 +598,7 @@ TEST_F(TestParameterClient, sync_parameter_describe_parameters_allow_undeclared)
{
std::vector<std::string> names{"foo", "baz"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(2u, parameter_descs.size());
ASSERT_EQ("foo", parameter_descs[0].name);
ASSERT_EQ(rclcpp::ParameterType::PARAMETER_INTEGER, parameter_descs[0].type);
Expand All @@ -613,7 +615,7 @@ TEST_F(TestParameterClient, sync_parameter_describe_parameters_allow_undeclared)
{
std::vector<std::string> names{"baz", "foo"};
std::vector<rcl_interfaces::msg::ParameterDescriptor> parameter_descs =
synchronous_client->describe_parameters(names);
synchronous_client->describe_parameters(names, 10s);
ASSERT_EQ(2u, parameter_descs.size());
ASSERT_EQ("baz", parameter_descs[0].name);
ASSERT_EQ(rclcpp::ParameterType::PARAMETER_NOT_SET, parameter_descs[0].type);
Expand Down
Loading