class MainWindow(QMainWindow, Ui_MainWindow): callback_enumerate_signal = pyqtSignal(str, str, int, bool) def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.setupUi(self) self.setWindowIcon(QIcon("brickv-icon.png")) signal.signal(signal.SIGINT, self.exit_brickv) signal.signal(signal.SIGTERM, self.exit_brickv) self.setWindowTitle("Brick Viewer " + config.BRICKV_VERSION) self.table_view_header = ['Stack ID', 'Device Name', 'UID', 'FW Version', 'Chip Temp.', 'Reset'] # Remove dummy tab self.tab_widget.removeTab(1) self.last_tab = 0 self.plugins = [(self, None, None, None)] self.ipcon = None self.flashing_window = None self.advanced_window = None self.reset_view() self.button_advanced.setDisabled(True) self.callback_enumerate_signal.connect(self.callback_enumerate) self.tab_widget.currentChanged.connect(self.tab_changed) self.connect.pressed.connect(self.connect_pressed) self.button_flashing.pressed.connect(self.flashing_pressed) self.button_advanced.pressed.connect(self.advanced_pressed) self.plugin_manager = PluginManager() self.host.setText(config.get_host()) self.port.setValue(config.get_port()) self.mtm = None self.chip_temp_timer = QTimer() self.chip_temp_timer.timeout.connect(self.update_chip_temp) self.chip_temp_timer.setInterval(2000) self.chip_temp_timer.start() def closeEvent(self, event): self.exit_brickv() def exit_brickv(self, signl=None, frme=None): config.set_host(str(self.host.text())) config.set_port(self.port.value()) if self.ipcon != None: self.reset_view() if signl != None and frme != None: print "Received SIGINT or SIGTERM, shutting down." sys.exit() def start(self): self.update_chip_temp() self.chip_temp_timer.start() def stop(self): self.chip_temp_timer.stop() def destroy(self): pass def tab_changed(self, i): self.plugins[i][0].start() self.plugins[self.last_tab][0].stop() self.last_tab = i def reset_view(self): self.tab_widget.setCurrentIndex(0) for i in reversed(range(1, len(self.plugins))): try: self.plugins[i][0].stop() self.plugins[i][0].destroy() except AttributeError: pass self.tab_widget.removeTab(i) self.plugins = [(self, None, None, None)] self.update_table_view() if self.ipcon: self.ipcon.destroy() self.ipcon = None def flashing_pressed(self): if self.flashing_window is None: self.flashing_window = FlashingWindow(self) self.update_flashing_window() self.flashing_window.show() def advanced_pressed(self): if self.advanced_window is None: self.advanced_window = AdvancedWindow(self) self.update_advanced_window() self.advanced_window.show() def connect_pressed(self): if not self.ipcon: try: self.ipcon = IPConnection(self.host.text(), self.port.value()) self.ipcon.enumerate(self.callback_enumerate_signal.emit) self.connect.setText("Disconnect") self.port.setDisabled(True) self.host.setDisabled(True) except (Error, socket.error): self.ipcon = None box_head = 'Could not connect' box_text = 'Please check host, check port and ' + \ 'check if brickd is running.' QMessageBox.critical(self, box_head, box_text) else: self.reset_view() self.connect.setText("Connect") self.button_advanced.setDisabled(True) self.port.setDisabled(False) self.host.setDisabled(False) def callback_enumerate(self, uid, name, stack_id, is_new): if is_new: for plugin in self.plugins: # Plugin already loaded if plugin[3] == uid: return plugin = self.plugin_manager.get_plugin_from_name(name, self.ipcon, uid) if plugin is not None: self.tab_widget.addTab(plugin, name) self.plugins.append((plugin, stack_id, name, uid)) else: for i in range(len(self.plugins)): if self.plugins[i][3] == uid: self.tab_widget.setCurrentIndex(0) self.plugins[i][0].stop() self.plugins[i][0].destroy() self.tab_widget.removeTab(i) self.plugins.remove(self.plugins[i]) self.update_table_view() return self.update_table_view() def update_table_view(self): data = [] for p in self.plugins[1:]: if p[0] is not None: data.append([p[1], p[2], p[3], p[0].version, '', '']) self.mtm = MainTableModel(self.table_view_header, data) self.table_view.setModel(self.mtm) for r in range(len(data)): p = self.plugins[r + 1] if p[0] is not None and ' Brick ' in p[2]: button = QPushButton('Reset') if p[0].has_reset_device(): button.clicked.connect(p[0].reset_device) else: button.setDisabled(True) self.table_view.setIndexWidget(self.mtm.index(r, 5), button) self.update_flashing_window() self.update_advanced_window() def update_flashing_window(self): if self.flashing_window is not None: devices = [] for plugin in self.plugins[1:]: if ' Brick ' in plugin[2]: devices.append((plugin[2], plugin[0].device)) self.flashing_window.set_devices(devices) def update_advanced_window(self): devices = [] for plugin in self.plugins[1:]: if ' Brick ' in plugin[2]: devices.append((plugin[2], plugin[0].device)) self.button_advanced.setEnabled(len(devices) > 0) if self.advanced_window is not None: self.advanced_window.set_devices(devices) def update_chip_temp(self): if self.mtm is None: return for r in range(len(self.plugins) - 1): p = self.plugins[r + 1] if p[0] is not None: try: self.mtm.setData(self.mtm.index(r, 4), p[0].get_chip_temperature(), Qt.DisplayRole) except Error: # abort update here to avoid requesting chtip temp from a # whole disconnected stack return