From 1d29893e8bf8da94312e7ed7762c796a8130b2ba Mon Sep 17 00:00:00 2001 From: samuelsadok Date: Tue, 2 Jun 2020 10:28:24 +0200 Subject: [PATCH] Merge pull request #10 from RoCkaZ/master Only set new timeout if it is different from the old one --- Firmware/fibre/python/fibre/serial_transport.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Firmware/fibre/python/fibre/serial_transport.py b/Firmware/fibre/python/fibre/serial_transport.py index 931a9415..e737dfca 100644 --- a/Firmware/fibre/python/fibre/serial_transport.py +++ b/Firmware/fibre/python/fibre/serial_transport.py @@ -17,7 +17,8 @@ DEFAULT_BAUDRATE = 115200 class SerialStreamTransport(fibre.protocol.StreamSource, fibre.protocol.StreamSink): def __init__(self, port, baud): - self._dev = serial.Serial(port, baud, timeout=1) + self._timeout = 1 + self._dev = serial.Serial(port, baud, timeout=self._timeout) def process_bytes(self, bytes): self._dev.write(bytes) @@ -29,10 +30,16 @@ class SerialStreamTransport(fibre.protocol.StreamSource, fibre.protocol.StreamSi function blocks forever. A deadline before the current time corresponds to non-blocking mode. """ - if deadline is None: + # Only set new timeout value if it is reasonably different from the old one (e.g. 20% as below) + # Otherwise it adds significant overhead (at least under Win10) as the port is reset with every reconfiguration + if deadline is None and self._timeout is not None: + self._timeout = None self._dev.timeout = None - else: - self._dev.timeout = max(deadline - time.monotonic(), 0) + elif deadline is not None: + new_timeout = max(deadline - time.monotonic(), 0) + if abs(new_timeout - self._timeout) > self._timeout * 0.2: + self._timeout = new_timeout + self._dev.timeout = new_timeout return self._dev.read(n_bytes) def get_bytes_or_fail(self, n_bytes, deadline):