colourterm/colourterm/connectdialog.py

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