5 #include <rosidl_typesupport_introspection_c/message_introspection.h>
6 #include <rosidl_typesupport_introspection_cpp/message_introspection.hpp>
7 #include <rosidl_typesupport_introspection_cpp/field_types.hpp>
9 #include <rosidl_typesupport_cpp/identifier.hpp>
10 #include <rosidl_typesupport_introspection_cpp/identifier.hpp>
16 auto members =
static_cast<const rosidl_typesupport_introspection_cpp::MessageMembers *
>(type_support->data);
18 if (members->member_count_ >= 1 && members->members_)
20 const rosidl_typesupport_introspection_cpp::MessageMember& first_field = members->members_[0];
21 if (first_field.members_ ==
nullptr)
25 const auto* header_members =
static_cast<const rosidl_typesupport_introspection_cpp::MessageMembers*
>(first_field.members_->data);
26 if (strcmp(header_members->message_name_,
"Header") == 0 && strcmp(header_members->message_namespace_,
"std_msgs::"
38 using TypeSupport = rosidl_message_type_support_t;
39 using namespace rosidl_typesupport_introspection_cpp;
41 std::set<std::string> secondary_types_pending;
42 std::set<std::string> secondary_types_done;
44 auto addTypeToSchema = [&](
const std::string&
type_name,
bool add_header)
46 auto introspection_library = rosbag2_cpp::get_typesupport_library(
type_name,
"rosidl_typesupport_introspection_cpp");
47 auto introspection_support = rosbag2_cpp::get_typesupport_handle(
type_name,
"rosidl_typesupport_introspection_cpp",
48 introspection_library);
52 schema += fmt::format(
"=====================================\nMSG: {}\n",
type_name);
54 const auto* members =
static_cast<const MessageMembers*
>(introspection_support->data);
55 for (
size_t i = 0;
i < members->member_count_;
i++)
57 const MessageMember& member = members->members_[
i];
59 switch(member.type_id_)
61 case ROS_TYPE_FLOAT32: schema +=
"float32";
break;
62 case ROS_TYPE_FLOAT64: schema +=
"float64";
break;
65 case ROS_TYPE_CHAR: schema +=
"uint8";
break;
66 case ROS_TYPE_BOOLEAN: schema +=
"bool";
break;
67 case ROS_TYPE_INT8: schema +=
"int8";
break;
68 case ROS_TYPE_UINT16: schema +=
"uint16";
break;
69 case ROS_TYPE_INT16: schema +=
"int16";
break;
70 case ROS_TYPE_UINT32: schema +=
"uint32";
break;
71 case ROS_TYPE_INT32: schema +=
"int32";
break;
72 case ROS_TYPE_UINT64: schema +=
"uint64";
break;
73 case ROS_TYPE_INT64: schema +=
"int64";
break;
74 case ROS_TYPE_STRING: schema +=
"string";
break;
75 case ROS_TYPE_MESSAGE: {
76 auto type_info =
reinterpret_cast<const MessageMembers*
>(member.members_->data);
77 std::string
package = type_info->message_namespace_;
78 package = package.substr(0, package.size() - 5);
81 if(secondary_types_done.count(
field_type) == 0)
90 if(member.array_size_ > 0) {
91 schema += fmt::format(
"[{}]", member.array_size_);
97 schema += fmt::format(
" {}\n", member.name_);
101 addTypeToSchema(base_type,
false);
103 while(!secondary_types_pending.empty())
105 auto it = secondary_types_pending.begin();
106 std::string other_type = *
it;
107 secondary_types_done.insert(other_type);
108 addTypeToSchema(other_type,
true);
109 secondary_types_pending.erase(
it);
124 auto identifier = rosidl_typesupport_cpp::typesupport_identifier;
133 const std::string& topic_name,
134 const std::string& type_name,