mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 14:38:30 -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.
73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
#!/usr/bin/env python
|
|
|
|
import re
|
|
from param import *
|
|
from emit import Emit
|
|
|
|
# Emit docs in a form acceptable to the APM wiki site
|
|
class WikiEmit(Emit):
|
|
|
|
def __init__(self):
|
|
wiki_fname = 'Parameters.wiki'
|
|
self.f = open(wiki_fname, mode='w')
|
|
preamble = '''#summary Dynamically generated list of documented parameters
|
|
= Table of Contents =
|
|
<wiki:toc max_depth="4" />
|
|
|
|
= Vehicles =
|
|
'''
|
|
self.f.write(preamble)
|
|
|
|
def close(self):
|
|
self.f.close
|
|
|
|
def camelcase_escape(self, word):
|
|
if re.match(r"([A-Z][a-z]+[A-Z][a-z]*)", word.strip()):
|
|
return "!"+word
|
|
else:
|
|
return word
|
|
|
|
def wikichars_escape(self, text):
|
|
for c in "*,{,},[,],_,=,#,^,~,!,@,$,|,<,>,&,|,\,/".split(','):
|
|
text = re.sub("\\"+c, '`'+c+'`', text)
|
|
return text
|
|
|
|
def emit_comment(self, s):
|
|
self.f.write("\n\n=" + s + "=\n\n")
|
|
|
|
def start_libraries(self):
|
|
self.emit_comment("Libraries")
|
|
|
|
def emit(self, g, f):
|
|
|
|
t = "\n\n== %s Parameters ==\n" % (self.camelcase_escape(g.name))
|
|
|
|
for param in g.params:
|
|
if hasattr(param, 'DisplayName'):
|
|
t += "\n\n=== %s (%s) ===" % (self.camelcase_escape(param.DisplayName),self.camelcase_escape(param.name))
|
|
else:
|
|
t += "\n\n=== %s ===" % self.camelcase_escape(param.name)
|
|
|
|
if hasattr(param, 'Description'):
|
|
t += "\n\n_%s_\n" % self.wikichars_escape(param.Description)
|
|
else:
|
|
t += "\n\n_TODO: description_\n"
|
|
|
|
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(',')
|
|
t+="|| *Value* || *Meaning* ||\n"
|
|
for value in values:
|
|
v = value.split(':')
|
|
t+="|| "+v[0]+" || "+self.camelcase_escape(v[1])+" ||\n"
|
|
else:
|
|
t += " * %s: %s\n" % (self.camelcase_escape(field), self.wikichars_escape(param.__dict__[field]))
|
|
|
|
#print t
|
|
self.f.write(t)
|
|
|
|
|
|
|