Skip to content

Commit 7a5dffb

Browse files
committed
Added action generation
1 parent d8c2984 commit 7a5dffb

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

rosidl_generator_rs/resource/action.rs.em

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,36 @@
1+
@{
2+
action_msg_specs = []
3+
4+
for subfolder, action in action_specs:
5+
action_msg_specs.append((subfolder, action.goal))
6+
action_msg_specs.append((subfolder, action.result))
7+
action_msg_specs.append((subfolder, action.feedback))
8+
action_msg_specs.append((subfolder, action.feedback_message))
9+
10+
action_srv_specs = []
11+
12+
for subfolder, action in action_specs:
13+
action_srv_specs.append((subfolder, action.send_goal_service))
14+
action_srv_specs.append((subfolder, action.get_result_service))
15+
}@
16+
17+
pub mod rmw {
18+
@{
19+
TEMPLATE(
20+
'msg_rmw.rs.em',
21+
package_name=package_name, interface_path=interface_path,
22+
msg_specs=action_msg_specs,
23+
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
24+
get_idiomatic_rs_type=get_idiomatic_rs_type,
25+
constant_value_to_rs=constant_value_to_rs)
26+
}@
27+
} // mod rmw
28+
129
@{
230
TEMPLATE(
331
'msg_idiomatic.rs.em',
432
package_name=package_name, interface_path=interface_path,
5-
msg_specs=msg_specs,
33+
msg_specs=action_msg_specs,
634
get_rs_name=get_rs_name, get_rmw_rs_type=get_rmw_rs_type,
735
get_idiomatic_rs_type=get_idiomatic_rs_type,
836
constant_value_to_rs=constant_value_to_rs)

rosidl_generator_rs/rosidl_generator_rs/__init__.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from rosidl_parser.definition import AbstractSequence
2929
from rosidl_parser.definition import AbstractString
3030
from rosidl_parser.definition import AbstractWString
31+
from rosidl_parser.definition import Action
3132
from rosidl_parser.definition import Array
3233
from rosidl_parser.definition import BASIC_TYPES
3334
from rosidl_parser.definition import BasicType
@@ -92,13 +93,20 @@ def generate_rs(generator_arguments_file, typesupport_impls):
9293
os.path.join(template_dir, 'srv.rs.em'): ['rust/src/%s.rs'],
9394
}
9495

96+
mapping_actions = {
97+
os.path.join(template_dir, 'action.rs.em'): ['rust/src/%s.rs'],
98+
}
99+
95100
# Ensure the required templates exist
96101
for template_file in mapping_msgs.keys():
97102
assert os.path.exists(template_file), \
98103
'Messages template file %s not found' % template_file
99104
for template_file in mapping_srvs.keys():
100105
assert os.path.exists(template_file), \
101106
'Services template file %s not found' % template_file
107+
for template_file in mapping_actions.keys():
108+
assert os.path.exists(template_file), \
109+
'Actions template file %s not found' % template_file
102110

103111
data = {
104112
'get_rmw_rs_type': make_get_rmw_rs_type(args['package_name']),
@@ -112,6 +120,7 @@ def generate_rs(generator_arguments_file, typesupport_impls):
112120
convert_lower_case_underscore_to_camel_case,
113121
'msg_specs': [],
114122
'srv_specs': [],
123+
'action_specs': [],
115124
'package_name': args['package_name'],
116125
'typesupport_impls': typesupport_impls,
117126
'interface_path': idl_rel_path,
@@ -126,6 +135,9 @@ def generate_rs(generator_arguments_file, typesupport_impls):
126135
for service in idl_content.get_elements_of_type(Service):
127136
data['srv_specs'].append(('srv', service))
128137

138+
for action in idl_content.get_elements_of_type(Action):
139+
data['action_specs'].append(('action', action))
140+
129141
if data['msg_specs']:
130142
for template_file, generated_filenames in mapping_msgs.items():
131143
for generated_filename in generated_filenames:
@@ -148,6 +160,17 @@ def generate_rs(generator_arguments_file, typesupport_impls):
148160
generated_file,
149161
minimum_timestamp=latest_target_timestamp)
150162

163+
if data['action_specs']:
164+
for template_file, generated_filenames in mapping_actions.items():
165+
for generated_filename in generated_filenames:
166+
generated_file = os.path.join(args['output_dir'],
167+
generated_filename % 'action')
168+
rosidl_pycommon.expand_template(
169+
os.path.join(template_dir, template_file),
170+
data.copy(),
171+
generated_file,
172+
minimum_timestamp=latest_target_timestamp)
173+
151174
rosidl_pycommon.expand_template(
152175
os.path.join(template_dir, 'lib.rs.em'),
153176
data.copy(),

0 commit comments

Comments
 (0)