diff --git a/rclcpp/include/rclcpp/parameter_service.hpp b/rclcpp/include/rclcpp/parameter_service.hpp new file mode 100644 index 0000000000..c2b6ceb09c --- /dev/null +++ b/rclcpp/include/rclcpp/parameter_service.hpp @@ -0,0 +1,160 @@ +// Copyright 2015 Open Source Robotics Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef RCLCPP_RCLCPP_PARAMETER_SERVICE_HPP_ +#define RCLCPP_RCLCPP_PARAMETER_SERVICE_HPP_ + +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace rclcpp +{ + +namespace parameter_service +{ + +class ParameterService +{ + +public: + RCLCPP_MAKE_SHARED_DEFINITIONS(ParameterService); + + ParameterService(const rclcpp::node::Node::SharedPtr & node) + : node_(node) + { + get_parameters_service_ = node_->create_service( + node_->get_name() + "__get_parameters", [&node]( + const std::shared_ptr request_header, + const std::shared_ptr request, + std::shared_ptr response) + { + auto values = node->get_parameters(request->names); + std::transform(values.cbegin(), values.cend(), std::back_inserter(response->values), + [](const rclcpp::parameter::ParameterVariant & pvariant) { + return pvariant. + get_parameter_value(); + }); + } + ); + + get_parameter_types_service_ = node_->create_service( + node_->get_name() + "__get_parameter_types", [&node]( + const std::shared_ptr request_header, + const std::shared_ptr request, + std::shared_ptr response) + { + auto types = node->get_parameter_types(request->parameter_names); + std::transform(types.cbegin(), types.cend(), + std::back_inserter(response->parameter_types), [](const uint8_t & type) { + return static_cast(type); + }); + } + ); + + set_parameters_service_ = node_->create_service( + node_->get_name() + "__set_parameters", [&node]( + const std::shared_ptr request_header, + const std::shared_ptr request, + std::shared_ptr response) + { + std::vector pvariants; + std::transform(request->parameters.cbegin(), request->parameters.cend(), + std::back_inserter(pvariants), + [](const rcl_interfaces::Parameter & p) { + return rclcpp::parameter::ParameterVariant:: + from_parameter(p); + }); + auto results = node->set_parameters(pvariants); + response->results = results; + } + ); + + set_parameters_atomically_service_ = + node_->create_service( + node_->get_name() + "__set_parameters_atomically", [&node]( + const std::shared_ptr request_header, + const std::shared_ptr request, + std::shared_ptr response) + { + std::vector pvariants; + std::transform(request->parameters.cbegin(), request->parameters.cend(), + std::back_inserter(pvariants), + [](const rcl_interfaces::Parameter & p) { + return rclcpp::parameter::ParameterVariant:: + from_parameter(p); + }); + auto result = node->set_parameters_atomically(pvariants); + response->result = result; + } + ); + + describe_parameters_service_ = node_->create_service( + node_->get_name() + "__describe_parameters", [&node]( + const std::shared_ptr request_header, + const std::shared_ptr request, + std::shared_ptr response) + { + auto descriptors = node->describe_parameters(request->names); + response->descriptors = descriptors; + } + ); + + list_parameters_service_ = node_->create_service( + node_->get_name() + "__describe_parameters", [&node]( + const std::shared_ptr request_header, + const std::shared_ptr request, + std::shared_ptr response) + { + auto result = node->list_parameters(request->parameter_prefixes, request->depth); + response->result = result; + } + ); + + + } + +private: + const rclcpp::node::Node::SharedPtr node_; + rclcpp::service::Service::SharedPtr get_parameters_service_; + rclcpp::service::Service::SharedPtr + get_parameter_types_service_; + rclcpp::service::Service::SharedPtr set_parameters_service_; + rclcpp::service::Service::SharedPtr + set_parameters_atomically_service_; + rclcpp::service::Service::SharedPtr + describe_parameters_service_; + rclcpp::service::Service::SharedPtr list_parameters_service_; +}; + +} /* namespace parameter_service */ + +} /* namespace rclcpp */ + +#endif /* RCLCPP_RCLCPP_PARAMETER_SERVICE_HPP_ */ diff --git a/rclcpp/include/rclcpp/rclcpp.hpp b/rclcpp/include/rclcpp/rclcpp.hpp index a9d484f382..35893ac499 100644 --- a/rclcpp/include/rclcpp/rclcpp.hpp +++ b/rclcpp/include/rclcpp/rclcpp.hpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include