mirror of https://github.com/ArduPilot/ardupilot
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
import json
|
|
import copy
|
|
from emit import Emit
|
|
|
|
|
|
# Emit ArduPilot documentation in JSON format
|
|
class JSONEmit(Emit):
|
|
def __init__(self, *args, **kwargs):
|
|
Emit.__init__(self, *args, **kwargs)
|
|
json_fname = 'apm.pdef.json'
|
|
self.f = open(json_fname, mode='w')
|
|
self.content = {"json": {"version": 0}}
|
|
|
|
def close(self):
|
|
json.dump(self.content, self.f, indent=2, sort_keys=True)
|
|
self.f.close()
|
|
|
|
def jsonFromKeyList(self, main_key, dictionary):
|
|
json_object = {}
|
|
if main_key in dictionary:
|
|
values = dictionary[main_key]
|
|
for value in values.split(','):
|
|
key, description = value.split(":")
|
|
json_object[key.strip()] = description.strip()
|
|
return json_object
|
|
|
|
def emit(self, g):
|
|
content = {}
|
|
|
|
# Copy content to avoid any modification
|
|
g = copy.deepcopy(g)
|
|
|
|
self.content[g.name] = {}
|
|
|
|
# Check all params available
|
|
for param in g.params:
|
|
param_json = {}
|
|
|
|
# Get display name
|
|
if hasattr(param, 'DisplayName'):
|
|
# i.e. ArduPlane (ArduPlane:FOOPARM)
|
|
param_json['displayName'] = param.DisplayName
|
|
|
|
# Get description
|
|
if hasattr(param, 'Description'):
|
|
param_json['description'] = param.Description
|
|
|
|
# Get user type
|
|
if hasattr(param, 'User'):
|
|
# i.e. Standard or Advanced
|
|
param_json['user'] = param.User
|
|
|
|
# Get param name and and remove key
|
|
name = param.__dict__.pop('name')
|
|
if ':' in name:
|
|
name = name.split(':')[1]
|
|
|
|
# Remove various unwanted keys
|
|
for key in list(param.__dict__.keys()):
|
|
if not self.should_emit_field(param, key):
|
|
param.__dict__.pop(key)
|
|
for key in 'real_path', 'SortValues', '__field_text':
|
|
try:
|
|
param.__dict__.pop(key)
|
|
except KeyError:
|
|
pass
|
|
|
|
# Remove __field_text key
|
|
if '__field_text' in param.__dict__:
|
|
param.__dict__.pop('__field_text')
|
|
|
|
# Get range section if available
|
|
range_json = {}
|
|
if 'Range' in param.__dict__:
|
|
range = param.__dict__['Range'].split(' ')
|
|
range_json['low'] = range[0]
|
|
range_json['high'] = range[1]
|
|
param.__dict__.pop('Range')
|
|
|
|
# Get bitmask section if available
|
|
bitmask_json = self.jsonFromKeyList('Bitmask', param.__dict__)
|
|
if(bitmask_json):
|
|
param.__dict__.pop('Bitmask')
|
|
|
|
# get value section if availables
|
|
values_json = self.jsonFromKeyList('Values', param.__dict__)
|
|
if(values_json):
|
|
param.__dict__.pop('Values')
|
|
|
|
# Set actual content
|
|
content[name] = param.__dict__
|
|
|
|
# Set range if available
|
|
if(range_json):
|
|
content[name]['Range'] = range_json
|
|
|
|
# Set bitmask if available
|
|
if(bitmask_json):
|
|
content[name]['Bitmask'] = bitmask_json
|
|
|
|
# Set values if available
|
|
if(values_json):
|
|
content[name]['Values'] = values_json
|
|
|
|
# Update main content with actual content
|
|
for key in content:
|
|
self.content[g.name][key] = content[key]
|