Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions rosidl_generator_py/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ if(BUILD_TESTING)
msg/BuiltinTypeSequencesIdl.idl
msg/StringArrays.msg
msg/Property.msg
idl/Enums.idl
ADD_LINTER_TESTS
SKIP_INSTALL
)
Expand Down
25 changes: 25 additions & 0 deletions rosidl_generator_py/idl/Enums.idl
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module rosidl_generator_py {
module idl {
typedef SomeEnum SomeEnum__3[3];

module Enums_Enums {
enum SomeEnum {
ENUMERATOR1,
ENUMERATOR2
};
};

struct Enums {
SomeEnum enum_value;

@default (value="ENUMERATOR2")
SomeEnum enum_default_value;

SomeEnum__3 static_array_values;

sequence<SomeEnum, 3> bounded_array_values;

sequence<SomeEnum> dynamic_array_values;
};
};
};
33 changes: 32 additions & 1 deletion rosidl_generator_py/resource/_msg.py.em
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ from rosidl_parser.definition import BasicType
from rosidl_parser.definition import BOOLEAN_TYPE
from rosidl_parser.definition import BoundedSequence
from rosidl_parser.definition import CHARACTER_TYPES
from rosidl_parser.definition import EnumerationType
from rosidl_parser.definition import EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME
from rosidl_parser.definition import FLOATING_POINT_TYPES
from rosidl_parser.definition import INTEGER_TYPES
Expand All @@ -35,6 +36,8 @@ imports = OrderedDict()
if message.structure.members:
imports.setdefault(
'import rosidl_parser.definition', []) # used for SLOT_TYPES
if message.enumerations:
imports.setdefault('from enum import IntEnum', [])
for member in message.structure.members:
if member.name != EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME:
imports.setdefault(
Expand Down Expand Up @@ -78,6 +81,16 @@ for member in message.structure.members:
@[ end for]@
@[end if]@
@#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@[for enum in message.enumerations]@


class @(enum.enumeration_type.name)(IntEnum):
"""Enumeration '@(enum.enumeration_type.name)'."""

@[ for i in range(len(enum.enumerators))]@
@(enum.enumerators[i]) = @(i)
@[ end for]@
@[end for]@


class Metaclass_@(message.structure.namespaced_type.name)(type):
Expand Down Expand Up @@ -178,6 +191,7 @@ for member in message.structure.members:
class @(message.structure.namespaced_type.name)(metaclass=Metaclass_@(message.structure.namespaced_type.name)):
@[if not message.constants]@
"""Message class '@(message.structure.namespaced_type.name)'."""

@[else]@
"""
Message class '@(message.structure.namespaced_type.name)'.
Expand All @@ -187,8 +201,11 @@ class @(message.structure.namespaced_type.name)(metaclass=Metaclass_@(message.st
@(constant_name)
@[ end for]@
"""
@[end if]@

@[end if]@
@[for enum in message.enumerations]@
@(enum.enumeration_type.name) = @(enum.enumeration_type.name)
@[end for]@
__slots__ = [
@[for member in message.structure.members]@
@[ if len(message.structure.members) == 1 and member.name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME]@
Expand Down Expand Up @@ -216,6 +233,8 @@ sequence<@
@# the typename of the non-nested type or the nested basetype
@[ if isinstance(type_, BasicType)]@
@(type_.typename)@
@[ elif isinstance(type_, EnumerationType)]@
@(type_.name)@
@[ elif isinstance(type_, AbstractGenericString)]@
@
@[ if isinstance(type_, AbstractWString)]@
Expand Down Expand Up @@ -259,6 +278,8 @@ if isinstance(type_, AbstractNestedType):
@(type_.__class__.__module__).@(type_.__class__.__name__)(@
@[ if isinstance(type_, BasicType)]@
'@(type_.typename)'@
@[ elif isinstance(type_, EnumerationType)]@
@(type_.namespaces), '@(type_.name)'@
@[ elif isinstance(type_, AbstractGenericString) and type_.has_maximum_size()]@
@(type_.maximum_size)@
@[ elif isinstance(type_, NamespacedType)]@
Expand Down Expand Up @@ -323,6 +344,11 @@ if isinstance(type_, AbstractNestedType):
else:
self.@(member.name) = numpy.array(kwargs.get('@(member.name)'), dtype=@(SPECIAL_NESTED_BASIC_TYPES[member.type.value_type.typename]['dtype']))
assert self.@(member.name).shape == (@(member.type.size), )
@[ elif isinstance(member.type.value_type, EnumerationType)]@
self.@(member.name) = kwargs.get(
'@(member.name)',
[@(get_python_type(type_))(0) for x in range(@(member.type.size))]
)
@[ else]@
self.@(member.name) = kwargs.get(
'@(member.name)',
Expand All @@ -340,6 +366,8 @@ if isinstance(type_, AbstractNestedType):
self.@(member.name) = kwargs.get('@(member.name)', bytes([0]))
@[ elif isinstance(type_, BasicType) and type_.typename in CHARACTER_TYPES]@
self.@(member.name) = kwargs.get('@(member.name)', chr(0))
@[ elif isinstance(type_, EnumerationType)]@
self.@(member.name) = kwargs.get('@(member.name)', @(get_python_type(type_))(0))
@[ else]@
self.@(member.name) = kwargs.get('@(member.name)', @(get_python_type(type_))())
@[ end if]@
Expand Down Expand Up @@ -572,6 +600,9 @@ bound = 1.7976931348623157e+308
assert value >= -@(bound) and value <= @(bound), \
"The '@(member.name)' field must be a @(name) in [@(-bound), @(bound)]"
@[ end if]@
@[ elif isinstance(type_, EnumerationType)]@
isinstance(value, @(get_python_type(type_))), \
"The '@(member.name)' field must be of type '@(get_python_type(type_))'"
@[ else]@
False
@[ end if]@
Expand Down
Loading