class MainWindow(QMainWindow): instrumentsFound = pyqtSignal() sampleFound = pyqtSignal() measurementFinished = pyqtSignal(int) def __init__(self, parent=None): super().__init__(parent) self.setAttribute(Qt.WA_QuitOnClose) self.setAttribute(Qt.WA_DeleteOnClose) # create instance variables self._ui = uic.loadUi('mainwindow.ui', self) self._domain = Domain(parent=self) # create latch widgets self._ui.ncounterLatchWidget = Adf4113NcountLatchWidget(parent=self) self._ui.gridLatch.addWidget(self._ui.ncounterLatchWidget, 1, 2) self._ui.rcounterLatchWidget = Adf4113RefcountLatchWidget(parent=self) self._ui.gridLatch.addWidget(self._ui.rcounterLatchWidget, 0, 2) self._ui.funcLatchWidget = Adf4113FuncLatchWidget(parent=self) self._ui.gridLatch.addWidget(self._ui.funcLatchWidget, 0, 1, 2, 1) self._ui.initLatchWidget = Adf4113InitLatchWidget(parent=self) self._ui.gridLatch.addWidget(self._ui.initLatchWidget, 0, 0, 2, 1) # TODO extract class # TODO load command presets from a config file self._commandPresets = dict() # create models self._funcModel = MapModel(self, { 0: ('Test connection', 'Протестировать подключение к программатору'), 1: ('Counter reset method', 'Сбросить R и AB счетчики') }, sort=False) self.initDialog() # self.size() def loadPresets(self): if not os.path.isfile(f'./{preset_file}'): return labels = dict() with open(f'./{preset_file}', 'rt', encoding='utf-8') as f: for index, line in enumerate(f.readlines()): if '#' not in line: command, label, tip = line.split('|') self._commandPresets[index] = command labels[index] = (label, tip) self._funcModel.initModel(labels) def setupUiSignals(self): self._ui.ncounterLatchWidget.bitmapChanged.connect(self._buildDebug) self._ui.rcounterLatchWidget.bitmapChanged.connect(self._buildDebug) self._ui.funcLatchWidget.bitmapChanged.connect(self._buildDebug) self._ui.initLatchWidget.bitmapChanged.connect(self._buildDebug) self._ui.ncounterLatchWidget.toggled.connect(self._buildDebug) self._ui.rcounterLatchWidget.toggled.connect(self._buildDebug) self._ui.funcLatchWidget.toggled.connect(self._buildDebug) self._ui.initLatchWidget.toggled.connect(self._buildDebug) self._ui.ncounterLatchWidget.bitmapChanged.connect(self._buildRun) self._ui.rcounterLatchWidget.bitmapChanged.connect(self._buildRun) self._ui.funcLatchWidget.bitmapChanged.connect(self._buildRun) self._ui.ncounterLatchWidget.toggled.connect(self._buildRun) self._ui.rcounterLatchWidget.toggled.connect(self._buildRun) self._ui.funcLatchWidget.toggled.connect(self._buildRun) def setupModels(self): self._ui.comboFunc.setModel(self._funcModel) def initUi(self): self._ui.initLatchWidget.setChecked(False) self._buildRun() def initDialog(self): self.loadPresets() self.setupModels() self.setupUiSignals() self.initUi() self._modeDisconnected() def _modeDisconnected(self): self._ui.btnConnect.setVisible(True) self._ui.btnDisconnect.setVisible(False) self._ui.btnWrite.setEnabled(False) self._ui.btnRun.setEnabled(False) def _modeConnected(self): self._ui.btnConnect.setVisible(False) self._ui.btnDisconnect.setVisible(True) self._ui.btnWrite.setEnabled(True) self._ui.btnRun.setEnabled(True) @pyqtSlot() def on_btnConnect_clicked(self): if not self._domain.connectProgr(): QMessageBox.warning( self, 'Ошибка', 'Не найден программатор, проверьте подкючение.') return print('connected to SPI') self._modeConnected() @pyqtSlot() def on_btnDisconnect_clicked(self): self._domain.disconnectProgr() self._modeDisconnected() @pyqtSlot() def on_btnWrite_clicked(self): if self._domain.connected: self._domain.send(self._ui.editCommand.text()) @pyqtSlot() def on_btnRun_clicked(self): if self._domain.connected: self._domain.send(self._ui.editRun.text()) @pyqtSlot(int) def on_comboFunc_currentIndexChanged(self, index: int): command_id = self._ui.comboFunc.currentData(MapModel.RoleNodeId) command_seq = self._commandPresets[command_id] print(f'init command: id={command_id}, hex={command_seq}') self._ui.editCommand.setText(command_seq) self._ui.editFuncDesc.setText( self._ui.comboFunc.currentData(Qt.ToolTipRole)) @pyqtSlot() def _buildDebug(self): def get_hex(widget): if not widget.isChecked(): return '' return f'.{widget.latch.hex}' cmd = f'<f' \ f'{get_hex(self._ui.initLatchWidget)}' \ f'{get_hex(self._ui.funcLatchWidget)}' \ f'{get_hex(self._ui.rcounterLatchWidget)}' \ f'{get_hex(self._ui.ncounterLatchWidget)}>' self._ui.editCommand.setText(cmd) @pyqtSlot() def _buildRun(self): def enable_reset(widget): widget.latch.counter_reset = 1 return f'{widget.latch.hex}' def disable_reset(widget): widget.latch.counter_reset = 0 return f'{widget.latch.hex}' cmd = f'<f' \ f'.{enable_reset(self._ui.funcLatchWidget)}' \ f'.{self._ui.rcounterLatchWidget.latch.hex}' \ f'.{self._ui.ncounterLatchWidget.latch.hex}' \ f'.{disable_reset(self._ui.funcLatchWidget)}>' self._ui.editRun.setText(cmd)