243 lines
11 KiB
Python
243 lines
11 KiB
Python
# -*- 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
|