1111@ # - content (IdlContent, list of elements, e.g. Messages or Services)
1212@ # ######################################################################
1313@ {
14+ from rosidl_generator_c import idl_structure_type_to_c_typename
15+ from rosidl_generator_c import type_hash_to_c_definition
1416from rosidl_pycommon import convert_camel_case_to_lower_case_underscore
1517include_parts = [package_name] + list (interface_path .parents [0 ].parts ) + [
1618 ' detail' , convert_camel_case_to_lower_case_underscore (interface_path .stem )]
@@ -32,6 +34,8 @@ extern "C"
3234# include <stddef.h>
3335# include <stdint.h>
3436
37+ # include "rosidl_runtime_c/type_hash.h"
38+
3539@ # ######################################################################
3640@ # Handle message
3741@ # ######################################################################
@@ -43,7 +47,7 @@ from rosidl_parser.definition import Message
4347TEMPLATE (
4448 ' msg__struct.h.em' ,
4549 package_name = package_name, interface_path = interface_path,
46- message = message, include_directives = include_directives)
50+ message = message, include_directives = include_directives, type_hash = type_hash )
4751}@
4852
4953@ [end for ]@
@@ -55,25 +59,34 @@ TEMPLATE(
5559from rosidl_parser .definition import Service
5660}@
5761@ [for service in content .get_elements_of_type (Service)]@
62+
63+ @ { hash_var = idl_structure_type_to_c_typename (service .namespaced_type ) + ' __TYPE_VERSION_HASH' }@
64+ // Note : this define is for MSVC, where the static const var can' t be used in downstream aggregate initializers
65+ #define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash[' service' ], line_final_backslash=True))
66+ static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT;
67+
5868@{
5969TEMPLATE(
6070 ' msg__struct .h .em ' ,
6171 package_name=package_name, interface_path=interface_path,
62- message = service .request_message , include_directives = include_directives)
72+ message=service.request_message, include_directives=include_directives,
73+ type_hash=type_hash[' request_message' ])
6374}@
6475
6576@{
6677TEMPLATE(
6778 ' msg__struct .h .em ' ,
6879 package_name=package_name, interface_path=interface_path,
69- message = service .response_message , include_directives = include_directives)
80+ message=service.response_message, include_directives=include_directives,
81+ type_hash=type_hash[' response_message' ])
7082}@
7183
7284@{
7385TEMPLATE(
7486 ' msg__struct .h .em ' ,
7587 package_name=package_name, interface_path=interface_path,
76- message = service .event_message , include_directives = include_directives)
88+ message=service.event_message, include_directives=include_directives,
89+ type_hash=type_hash[' event_message' ])
7790}@
7891
7992@[end for]@
@@ -85,74 +98,99 @@ TEMPLATE(
8598from rosidl_parser.definition import Action
8699}@
87100@[for action in content.get_elements_of_type(Action)]@
101+
102+ @{ hash_var = idl_structure_type_to_c_typename(action.namespaced_type) + ' __TYPE_VERSION_HASH' }@
103+ #define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash[' action' ], line_final_backslash=True))
104+ static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT;
105+
88106@{
89107TEMPLATE(
90108 ' msg__struct .h .em ' ,
91109 package_name=package_name, interface_path=interface_path,
92- message = action .goal , include_directives = include_directives)
110+ message=action.goal, include_directives=include_directives,
111+ type_hash=type_hash[' goal' ])
93112}@
94113
95114@{
96115TEMPLATE(
97116 ' msg__struct .h .em ' ,
98117 package_name=package_name, interface_path=interface_path,
99- message = action .result , include_directives = include_directives)
118+ message=action.result, include_directives=include_directives,
119+ type_hash=type_hash[' result' ])
100120}@
101121
102122@{
103123TEMPLATE(
104124 ' msg__struct .h .em ' ,
105125 package_name=package_name, interface_path=interface_path,
106- message = action .feedback , include_directives = include_directives)
126+ message=action.feedback, include_directives=include_directives,
127+ type_hash=type_hash[' feedback' ])
107128}@
108129
130+ @{ hash_var = idl_structure_type_to_c_typename(action.send_goal_service.namespaced_type) + ' __TYPE_VERSION_HASH' }@
131+ // Note: this define is for MSVC, where the static const var can' t be used in downstream aggregate initializers
132+ # define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash['send_goal_service']['service'], line_final_backslash=True))
133+ static const rosidl_type_hash_t @ (hash_var) = @ (hash_var)__INIT;
134+
109135@ {
110136TEMPLATE (
111137 ' msg__struct.h.em' ,
112138 package_name = package_name, interface_path = interface_path,
113- message = action .send_goal_service .request_message , include_directives = include_directives)
139+ message = action .send_goal_service .request_message , include_directives = include_directives,
140+ type_hash = type_hash[' send_goal_service' ][' request_message' ])
114141}@
115142
116143@ {
117144TEMPLATE (
118145 ' msg__struct.h.em' ,
119146 package_name = package_name, interface_path = interface_path,
120- message = action .send_goal_service .response_message , include_directives = include_directives)
147+ message = action .send_goal_service .response_message , include_directives = include_directives,
148+ type_hash = type_hash[' send_goal_service' ][' response_message' ])
121149}@
122150
123151@ {
124152TEMPLATE (
125153 ' msg__struct.h.em' ,
126154 package_name = package_name, interface_path = interface_path,
127- message = action .send_goal_service .event_message , include_directives = include_directives)
155+ message = action .send_goal_service .event_message , include_directives = include_directives,
156+ type_hash = type_hash[' send_goal_service' ][' event_message' ])
128157}@
129158
159+ @ { hash_var = idl_structure_type_to_c_typename (action .get_result_service .namespaced_type ) + ' __TYPE_VERSION_HASH' }@
160+ // Note : this define is for MSVC, where the static const var can' t be used in downstream aggregate initializers
161+ #define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash[' get_result_service' ][' service' ], line_final_backslash=True))
162+ static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT;
163+
130164@{
131165TEMPLATE(
132166 ' msg__struct .h .em ' ,
133167 package_name=package_name, interface_path=interface_path,
134- message = action .get_result_service .request_message , include_directives = include_directives)
168+ message=action.get_result_service.request_message, include_directives=include_directives,
169+ type_hash=type_hash[' get_result_service' ][' request_message' ])
135170}@
136171
137172@{
138173TEMPLATE(
139174 ' msg__struct .h .em ' ,
140175 package_name=package_name, interface_path=interface_path,
141- message = action .get_result_service .response_message , include_directives = include_directives)
176+ message=action.get_result_service.response_message, include_directives=include_directives,
177+ type_hash=type_hash[' get_result_service' ][' response_message' ])
142178}@
143179
144180@{
145181TEMPLATE(
146182 ' msg__struct .h .em ' ,
147183 package_name=package_name, interface_path=interface_path,
148- message = action .get_result_service .event_message , include_directives = include_directives)
184+ message=action.get_result_service.event_message, include_directives=include_directives,
185+ type_hash=type_hash[' get_result_service' ][' event_message' ])
149186}@
150187
151188@{
152189TEMPLATE(
153190 ' msg__struct .h .em ' ,
154191 package_name=package_name, interface_path=interface_path,
155- message = action .feedback_message , include_directives = include_directives)
192+ message=action.feedback_message, include_directives=include_directives,
193+ type_hash=type_hash[' feedback_message' ])
156194}@
157195
158196@[end for]@
0 commit comments