Files
paparazzi/sw/lib/python/settings_xml_parse.py
T

100 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python
import os
import sys
from lxml import etree
# Class for all settings
class PaparazziACSettings:
"Paparazzi Settings Class"
ac_id = 0
groups = []
lookup = []
name_lookup = {}
# Takes a string file path for settings XML file and
# returns a settings AC object
def __init__(self, ac_id):
self.ac_id = ac_id
paparazzi_home = os.getenv("PAPARAZZI_HOME")
conf_xml_path = "%s/conf/conf.xml" % paparazzi_home
conf_tree = etree.parse(conf_xml_path)
# extract aircraft node from conf.xml file
ac_node = conf_tree.xpath('/conf/aircraft[@ac_id=%i]' % ac_id)
if (len(ac_node) != 1):
print "Aircraft ID %i not found." % ac_id
# get settings file path from aircraft xml node
settings_xml_path = "%s/conf/%s" % (paparazzi_home, ac_node[0].attrib['settings'])
# save AC name for reference
self.name = ac_node[0].attrib['name']
tree = etree.parse(settings_xml_path)
index = 0 # keep track of index/id of setting starting at 0
for the_tab in tree.xpath("//dl_settings[@NAME]"):
setting_group = PaparazziSettingsGroup(the_tab.attrib['NAME'])
for the_setting in the_tab.xpath('dl_setting[@VAR]'):
if the_setting.attrib.has_key('shortname'):
name = the_setting.attrib['shortname']
else:
name = the_setting.attrib['VAR']
settings = PaparazziSetting(name)
settings.index = index
settings.min_value = float(the_setting.attrib['MIN'])
settings.max_value = float(the_setting.attrib['MAX'])
settings.step = float(the_setting.attrib['STEP'])
if (the_setting.attrib.has_key('values')):
settings.values = the_setting.attrib['values'].split('|')
count = int((settings.max_value - settings.min_value + settings.step) / settings.step)
if (len(settings.values) != count):
print "Warning: wrong number of values (%i) for %s (expected %i)" % (len(settings.values), name, count)
setting_group.member_list.append(settings)
self.lookup.append(settings)
self.name_lookup[name] = settings
index = index + 1
self.groups.append(setting_group)
def GetACName(self):
return self.name
# Class for named group of settings
class PaparazziSettingsGroup:
"Paparazzi Setting Group Class"
name = 0
member_list = []
def __init__(self, name):
self.name = name
self.member_list = []
# Class for a single paparazzi setting
class PaparazziSetting:
"Paparazzi Setting Class"
shortname = ""
min_value = 0
max_value = 1
step = 1
index = 0
value = None
values = None
def __init__(self, shortname):
self.shortname = shortname
def test():
ac_id = 11
ac_settings = PaparazziACSettings(ac_id)
for setting_group in ac_settings.groups:
print setting_group.name
for setting in setting_group.member_list:
print " " + setting.shortname
if __name__ == '__main__':
test()