Exemplo n.º 1
0
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