class RobotMonitor(QWidget): sig_err = pyqtSignal(str) sig_warn = pyqtSignal(str) sig_clear = pyqtSignal() def __init__(self, topic): super(RobotMonitor, self).__init__() self.setObjectName('Robot Monitor') self.top_items = [] layout = QVBoxLayout() self.err = QTreeWidget() self.err.setHeaderLabel("Errors") self.warn = QTreeWidget() self.warn.setHeaderLabel("Warnings") self.sig_clear.connect(self.clear) self.sig_err.connect(self.disp_err) self.sig_warn.connect(self.disp_warn) self.comp = QTreeWidget() self.comp.setHeaderLabel("All") self.comp.itemDoubleClicked.connect(self.tree_clicked) self.time = TimelineWidget(self) layout.addWidget(self.err) layout.addWidget(self.warn) layout.addWidget(self.comp, 1) layout.addWidget(self.time, 0) self.setLayout(layout) self.paused = False self.topic = topic self.sub = rospy.Subscriber(self.topic, DiagnosticArray, self.cb) self.setWindowTitle('Robot Monitor') def cb(self, msg): if not self.paused: self.sig_clear.emit() self.update_tree(msg) self.update_we(msg) self.time.add_message(msg) def tree_clicked(self, item, yes): item.on_click() def update_tree(self, msg): #Update the tree from the bottom names = [get_nice_name(k.name) for k in self.top_items] add = [] for i in self._top_level(msg): name = get_nice_name(i.name) if name in names: self.top_items[names.index(name)].update(i, msg) else: nw = StatusItem(i) nw.update(i, msg) self.top_items.append(nw) add.append(nw) self.comp.addTopLevelItems(add) def _top_level(self, msg): ret = [] for i in msg.status: if len(i.name.split('/')) == 2: ret.append(i) return ret def update_we(self, msg): """Update the warning and error boxes""" for status in msg.status: if status.level == status.WARN: txt = "%s : %s"%(status.name, status.message) self.sig_warn.emit(txt) elif status.level == status.ERROR: txt = "%s : %s"%(status.name, status.message) self.sig_err.emit(txt) def pause(self, msg): self.paused = True self.sig_clear.emit() self.update_we(msg) self.update_tree(msg) def unpause(self): self.paused = False def clear(self): self.err.clear() self.warn.clear() def disp_err(self, msg): i = QTreeWidgetItem() i.setText(0, msg) self.err.addTopLevelItem(i) def disp_warn(self,msg): i = QTreeWidgetItem() i.setText(0, msg) self.warn.addTopLevelItem(i) def close(self): if self.sub: self.sub.unregister() self.sub = None