Skip to content

Commit 883cb7b

Browse files
committed
Add read support for QtSerialPort transport
* fix broken qtserial transport caused by 8650a43 closes #8
1 parent 8650a43 commit 883cb7b

File tree

4 files changed

+35
-18
lines changed

4 files changed

+35
-18
lines changed

inkcut/device/plugin.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def write(self, data):
186186
if self.transport is not None:
187187
self.transport.write(data)
188188

189-
def data_received(self, data):
189+
def data_received(self, data: bytes):
190190
""" Called when the device replies back with data. This can occur
191191
at any time as communication is asynchronous. The protocol should
192192
handle as needed.

inkcut/device/transports/qtserialport/plugin.py

+29-9
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ def _default_ports(self):
3535

3636
def map_flow_control(self):
3737
if self.rtscts:
38-
return QSerialPort.HardwareControl
38+
return QSerialPort.FlowControl.HardwareControl
3939
elif self.xonxoff:
40-
return QSerialPort.SoftwareControl
41-
return QSerialPort.NoFlowControl
40+
return QSerialPort.FlowControl.SoftwareControl
41+
return QSerialPort.FlowControl.NoFlowControl
4242

4343
STOP_BIT_MAPPING = {
4444
serial.STOPBITS_ONE: QSerialPort.StopBits.OneStop,
@@ -60,7 +60,18 @@ def map_stop_bits(self):
6060
def map_parity(self):
6161
return QtSerialConfig.PARITY_BIT_MAPPING[self.parity]
6262

63+
BYTESIZE_MAPPING = {
64+
5: QSerialPort.DataBits.Data5,
65+
6: QSerialPort.DataBits.Data6,
66+
7: QSerialPort.DataBits.Data7,
67+
8: QSerialPort.DataBits.Data8,
68+
}
69+
70+
def map_bytesize(self):
71+
return QtSerialConfig.BYTESIZE_MAPPING[self.bytesize]
72+
6373
class QtSerialTransport(DeviceTransport):
74+
__slots__ = ('__weakref__',) # needed to for connection with Qt signals, at least with PyQt6
6475

6576
#: Default config
6677
config = Instance(QtSerialConfig, ()).tag(config=True)
@@ -75,23 +86,32 @@ class QtSerialTransport(DeviceTransport):
7586
def open_serial_port(self, config):
7687
try:
7788
serial_port = QSerialPort()
78-
serial_port.setPortName(config.device_path)
89+
serial_port.setPortName(config.port)
7990
#Setting the AllDirections flag is supported on all platforms. Windows supports only this mode.
80-
serial_port.setBaudRate(config.baudrate, QSerialPort.AllDirections)
91+
serial_port.setBaudRate(config.baudrate, QSerialPort.Direction.AllDirections)
8192
serial_port.setParity(config.map_parity())
8293
serial_port.setStopBits(config.map_stop_bits())
83-
serial_port.setDataBits(config.bytesize)
94+
serial_port.setDataBits(config.map_bytesize())
8495
serial_port.setFlowControl(config.map_flow_control())
8596
serial_port.open(QSerialPort.ReadWrite)
97+
foo = self.on_data_receive_ready
98+
serial_port.readyRead.connect(self.on_data_receive_ready)
8699
return serial_port
87100
except Exception as e:
88101
log.error("{}".format(traceback.format_exc()))
89-
return None
102+
return None
103+
104+
def on_data_receive_ready(self):
105+
if not self.connection:
106+
return
107+
while self.connection.bytesAvailable() > 0:
108+
data = self.connection.read(self.connection.bytesAvailable())
109+
self.protocol.data_received(data)
110+
self.last_read = data
90111

91112
def connect(self):
92113
config = self.config
93-
#self.device_path = config.port
94-
device_path = self.device_path = config.port
114+
self.device_path = config.port
95115
try:
96116
#: Save a reference
97117
self.protocol.transport = self

inkcut/device/transports/serialport/plugin.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@
2323

2424
from inkcut.device.transports.raw.plugin import RawFdTransport, RawFdProtocol
2525

26-
#: Reverse key values
27-
SERIAL_PARITIES = {v: k for k, v in serial.PARITY_NAMES.items()}
28-
29-
3026
class SerialPortInfo(Model):
3127
device_path = Str()
3228
description = Str()
@@ -46,7 +42,7 @@ class SerialConfigBase(Model):
4642
baudrate = Int(9600).tag(config=True)
4743
bytesize = Enum(serial.EIGHTBITS, serial.SEVENBITS, serial.SIXBITS,
4844
serial.FIVEBITS).tag(config=True)
49-
parity = Enum(*serial.PARITY_NAMES.values()).tag(config=True)
45+
parity = Enum(*serial.PARITY_NAMES.keys()).tag(config=True)
5046
stopbits = Enum(serial.STOPBITS_ONE, serial.STOPBITS_ONE_POINT_FIVE,
5147
serial.STOPBITS_TWO).tag(config=True)
5248
xonxoff = Bool().tag(config=True)
@@ -60,7 +56,7 @@ def _default_ports(self):
6056
return []
6157

6258
def _default_parity(self):
63-
return 'None'
59+
return 'N'
6460

6561
def _default_port(self):
6662
if self.ports:
@@ -110,7 +106,7 @@ def connect(self):
110106
reactor,
111107
baudrate=config.baudrate,
112108
bytesize=config.bytesize,
113-
parity=SERIAL_PARITIES[config.parity],
109+
parity=config.parity,
114110
stopbits=config.stopbits,
115111
xonxoff=config.xonxoff,
116112
rtscts=config.rtscts

inkcut/device/transports/serialport/settings.enaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ from inkcut.core.utils import load_icon
1515
from enaml.layout.api import hbox, align, spacer
1616
from enaml.qt.QtWidgets import QApplication
1717
from enaml.widgets.api import Container, Form, Label, ObjectCombo, SpinBox, CheckBox, PushButton
18-
18+
import serial
1919

2020
enamldef SerialPortSettingsView(Container):
2121
attr model
@@ -68,6 +68,7 @@ enamldef SerialPortSettingsView(Container):
6868
ObjectCombo:
6969
items = list(model.get_member('parity').items)
7070
selected := model.parity
71+
to_string = lambda v: serial.PARITY_NAMES[v]
7172
Label:
7273
text = QApplication.translate("serialport", "Stopbits")
7374
ObjectCombo:

0 commit comments

Comments
 (0)