Skip to content

Commit 112941f

Browse files
osc-lib: Fix SLIP client CPU usage
By not reading byte by byte, we reduce the CPU usage by half. Co-authored-by: Martijn Braam <martijn@brixit.nl>
1 parent ff4b7c7 commit 112941f

1 file changed

Lines changed: 13 additions & 6 deletions

File tree

osc-lib/fosdemosc/slip_client.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,33 @@ def send(self, content: Union[OscMessage, OscBundle]) -> None:
2828

2929
def receive(self) -> bytes:
3030
buffer = b''
31+
buf = b''
32+
n = 0
3133
while True:
32-
c = self.ser.read(1)
33-
if c is None or not len(c):
34-
raise serial.SerialTimeoutException('Cannot read from serial port')
35-
34+
if n == len(buf):
35+
buf = self.ser.read(self.ser.in_waiting or 1)
36+
n = 0
37+
if buf is None or not len(buf):
38+
raise serial.SerialTimeoutException('Cannot read from serial port')
39+
buf = bytes(buf)
40+
c = bytes(buf[n:n+1])
41+
n+=1
3642
if c == self.END:
3743
if len(buffer):
3844
break
3945
continue
4046

4147
if c == self.ESC:
42-
c = self.ser.read(1)
48+
c = bytes(buf[n])
49+
n+=1
4350
if c is None or not len(c):
4451
raise serial.SerialTimeoutException('Packet ended too early')
4552
if c == self.ESC_END:
4653
buffer += self.END
4754
elif c == self.ESC_ESC:
4855
buffer += self.ESC
4956
else:
50-
buffer += c
57+
buffer += bytes(c)
5158
return buffer
5259

5360
def receive_obj(self) -> OscBundle | OscMessage:

0 commit comments

Comments
 (0)