diff --git a/autoware_iv_external_api_adaptor/CMakeLists.txt b/autoware_iv_external_api_adaptor/CMakeLists.txt index db2cd73d5..9a15e7360 100644 --- a/autoware_iv_external_api_adaptor/CMakeLists.txt +++ b/autoware_iv_external_api_adaptor/CMakeLists.txt @@ -21,6 +21,7 @@ ament_auto_add_library(${PROJECT_NAME} SHARED src/engage.cpp src/initial_pose.cpp src/map.cpp + src/metadata_packages.cpp src/operator.cpp src/route.cpp src/service.cpp @@ -35,6 +36,7 @@ rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Engage") rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::InitialPose") rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Map") rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Operator") +rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::MetadataPackages") rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Route") rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Service") rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Start") diff --git a/autoware_iv_external_api_adaptor/package.xml b/autoware_iv_external_api_adaptor/package.xml index f70b3e6b7..935f85713 100644 --- a/autoware_iv_external_api_adaptor/package.xml +++ b/autoware_iv_external_api_adaptor/package.xml @@ -14,6 +14,7 @@ autoware_external_api_msgs autoware_system_msgs autoware_vehicle_msgs + nlohmann-json-dev rclcpp rclcpp_components std_srvs diff --git a/autoware_iv_external_api_adaptor/src/metadata_packages.cpp b/autoware_iv_external_api_adaptor/src/metadata_packages.cpp new file mode 100644 index 000000000..0535319b6 --- /dev/null +++ b/autoware_iv_external_api_adaptor/src/metadata_packages.cpp @@ -0,0 +1,59 @@ +// Copyright 2021 Tier IV, 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. + +#include "metadata_packages.hpp" +#include +#include "ament_index_cpp/get_resources.hpp" +#include "ament_index_cpp/get_resource.hpp" +#include "nlohmann/json.hpp" + +namespace external_api +{ + +MetadataPackages::MetadataPackages(const rclcpp::NodeOptions & options) +: Node("external_api_metadata_packages", options) +{ + using namespace std::placeholders; + autoware_api_utils::ServiceProxyNodeInterface proxy(this); + + const auto resources = ament_index_cpp::get_resources("autoware_metadata_packages"); + nlohmann::json json = nlohmann::json::object(); + for (const auto & resource : resources) { + const std::string & package = resource.first; + std::string content; + ament_index_cpp::get_resource("autoware_metadata_packages", package, content); + json[package] = nlohmann::json::parse(content); + } + metadata_.format = "1"; + metadata_.json = json.dump(); + + group_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); + srv_ = proxy.create_service( + "/api/external/get/metadata/packages", + std::bind(&MetadataPackages::getVersions, this, _1, _2), + rmw_qos_profile_services_default, group_); +} + +void MetadataPackages::getVersions( + const autoware_external_api_msgs::srv::GetMetadataPackages::Request::SharedPtr, + const autoware_external_api_msgs::srv::GetMetadataPackages::Response::SharedPtr response) +{ + response->metadata = metadata_; + response->status = autoware_api_utils::response_success(); +} + +} // namespace external_api + +#include "rclcpp_components/register_node_macro.hpp" +RCLCPP_COMPONENTS_REGISTER_NODE(external_api::MetadataPackages) diff --git a/autoware_iv_external_api_adaptor/src/metadata_packages.hpp b/autoware_iv_external_api_adaptor/src/metadata_packages.hpp new file mode 100644 index 000000000..2d25d05b9 --- /dev/null +++ b/autoware_iv_external_api_adaptor/src/metadata_packages.hpp @@ -0,0 +1,46 @@ +// Copyright 2021 Tier IV, 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 PACKAGE_VERSIONS_HPP_ +#define PACKAGE_VERSIONS_HPP_ + +#include "rclcpp/rclcpp.hpp" +#include "autoware_api_utils/autoware_api_utils.hpp" +#include "autoware_external_api_msgs/srv/get_metadata_packages.hpp" + +namespace external_api +{ + +class MetadataPackages : public rclcpp::Node +{ +public: + explicit MetadataPackages(const rclcpp::NodeOptions & options); + +private: + // ros interface + rclcpp::CallbackGroup::SharedPtr group_; + autoware_api_utils::Service::SharedPtr srv_; + + // ros callback + void getVersions( + const autoware_external_api_msgs::srv::GetMetadataPackages::Request::SharedPtr request, + const autoware_external_api_msgs::srv::GetMetadataPackages::Response::SharedPtr response); + + // data + autoware_external_api_msgs::msg::MetadataPackages metadata_; +}; + +} // namespace external_api + +#endif // PACKAGE_VERSIONS_HPP_