20 #include "rclcpp/node_interfaces/node_type_descriptions.hpp"
21 #include "rclcpp/parameter_client.hpp"
23 #include "type_description_interfaces/srv/get_type_description.h"
28 struct GetTypeDescription__C
30 using Request = type_description_interfaces__srv__GetTypeDescription_Request;
31 using Response = type_description_interfaces__srv__GetTypeDescription_Response;
32 using Event = type_description_interfaces__srv__GetTypeDescription_Event;
37 namespace rosidl_typesupport_cpp
40 rosidl_service_type_support_t
const *
41 get_service_type_support_handle<GetTypeDescription__C>()
43 return ROSIDL_GET_SRV_TYPE_SUPPORT(type_description_interfaces, srv, GetTypeDescription);
49 namespace node_interfaces
55 using ServiceT = GetTypeDescription__C;
58 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_;
62 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base,
63 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & node_logging,
64 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & node_parameters,
65 const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr & node_services)
66 : logger_(node_logging->get_logger()),
67 node_base_(std::move(node_base))
70 const std::string enable_param_name =
"start_type_description_service";
72 if (!node_parameters->has_parameter(enable_param_name)) {
73 enable_param = node_parameters->declare_parameter(
76 rcl_interfaces::msg::ParameterDescriptor()
77 .set__name(enable_param_name)
78 .set__type(rclcpp::PARAMETER_BOOL)
79 .set__description(
"Start the ~/get_type_description service for this node.")
80 .set__read_only(
true));
82 enable_param = node_parameters->get_parameter(enable_param_name).get_parameter_value();
84 if (enable_param.
get_type() != rclcpp::PARAMETER_BOOL) {
87 "Invalid type '%s' for parameter 'start_type_description_service', should be 'bool'",
89 std::ostringstream ss;
90 ss <<
"Wrong parameter type, parameter {" << enable_param_name <<
"} is of type {bool}, "
91 <<
"setting it to {" <<
to_string(enable_param.
get_type()) <<
"} is not allowed.";
95 if (enable_param.get<
bool>()) {
96 auto * rcl_node = node_base_->get_rcl_node_handle();
97 std::shared_ptr<rcl_service_t> rcl_srv(
104 "Error in destruction of rcl service handle [~/get_type_description]: %s",
105 rcl_get_error_string().str);
115 logger_,
"Failed to initialize ~/get_type_description service: %s",
116 rcl_get_error_string().str);
118 throw std::runtime_error(
119 "Failed to initialize ~/get_type_description service.");
125 const std::shared_ptr<rmw_request_id_t> & header,
126 const std::shared_ptr<ServiceT::Request> & request,
127 const std::shared_ptr<ServiceT::Response> & response
130 node_base_->get_rcl_node_handle(),
136 type_description_srv_ = std::make_shared<Service<ServiceT>>(
137 node_base_->get_shared_rcl_node_handle(),
140 node_services->add_service(
141 std::dynamic_pointer_cast<ServiceBase>(type_description_srv_),
147 NodeTypeDescriptions::NodeTypeDescriptions(
148 const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_base,
149 const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & node_logging,
150 const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & node_parameters,
151 const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr & node_services)
159 NodeTypeDescriptions::~NodeTypeDescriptions()
Store the type and value of a parameter.
RCLCPP_PUBLIC ParameterType get_type() const
Return an enum indicating the type of the set value.
Thrown if requested parameter type is invalid.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
RCLCPP_PUBLIC std::string to_string(const FutureReturnCode &future_return_code)
String conversion function for FutureReturnCode.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_node_type_description_service_init(rcl_service_t *service, const rcl_node_t *node)
Initialize the node's ~/get_type_description service.
RCL_PUBLIC void rcl_node_type_description_service_handle_request(rcl_node_t *node, const rmw_request_id_t *request_header, const type_description_interfaces__srv__GetTypeDescription_Request *request, type_description_interfaces__srv__GetTypeDescription_Response *response)
Process a single pending request to the GetTypeDescription service.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_service_fini(rcl_service_t *service, rcl_node_t *node)
Finalize a rcl_service_t.
RCL_PUBLIC RCL_WARN_UNUSED rcl_service_t rcl_get_zero_initialized_service(void)
Return a rcl_service_t struct with members set to NULL.
Structure which encapsulates a ROS Service.
#define RCL_RET_OK
Success return code.
rmw_ret_t rcl_ret_t
The type that holds an rcl return code.