diff --git a/concert_conductor_graph/src/concert_conductor_graph/concert_client.py b/concert_conductor_graph/src/concert_conductor_graph/concert_client.py index 14b0db4..93c35e2 100644 --- a/concert_conductor_graph/src/concert_conductor_graph/concert_client.py +++ b/concert_conductor_graph/src/concert_conductor_graph/concert_client.py @@ -37,9 +37,6 @@ def _set_link_string(self): :returns: link type string :rtype: str ''' -# if ((self.msg.status == concert_msgs.ConcertClientState.AVAILABLE) or -# (self.msg.status == concert_msgs.ConcertClientState.MISSING) -# ): if self.msg.is_local_client: return 'local' elif self.msg.conn_stats.network_type == gateway_msgs.ConnectionStatistics.WIRED: @@ -73,6 +70,8 @@ def get_rapp_context(self): def get_connection_strength(self): if self.msg.is_local_client == True: return 'very_strong' + elif self.msg.state == concert_msgs.ConcertClientState.MISSING: + return 'missing' else: link_quality_percent = (float(self.msg.conn_stats.wireless_link_quality) / 70) * 100 if 80 < link_quality_percent and 100 >= link_quality_percent: @@ -95,7 +94,13 @@ def update(self, msg): the rapp that is running), the connection statistics and the state. ''' # could pull the individual bits, but just easy to drop the new msg in place + old_msg = self.msg self.msg = msg + if ( + old_msg.is_local_client != msg.is_local_client or + old_msg.conn_stats.network_type != msg.conn_stats.network_type + ): + self.link_type = self._set_link_string() ############################################################################## # Conveniences diff --git a/concert_conductor_graph/src/concert_conductor_graph/conductor_graph.py b/concert_conductor_graph/src/concert_conductor_graph/conductor_graph.py index 1aa8b3c..5ea400e 100644 --- a/concert_conductor_graph/src/concert_conductor_graph/conductor_graph.py +++ b/concert_conductor_graph/src/concert_conductor_graph/conductor_graph.py @@ -184,7 +184,7 @@ class ConductorGraph(Plugin): # constants # colour definitions from http://www.w3.org/TR/SVG/types.html#ColorKeywords # see also http://qt-project.org/doc/qt-4.8/qcolor.html#setNamedColor - link_strength_colours = {'very_strong': QColor("lime"), 'strong': QColor("chartreuse"), 'normal': QColor("yellow"), 'weak': QColor("orange"), 'very_weak': QColor("red")} + link_strength_colours = {'very_strong': QColor("lime"), 'strong': QColor("chartreuse"), 'normal': QColor("yellow"), 'weak': QColor("orange"), 'very_weak': QColor("red"), 'missing': QColor("powderblue")} def __init__(self, context): self._context = context @@ -199,7 +199,6 @@ def __init__(self, context): self._widget = QWidget() self.cur_selected_client_name = "" self.pre_selected_client_name = "" - # factory builds generic dotcode items self.dotcode_factory = PydotFactory() # self.dotcode_factory=PygraphvizFactory() @@ -310,13 +309,16 @@ def _change_client_tab(self, index): self.cur_selected_client_name = self._widget.tabWidget.tabText(self._widget.tabWidget.currentIndex()) def _set_network_statisics(self): - if self._edge_items == None: - return - else: - for edge_items in self._edge_items.itervalues(): - for edge_item in edge_items: - edge_dst_name = edge_item.to_node._label.text() - edge_item.setToolTip(str(self._graph.concert_clients[edge_dst_name].msg.conn_stats)) + # we currently redraw every statistics update (expensive!) so passing for now, but we should + # reenable this and drop the change callback to be more efficient + #if self._edge_items == None: + # return + #else: + # for edge_items in self._edge_items.itervalues(): + # for edge_item in edge_items: + # edge_dst_name = edge_item.to_node._label.text() + # edge_item.setToolTip(str(self._graph.concert_clients[edge_dst_name].msg.conn_stats)) + pass def _redraw_graph_view(self): print("[conductor graph]: _redraw_graph_view") diff --git a/concert_conductor_graph/src/concert_conductor_graph/conductor_graph_info.py b/concert_conductor_graph/src/concert_conductor_graph/conductor_graph_info.py index b4d7b6b..24ba3a0 100644 --- a/concert_conductor_graph/src/concert_conductor_graph/conductor_graph_info.py +++ b/concert_conductor_graph/src/concert_conductor_graph/conductor_graph_info.py @@ -69,15 +69,19 @@ def _update_clients_callback(self, msg): changes its state. This update happens rather infrequently with every message supplied by the conductor's latched graph publisher. ''' + print("[conductor_graph_info] : update clients callback") self._graph = msg # sneaky way of getting all the states and the lists visible_concert_clients_by_name = [] for state in msg.__slots__: + if state == concert_msgs.ConcertClientState.GONE: + continue concert_clients = getattr(msg, state) # by state - for concert_client in concert_clients: + for concert_client in concert_clients: # concert_msgs.ConcertClient visible_concert_clients_by_name.append(concert_client.name) if concert_client.name in self.concert_clients.keys(): self.concert_clients[concert_client.name].is_new = False + self.concert_clients[concert_client.name].update(concert_client) else: self.concert_clients[concert_client.name] = ConcertClient(concert_client) # create extended ConcertClient class from msg # remove any that are no longer visible diff --git a/concert_conductor_graph/src/concert_conductor_graph/dotcode.py b/concert_conductor_graph/src/concert_conductor_graph/dotcode.py index 6000e9f..b7ea232 100644 --- a/concert_conductor_graph/src/concert_conductor_graph/dotcode.py +++ b/concert_conductor_graph/src/concert_conductor_graph/dotcode.py @@ -87,8 +87,12 @@ def get_nodes_and_edges(self, conductor_graph_instance): """ nodes = conductor_graph_instance.concert_clients.values() edges = [] + important_states = [ + concert_msgs.ConcertClientState.MISSING, + concert_msgs.ConcertClientState.AVAILABLE + ] for node in nodes: - if node.msg.conn_stats.gateway_available: + if node.msg.state in important_states: # and node.msg.conn_stats.gateway_available: edges.append(Edge("conductor", node.concert_alias, node.link_type)) return (nodes, edges)