[python] pprz_msg using properties

This commit is contained in:
Felix Ruess
2015-02-18 12:54:26 +01:00
parent a704d20ced
commit 6706fac752
4 changed files with 43 additions and 36 deletions
@@ -33,9 +33,9 @@ class Ivy2RedisServer():
# if ac_id is not 0 (i.e. telemetry from an aircraft) include it in the key # if ac_id is not 0 (i.e. telemetry from an aircraft) include it in the key
# don't add it to the key for ground messages # don't add it to the key for ground messages
if ac_id: if ac_id:
key = "{0}.{1}.{2}".format(msg.get_classname(), msg.get_msgname(), ac_id) key = "{0}.{1}.{2}".format(msg.msg_class, msg.name, ac_id)
else: else:
key = "{0}.{1}".format(msg.get_classname(), msg.get_msgname()) key = "{0}.{1}".format(msg.msg_class, msg.name)
if self.verbose: if self.verbose:
print("received message, key=%s, msg=%s" % (key, msg.to_json(payload_only=True))) print("received message, key=%s, msg=%s" % (key, msg.to_json(payload_only=True)))
sys.stdout.flush() sys.stdout.flush()
@@ -29,7 +29,6 @@ class Message(PprzMessage):
self.field_controls = [] self.field_controls = []
self.index = None self.index = None
self.last_seen = time.clock() self.last_seen = time.clock()
self.name = name
class Aircraft(object): class Aircraft(object):
@@ -51,12 +50,13 @@ class MessagesFrame(wx.Frame):
:type msg: PprzMessage :type msg: PprzMessage
""" """
# only show messages of the requested class # only show messages of the requested class
if msg.get_classname() != self.msg_class: if msg.msg_class != self.msg_class:
return return
if ac_id in self.aircrafts and msg.get_msgname() in self.aircrafts[ac_id].messages: if ac_id in self.aircrafts and msg.name in self.aircrafts[ac_id].messages:
if time.time() - self.aircrafts[ac_id].messages[msg.get_msgname()].last_seen < 0.2: if time.time() - self.aircrafts[ac_id].messages[msg.name].last_seen < 0.2:
return return
wx.CallAfter(self.gui_update, msg.get_classname(), msg.get_msgname(), ac_id, msg)
wx.CallAfter(self.gui_update, ac_id, msg)
def find_page(self, book, name): def find_page(self, book, name):
if book.GetPageCount() < 1: if book.GetPageCount() < 1:
@@ -113,7 +113,7 @@ class MessagesFrame(wx.Frame):
messages_book = aircraft.messages_book messages_book = aircraft.messages_book
aircraft.messages[name] = Message(msg_class, name) aircraft.messages[name] = Message(msg_class, name)
field_panel = wx.Panel(messages_book) field_panel = wx.Panel(messages_book)
grid_sizer = wx.FlexGridSizer(len(aircraft.messages[name].get_fieldnames()), 2) grid_sizer = wx.FlexGridSizer(len(aircraft.messages[name].fieldnames), 2)
index = self.find_page(messages_book, name) 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)
@@ -123,7 +123,7 @@ class MessagesFrame(wx.Frame):
for message_name in aircraft.messages: for message_name in aircraft.messages:
aircraft.messages[message_name].index = self.find_page(messages_book, message_name) aircraft.messages[message_name].index = self.find_page(messages_book, message_name)
for field_name in aircraft.messages[name].get_fieldnames(): for field_name in aircraft.messages[name].fieldnames:
name_text = wx.StaticText(field_panel, -1, field_name) name_text = wx.StaticText(field_panel, -1, field_name)
size = name_text.GetSize() size = name_text.GetSize()
size.x = LABEL_WIDTH size.x = LABEL_WIDTH
@@ -141,20 +141,18 @@ class MessagesFrame(wx.Frame):
field_panel.SetSizer(grid_sizer) field_panel.SetSizer(grid_sizer)
field_panel.Layout() field_panel.Layout()
def gui_update(self, msg_class, msg_name, ac_id, msg): def gui_update(self, ac_id, msg):
if ac_id not in self.aircrafts: if ac_id not in self.aircrafts:
self.add_new_aircraft(ac_id) self.add_new_aircraft(ac_id)
aircraft = self.aircrafts[ac_id] aircraft = self.aircrafts[ac_id]
if msg.name not in aircraft.messages:
self.add_new_message(aircraft, msg.msg_class, msg.name)
if msg_name not in aircraft.messages: aircraft.messages_book.SetPageImage(aircraft.messages[msg.name].index, 1)
self.add_new_message(aircraft, msg_class, msg_name) self.aircrafts[ac_id].messages[msg.name].last_seen = time.time()
aircraft.messages_book.SetPageImage(aircraft.messages[msg_name].index, 1) for index in range(0, len(msg.fieldvalues)):
self.aircrafts[ac_id].messages[msg_name].last_seen = time.time() aircraft.messages[msg.name].field_controls[index].SetLabel(msg.get_field(index))
for index in range(0, len(msg.get_fieldvalues())):
aircraft.messages[msg_name].field_controls[index].SetLabel(msg.get_field(index))
def __init__(self, msg_class="telemetry"): def __init__(self, msg_class="telemetry"):
wx.Frame.__init__(self, id=-1, parent=None, name=u'MessagesFrame', size=wx.Size(WIDTH, HEIGHT), style=wx.DEFAULT_FRAME_STYLE, title=u'Messages') wx.Frame.__init__(self, id=-1, parent=None, name=u'MessagesFrame', size=wx.Size(WIDTH, HEIGHT), style=wx.DEFAULT_FRAME_STYLE, title=u'Messages')
+3 -3
View File
@@ -91,12 +91,12 @@ class IvyMessagesInterface(object):
def send(self, msg, ac_id=None): def send(self, msg, ac_id=None):
if isinstance(msg, PprzMessage): if isinstance(msg, PprzMessage):
if "telemetry" in msg.get_classname(): if "telemetry" in msg.msg_class:
if ac_id is None: if ac_id is None:
print("ac_id needed to send telemetry message.") print("ac_id needed to send telemetry message.")
else: else:
IvySendMsg("%d %s %s" % (ac_id, msg.get_msgname(), msg.payload_to_ivy_string())) IvySendMsg("%d %s %s" % (ac_id, msg.name, msg.payload_to_ivy_string()))
else: else:
IvySendMsg("%s %s %s" % (msg.get_classname(), msg.get_msgname(), msg.payload_to_ivy_string())) IvySendMsg("%s %s %s" % (msg.msg_class, msg.name, msg.payload_to_ivy_string()))
else: else:
IvySendMsg(msg) IvySendMsg(msg)
+24 -15
View File
@@ -36,19 +36,28 @@ class PprzMessage(object):
else: else:
self._fieldvalues.append(0) self._fieldvalues.append(0)
def get_msgname(self): @property
def name(self):
"""Get the message name."""
return self._name return self._name
def get_classname(self): @property
def msg_class(self):
"""Get the message class."""
return self._class_name return self._class_name
def get_fieldnames(self): @property
def fieldnames(self):
"""Get list of field names."""
return self._fieldnames return self._fieldnames
def get_fieldvalues(self): @property
def fieldvalues(self):
"""Get list of field values."""
return self._fieldvalues return self._fieldvalues
def get_field(self, idx): def get_field(self, idx):
"""Get field value by index."""
return self._fieldvalues[idx] return self._fieldvalues[idx]
def set_values(self, values): def set_values(self, values):
@@ -58,19 +67,19 @@ class PprzMessage(object):
raise PprzMessageError("Error: fields not matching") raise PprzMessageError("Error: fields not matching")
def __str__(self): def __str__(self):
ret = '%s.%s {' % (self._class_name, self._name) ret = '%s.%s {' % (self.msg_class, self.name)
for idx, f in enumerate(self._fieldnames): for idx, f in enumerate(self.fieldnames):
ret += '%s : %s, ' % (f, self._fieldvalues[idx]) ret += '%s : %s, ' % (f, self.fieldvalues[idx])
ret = ret[0:-2] + '}' ret = ret[0:-2] + '}'
return ret return ret
def to_dict(self, payload_only=False): def to_dict(self, payload_only=False):
d = {} d = {}
if not payload_only: if not payload_only:
d['msgname'] = self._name d['msgname'] = self.name
d['msgclass'] = self._class_name d['msgclass'] = self.msg_class
for idx, f in enumerate(self._fieldnames): for idx, f in enumerate(self.fieldnames):
d[f] = self._fieldvalues[idx] d[f] = self.fieldvalues[idx]
return d return d
def to_json(self, payload_only=False): def to_json(self, payload_only=False):
@@ -78,13 +87,13 @@ class PprzMessage(object):
def payload_to_ivy_string(self): def payload_to_ivy_string(self):
ivy_str = '' ivy_str = ''
for idx, t in enumerate(self._fieldtypes): for idx, t in enumerate(self.fieldtypes):
if "char[" in t: if "char[" in t:
ivy_str += '"' + self._fieldvalues[idx] + '"' ivy_str += '"' + self.fieldvalues[idx] + '"'
elif '[' in t: elif '[' in t:
ivy_str += ','.join([str(x) for x in self._fieldvalues[idx]]) ivy_str += ','.join([str(x) for x in self.fieldvalues[idx]])
else: else:
ivy_str += str(self._fieldvalues[idx]) ivy_str += str(self.fieldvalues[idx])
ivy_str += ' ' ivy_str += ' '
return ivy_str return ivy_str