diff --git a/sw/ground_segment/python/messages_app/messagesframe.py b/sw/ground_segment/python/messages_app/messagesframe.py index a0cff926aa..7b3308ff62 100644 --- a/sw/ground_segment/python/messages_app/messagesframe.py +++ b/sw/ground_segment/python/messages_app/messagesframe.py @@ -18,120 +18,120 @@ HEIGHT = 800 BORDER = 1 class MessagesFrame(wx.Frame): - def message_recv(self, ac_id, name, values): - if self.aircrafts.has_key(ac_id): - if self.aircrafts[ac_id].messages.has_key(name): - if time.time() - self.aircrafts[ac_id].messages[name].last_seen < 0.2: - return + def message_recv(self, ac_id, name, values): + if self.aircrafts.has_key(ac_id) and self.aircrafts[ac_id].messages.has_key(name): + if time.time() - self.aircrafts[ac_id].messages[name].last_seen < 0.2: + return - wx.CallAfter(self.gui_update, ac_id, name, values) + wx.CallAfter(self.gui_update, ac_id, name, values) - def find_page(self, book, name): - if book.GetPageCount() < 1: - return 0 - start = 0 - end = book.GetPageCount() + def find_page(self, book, name): + if book.GetPageCount() < 1: + return 0 + start = 0 + end = book.GetPageCount() + + while (start < end): + if book.GetPageText(start) > name: + return start + start = start + 1 - while (start < end): - if book.GetPageText(start) > name: return start - start = start + 1 - return start + def update_leds(self): + wx.CallAfter(self.update_leds_real) - def update_leds(self): - wx.CallAfter(self.update_leds_real) + def update_leds_real(self): + for ac_id in self.aircrafts: + aircraft = self.aircrafts[ac_id] + for msg_str in aircraft.messages: + message = aircraft.messages[msg_str] + if message.last_seen + 0.2 < time.time(): + aircraft.messages_book.SetPageImage(message.index, 0) - def update_leds_real(self): - for ac_id in self.aircrafts: - aircraft = self.aircrafts[ac_id] - for msg_str in aircraft.messages: - message = aircraft.messages[msg_str] - if message.last_seen + 0.2 < time.time(): - aircraft.messages_book.SetPageImage(message.index, 0) + self.timer = threading.Timer(0.1, self.update_leds) + self.timer.start() - self.timer = threading.Timer(0.1, self.update_leds) - self.timer.start() + def setup_image_list(self, notebook): + imageList = wx.ImageList(24,24) - def setup_image_list(self, notebook): - imageList = wx.ImageList(24,24) + image = wx.Image(PPRZ_HOME + "/data/pictures/gray_led24.png") + bitmap = wx.BitmapFromImage(image) + imageList.Add(bitmap) - image = wx.Image(PPRZ_HOME + "/data/pictures/gray_led24.png") - bitmap = wx.BitmapFromImage(image) - imageList.Add(bitmap) + image = wx.Image(PPRZ_HOME + "/data/pictures/green_led24.png") + bitmap = wx.BitmapFromImage(image) + imageList.Add(bitmap) - image = wx.Image(PPRZ_HOME + "/data/pictures/green_led24.png") - bitmap = wx.BitmapFromImage(image) - imageList.Add(bitmap) + notebook.AssignImageList(imageList) - notebook.AssignImageList(imageList) + def add_new_aircraft(self, ac_id): + self.aircrafts[ac_id] = messages_tool.Aircraft(ac_id) + ac_panel = wx.Panel(self.notebook, -1) + self.notebook.AddPage(ac_panel, str(ac_id)) + messages_book = wx.Notebook(ac_panel, style=wx.NB_LEFT) + self.setup_image_list(messages_book) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(messages_book, 1, wx.EXPAND) + ac_panel.SetSizer(sizer) + sizer.Layout() + self.aircrafts[ac_id].messages_book = messages_book - def add_new_aircraft(self, ac_id): - self.aircrafts[ac_id] = messages_tool.Aircraft(ac_id) - ac_panel = wx.Panel(self.notebook, -1) - self.notebook.AddPage(ac_panel, str(ac_id)) - messages_book = wx.Notebook(ac_panel, style=wx.NB_LEFT) - self.setup_image_list(messages_book) - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(messages_book, 1, wx.EXPAND) - ac_panel.SetSizer(sizer) - sizer.Layout() - self.aircrafts[ac_id].messages_book = messages_book + def add_new_message(self, aircraft, name): + messages_book = aircraft.messages_book + aircraft.messages[name] = messages_tool.Message("telemetry", name) + field_panel = wx.Panel(messages_book) + grid_sizer = wx.FlexGridSizer(len(aircraft.messages[name].field_names), 2) - def add_new_message(self, aircraft, name): - messages_book = aircraft.messages_book - aircraft.messages[name] = messages_tool.Message("telemetry", name) - field_panel = wx.Panel(messages_book) - grid_sizer = wx.FlexGridSizer(len(aircraft.messages[name].field_names), 2) + index = self.find_page(messages_book, name) + messages_book.InsertPage(index, field_panel, name, imageId = 1) + aircraft.messages[name].index = index - index = self.find_page(messages_book, name) - messages_book.InsertPage(index, field_panel, name, imageId = 1) - aircraft.messages[name].index = index + # update indexes of pages which are to be moved + for message_name in aircraft.messages: + aircraft.messages[message_name].index = self.find_page(messages_book, message_name) - # update indexes of pages which are to be moved - for message_name in aircraft.messages: - aircraft.messages[message_name].index = self.find_page(messages_book, message_name) + for field_name in aircraft.messages[name].field_names: + name_text = wx.StaticText(field_panel, -1, field_name) + size = name_text.GetSize() + size.x = LABEL_WIDTH + name_text.SetMinSize(size) + grid_sizer.Add(name_text, 1, wx.ALL, BORDER) + value_control = wx.StaticText(field_panel, -1, "42", style=wx.ST_NO_AUTORESIZE) + size = value_control.GetSize() + size.x = LABEL_WIDTH + value_control.SetMinSize(size) + grid_sizer.Add(value_control, 1, wx.ALL, BORDER) + aircraft.messages[name].field_controls.append(value_control) - for field_name in aircraft.messages[name].field_names: - name_text = wx.StaticText(field_panel, -1, field_name) - size = name_text.GetSize() - size.x = LABEL_WIDTH - name_text.SetMinSize(size) - grid_sizer.Add(name_text, 1, wx.ALL, BORDER) - value_control = wx.StaticText(field_panel, -1, "42", style=wx.ST_NO_AUTORESIZE) - size = value_control.GetSize() - size.x = LABEL_WIDTH - value_control.SetMinSize(size) - grid_sizer.Add(value_control, 1, wx.ALL, BORDER) - aircraft.messages[name].field_controls.append(value_control) - field_panel.SetAutoLayout(True) - field_panel.SetSizer(grid_sizer) - field_panel.Layout() + field_panel.SetAutoLayout(True) + field_panel.SetSizer(grid_sizer) + field_panel.Layout() - def gui_update(self, ac_id, name, values): - if not self.aircrafts.has_key(ac_id): - self.add_new_aircraft(ac_id) + def gui_update(self, ac_id, name, values): + if not self.aircrafts.has_key(ac_id): + self.add_new_aircraft(ac_id) - aircraft = self.aircrafts[ac_id] + aircraft = self.aircrafts[ac_id] - if not aircraft.messages.has_key(name): - self.add_new_message(aircraft, name) + if not aircraft.messages.has_key(name): + self.add_new_message(aircraft, name) - aircraft.messages_book.SetPageImage(aircraft.messages[name].index, 1) - self.aircrafts[ac_id].messages[name].last_seen = time.time() + aircraft.messages_book.SetPageImage(aircraft.messages[name].index, 1) + self.aircrafts[ac_id].messages[name].last_seen = time.time() - for index in range(0, len(values)): - aircraft.messages[name].field_controls[index].SetLabel(values[index]) + for index in range(0, len(values)): + aircraft.messages[name].field_controls[index].SetLabel(values[index]) - def __init__(self): - wx.Frame.__init__(self, id=-1, parent=None, name=u'MessagesFrame', size=wx.Size(WIDTH, HEIGHT), style=wx.DEFAULT_FRAME_STYLE, title=u'Messages') - self.notebook = wx.Notebook(self) - self.aircrafts = {} + def __init__(self): + wx.Frame.__init__(self, id=-1, parent=None, name=u'MessagesFrame', size=wx.Size(WIDTH, HEIGHT), style=wx.DEFAULT_FRAME_STYLE, title=u'Messages') + self.notebook = wx.Notebook(self) + self.aircrafts = {} - sizer = wx.BoxSizer(wx.HORIZONTAL) - sizer.Add(self.notebook, 1, wx.EXPAND) - self.SetSizer(sizer) - sizer.Layout() - self.timer = threading.Timer(0.1, self.update_leds) - self.timer.start() - self.interface = messages_tool.IvyMessagesInterface(self.message_recv) + sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer.Add(self.notebook, 1, wx.EXPAND) + self.SetSizer(sizer) + sizer.Layout() + self.timer = threading.Timer(0.1, self.update_leds) + self.timer.start() + self.interface = messages_tool.IvyMessagesInterface(self.message_recv) diff --git a/sw/lib/python/messages_tool.py b/sw/lib/python/messages_tool.py index e0fa2ed85e..313909c3f1 100644 --- a/sw/lib/python/messages_tool.py +++ b/sw/lib/python/messages_tool.py @@ -1,3 +1,5 @@ +from __future__ import print_function + import messages_xml_map from ivy.std_api import * import logging @@ -5,59 +7,59 @@ import time import os class Message: - def __init__(self, class_name, name): - messages_xml_map.ParseMessages() - self.field_value = [] - self.field_names = messages_xml_map.message_dictionary[class_name][name] - self.field_controls = [] - self.index = None - self.last_seen = time.clock() - self.name = name + def __init__(self, class_name, name): + messages_xml_map.ParseMessages() + self.field_value = [] + self.field_names = messages_xml_map.message_dictionary[class_name][name] + self.field_controls = [] + self.index = None + self.last_seen = time.clock() + self.name = name class Aircraft: - def __init__(self, id): - self.ac_id = id - self.messages = {} - self.messages_book = None + def __init__(self, id): + self.ac_id = id + self.messages = {} + self.messages_book = None class IvyMessagesInterface(): - def __init__(self, callback, initIvy = True): - self.callback = callback - self.ivy_id = 0 - self.InitIvy(initIvy) + def __init__(self, callback, initIvy = True): + self.callback = callback + self.ivy_id = 0 + self.InitIvy(initIvy) - def Stop(self): - IvyUnBindMsg(self.ivy_id) + def Stop(self): + IvyUnBindMsg(self.ivy_id) - def __del__(self): - try: - IvyUnBindMsg(self.ivy_id) - except: - pass + def __init__del__(self): + try: + IvyUnBindMsg(self.ivy_id) + except: + pass - def InitIvy(self, initIvy): - if initIvy: - IvyInit("Messages %i" % os.getpid(), "READY", 0, lambda x,y: y, lambda x,y: y) - logging.getLogger('Ivy').setLevel(logging.WARN) - IvyStart("") - self.ivy_id = IvyBindMsg(self.OnIvyMsg, "(.*)") + def InitIvy(self, initIvy): + if initIvy: + IvyInit("Messages %i" % os.getpid(), "READY", 0, lambda x,y: y, lambda x,y: y) + logging.getLogger('Ivy').setLevel(logging.WARN) + IvyStart("") + self.ivy_id = IvyBindMsg(self.OnIvyMsg, "(.*)") - def OnIvyMsg(self, agent, *larg): - data = larg[0].split(' ') - try: - ac_id = int(data[0]) - name = data[1] - values = data[2:] - self.callback(ac_id, name, values) - except ValueError: - pass - except: - raise + def OnIvyMsg(self, agent, *larg): + data = larg[0].split(' ') + try: + ac_id = int(data[0]) + name = data[1] + values = data[2:] + self.callback(ac_id, name, values) + except ValueError: + pass + except: + raise def test(): - message = Message("WHIRLY") - print message - print message.field_names - + message = Message("WHIRLY") + print(message) + print(message.field_names) + if __name__ == '__main__': - test() + test() diff --git a/sw/lib/python/messages_xml_map.py b/sw/lib/python/messages_xml_map.py index b07975823d..91c4c4f90b 100755 --- a/sw/lib/python/messages_xml_map.py +++ b/sw/lib/python/messages_xml_map.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +from __future__ import print_function + import os import sys import getopt @@ -12,67 +14,65 @@ message_dictionary_id_name = {} message_dictionary_name_id = {} def Usage(scmd): - lpathitem = scmd.split('/') - fmt = '''Usage: %s [-h | --help] [-f FILE | --file=FILE] + lpathitem = scmd.split('/') + fmt = '''Usage: %s [-h | --help] [-f FILE | --file=FILE] where \t-h | --help print this message -\t-f FILE | --file=FILE where FILE is path to messages.xml +\t-f FILE | --file=FILE where FILE is path to messages.xml ''' - print fmt % lpathitem[-1] + print(fmt % lpathitem[-1]) def GetOptions(): - try: - optlist, left_args = getopt.getopt(sys.argv[1:],'hf:', ['help','file=']) - except getopt.GetoptError: - # print help information and exit: - Usage(sys.argv[0]) - sys.exit(2) - for o, a in optlist: - if o in ("-h", "--help"): - Usage(sys.argv[0]) - sys.exit() - elif o in ("-f", "--file"): - messages_path = a + try: + optlist, left_args = getopt.getopt(sys.argv[1:],'hf:', ['help','file=']) + except getopt.GetoptError: + # print help information and exit: + Usage(sys.argv[0]) + sys.exit(2) + for o, a in optlist: + if o in ("-h", "--help"): + Usage(sys.argv[0]) + sys.exit() + elif o in ("-f", "--file"): + messages_path = a def ParseMessages(): - from lxml import etree - tree = etree.parse( messages_path) - for the_class in tree.xpath("//class[@name]"): - class_name = the_class.attrib['name'] - if not message_dictionary.has_key(class_name): - message_dictionary_id_name[class_name] = {} - message_dictionary_name_id[class_name] = {} - message_dictionary[class_name] = {} - message_dictionary_types[class_name] = {} - for the_message in the_class.xpath("message[@name]"): - message_name = the_message.attrib['name'] - if the_message.attrib.has_key('id'): - message_id = the_message.attrib['id'] - else: - message_id = the_message.attrib['ID'] - if (message_id[0:2] == "0x"): - message_id = int(message_id, 16) - else: - message_id = int(message_id) + from lxml import etree + tree = etree.parse( messages_path) + for the_class in tree.xpath("//class[@name]"): + class_name = the_class.attrib['name'] + if not message_dictionary.has_key(class_name): + message_dictionary_id_name[class_name] = {} + message_dictionary_name_id[class_name] = {} + message_dictionary[class_name] = {} + message_dictionary_types[class_name] = {} + for the_message in the_class.xpath("message[@name]"): + message_name = the_message.attrib['name'] + if the_message.attrib.has_key('id'): + message_id = the_message.attrib['id'] + else: + message_id = the_message.attrib['ID'] + if (message_id[0:2] == "0x"): + message_id = int(message_id, 16) + else: + message_id = int(message_id) - message_dictionary_id_name[class_name][message_id] = message_name - message_dictionary_name_id[class_name][message_name] = message_id + message_dictionary_id_name[class_name][message_id] = message_name + message_dictionary_name_id[class_name][message_name] = message_id - # insert this message into our dictionary as a list with room for the fields - message_dictionary[class_name][message_name] = [] - message_dictionary_types[class_name][message_id] = [] + # insert this message into our dictionary as a list with room for the fields + message_dictionary[class_name][message_name] = [] + message_dictionary_types[class_name][message_id] = [] + + for the_field in the_message.xpath('field[@name]'): + # for now, just save the field names -- in the future maybe expand this to save a struct? + message_dictionary[class_name][message_name].append( the_field.attrib['name']) + message_dictionary_types[class_name][message_id].append( the_field.attrib['type']) - for the_field in the_message.xpath('field[@name]'): - # for now, just save the field names -- in the future maybe expand this to save a struct? - message_dictionary[class_name][message_name].append( the_field.attrib['name']) - message_dictionary_types[class_name][message_id].append( the_field.attrib['type']) - def test(): - GetOptions() - ParseMessages() - + GetOptions() + ParseMessages() + if __name__ == '__main__': - test() - - + test() diff --git a/sw/lib/python/settings_tool.py b/sw/lib/python/settings_tool.py index b8b67c1b5f..54c004dbbe 100755 --- a/sw/lib/python/settings_tool.py +++ b/sw/lib/python/settings_tool.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +from __future__ import print_function + from ivy.std_api import * import os import logging @@ -12,73 +14,73 @@ _SHOW_IVY_MSGS_ = False class IvySettingsInterface(PaparazziACSettings): def __init__(self, ac_ids): - PaparazziACSettings.__init__(self, ac_ids[0]) - self.update_callback = None - self.InitIvy() - self.ac_ids = ac_ids + PaparazziACSettings.__init__(self, ac_ids[0]) + self.update_callback = None + self.InitIvy() + self.ac_ids = ac_ids def ProcessMessage(self, message_values, fromRemote): - # Extract aircraft id from message and ignore if not matching - msg_ac_id = int(message_values[0]) - if (msg_ac_id != self.ac_ids[0]): - return + # Extract aircraft id from message and ignore if not matching + msg_ac_id = int(message_values[0]) + if (msg_ac_id != self.ac_ids[0]): + return - # Extract setting value - setting_index = int(message_values[1]) - setting_value = message_values[2] + # Extract setting value + setting_index = int(message_values[1]) + setting_value = message_values[2] - # Store value from message - self.lookup[setting_index].value = setting_value + # Store value from message + self.lookup[setting_index].value = setting_value - # Callback (if present) - if self.update_callback != None: - self.update_callback(setting_index, setting_value, fromRemote) + # Callback (if present) + if self.update_callback != None: + self.update_callback(setting_index, setting_value, fromRemote) - if _SHOW_IVY_MSGS_: - print "index: %s value %s " % (setting_index, setting_value) + if _SHOW_IVY_MSGS_: + print("index: %s value %s " % (setting_index, setting_value)) # Called for DL_VALUE (from aircraft) def OnValueMsg(self, agent, *larg): - # Extract field values - message_values = larg[0].split(' ') - message_values = message_values[0:1] + message_values[2:] - self.ProcessMessage(message_values, True) + # Extract field values + message_values = larg[0].split(' ') + message_values = message_values[0:1] + message_values[2:] + self.ProcessMessage(message_values, True) # Called for DL_SETTING (from ground) def OnSettingMsg(self, agent, *larg): - # Extract field values - message_values = larg[0].split(' ') - self.ProcessMessage(message_values, False) + # Extract field values + message_values = larg[0].split(' ') + self.ProcessMessage(message_values, False) def RegisterCallback(self, callback_function): - self.update_callback = callback_function - - def InitIvy(self): - # initialising the bus - IvyInit("settings_app", # application name for Ivy - "", # ready message - 0, # main loop is local (ie. using IvyMainloop) - lambda x,y: y, # handler called on connection/deconnection - lambda x,y: y # handler called when a diemessage is received - ) + self.update_callback = callback_function - # starting the bus - logging.getLogger('Ivy').setLevel(logging.WARN) - IvyStart("") - IvyBindMsg(self.OnValueMsg, "(^.* DL_VALUE .*)") - IvyBindMsg(self.OnSettingMsg, "dl DL_SETTING (.*)") + def InitIvy(self): + # initialising the bus + IvyInit("settings_app", # application name for Ivy + "", # ready message + 0, # main loop is local (ie. using IvyMainloop) + lambda x,y: y, # handler called on connection/deconnection + lambda x,y: y # handler called when a diemessage is received + ) + + # starting the bus + logging.getLogger('Ivy').setLevel(logging.WARN) + IvyStart("") + IvyBindMsg(self.OnValueMsg, "(^.* DL_VALUE .*)") + IvyBindMsg(self.OnSettingMsg, "dl DL_SETTING (.*)") def SendSetting(self, setting_index): - for ac_id in self.ac_ids: - IvySendMsg("dl DL_SETTING %s %s %s" % (ac_id, setting_index, self.lookup[setting_index].value)) + for ac_id in self.ac_ids: + IvySendMsg("dl DL_SETTING %s %s %s" % (ac_id, setting_index, self.lookup[setting_index].value)) def OnClose(self): IvyStop() def main(): - ac_id = [ 11 ] - ivy_interface = IvySettingsInterface(ac_id) + ac_id = [ 11 ] + ivy_interface = IvySettingsInterface(ac_id) if __name__ == '__main__': - main() + main() diff --git a/sw/lib/python/settings_xml_parse.py b/sw/lib/python/settings_xml_parse.py index db8d064278..b7000578d8 100755 --- a/sw/lib/python/settings_xml_parse.py +++ b/sw/lib/python/settings_xml_parse.py @@ -1,115 +1,118 @@ #!/usr/bin/env python +from __future__ import print_function + 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 + "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 + 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']) + # 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'] + # 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"): - if the_tab.attrib.has_key('NAME'): - setting_group = PaparazziSettingsGroup(the_tab.attrib['NAME']) - elif the_tab.attrib.has_key('NAME'): - setting_group = PaparazziSettingsGroup(the_tab.attrib['name']) - else: - continue - - for the_setting in the_tab.xpath('dl_setting'): - if the_setting.attrib.has_key('shortname'): - name = the_setting.attrib['shortname'] - elif the_setting.attrib.has_key('VAR'): - name = the_setting.attrib['VAR'] - else: - name = the_setting.attrib['var'] - settings = PaparazziSetting(name) - settings.index = index - if the_setting.attrib.has_key('MIN'): - settings.min_value = float(the_setting.attrib['MIN']) - else: - settings.min_value = float(the_setting.attrib['min']) - if the_setting.attrib.has_key('MAX'): - settings.max_value = float(the_setting.attrib['MAX']) - else: - settings.max_value = float(the_setting.attrib['max']) - if the_setting.attrib.has_key('STEP'): - settings.step = float(the_setting.attrib['STEP']) - else: - 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 + 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"): + if the_tab.attrib.has_key('NAME'): + setting_group = PaparazziSettingsGroup(the_tab.attrib['NAME']) + elif the_tab.attrib.has_key('NAME'): + setting_group = PaparazziSettingsGroup(the_tab.attrib['name']) + else: + continue + + for the_setting in the_tab.xpath('dl_setting'): + if the_setting.attrib.has_key('shortname'): + name = the_setting.attrib['shortname'] + elif the_setting.attrib.has_key('VAR'): + name = the_setting.attrib['VAR'] + else: + name = the_setting.attrib['var'] + settings = PaparazziSetting(name) + settings.index = index + if the_setting.attrib.has_key('MIN'): + settings.min_value = float(the_setting.attrib['MIN']) + else: + settings.min_value = float(the_setting.attrib['min']) + if the_setting.attrib.has_key('MAX'): + settings.max_value = float(the_setting.attrib['MAX']) + else: + settings.max_value = float(the_setting.attrib['max']) + if the_setting.attrib.has_key('STEP'): + settings.step = float(the_setting.attrib['STEP']) + else: + 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 = [] + "Paparazzi Setting Group Class" + name = 0 + member_list = [] - def __init__(self, name): - self.name = name - self.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 + "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 = 164 - ac_settings = PaparazziACSettings(ac_id) - for setting_group in ac_settings.groups: - print setting_group.name + ac_id = 164 + 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 + print(" " + setting.shortname) if __name__ == '__main__': - test() - - + test()