@############################################### @# @# ROS message to IDL converter @# @# EmPy template for generating .idl files @# @################################################################################ @# @# Copyright 2017 Proyectos y Sistemas de Mantenimiento SL (eProsima). @# @# Redistribution and use in source and binary forms, with or without @# modification, are permitted provided that the following conditions are met: @# @# 1. Redistributions of source code must retain the above copyright notice, this @# list of conditions and the following disclaimer. @# @# 2. Redistributions in binary form must reproduce the above copyright notice, @# this list of conditions and the following disclaimer in the documentation @# and/or other materials provided with the distribution. @# @# 3. Neither the name of the copyright holder nor the names of its contributors @# may be used to endorse or promote products derived from this software without @# specific prior written permission. @# @# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" @# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE @# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR @# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF @# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS @# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN @# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) @# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE @# POSSIBILITY OF SUCH DAMAGE. @# @################################################################################ @{ import genmsg.msgs import gencpp from px_generate_uorb_topic_helper import * # this is in Tools/ builtin_types = set() array_types = set() }@ @################################################# @# Searching for serialize function per each field @################################################# @{ def get_include_directives(spec): include_directives = set() for field in (spec.parsed_fields()): if genmsg.msgs.is_valid_constant_type(genmsg.msgs.bare_msg_type(field.type)): continue builtin_type = str(field.base_type).replace('px4/', '') include_directive = '#include "%s_.idl"' % builtin_type builtin_types.add(builtin_type) include_directives.add(include_directive) return sorted(include_directives) def get_idl_type_name(field_type): if field_type in type_idl_map: return type_idl_map[field_type] else: (package, name) = genmsg.names.package_resource_name(field_type) return name def add_msg_field(field): if (not field.is_header): if field.is_array: print(' {0}__{1}_array_{2} {3}_;'.format(spec.short_name, str(get_idl_type_name(field.base_type)).replace(" ", "_"), str(field.array_len), field.name)) else: base_type = get_idl_type_name(field.base_type) + "_" if get_idl_type_name(field.base_type) in builtin_types else get_idl_type_name(field.base_type) print(' {0} {1}_;'.format(base_type, field.name)) def add_msg_fields(): for field in spec.parsed_fields(): add_msg_field(field) def add_array_typedefs(): for field in spec.parsed_fields(): if not field.is_header and field.is_array: base_type = get_idl_type_name(field.base_type) + "_" if get_idl_type_name(field.base_type) in builtin_types else get_idl_type_name(field.base_type) array_type = 'typedef {0} {1}__{2}_array_{3}[{4}];'.format(base_type, spec.short_name, get_idl_type_name(field.base_type).replace(" ", "_"), field.array_len, field.array_len) if array_type not in array_types: array_types.add(array_type) for atype in array_types: print(atype) def add_msg_constants(): sorted_constants = sorted(spec.constants, key=sizeof_field_type, reverse=True) for constant in sorted_constants: print('const {0} {1}__{2} = {3};'.format(get_idl_type_name(constant.type), spec.short_name, constant.name, constant.val)) } #ifndef __@(spec.short_name)__idl__ #define __@(spec.short_name)__idl__ @############################# @# Include dependency messages @############################# @[for line in get_include_directives(spec)] @(line) @[end for] @# Constants @add_msg_constants() @# Array types @add_array_typedefs() struct @(spec.short_name)_ { @add_msg_fields() }; // struct @(spec.short_name)_ #pragma keylist @(spec.short_name)_ #endif // __@(spec.short_name)__idl__