Skip to content

Commit a63f32e

Browse files
authored
[service introspection] generate service_event messages (#700)
* add service event message Signed-off-by: Brian Chen <[email protected]> Signed-off-by: Jacob Perron <[email protected]> Signed-off-by: Ivan Santiago Paunovic <[email protected]> Signed-off-by: Chris Lalancette <[email protected]>
1 parent a46056c commit a63f32e

File tree

31 files changed

+582
-15
lines changed

31 files changed

+582
-15
lines changed

rosidl_adapter/rosidl_adapter/parser.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
SERVICE_REQUEST_RESPONSE_SEPARATOR = '---'
2727
SERVICE_REQUEST_MESSAGE_SUFFIX = '_Request'
2828
SERVICE_RESPONSE_MESSAGE_SUFFIX = '_Response'
29+
SERVICE_EVENT_MESSAGE_SUFFIX = '_Event'
2930

3031
ACTION_REQUEST_RESPONSE_SEPARATOR = '---'
3132
ACTION_GOAL_SUFFIX = '_Goal'

rosidl_cmake/cmake/rosidl_generate_interfaces.cmake

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,21 +139,49 @@ macro(rosidl_generate_interfaces target)
139139
# afterwards all remaining interface files are .idl files
140140
list(APPEND _idl_tuples ${_idl_adapter_tuples})
141141

142-
# to generate action interfaces, we need to depend on "action_msgs"
142+
# Check for any action or service interfaces
143+
# Which have implicit dependencies that need to be found
143144
foreach(_tuple ${_interface_tuples})
145+
# We use the parent directory name to identify if the interface is an action or service
144146
string(REGEX REPLACE ".*:([^:]*)$" "\\1" _tuple_file "${_tuple}")
145147
get_filename_component(_parent_dir "${_tuple_file}" DIRECTORY)
148+
get_filename_component(_parent_dir ${_parent_dir} NAME)
149+
146150
if("${_parent_dir}" STREQUAL "action")
151+
# Actions depend on the packages service_msgs and action_msgs
152+
find_package(service_msgs QUIET)
153+
if(NOT ${service_msgs_FOUND})
154+
message(FATAL_ERROR
155+
"Unable to generate action interface for '${_tuple_file}'. "
156+
"In order to generate action interfaces you must add a depend tag "
157+
"for 'service_msgs' in your package.xml.")
158+
endif()
159+
ament_export_dependencies(service_msgs)
160+
list_append_unique(_ARG_DEPENDENCIES "service_msgs")
147161
find_package(action_msgs QUIET)
148162
if(NOT ${action_msgs_FOUND})
149163
message(FATAL_ERROR
150164
"Unable to generate action interface for '${_tuple_file}'. "
151165
"In order to generate action interfaces you must add a depend tag "
152166
"for 'action_msgs' in your package.xml.")
153167
endif()
154-
list_append_unique(_ARG_DEPENDENCIES "action_msgs")
155168
ament_export_dependencies(action_msgs)
169+
list_append_unique(_ARG_DEPENDENCIES "action_msgs")
170+
171+
# It is safe to break out of the loop since services only depend on service_msgs
172+
# Which has already been found above
156173
break()
174+
elseif("${_parent_dir}" STREQUAL "srv")
175+
# Services depend on service_msgs
176+
find_package(service_msgs QUIET)
177+
if(NOT ${service_msgs_FOUND})
178+
message(FATAL_ERROR
179+
"Unable to generate service interface for '${_tuple_file}'. "
180+
"In order to generate service interfaces you must add a depend tag "
181+
"for 'service_msgs' in your package.xml.")
182+
endif()
183+
ament_export_dependencies(service_msgs)
184+
list_append_unique(_ARG_DEPENDENCIES "service_msgs")
157185
endif()
158186
endforeach()
159187

rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
3434
)
3535
list(APPEND _generated_sources
3636
"${_output_path}/${_parent_folder}/detail/${_header_name}__functions.c"
37+
"${_output_path}/${_parent_folder}/detail/${_header_name}__type_support.c"
3738
)
3839
endforeach()
3940

@@ -52,15 +53,18 @@ set(target_dependencies
5253
"${rosidl_generator_c_BIN}"
5354
${rosidl_generator_c_GENERATOR_FILES}
5455
"${rosidl_generator_c_TEMPLATE_DIR}/action__type_support.h.em"
56+
"${rosidl_generator_c_TEMPLATE_DIR}/action__type_support.c.em"
5557
"${rosidl_generator_c_TEMPLATE_DIR}/idl.h.em"
5658
"${rosidl_generator_c_TEMPLATE_DIR}/idl__functions.c.em"
5759
"${rosidl_generator_c_TEMPLATE_DIR}/idl__functions.h.em"
5860
"${rosidl_generator_c_TEMPLATE_DIR}/idl__struct.h.em"
61+
"${rosidl_generator_c_TEMPLATE_DIR}/idl__type_support.c.em"
5962
"${rosidl_generator_c_TEMPLATE_DIR}/idl__type_support.h.em"
6063
"${rosidl_generator_c_TEMPLATE_DIR}/msg__functions.c.em"
6164
"${rosidl_generator_c_TEMPLATE_DIR}/msg__functions.h.em"
6265
"${rosidl_generator_c_TEMPLATE_DIR}/msg__struct.h.em"
6366
"${rosidl_generator_c_TEMPLATE_DIR}/msg__type_support.h.em"
67+
"${rosidl_generator_c_TEMPLATE_DIR}/srv__type_support.c.em"
6468
"${rosidl_generator_c_TEMPLATE_DIR}/srv__type_support.h.em"
6569
${rosidl_generate_interfaces_ABS_IDL_FILES}
6670
${_dependency_files})
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@# Included from rosidl_generator_c/resource/idl__type_support.c.em
2+
@{
3+
TEMPLATE(
4+
'srv__type_support.c.em',
5+
package_name=package_name, service=action.send_goal_service,
6+
interface_path=interface_path, include_directives=include_directives)
7+
}@
8+
9+
@{
10+
TEMPLATE(
11+
'srv__type_support.c.em',
12+
package_name=package_name, service=action.get_result_service,
13+
interface_path=interface_path, include_directives=include_directives)
14+
}@

rosidl_generator_c/resource/idl__functions.c.em

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ TEMPLATE(
6464
package_name=package_name, interface_path=interface_path,
6565
message=service.response_message, include_directives=include_directives)
6666
}@
67+
68+
@{
69+
TEMPLATE(
70+
'msg__functions.c.em',
71+
package_name=package_name, interface_path=interface_path,
72+
message=service.event_message, include_directives=include_directives)
73+
}@
6774
@[end for]@
6875
@
6976
@#######################################################################
@@ -109,6 +116,13 @@ TEMPLATE(
109116
message=action.send_goal_service.response_message, include_directives=include_directives)
110117
}@
111118

119+
@{
120+
TEMPLATE(
121+
'msg__functions.c.em',
122+
package_name=package_name, interface_path=interface_path,
123+
message=action.send_goal_service.event_message, include_directives=include_directives)
124+
}@
125+
112126
@{
113127
TEMPLATE(
114128
'msg__functions.c.em',
@@ -123,6 +137,13 @@ TEMPLATE(
123137
message=action.get_result_service.response_message, include_directives=include_directives)
124138
}@
125139

140+
@{
141+
TEMPLATE(
142+
'msg__functions.c.em',
143+
package_name=package_name, interface_path=interface_path,
144+
message=action.get_result_service.event_message, include_directives=include_directives)
145+
}@
146+
126147
@{
127148
TEMPLATE(
128149
'msg__functions.c.em',

rosidl_generator_c/resource/idl__functions.h.em

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ TEMPLATE(
7272
message=service.response_message)
7373
}@
7474

75+
@{
76+
TEMPLATE(
77+
'msg__functions.h.em',
78+
package_name=package_name, interface_path=interface_path,
79+
message=service.event_message)
80+
}@
7581
@[end for]@
7682
@
7783
@#######################################################################
@@ -116,6 +122,13 @@ TEMPLATE(
116122
message=action.send_goal_service.response_message)
117123
}@
118124

125+
@{
126+
TEMPLATE(
127+
'msg__functions.h.em',
128+
package_name=package_name, interface_path=interface_path,
129+
message=action.send_goal_service.event_message)
130+
}@
131+
119132
@{
120133
TEMPLATE(
121134
'msg__functions.h.em',
@@ -130,6 +143,13 @@ TEMPLATE(
130143
message=action.get_result_service.response_message)
131144
}@
132145

146+
@{
147+
TEMPLATE(
148+
'msg__functions.h.em',
149+
package_name=package_name, interface_path=interface_path,
150+
message=action.get_result_service.event_message)
151+
}@
152+
133153
@{
134154
TEMPLATE(
135155
'msg__functions.h.em',

rosidl_generator_c/resource/idl__struct.h.em

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ TEMPLATE(
6969
message=service.response_message, include_directives=include_directives)
7070
}@
7171

72+
@{
73+
TEMPLATE(
74+
'msg__struct.h.em',
75+
package_name=package_name, interface_path=interface_path,
76+
message=service.event_message, include_directives=include_directives)
77+
}@
78+
7279
@[end for]@
7380
@
7481
@#######################################################################
@@ -113,6 +120,13 @@ TEMPLATE(
113120
message=action.send_goal_service.response_message, include_directives=include_directives)
114121
}@
115122

123+
@{
124+
TEMPLATE(
125+
'msg__struct.h.em',
126+
package_name=package_name, interface_path=interface_path,
127+
message=action.send_goal_service.event_message, include_directives=include_directives)
128+
}@
129+
116130
@{
117131
TEMPLATE(
118132
'msg__struct.h.em',
@@ -127,6 +141,13 @@ TEMPLATE(
127141
message=action.get_result_service.response_message, include_directives=include_directives)
128142
}@
129143

144+
@{
145+
TEMPLATE(
146+
'msg__struct.h.em',
147+
package_name=package_name, interface_path=interface_path,
148+
message=action.get_result_service.event_message, include_directives=include_directives)
149+
}@
150+
130151
@{
131152
TEMPLATE(
132153
'msg__struct.h.em',
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// generated from rosidl_generator_c/resource/idl__type_support.c.em
2+
// with input from @(package_name):@(interface_path)
3+
// generated code does not contain a copyright notice
4+
@
5+
@#######################################################################
6+
@# EmPy template for generating <idl>__type_support.c files
7+
@#
8+
@# Context:
9+
@# - package_name (string)
10+
@# - interface_path (Path relative to the directory named after the package)
11+
@# - content (IdlContent, list of elements, e.g. Messages or Services)
12+
@#######################################################################
13+
@{
14+
from rosidl_pycommon import convert_camel_case_to_lower_case_underscore
15+
include_parts = [package_name] + list(interface_path.parents[0].parts) + [
16+
'detail', convert_camel_case_to_lower_case_underscore(interface_path.stem)]
17+
include_base = '/'.join(include_parts)
18+
19+
include_directives = {
20+
'rosidl_typesupport_interface/macros.h',
21+
include_base + '__type_support.h',
22+
include_base + '__struct.h',
23+
include_base + '__functions.h'}
24+
}@
25+
26+
#include <string.h>
27+
28+
@[for header_file in include_directives]@
29+
#include "@(header_file)"
30+
@[end for]@
31+
32+
#ifdef __cplusplus
33+
extern "C"
34+
{
35+
#endif
36+
37+
@#######################################################################
38+
@# Handle service
39+
@#######################################################################
40+
@{
41+
from rosidl_parser.definition import Service
42+
}@
43+
@[for service in content.get_elements_of_type(Service)]@
44+
@{
45+
TEMPLATE(
46+
'srv__type_support.c.em',
47+
package_name=package_name, service=service,
48+
interface_path=interface_path, include_directives=include_directives)
49+
}@
50+
51+
@[end for]@
52+
@
53+
@#######################################################################
54+
@# Handle action
55+
@#######################################################################
56+
@{
57+
from rosidl_parser.definition import Action
58+
}@
59+
@[for action in content.get_elements_of_type(Action)]@
60+
@{
61+
TEMPLATE(
62+
'action__type_support.c.em',
63+
package_name=package_name, action=action,
64+
interface_path=interface_path, include_directives=include_directives)
65+
}@
66+
67+
@[end for]@
68+
#ifdef __cplusplus
69+
}
70+
#endif

rosidl_generator_c/resource/msg__struct.h.em

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ from rosidl_parser.definition import FLOATING_POINT_TYPES
1313
from rosidl_parser.definition import INTEGER_TYPES
1414
from rosidl_parser.definition import NamespacedType
1515
from rosidl_parser.definition import OCTET_TYPE
16+
from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX
17+
from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX
1618
from rosidl_generator_c import basetype_to_c
1719
from rosidl_generator_c import idl_declaration_to_c
1820
from rosidl_generator_c import idl_structure_type_sequence_to_c_typename
@@ -43,6 +45,14 @@ for member in message.structure.members:
4345
'rosidl_runtime_c/u16string.h', [])
4446
member_names.append(member.name)
4547
elif isinstance(type_, NamespacedType):
48+
if (
49+
message.structure.namespaced_type.namespaces[-1] in ['action', 'srv'] and (
50+
type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or
51+
type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX))
52+
):
53+
typename = type_.name.rsplit('_', 1)[0]
54+
if typename == message.structure.namespaced_type.name.rsplit('_', 1)[0]:
55+
continue
4656
include_prefix = idl_structure_type_to_c_include_prefix(
4757
type_, 'detail')
4858
member_names = includes.setdefault(

0 commit comments

Comments
 (0)