diff options
author | px4dev <px4@purgatory.org> | 2012-08-04 15:12:36 -0700 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2012-08-04 15:12:36 -0700 |
commit | 8a365179eafdf3aea98e60ab9f5882b200d4c759 (patch) | |
tree | 4f38d6d4cd80bd0b6e22e2bb534c3f117ce44e56 /mavlink/share/pyshared/pymavlink/generator/mavgen.py | |
download | px4-firmware-8a365179eafdf3aea98e60ab9f5882b200d4c759.tar.gz px4-firmware-8a365179eafdf3aea98e60ab9f5882b200d4c759.tar.bz2 px4-firmware-8a365179eafdf3aea98e60ab9f5882b200d4c759.zip |
Fresh import of the PX4 firmware sources.
Diffstat (limited to 'mavlink/share/pyshared/pymavlink/generator/mavgen.py')
-rw-r--r-- | mavlink/share/pyshared/pymavlink/generator/mavgen.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/mavlink/share/pyshared/pymavlink/generator/mavgen.py b/mavlink/share/pyshared/pymavlink/generator/mavgen.py new file mode 100644 index 000000000..05f71f778 --- /dev/null +++ b/mavlink/share/pyshared/pymavlink/generator/mavgen.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +''' +parse a MAVLink protocol XML file and generate a python implementation + +Copyright Andrew Tridgell 2011 +Released under GNU GPL version 3 or later +''' + +def mavgen(opts, args) : + """Generate mavlink message formatters and parsers (C and Python ) using options + and args where args are a list of xml files. This function allows python + scripts under Windows to control mavgen using the same interface as + shell scripts under Unix""" + import sys, textwrap, os + + import mavparse + import mavgen_python + import mavgen_c + + xml = [] + + for fname in args: + print("Parsing %s" % fname) + xml.append(mavparse.MAVXML(fname, opts.wire_protocol)) + + # expand includes + for x in xml[:]: + for i in x.include: + fname = os.path.join(os.path.dirname(x.filename), i) + print("Parsing %s" % fname) + xml.append(mavparse.MAVXML(fname, opts.wire_protocol)) + + # include message lengths and CRCs too + for idx in range(0, 256): + if x.message_lengths[idx] == 0: + x.message_lengths[idx] = xml[-1].message_lengths[idx] + x.message_crcs[idx] = xml[-1].message_crcs[idx] + x.message_names[idx] = xml[-1].message_names[idx] + + # work out max payload size across all includes + largest_payload = 0 + for x in xml: + if x.largest_payload > largest_payload: + largest_payload = x.largest_payload + for x in xml: + x.largest_payload = largest_payload + + if mavparse.check_duplicates(xml): + sys.exit(1) + + print("Found %u MAVLink message types in %u XML files" % ( + mavparse.total_msgs(xml), len(xml))) + + if opts.language == 'python': + mavgen_python.generate(opts.output, xml) + elif opts.language == 'C': + mavgen_c.generate(opts.output, xml) + else: + print("Unsupported language %s" % opts.language) + + +if __name__=="__main__": + import sys, textwrap, os + + from optparse import OptionParser + + # allow import from the parent directory, where mavutil.py is + sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), '..')) + + import mavparse + import mavgen_python + import mavgen_c + + parser = OptionParser("%prog [options] <XML files>") + parser.add_option("-o", "--output", dest="output", default="mavlink", help="output directory.") + parser.add_option("--lang", dest="language", default="python", help="language of generated code: 'Python' or 'C' [default: %default]") + parser.add_option("--wire-protocol", dest="wire_protocol", default=mavparse.PROTOCOL_0_9, help="MAVLink protocol version: '0.9' or '1.0'. [default: %default]") + (opts, args) = parser.parse_args() + + if len(args) < 1: + parser.error("You must supply at least one MAVLink XML protocol definition") + mavgen(opts, args) |