Tools: Add json param metadata parser
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
This commit is contained in:
parent
a8501a91c7
commit
1a14085a6d
103
Tools/autotest/param_metadata/jsonemit.py
Normal file
103
Tools/autotest/param_metadata/jsonemit.py
Normal file
@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import json
|
||||
import copy
|
||||
from emit import Emit
|
||||
|
||||
|
||||
# Emit APM documentation in JSON format
|
||||
class JSONEmit(Emit):
|
||||
def __init__(self):
|
||||
Emit.__init__(self)
|
||||
json_fname = 'apm.pdef.json'
|
||||
self.f = open(json_fname, mode='w')
|
||||
self.content = {"json": {"version": 0}}
|
||||
self.name = ''
|
||||
|
||||
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)
|
||||
|
||||
# Get vehicle name
|
||||
if 'truename' in g.__dict__:
|
||||
self.name = g.__dict__['truename']
|
||||
self.content[self.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 real_path key
|
||||
if 'real_path' in param.__dict__:
|
||||
param.__dict__.pop('real_path')
|
||||
|
||||
# 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[self.name][key] = content[key]
|
Loading…
Reference in New Issue
Block a user