aboutsummaryrefslogtreecommitdiff
path: root/mavlink/share/pyshared/pymavlink/generator/mavtestgen.py
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2012-08-04 15:12:36 -0700
committerpx4dev <px4@purgatory.org>2012-08-04 15:12:36 -0700
commit8a365179eafdf3aea98e60ab9f5882b200d4c759 (patch)
tree4f38d6d4cd80bd0b6e22e2bb534c3f117ce44e56 /mavlink/share/pyshared/pymavlink/generator/mavtestgen.py
downloadpx4-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/mavtestgen.py')
-rw-r--r--mavlink/share/pyshared/pymavlink/generator/mavtestgen.py142
1 files changed, 142 insertions, 0 deletions
diff --git a/mavlink/share/pyshared/pymavlink/generator/mavtestgen.py b/mavlink/share/pyshared/pymavlink/generator/mavtestgen.py
new file mode 100644
index 000000000..faffa1c19
--- /dev/null
+++ b/mavlink/share/pyshared/pymavlink/generator/mavtestgen.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python
+'''
+generate a MAVLink test suite
+
+Copyright Andrew Tridgell 2011
+Released under GNU GPL version 3 or later
+'''
+
+import sys, textwrap
+from optparse import OptionParser
+
+# mavparse is up a directory level
+sys.path.append('..')
+import mavparse
+
+def gen_value(f, i, language):
+ '''generate a test value for the ith field of a message'''
+ type = f.type
+
+ # could be an array
+ if type.find("[") != -1:
+ aidx = type.find("[")
+ basetype = type[0:aidx]
+ if basetype == "array":
+ basetype = "int8_t"
+ if language == 'C':
+ return '(const %s *)"%s%u"' % (basetype, f.name, i)
+ return '"%s%u"' % (f.name, i)
+
+ if type == 'float':
+ return 17.0 + i*7
+ if type == 'char':
+ return 'A' + i
+ if type == 'int8_t':
+ return 5 + i
+ if type in ['int8_t', 'uint8_t']:
+ return 5 + i
+ if type in ['uint8_t_mavlink_version']:
+ return 2
+ if type in ['int16_t', 'uint16_t']:
+ return 17235 + i*52
+ if type in ['int32_t', 'uint32_t']:
+ v = 963497464 + i*52
+ if language == 'C':
+ return "%sL" % v
+ return v
+ if type in ['int64_t', 'uint64_t']:
+ v = 9223372036854775807 + i*63
+ if language == 'C':
+ return "%sLL" % v
+ return v
+
+
+
+def generate_methods_python(outf, msgs):
+ outf.write("""
+'''
+MAVLink protocol test implementation (auto-generated by mavtestgen.py)
+
+Generated from: %s
+
+Note: this file has been auto-generated. DO NOT EDIT
+'''
+
+import mavlink
+
+def generate_outputs(mav):
+ '''generate all message types as outputs'''
+""")
+ for m in msgs:
+ if m.name == "HEARTBEAT": continue
+ outf.write("\tmav.%s_send(" % m.name.lower())
+ for i in range(0, len(m.fields)):
+ f = m.fields[i]
+ outf.write("%s=%s" % (f.name, gen_value(f, i, 'py')))
+ if i != len(m.fields)-1:
+ outf.write(",")
+ outf.write(")\n")
+
+
+def generate_methods_C(outf, msgs):
+ outf.write("""
+/*
+MAVLink protocol test implementation (auto-generated by mavtestgen.py)
+
+Generated from: %s
+
+Note: this file has been auto-generated. DO NOT EDIT
+*/
+
+static void mavtest_generate_outputs(mavlink_channel_t chan)
+{
+""")
+ for m in msgs:
+ if m.name == "HEARTBEAT": continue
+ outf.write("\tmavlink_msg_%s_send(chan," % m.name.lower())
+ for i in range(0, len(m.fields)):
+ f = m.fields[i]
+ outf.write("%s" % gen_value(f, i, 'C'))
+ if i != len(m.fields)-1:
+ outf.write(",")
+ outf.write(");\n")
+ outf.write("}\n")
+
+
+
+######################################################################
+'''main program'''
+
+parser = OptionParser("%prog [options] <XML files>")
+parser.add_option("-o", "--output", dest="output", default="mavtest", help="output folder [default: %default]")
+(opts, args) = parser.parse_args()
+
+if len(args) < 1:
+ parser.error("You must supply at least one MAVLink XML protocol definition")
+
+
+msgs = []
+enums = []
+
+for fname in args:
+ (m, e) = mavparse.parse_mavlink_xml(fname)
+ msgs.extend(m)
+ enums.extend(e)
+
+
+if mavparse.check_duplicates(msgs):
+ sys.exit(1)
+
+print("Found %u MAVLink message types" % len(msgs))
+
+print("Generating python %s" % (opts.output+'.py'))
+outf = open(opts.output + '.py', "w")
+generate_methods_python(outf, msgs)
+outf.close()
+
+print("Generating C %s" % (opts.output+'.h'))
+outf = open(opts.output + '.h', "w")
+generate_methods_C(outf, msgs)
+outf.close()
+
+print("Generated %s OK" % opts.output)