diff --git a/sw/ground_segment/python/messages_app/messagesapp.py b/sw/ground_segment/python/messages_app/messagesapp.py index 6b44cb483a..3c26c27961 100755 --- a/sw/ground_segment/python/messages_app/messagesapp.py +++ b/sw/ground_segment/python/messages_app/messagesapp.py @@ -1,23 +1,17 @@ #!/usr/bin/env python import wx -import getopt -import sys import messagesframe + class MessagesApp(wx.App): def OnInit(self): self.main = messagesframe.MessagesFrame() self.main.Show() self.SetTopWindow(self.main) - #opts, args = getopt.getopt(sys.argv[1:], "p:", - #["plot"]) - #for o,a in opts: - #if o in ("-p", "--plot"): - #[ac_id, message, field, color, use_x] = a.split(':') - #self.main.AddPlot(int(ac_id), message, field, color, bool(int(use_x))) return True + def main(): application = MessagesApp(0) application.MainLoop() diff --git a/sw/ground_segment/python/messages_app/messagesframe.py b/sw/ground_segment/python/messages_app/messagesframe.py index ac1e32573e..c43f3c84fb 100644 --- a/sw/ground_segment/python/messages_app/messagesframe.py +++ b/sw/ground_segment/python/messages_app/messagesframe.py @@ -4,7 +4,6 @@ import sys import os import time import threading -import math PPRZ_HOME = os.getenv("PAPARAZZI_HOME") sys.path.append(PPRZ_HOME + "/sw/lib/python") @@ -17,8 +16,20 @@ DATA_WIDTH = 100 HEIGHT = 800 BORDER = 1 + class MessagesFrame(wx.Frame): def message_recv(self, ac_id, name, values): + """Handle incoming messages + + Callback function for IvyMessagesInterface + + :param ac_id: aircraft id + :type ac_id: int + :param name: message name + :type name: str + :param values: message values + :type values: list + """ if ac_id in self.aircrafts and name in self.aircrafts[ac_id].messages: if time.time() - self.aircrafts[ac_id].messages[name].last_seen < 0.2: return @@ -31,11 +42,10 @@ class MessagesFrame(wx.Frame): start = 0 end = book.GetPageCount() - while (start < end): + while start < end: if book.GetPageText(start) > name: return start - start = start + 1 - + start += 1 return start def update_leds(self): @@ -53,7 +63,7 @@ class MessagesFrame(wx.Frame): self.timer.start() def setup_image_list(self, notebook): - imageList = wx.ImageList(24,24) + imageList = wx.ImageList(24, 24) image = wx.Image(PPRZ_HOME + "/data/pictures/gray_led24.png") bitmap = wx.BitmapFromImage(image) @@ -84,7 +94,7 @@ class MessagesFrame(wx.Frame): 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) + messages_book.InsertPage(index, field_panel, name, imageId=1) aircraft.messages[name].index = index # update indexes of pages which are to be moved @@ -140,5 +150,5 @@ class MessagesFrame(wx.Frame): def OnClose(self, event): self.timer.cancel() - self.interface.Shutdown() + self.interface.shutdown() self.Destroy() diff --git a/sw/lib/python/messages_tool.py b/sw/lib/python/messages_tool.py index 7eaa067024..ac7bd16fd4 100644 --- a/sw/lib/python/messages_tool.py +++ b/sw/lib/python/messages_tool.py @@ -7,9 +7,10 @@ import time import os import re + class Message: def __init__(self, class_name, name): - messages_xml_map.ParseMessages() + messages_xml_map.parse_messages() self.field_value = [] self.field_names = messages_xml_map.message_dictionary[class_name][name] self.field_controls = [] @@ -17,9 +18,10 @@ class Message: self.last_seen = time.clock() self.name = name + class Aircraft: - def __init__(self, id): - self.ac_id = id + def __init__(self, ac_id): + self.ac_id = ac_id self.messages = {} self.messages_book = None diff --git a/sw/lib/python/messages_xml_map.py b/sw/lib/python/messages_xml_map.py index 9cf660677f..d29cd5b5f6 100755 --- a/sw/lib/python/messages_xml_map.py +++ b/sw/lib/python/messages_xml_map.py @@ -3,43 +3,28 @@ from __future__ import absolute_import, print_function import os -import sys -import getopt -messages_path = '%s/conf/messages.xml' % os.getenv("PAPARAZZI_HOME") +default_messages_file = '%s/conf/messages.xml' % os.getenv("PAPARAZZI_HOME") message_dictionary = {} message_dictionary_types = {} message_dictionary_id_name = {} message_dictionary_name_id = {} -def Usage(scmd): - 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 -''' - 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 +class MessagesNotFound(Exception): + def __init__(self, filename): + self.filename = filename + + def __str__(self): + return "messages file " + repr(self.filename) + " not found" -def ParseMessages(): +def parse_messages(messages_file=default_messages_file): + if not os.path.isfile(messages_file): + raise MessagesNotFound(messages_file) from lxml import etree - tree = etree.parse( messages_path) + tree = etree.parse(messages_file) for the_class in tree.xpath("//msg_class[@name]"): class_name = the_class.attrib['name'] if class_name not in message_dictionary: @@ -53,7 +38,7 @@ def ParseMessages(): message_id = the_message.attrib['id'] else: message_id = the_message.attrib['ID'] - if (message_id[0:2] == "0x"): + if message_id[0:2] == "0x": message_id = int(message_id, 16) else: message_id = int(message_id) @@ -67,12 +52,22 @@ def ParseMessages(): 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']) + 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() + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("-f", "--file", help="path to messages.xml file", default=default_messages_file) + parser.add_argument("-l", "--list", help="list parsed messages", action="store_true", dest="list_messages") + parser.add_argument("-c", "--class", help="message class", dest="msg_class", default="telemetry") + args = parser.parse_args() + parse_messages(args.file) + if args.list_messages: + print("Listing %i messages in '%s' msg_class" % (len(message_dictionary[args.msg_class]), args.msg_class)) + for msg in message_dictionary[args.msg_class]: + print(msg) if __name__ == '__main__': test()