|
|
|
#!/usr/bin/env python
|
|
|
|
"""
|
|
|
|
Param source code generation script.
|
|
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
import codecs
|
|
|
|
import argparse
|
|
|
|
from jinja2 import Environment, FileSystemLoader
|
|
|
|
import os
|
|
|
|
|
|
|
|
def generate(xml_file, dest='.', modules=None):
|
|
|
|
"""
|
|
|
|
Generate px4 param source from xml.
|
|
|
|
|
|
|
|
@param xml_file: input parameter xml file
|
|
|
|
@param dest: Destination directory for generated files
|
|
|
|
@param modules: The list of px4 modules to search for params.
|
|
|
|
None means to scan everything.
|
|
|
|
"""
|
|
|
|
# pylint: disable=broad-except
|
|
|
|
tree = ET.parse(xml_file)
|
|
|
|
root = tree.getroot()
|
|
|
|
|
|
|
|
params = []
|
|
|
|
for group in root:
|
|
|
|
if group.tag == "group" and "no_code_generation" not in group.attrib:
|
|
|
|
for param in group:
|
|
|
|
scope_ = param.find('scope').text
|
|
|
|
if (modules is not None) and (not scope_ in modules):
|
|
|
|
continue
|
|
|
|
params.append(param)
|
|
|
|
|
|
|
|
params = sorted(params, key=lambda name: name.attrib["name"])
|
|
|
|
|
|
|
|
script_path = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
|
|
|
|
# for jinja docs see: http://jinja.pocoo.org/docs/2.9/api/
|
|
|
|
env = Environment(
|
|
|
|
loader=FileSystemLoader(os.path.join(script_path, 'templates')))
|
|
|
|
|
|
|
|
if not os.path.isdir(dest):
|
|
|
|
os.path.mkdir(dest)
|
|
|
|
|
|
|
|
template_files = [
|
|
|
|
'px4_parameters.h.jinja',
|
|
|
|
'px4_parameters.c.jinja',
|
|
|
|
]
|
|
|
|
for template_file in template_files:
|
|
|
|
template = env.get_template(template_file)
|
|
|
|
with open(os.path.join(
|
|
|
|
dest, template_file.replace('.jinja','')), 'w') as fid:
|
|
|
|
fid.write(template.render(params=params))
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
arg_parser = argparse.ArgumentParser()
|
|
|
|
arg_parser.add_argument("--xml", help="parameter xml file")
|
|
|
|
arg_parser.add_argument("--modules", help="px4 module list", default=None)
|
|
|
|
arg_parser.add_argument("--dest", help="destination path", default=os.path.curdir)
|
|
|
|
args = arg_parser.parse_args()
|
|
|
|
generate(xml_file=args.xml, modules=args.modules, dest=args.dest)
|
|
|
|
|
|
|
|
# vim: set et fenc=utf-8 ff=unix sts=4 sw=4 ts=4 :
|