19 #include "rclcpp/node_interfaces/node_type_descriptions.hpp"
20 #include "rclcpp/parameter_client.hpp"
22 #include "type_description_interfaces/srv/get_type_description.h"
27 struct GetTypeDescription__C
29 using Request = type_description_interfaces__srv__GetTypeDescription_Request;
30 using Response = type_description_interfaces__srv__GetTypeDescription_Response;
31 using Event = type_description_interfaces__srv__GetTypeDescription_Event;
36 namespace rosidl_typesupport_cpp
39 rosidl_service_type_support_t
const *
40 get_service_type_support_handle<GetTypeDescription__C>()
42 return ROSIDL_GET_SRV_TYPE_SUPPORT(type_description_interfaces, srv, GetTypeDescription);
48 namespace node_interfaces
54 using ServiceT = GetTypeDescription__C;
57 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_;
61 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base,
62 rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging,
63 rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters,
64 rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services)
65 : logger_(node_logging->get_logger()),
69 const std::string enable_param_name =
"start_type_description_service";
71 if (!node_parameters->has_parameter(enable_param_name)) {
72 enable_param = node_parameters->declare_parameter(
75 rcl_interfaces::msg::ParameterDescriptor()
76 .set__name(enable_param_name)
77 .set__type(rclcpp::PARAMETER_BOOL)
78 .set__description(
"Start the ~/get_type_description service for this node.")
79 .set__read_only(
true));
81 enable_param = node_parameters->get_parameter(enable_param_name).get_parameter_value();
83 if (enable_param.
get_type() != rclcpp::PARAMETER_BOOL) {
86 "Invalid type '%s' for parameter 'start_type_description_service', should be 'bool'",
88 std::ostringstream ss;
89 ss <<
"Wrong parameter type, parameter {" << enable_param_name <<
"} is of type {bool}, "
90 <<
"setting it to {" <<
to_string(enable_param.
get_type()) <<
"} is not allowed.";
94 if (enable_param.get<
bool>()) {
95 auto * rcl_node = node_base->get_rcl_node_handle();
96 std::shared_ptr<rcl_service_t> rcl_srv(
103 "Error in destruction of rcl service handle [~/get_type_description]: %s",
104 rcl_get_error_string().str);
114 logger_,
"Failed to initialize ~/get_type_description service: %s",
115 rcl_get_error_string().str);
116 throw std::runtime_error(
117 "Failed to initialize ~/get_type_description service.");
123 std::shared_ptr<rmw_request_id_t> header,
124 std::shared_ptr<ServiceT::Request> request,
125 std::shared_ptr<ServiceT::Response> response
128 node_base_->get_rcl_node_handle(),
134 type_description_srv_ = std::make_shared<Service<ServiceT>>(
135 node_base_->get_shared_rcl_node_handle(),
138 node_services->add_service(
139 std::dynamic_pointer_cast<ServiceBase>(type_description_srv_),
145 NodeTypeDescriptions::NodeTypeDescriptions(
146 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base,
147 rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging,
148 rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters,
149 rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services)
157 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.