Skip to content

Commit

Permalink
Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobperron committed Nov 30, 2018
1 parent 5752b7b commit 18ae20f
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 35 deletions.
16 changes: 6 additions & 10 deletions rosidl_generator_dds_idl/bin/rosidl_generator_dds_idl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import argparse
import sys

from rosidl_generator_dds_idl import convert_dds_idl
from rosidl_generator_dds_idl import generate_dds_idl


def main(argv=sys.argv[1:]):
Expand All @@ -14,15 +14,11 @@ def main(argv=sys.argv[1:]):
'--generator-arguments-file',
required=True,
help='The location of the file containing the generator arguments')
parser.add_argument(
'--subfolders',
nargs='*',
help='The subfolders between the package name and the interface '
'definition')
# parser.add_argument(
# '--extension',
# nargs='?',
# help='The Python module extending the generator')
parser.add_argument(
'--subfolders',
nargs='*',
help='The subfolders between the package name and the interface '
'definition')
args = parser.parse_args(argv)

return generate_dds_idl(args.generator_arguments_file, args.subfolders)
Expand Down
10 changes: 8 additions & 2 deletions rosidl_generator_dds_idl/resource/idl.idl.em
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,19 @@
// with input from @(package_name):@(interface_path)
// generated code does not contain a copyright notice
@{
import os
from rosidl_parser.definition import Include
for includes in content.get_elements_of_type(Include):
includes = content.get_elements_of_type(Include)
}@
@[if includes]@

@[ for include in includes]@
#include "@(include.locator)"
@{
name, ext = os.path.splitext(include.locator)
dir_name = os.path.dirname(name)
include_name = '{}_{}'.format(os.path.join(dir_name, *subfolders, os.path.basename(name)), ext)
}@
#include "@(include_name)"
@[ end for]@
@[end if]@
@{
Expand Down
23 changes: 12 additions & 11 deletions rosidl_generator_dds_idl/resource/msg.idl.em
Original file line number Diff line number Diff line change
@@ -1,38 +1,39 @@
@# Included from rosidl_generator_dds_idl/resource/idl.idl.em
@{
from rosidl_parser.definition import BasicType
from rosidl_generator_dds_idl import idl_typename, idl_literal

This comment has been minimized.

Copy link
@dirk-thomas

dirk-thomas Apr 26, 2019

Member

Importing these symbols here (instead of using the once being passed into the template from here:

'idl_typename': idl_typename,
'idl_literal': idl_literal,
) breaks the ability to customize them. See #51 for a fix.

@jacobperron FYI


from rosidl_parser.definition import Array
from rosidl_parser.definition import BaseType
from rosidl_parser.definition import BoundedSequence
from rosidl_parser.definition import CONSTANT_MODULE_SUFFIX
from rosidl_parser.definition import NestedType
from rosidl_parser.definition import Sequence
from rosidl_parser.definition import String
}@
@[for ns in messages.structure.type.namespaces]@
@[for ns in message.structure.type.namespaces]@
module @(ns) {

@[end for]@
module dds_ {

@[if message.constants]@
module @{message.structure.type.name}@@(CONSTANT_MODULE_SUFFIX) {
@[ for constant in message.constants]@
const @(idl_base_type(constant.type)) @(constant.name) = @(idl_literal(constant.value));
module @(message.structure.type.name)@(CONSTANT_MODULE_SUFFIX) {
@[ for constant in message.constants.values()]@
const @(idl_typename(constant.type)) @(constant.name) = @(idl_literal(constant.type, constant.value));
@[ end for]
}
};
@[end if]@

struct @(message.structure.type.name)_ {
@[for member in message.structure.members]@
@[ if isinstance(member.type, NestedType)]@
@[ if isinstance(member.type, Array)]@
@(idl_base_type(member.type.basetype)) @(member.name)[@(member.type.size)];
@(idl_typename(member.type.basetype)) @(member.name)[@(member.type.size)];
@[ elif isinstance(member.type, Sequence)]@
sequence<@(idl_base_type(member.type.basetype))@
sequence<@(idl_typename(member.type.basetype))@
@[ if isinstance(member.type, BoundedSequence)]@
, @(member.type.upper_bound)@
@[ end if]@
> @(member.name);
@(member.name)[@(member.type.size)];
@[ else]@

@[ end if]
Expand All @@ -50,4 +51,4 @@ sequence<@(idl_base_type(member.type.basetype))@
@[for ns in reversed(message.structure.type.namespaces)]@
}; // module @(ns) {

@[end for]@
@[end for]@
38 changes: 26 additions & 12 deletions rosidl_generator_dds_idl/rosidl_generator_dds_idl/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,46 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import os

from rosidl_cmake import generate_files
from rosidl_parser import BaseType
from rosidl_parser import BaseString
from rosidl_parser import BasicType
from rosidl_parser import NamespacedType
from rosidl_parser import String
from rosidl_parser import WString
from rosidl_parser.definition import BaseType
from rosidl_parser.definition import BaseString
from rosidl_parser.definition import BasicType
from rosidl_parser.definition import NamespacedType
from rosidl_parser.definition import String
from rosidl_parser.definition import WString


def generate_dds_idl(generator_arguments_file, subfolders):
mapping = {
'idl.idl.em': os.path.join(*subfolders, '%s.idl')
'idl.idl.em': os.path.join(*subfolders, '%s_.idl')
}
functions = {
'idl_typename': idl_typename,
'idl_literal': idl_literal
data = {
'subfolders' : subfolders
}
generate_files(generator_arguments_file, mapping, functions)
generate_files(generator_arguments_file, mapping, data, keep_case=True)
return 0


# used by the template
EXPLICIT_TYPE_TO_IMPLICIT_TYPE = {
'int8': 'octet',
'uint8': 'octet',
'int16': 'short',
'uint16': 'unsigned short',
'int32': 'long',
'uint32': 'unsigned long',
'int64': 'long long',
'uint64': 'unsigned long long',
}


# used by the template
def idl_typename(type_):
assert(isinstance(type_, BaseType))
if isinstance(type_, BasicType):
typename = type_.type
typename = EXPLICIT_TYPE_TO_IMPLICIT_TYPE.get(type_.type, type_.type)
elif isinstance(type_, BaseString):
if isinstance(type_, String):
typename = 'string'
Expand Down

0 comments on commit 18ae20f

Please sign in to comment.