diff --git a/sw/ext/pprzlink b/sw/ext/pprzlink index 75dfe2166c..2b246f6480 160000 --- a/sw/ext/pprzlink +++ b/sw/ext/pprzlink @@ -1 +1 @@ -Subproject commit 75dfe2166c8d7c99614224f33a7712615b7c7364 +Subproject commit 2b246f6480ac06bb6fc58b2a7947a59cec360a04 diff --git a/sw/ground_segment/python/dashboard/radiowatchframe.py b/sw/ground_segment/python/dashboard/radiowatchframe.py index 274f88ee52..0f402fa859 100644 --- a/sw/ground_segment/python/dashboard/radiowatchframe.py +++ b/sw/ground_segment/python/dashboard/radiowatchframe.py @@ -66,7 +66,8 @@ class RadioWatchFrame(wx.Frame): sizer.Add(self.rc_statusText, 1, wx.EXPAND) self.SetSizer(sizer) sizer.Layout() - self.interface = IvyMessagesInterface(self.message_recv) + self.interface = IvyMessagesInterface("radiowatchframe") + self.interface.subscribe(self.message_recv) self.update_timer = wx.CallLater(UPDATE_INTERVAL, self.gui_update) def OnClose(self, event): diff --git a/sw/ground_segment/python/guided_mode_example.py b/sw/ground_segment/python/guided_mode_example.py index 67ac19f7a0..3ff00500d5 100755 --- a/sw/ground_segment/python/guided_mode_example.py +++ b/sw/ground_segment/python/guided_mode_example.py @@ -35,16 +35,13 @@ class Guidance(object): except Exception as e: print(e) print("auto2 setting not found, mode change not possible.") - self._interface = IvyMessagesInterface(self.message_recv) - - def message_recv(self, ac_id, msg): - if self.verbose: - print("Got msg %s" % msg.name) + self._interface = IvyMessagesInterface("guided mode example") def shutdown(self): if self._interface is not None: print("Shutting down ivy interface...") self._interface.shutdown() + self._interface = None def __del__(self): self.shutdown() diff --git a/sw/ground_segment/python/ivytoredis/ivy_to_redis.py b/sw/ground_segment/python/ivytoredis/ivy_to_redis.py index e782781d4c..f66c9b3414 100755 --- a/sw/ground_segment/python/ivytoredis/ivy_to_redis.py +++ b/sw/ground_segment/python/ivytoredis/ivy_to_redis.py @@ -24,7 +24,8 @@ server = None class Ivy2RedisServer(): def __init__(self, redishost, redisport, verbose=False): self.verbose = verbose - self.interface = IvyMessagesInterface(self.message_recv) + self.interface = IvyMessagesInterface("Ivy2Redis") + self.interface.subscribe(self.message_recv) self.r = redis.StrictRedis(host=redishost, port=redisport, db=0) self.keep_running = True print("Connected to redis server %s on port %i" % (redishost, redisport)) diff --git a/sw/ground_segment/python/messages_app/messagesframe.py b/sw/ground_segment/python/messages_app/messagesframe.py index 2c475371b8..580813162e 100644 --- a/sw/ground_segment/python/messages_app/messagesframe.py +++ b/sw/ground_segment/python/messages_app/messagesframe.py @@ -172,7 +172,9 @@ class MessagesFrame(wx.Frame): self.timer = threading.Timer(0.1, self.update_leds) self.timer.start() self.msg_class = msg_class - self.interface = IvyMessagesInterface(self.message_recv) + self.interface = IvyMessagesInterface("Paparazzi Messages Viewer") + self.interface.subscribe(self.message_recv) + def OnClose(self, event): self.timer.cancel() diff --git a/sw/ground_segment/python/move_waypoint_example.py b/sw/ground_segment/python/move_waypoint_example.py index 093d01eee2..64e40e0a88 100755 --- a/sw/ground_segment/python/move_waypoint_example.py +++ b/sw/ground_segment/python/move_waypoint_example.py @@ -18,11 +18,7 @@ from pprzlink.message import PprzMessage class WaypointMover(object): def __init__(self, verbose=False): self.verbose = verbose - self._interface = IvyMessagesInterface(self.message_recv) - - def message_recv(self, ac_id, msg): - if self.verbose: - print("Got msg %s" % msg.name) + self._interface = IvyMessagesInterface("WaypointMover") def shutdown(self): print("Shutting down ivy interface...") diff --git a/sw/ground_segment/python/real_time_plot/messagepicker.py b/sw/ground_segment/python/real_time_plot/messagepicker.py index 81c3412eb7..a4ad9e567f 100755 --- a/sw/ground_segment/python/real_time_plot/messagepicker.py +++ b/sw/ground_segment/python/real_time_plot/messagepicker.py @@ -32,7 +32,7 @@ class Aircraft(object): class MessagePicker(wx.Frame): - def __init__(self, parent, callback, initIvy=True): + def __init__(self, parent, callback, ivy_interface=None): wx.Frame.__init__(self, parent, name="MessagePicker", title=u'Message Picker', size=wx.Size(320,640)) self.aircrafts = {} @@ -43,7 +43,11 @@ class MessagePicker(wx.Frame): self.tree.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick) self.tree.Bind(wx.EVT_CHAR, self.OnKeyChar) self.Bind(wx.EVT_CLOSE, self.OnClose) - self.message_interface = IvyMessagesInterface(self.msg_recv, initIvy) + if ivy_interface is None: + self.message_interface = IvyMessagesInterface("MessagePicker") + else: + self.message_interface = ivy_interface + self.message_interface.subscribe(self.msg_recv) def OnClose(self, event): # if we have a parent (like the plotpanel) only hide instead of shutdown diff --git a/sw/ground_segment/python/real_time_plot/plotpanel.py b/sw/ground_segment/python/real_time_plot/plotpanel.py index 9674f8c89e..66c2b98575 100644 --- a/sw/ground_segment/python/real_time_plot/plotpanel.py +++ b/sw/ground_segment/python/real_time_plot/plotpanel.py @@ -19,7 +19,8 @@ sys.path.append(PPRZ_SRC + "/sw/ext/pprzlink/lib/v1.0/python") import pprz_env from pprzlink import messages_xml_map - +from ivy_msg_interface import IvyMessagesInterface +from pprzlink.message import PprzMessage class PlotData: def __init__(self, ivy_msg_id, title, width, color=None, scale=1.0): @@ -172,7 +173,6 @@ class PlotPanel(object): self.frame = frame # the frame owns any controls we might need to update parent.SetDropTarget(TextDropTarget(self)) # calls self.OnDropText when drag and drop complete - self.InitIvy() self.width = 800 self.height = 200 @@ -191,6 +191,8 @@ class PlotPanel(object): messages_xml_map.parse_messages() + self.ivy_interface = IvyMessagesInterface(_IVY_APPNAME) + # start the timer self.timer = wx.FutureCall(self.plot_interval, self.OnTimer) @@ -229,29 +231,9 @@ class PlotPanel(object): pass def ShowMessagePicker(self, parent): - frame = messagepicker.MessagePicker(parent, self.BindCurve, False) + frame = messagepicker.MessagePicker(parent, self.BindCurve, self.ivy_interface) frame.Show() - def InitIvy(self): - # initialising the bus - IvyInit(_IVY_APPNAME, # application name for Ivy - "", # "[%s is ready]" % IVYAPPNAME, # 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 - # Note: env variable IVYBUS will be used if no parameter or empty string - # is given ; this is performed by IvyStart (C) - try: - logging.getLogger('Ivy').setLevel(logging.WARN) - IvyStart(pprz_env.IVY_BUS) - # binding to every message - # IvyBindMsg(self.OnIvyMsg, "(.*)") - except: - IvyStop() - def OnDropText(self, data): [ac_id, category, message, field, scale] = data.encode('ASCII').split(':') self.BindCurve(int(ac_id), message, field, scale=float(scale)) @@ -299,7 +281,7 @@ class PlotPanel(object): random.randint(0, 255)) return - ivy_id = IvyBindMsg(self.OnIvyMsg, str(message_string)) + ivy_id = self.ivy_interface.bind_raw(self.OnIvyMsg, str(message_string)) title = '%i:%s:%s' % (ac_id, message, field) self.plots[ac_id][message][field] = PlotData(ivy_id, title, self.plot_size, color, scale) self.frame.AddCurve(ivy_id, title, use_as_x) @@ -336,7 +318,7 @@ class PlotPanel(object): if (self.x_axis is not None) and (self.x_axis.id == ivy_id): self.x_axis = None - IvyUnBindMsg(ivy_id) + self.ivy_interface.unbind(ivy_id) del self.plots[ac_id][msg][field] if len(self.plots[ac_id][msg]) == 0: del self.plots[ac_id][msg]