@############################################### @# @# 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() }@ @################################################# @# 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(" " + str(get_idl_type_name(field.base_type)) + ' ' + field.name + '[' + str(field.array_len) + '];') else: print(" " + str(get_idl_type_name(field.type)) + ' ' + field.name + ';') def add_msg_fields(): # sort fields (using a stable sort) as in the declaration of the type sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True) for field in sorted_fields: add_msg_field(field) def add_msg_constants(): sorted_constants = sorted(spec.constants, key=sizeof_field_type, reverse=True) for constant in sorted_constants: constant_value = '%d' % constant.val print("const " + get_idl_type_name(constant.type) + " " + constant.name + " = " + constant_value + ";") }@ #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() @[for type in builtin_types]@ typedef @(type + '_') @(type); @[end for]@ struct @(spec.short_name)_ { @add_msg_fields() }; // struct @(spec.short_name)_ #pragma keylist @(spec.short_name)_ #endif // __@(spec.short_name)__idl__