You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
3.8 KiB
80 lines
3.8 KiB
#!/usr/bin/env python |
|
|
|
from lxml import etree |
|
|
|
from emit import Emit |
|
from param import known_param_fields, known_units |
|
|
|
# Emit APM documentation in an machine readable XML format |
|
class XmlEmit(Emit): |
|
def __init__(self): |
|
Emit.__init__(self) |
|
self.wiki_fname = 'apm.pdef.xml' |
|
self.f = open(self.wiki_fname, mode='w') |
|
self.preamble = '''<?xml version="1.0" encoding="utf-8"?> |
|
<!-- Dynamically generated list of documented parameters (generated by param_parse.py) --> |
|
''' |
|
self.f.write(self.preamble) |
|
self.paramfile = etree.Element('paramfile') |
|
self.vehicles = etree.SubElement(self.paramfile, 'vehicles') |
|
self.libraries = etree.SubElement(self.paramfile, 'libraries') |
|
self.current_element = self.vehicles |
|
|
|
def close(self): |
|
etree.indent(self.paramfile) |
|
pretty_xml = etree.tostring(self.paramfile, pretty_print=True, encoding='unicode') |
|
self.f.write(pretty_xml) |
|
self.f.close() |
|
|
|
def emit_comment(self, s): |
|
self.f.write("<!-- " + s + " -->") |
|
|
|
def start_libraries(self): |
|
self.current_element = self.libraries |
|
|
|
def emit(self, g): |
|
xml_parameters = etree.SubElement(self.current_element, 'parameters', name=g.name) # i.e. ArduPlane |
|
|
|
for param in g.params: |
|
# Begin our parameter node |
|
if hasattr(param, 'DisplayName'): |
|
xml_param = etree.SubElement(xml_parameters, 'param', humanName=param.DisplayName, name=param.name) # i.e. ArduPlane (ArduPlane:FOOPARM) |
|
else: |
|
xml_param = etree.SubElement(xml_parameters, 'param', name=param.name) |
|
|
|
if hasattr(param, 'Description'): |
|
xml_param.set('documentation', param.Description) # i.e. parameter docs |
|
if hasattr(param, 'User'): |
|
xml_param.set('user', param.User) # i.e. Standard or Advanced |
|
|
|
if hasattr(param, 'Calibration'): |
|
xml_param.set('calibration', param.Calibration) |
|
|
|
# Add values as chidren of this node |
|
for field in param.__dict__.keys(): |
|
if field not in ['name', 'DisplayName', 'Description', 'User'] and field in known_param_fields: |
|
if field == 'Values' and Emit.prog_values_field.match(param.__dict__[field]): |
|
xml_values = etree.SubElement(xml_param, 'values') |
|
values = (param.__dict__[field]).split(',') |
|
for value in values: |
|
v = value.split(':') |
|
if len(v) != 2: |
|
raise ValueError("Bad value (%s)" % v) |
|
# i.e. numeric value, string label |
|
xml_value = etree.SubElement(xml_values, 'value', code=v[0]) |
|
xml_value.text = v[1] |
|
|
|
elif field == 'Units': |
|
abreviated_units = param.__dict__[field] |
|
if abreviated_units != '': |
|
units = known_units[abreviated_units] # use the known_units dictionary to convert the abreviated unit into a full textual one |
|
xml_field1 = etree.SubElement(xml_param, 'field', name=field) # i.e. A/s |
|
xml_field1.text = abreviated_units |
|
xml_field2 = etree.SubElement(xml_param, 'field', name='UnitText') # i.e. ampere per second |
|
xml_field2.text = units |
|
else: |
|
xml_field = etree.SubElement(xml_param, 'field', name=field) |
|
xml_field.text = param.__dict__[field] |
|
|
|
if xml_param.text is None and not len(xml_param): |
|
xml_param.text = '\n' # add </param> on next line in case of empty element.
|
|
|