mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-04 15:08:28 -04:00
9885cc7ed1
I've refactored the param_parse tool to use various 'emitters'. An emitter can take parameter info and output it in a particular format. Currently the only supported emitters are the wiki and XML formats. The goal of these changes is to create a standard machine readable description of parameters - mainly for use by ground control stations, but it will also enable spiffy scripting environments where code can refer symbolically to vehicle parameters (reflectionish). Open issue: Is there any sort of Ardupilot build id which can be included in the generated XML? That would ensure that we select the correct paramdefs for the load on the target (possibly by asking the target for a SHA or somesuch). If that issue is resolved, then the filename for the XML file should probably be something like: arduplane-ca5742ac.pdef.xml. It is worth noting that I've proposed a suffix of ".pdef.xml" for these file types. This facilitates automated file handling on Android devices. On Android you can register 'handlers' for particular file extensions and if the user tries to open that extension in email or a web browser your app will be given a chance to do something about it. The 'outer' xml extension will allow naive editors to know that at least this is an xml file. I will include a sample of the XML format with the pull-request for this CL.
71 lines
2.5 KiB
Python
71 lines
2.5 KiB
Python
#!/usr/bin/env python
|
|
|
|
from xml.sax.saxutils import escape, quoteattr
|
|
|
|
from param import *
|
|
from emit import Emit
|
|
|
|
# Emit APM documentation in an machine readable XML format
|
|
class XmlEmit(Emit):
|
|
|
|
def __init__(self):
|
|
wiki_fname = 'arduplane.pdef.xml'
|
|
self.f = open(wiki_fname, mode='w')
|
|
preamble = '''<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- Dynamically generated list of documented parameters (generated by param_parse.py) -->
|
|
<paramfile>
|
|
<vehicles>
|
|
'''
|
|
self.f.write(preamble)
|
|
|
|
def close(self):
|
|
self.f.write('</libraries>')
|
|
self.f.write('''</paramfile>\n''')
|
|
self.f.close
|
|
|
|
def emit_comment(self, s):
|
|
self.f.write("<!-- " + s + " -->")
|
|
|
|
def start_libraries(self):
|
|
self.f.write('</vehicles>')
|
|
self.f.write('<libraries>')
|
|
|
|
def emit(self, g, f):
|
|
t = '''<parameters name=%s>\n''' % quoteattr(g.name) # i.e. ArduPlane
|
|
|
|
for param in g.params:
|
|
# Begin our parameter node
|
|
if hasattr(param, 'DisplayName'):
|
|
t += '<param humanName=%s name=%s ' % (quoteattr(param.DisplayName),quoteattr(param.name)) # i.e. ArduPlane (ArduPlane:FOOPARM)
|
|
else:
|
|
t += '<param name=%s ' % quoteattr(param.name)
|
|
|
|
if hasattr(param, 'Description'):
|
|
t += 'documentation=%s' % quoteattr(param.Description) # i.w. parameter docs
|
|
|
|
t += ">\n"
|
|
|
|
# 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]):
|
|
t+= "<values>\n"
|
|
|
|
values = (param.__dict__[field]).split(',')
|
|
for value in values:
|
|
v = value.split(':')
|
|
t+='''<value code=%s>%s</value>\n''' % (quoteattr(v[0]), escape(v[1])) # i.e. numeric value, string label
|
|
|
|
t += "</values>\n"
|
|
else:
|
|
t += '''<field name=%s>%s</field>\n''' % (quoteattr(field), escape(param.__dict__[field])) # i.e. Range: 0 10
|
|
|
|
t += '''</param>\n'''
|
|
t += '''</parameters>\n'''
|
|
|
|
#print t
|
|
self.f.write(t)
|
|
|
|
|
|
|