Go to the documentation of this file.00001
00002 '''
00003 generate a MAVLink test suite
00004
00005 Copyright Andrew Tridgell 2011
00006 Released under GNU GPL version 3 or later
00007 '''
00008
00009 import sys, textwrap
00010 from argparse import ArgumentParser
00011
00012
00013 from . import mavparse
00014
00015 def gen_value(f, i, language):
00016 '''generate a test value for the ith field of a message'''
00017 type = f.type
00018
00019
00020 if type.find("[") != -1:
00021 aidx = type.find("[")
00022 basetype = type[0:aidx]
00023 if basetype == "array":
00024 basetype = "int8_t"
00025 if language == 'C':
00026 return '(const %s *)"%s%u"' % (basetype, f.name, i)
00027 return '"%s%u"' % (f.name, i)
00028
00029 if type == 'float':
00030 return 17.0 + i*7
00031 if type == 'char':
00032 return 'A' + i
00033 if type == 'int8_t':
00034 return 5 + i
00035 if type in ['int8_t', 'uint8_t']:
00036 return 5 + i
00037 if type in ['uint8_t_mavlink_version']:
00038 return 2
00039 if type in ['int16_t', 'uint16_t']:
00040 return 17235 + i*52
00041 if type in ['int32_t', 'uint32_t']:
00042 v = 963497464 + i*52
00043 if language == 'C':
00044 return "%sL" % v
00045 return v
00046 if type in ['int64_t', 'uint64_t']:
00047 v = 9223372036854775807 + i*63
00048 if language == 'C':
00049 return "%sLL" % v
00050 return v
00051
00052
00053
00054 def generate_methods_python(outf, msgs):
00055 outf.write("""
00056 '''
00057 MAVLink protocol test implementation (auto-generated by mavtestgen.py)
00058
00059 Generated from: %s
00060
00061 Note: this file has been auto-generated. DO NOT EDIT
00062 '''
00063
00064 import mavlink
00065
00066 def generate_outputs(mav):
00067 '''generate all message types as outputs'''
00068 """)
00069 for m in msgs:
00070 if m.name == "HEARTBEAT": continue
00071 outf.write("\tmav.%s_send(" % m.name.lower())
00072 for i in range(0, len(m.fields)):
00073 f = m.fields[i]
00074 outf.write("%s=%s" % (f.name, gen_value(f, i, 'py')))
00075 if i != len(m.fields)-1:
00076 outf.write(",")
00077 outf.write(")\n")
00078
00079
00080 def generate_methods_C(outf, msgs):
00081 outf.write("""
00082 /*
00083 MAVLink protocol test implementation (auto-generated by mavtestgen.py)
00084
00085 Generated from: %s
00086
00087 Note: this file has been auto-generated. DO NOT EDIT
00088 */
00089
00090 static void mavtest_generate_outputs(mavlink_channel_t chan)
00091 {
00092 """)
00093 for m in msgs:
00094 if m.name == "HEARTBEAT": continue
00095 outf.write("\tmavlink_msg_%s_send(chan," % m.name.lower())
00096 for i in range(0, len(m.fields)):
00097 f = m.fields[i]
00098 outf.write("%s" % gen_value(f, i, 'C'))
00099 if i != len(m.fields)-1:
00100 outf.write(",")
00101 outf.write(");\n")
00102 outf.write("}\n")
00103
00104
00105
00106
00107 '''main program'''
00108
00109 parser = ArgumentParser(description="This tool generate MAVLink test suite")
00110 parser.add_argument("-o", "--output", default="mavtest", help="output folder [default: %(default)s]")
00111 parser.add_argument("definitions", metavar="XML", nargs="+", help="MAVLink definitions")
00112 args = parser.parse_args()
00113
00114 msgs = []
00115 enums = []
00116
00117 for fname in args.definitions:
00118 (m, e) = mavparse.parse_mavlink_xml(fname)
00119 msgs.extend(m)
00120 enums.extend(e)
00121
00122
00123 if mavparse.check_duplicates(msgs):
00124 sys.exit(1)
00125
00126 print("Found %u MAVLink message types" % len(msgs))
00127
00128 print("Generating python %s" % (args.output+'.py'))
00129 outf = open(args.output + '.py', "w")
00130 generate_methods_python(outf, msgs)
00131 outf.close()
00132
00133 print("Generating C %s" % (args.output+'.h'))
00134 outf = open(args.output + '.h', "w")
00135 generate_methods_C(outf, msgs)
00136 outf.close()
00137
00138 print("Generated %s OK" % args.output)