# -*- coding: utf-8 -*- import os from PyQt5 import QtWidgets from serial import Serial, FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS, PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK,\ PARITY_SPACE, STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO, SerialException from serial.tools import list_ports from colourterm import from_utf8, translate DATA_BITS = { '5': FIVEBITS, '6': SIXBITS, '7': SEVENBITS, '8': EIGHTBITS } PARITY_BITS = { 'None': PARITY_NONE, 'Even': PARITY_EVEN, 'Odd': PARITY_ODD, 'Mark': PARITY_MARK, 'Space': PARITY_SPACE } STOP_BITS = { '1': STOPBITS_ONE, '1.5': STOPBITS_ONE_POINT_FIVE, '2': STOPBITS_TWO } class UiConnectDialog(object): def __init__(self): """ Just to satisfy PEP8/PyLint """ self.device_layout = None self.port_label = None self.port_edit = None self.baud_label = None self.baud_combobox = None self.data_bits_label = None self.data_bits_combobox = None self.stop_bits_label = None self.stop_bits_combobox = None self.parity_label = None self.parity_combobox = None self.handshake_label = None self.software_checkbox = None self.hardware_checkbox = None self.open_mode_label = None self.reading_checkbox = None self.writing_checkbox = None self.button_box = None def setup_ui(self, connect_dialog): """ Set up the user interface """ self.device_layout = QtWidgets.QGridLayout(connect_dialog) self.device_layout.setSpacing(8) self.device_layout.setContentsMargins(8, 8, 8, 0) self.device_layout.setObjectName(from_utf8('device_layout')) self.port_label = QtWidgets.QLabel(connect_dialog) self.port_label.setObjectName(from_utf8('port_label')) self.device_layout.addWidget(self.port_label, 0, 0, 1, 1) self.port_edit = QtWidgets.QComboBox(connect_dialog) self.port_edit.setObjectName(from_utf8('port_edit')) self.port_edit.setEditable(True) self.device_layout.addWidget(self.port_edit, 0, 1, 1, 1) self.baud_label = QtWidgets.QLabel(connect_dialog) self.baud_label.setObjectName(from_utf8('baud_label')) self.device_layout.addWidget(self.baud_label, 1, 0, 1, 1) self.baud_combobox = QtWidgets.QComboBox(connect_dialog) self.baud_combobox.setObjectName(from_utf8('baud_combobox')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.baud_combobox.addItem(from_utf8('')) self.device_layout.addWidget(self.baud_combobox, 1, 1, 1, 1) self.data_bits_label = QtWidgets.QLabel(connect_dialog) self.data_bits_label.setObjectName(from_utf8('data_bits_label')) self.device_layout.addWidget(self.data_bits_label, 2, 0, 1, 1) self.data_bits_combobox = QtWidgets.QComboBox(connect_dialog) self.data_bits_combobox.setObjectName(from_utf8('data_bits_combobox')) self.data_bits_combobox.addItem(from_utf8('')) self.data_bits_combobox.addItem(from_utf8('')) self.data_bits_combobox.addItem(from_utf8('')) self.data_bits_combobox.addItem(from_utf8('')) self.device_layout.addWidget(self.data_bits_combobox, 2, 1, 1, 1) self.stop_bits_label = QtWidgets.QLabel(connect_dialog) self.stop_bits_label.setObjectName(from_utf8('stop_bits_label')) self.device_layout.addWidget(self.stop_bits_label, 3, 0, 1, 1) self.stop_bits_combobox = QtWidgets.QComboBox(connect_dialog) self.stop_bits_combobox.setObjectName(from_utf8('stop_bits_combobox')) self.stop_bits_combobox.addItem(from_utf8('')) self.stop_bits_combobox.addItem(from_utf8('')) self.stop_bits_combobox.addItem(from_utf8('')) self.device_layout.addWidget(self.stop_bits_combobox, 3, 1, 1, 1) self.parity_label = QtWidgets.QLabel(connect_dialog) self.parity_label.setObjectName(from_utf8('parity_label')) self.device_layout.addWidget(self.parity_label, 4, 0, 1, 1) self.parity_combobox = QtWidgets.QComboBox(connect_dialog) self.parity_combobox.setObjectName(from_utf8('parity_combobox')) self.parity_combobox.addItem(from_utf8('')) self.parity_combobox.addItem(from_utf8('')) self.parity_combobox.addItem(from_utf8('')) self.parity_combobox.addItem(from_utf8('')) self.parity_combobox.addItem(from_utf8('')) self.device_layout.addWidget(self.parity_combobox, 4, 1, 1, 1) self.handshake_label = QtWidgets.QLabel(connect_dialog) self.handshake_label.setObjectName(from_utf8('handshake_label')) self.device_layout.addWidget(self.handshake_label, 0, 2, 1, 1) self.software_checkbox = QtWidgets.QCheckBox(connect_dialog) self.software_checkbox.setObjectName(from_utf8('software_checkbox')) self.device_layout.addWidget(self.software_checkbox, 0, 3, 1, 1) self.hardware_checkbox = QtWidgets.QCheckBox(connect_dialog) self.hardware_checkbox.setObjectName(from_utf8('hardware_checkbox')) self.device_layout.addWidget(self.hardware_checkbox, 1, 3, 1, 1) self.open_mode_label = QtWidgets.QLabel(connect_dialog) self.open_mode_label.setObjectName(from_utf8('open_mode_label')) self.device_layout.addWidget(self.open_mode_label, 2, 2, 1, 1) self.reading_checkbox = QtWidgets.QCheckBox(connect_dialog) self.reading_checkbox.setChecked(True) self.reading_checkbox.setObjectName(from_utf8('reading_checkbox')) self.device_layout.addWidget(self.reading_checkbox, 2, 3, 1, 1) self.writing_checkbox = QtWidgets.QCheckBox(connect_dialog) self.writing_checkbox.setChecked(True) self.writing_checkbox.setObjectName(from_utf8('writing_checkbox')) self.device_layout.addWidget(self.writing_checkbox, 3, 3, 1, 1) self.button_box = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) self.device_layout.addWidget(self.button_box, 5, 0, 1, 4) self.retranslate_ui(connect_dialog) self.baud_combobox.setCurrentIndex(4) self.button_box.accepted.connect(connect_dialog.accept) self.button_box.rejected.connect(connect_dialog.reject) def retranslate_ui(self, connect_dialog): """ Translate the user interface. """ connect_dialog.setWindowTitle(translate('ConnectDialog', 'Open Port')) self.port_label.setText(translate('ConnectDialog', 'Port:')) self.baud_label.setText(translate('ConnectDialog', 'Baude rate:')) self.baud_combobox.setItemText(0, translate('ConnectDialog', '921600')) self.baud_combobox.setItemText(1, translate('ConnectDialog', '576000')) self.baud_combobox.setItemText(2, translate('ConnectDialog', '460800')) self.baud_combobox.setItemText(3, translate('ConnectDialog', '230400')) self.baud_combobox.setItemText(4, translate('ConnectDialog', '115200')) self.baud_combobox.setItemText(5, translate('ConnectDialog', '57600')) self.baud_combobox.setItemText(6, translate('ConnectDialog', '38400')) self.baud_combobox.setItemText(7, translate('ConnectDialog', '19200')) self.baud_combobox.setItemText(8, translate('ConnectDialog', '9600')) self.baud_combobox.setItemText(9, translate('ConnectDialog', '4800')) self.data_bits_label.setText(translate('ConnectDialog', 'Data bits:')) self.data_bits_combobox.setItemText(0, translate('ConnectDialog', '8')) self.data_bits_combobox.setItemText(1, translate('ConnectDialog', '7')) self.data_bits_combobox.setItemText(2, translate('ConnectDialog', '6')) self.data_bits_combobox.setItemText(3, translate('ConnectDialog', '5')) self.stop_bits_label.setText(translate('ConnectDialog', 'Stop bits:')) self.stop_bits_combobox.setItemText(0, translate('ConnectDialog', '1')) self.stop_bits_combobox.setItemText(1, translate('ConnectDialog', '1.5')) self.stop_bits_combobox.setItemText(2, translate('ConnectDialog', '2')) self.parity_label.setText(translate('ConnectDialog', 'Parity:')) self.parity_combobox.setItemText(0, translate('ConnectDialog', 'None')) self.parity_combobox.setItemText(1, translate('ConnectDialog', 'Odd')) self.parity_combobox.setItemText(2, translate('ConnectDialog', 'Even')) self.parity_combobox.setItemText(3, translate('ConnectDialog', 'Mark')) self.parity_combobox.setItemText(4, translate('ConnectDialog', 'Space')) self.handshake_label.setText(translate('ConnectDialog', 'Handshake:')) self.software_checkbox.setText(translate('ConnectDialog', 'Software')) self.hardware_checkbox.setText(translate('ConnectDialog', 'Hardware')) self.open_mode_label.setText(translate('ConnectDialog', 'Open mode:')) self.reading_checkbox.setText(translate('ConnectDialog', 'Reading')) self.writing_checkbox.setText(translate('ConnectDialog', 'Writing')) class ConnectDialog(QtWidgets.QDialog, UiConnectDialog): def __init__(self, parent): super().__init__(parent=parent) self.setup_ui(self) def get_port(self): return self.port_edit.currentText() def get_baud(self): return int(self.baud_combobox.currentText()) def get_data_bits(self): return DATA_BITS[str(self.data_bits_combobox.currentText())] def get_stop_bits(self): return STOP_BITS[str(self.stop_bits_combobox.currentText())] def get_parity(self): return PARITY_BITS[str(self.parity_combobox.currentText())] def get_software_handshake(self): return self.software_checkbox.isChecked() def get_hardware_handshake(self): return self.hardware_checkbox.isChecked() def set_port(self, port): self.port_edit.setEditText(port) def update_port_combobox(self): self.port_edit.clear() ports = [] for port in self._get_serial_ports(): ports.append(port) ports.sort() self.port_edit.addItems(ports) def _get_serial_ports(self): """ Returns a generator for all available serial ports """ if os.name == 'nt': # windows for i in range(256): try: s = Serial(i) s.close() yield 'COM' + str(i + 1) except SerialException: pass else: # unix try: for port in list_ports.comports(): yield port[0] except NameError: # pyserial 2.6 cannot handle serial usb ports very well, in that case just do not provide a list pass