Пример #1
0
class I2CWidget(QWidget):

    def __init__(self, status, actions):
        super (I2CWidget, self).__init__()
        self.status =  status
        self.actions = actions

        self.row_add_action = QAction("Add Row", self)
        self.row_add_action.triggered.connect(self.add_row)

        self.row_delete_action = QAction("Delete Row", self)
        self.row_delete_action.triggered.connect(self.remove_row)

        self.default_script_list = QListWidget()
        self.default_script_list.setMaximumWidth(150)

        self.default_script_list.itemDoubleClicked.connect(self.default_script_load_double_clicked)
        self.setWindowTitle("Standalone I2C Widget")
        layout = QHBoxLayout()
        self.load_callback = None
        self.toolbar = QToolBar()
        self.toolbar.setMaximumWidth(150)
        self.toolbar.setSizePolicy(Qt.QSizePolicy.Maximum, Qt.QSizePolicy.Maximum)

        self.tools_layout= QVBoxLayout()

        self.save_loader = SaveLoader(extensions = ["csv"],
                                      initial_file = "i2c_config_file")

        self.toolbar.setOrientation(QtCore.Qt.Vertical)
        self.toolbar.addAction(self.row_add_action)
        self.toolbar.addAction(self.row_delete_action)
        self.tools_layout.addWidget(self.toolbar)
        self.tools_layout.addWidget(QLabel("Default Scripts"))
        self.tools_layout.addWidget(self.default_script_list)
        default_script_load = QPushButton("Load")
        default_script_load.clicked.connect(self.default_script_load_clicked)
        self.tools_layout.addWidget(default_script_load)


        self.tab_view = QTabWidget()

        self.init_table = I2CTable(self.status, self.actions, loop = False)
        self.loop_table = I2CTable(self.status, self.actions, loop = True)
        self.tab_view.addTab(self.init_table, "Start")
        self.tab_view.addTab(self.loop_table, "Loop")

        self.control_view = I2CControlView(self.status, self.actions)
        self.actions.i2c_update_view.connect(self.update_i2c_transactions)

        layout.addLayout(self.tools_layout)

        io_layout = QVBoxLayout()
        io_layout.addWidget(self.save_loader)
        name_desc_layout = QHBoxLayout()
        self.config_name = QLineEdit("Name")
        self.config_name.setMinimumWidth(100)
        self.config_name.setSizePolicy(Qt.QSizePolicy.Preferred, Qt.QSizePolicy.Preferred)

        self.config_desc = QLineEdit("Description")
        name_desc_layout.addWidget(self.config_name)
        name_desc_layout.addWidget(self.config_desc)

        io_layout.addLayout(name_desc_layout)
        io_layout.addWidget(self.tab_view)

        layout.addLayout(io_layout)

        #layout.addWidget(self.tab_view)
        layout.addWidget(self.control_view)

        self.setLayout(layout)
        

        self.actions.i2c_update_read_view.connect(self.update_read_view)
        self.init_read_data = None
        self.loop_read_data = None
        self.read_timer = QTimer(self)
        self.read_timer.setInterval(SINGLE_SHOT_TIMEOUT)
        self.read_timer.setSingleShot(True)

    def get_config_name(self):
        return self.config_name.text()

    def set_config_name(self, name):
        self.config_name.setText(name)

    def get_config_description(self):
        return self.config_desc.text()

    def set_config_description(self, description):
        self.config_desc.setText(description)

    def add_row(self):
        if self.tab_view.currentWidget() is self.loop_table:
            self.actions.i2c_row_add.emit(True)
        else:
            self.actions.i2c_row_add.emit(False)

    def remove_row(self):
        if self.tab_view.currentWidget() is self.loop_table:
            self.actions.i2c_row_delete.emit(True)
        else:
            self.actions.i2c_row_delete.emit(False)

    def update_i2c_transactions(self, loop, transactions):
        if not loop:
            self.update_i2c_init_transactions(transactions)
        else:
            self.update_i2c_loop_transactions(transactions)

    def update_i2c_init_transactions(self, transactions):
        self.init_table.update_i2c_transactions(transactions)

    def update_i2c_loop_transactions(self, transactions):
        self.loop_table.update_i2c_transactions(transactions)

    def set_save_callback(self, callback):
        self.save_loader.set_save_callback(callback)

    def set_load_callback(self, callback):
        self.save_loader.set_load_callback(callback)

    def get_filename(self):
        return self.save_loader.get_filename()

    def default_script_load_clicked(self):
        item = self.default_script_list.currentItem()
        if item is not None:
            filename = os.path.join(DEFAULT_SCRIPT_PATH, str(item.text()))
            if self.load_callback is not None:
                self.load_callback(filename)
            #print "Item: %s" % filename

    def set_load_default_callback(self, callback):
        self.load_callback = callback

    def default_script_load_double_clicked(self, item):
        self.default_script_load_clicked()

    def load_default_scripts(self):
        files = os.listdir(DEFAULT_SCRIPT_PATH)
        self.default_script_list.clear()
        self.default_script_list.addItems(files)
        self.default_script_list.setCurrentRow(0)

    def singleshot_event(self):
        #print "update I2C Read: in thread: %s" % str(QThread.currentThread().objectName())

        if self.init_read_data is not None:
            self.init_table.update_read_data(self.init_read_data)
            self.init_read_data = None
        if self.loop_read_data is not None:
            self.loop_table.update_read_data(self.loop_read_data)
            self.loop_read_data = None

    def update_read_view(self, loop, read_data):
        #print "read timer active: %s" % str(self.read_timer.isActive())
        if loop:
            self.loop_read_data = read_data

        else:
            self.init_read_data = read_data

        if not self.read_timer.isActive():
            self.read_timer.singleShot(SINGLE_SHOT_TIMEOUT, self.singleshot_event)
            self.read_timer.start()