aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-03-08 21:24:27 -0500
committerKevin O'Connor <kevin@koconnor.net>2017-03-08 21:25:54 -0500
commit21c4dea0e634a04ffdc8826b172e5ed9842dab83 (patch)
treec8368a17b282e8376c28a6a8cfb5b266fd76b60d
parentbcaf818c0e2bc6b92a579318b9ac97911d0104bf (diff)
downloadkutter-21c4dea0e634a04ffdc8826b172e5ed9842dab83.tar.gz
kutter-21c4dea0e634a04ffdc8826b172e5ed9842dab83.tar.xz
kutter-21c4dea0e634a04ffdc8826b172e5ed9842dab83.zip
serialhdl: Detect timeout in SerialReader.send_with_response()
Raise an error if the response is never received. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--klippy/serialhdl.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/klippy/serialhdl.py b/klippy/serialhdl.py
index 408e85da..0156f279 100644
--- a/klippy/serialhdl.py
+++ b/klippy/serialhdl.py
@@ -8,6 +8,9 @@ import serial
import msgproto, chelper, util
+class error(Exception):
+ pass
+
class SerialReader:
BITS_PER_BYTE = 10.
def __init__(self, reactor, serialport, baud):
@@ -230,6 +233,7 @@ class SerialReader:
# Class to retry sending of a query command until a given response is received
class SerialRetryCommand:
+ TIMEOUT_TIME = 5.0
RETRY_TIME = 0.500
def __init__(self, serial, cmd, name):
self.serial = serial
@@ -240,6 +244,9 @@ class SerialRetryCommand:
self.serial.register_callback(self.handle_callback, self.name)
self.send_timer = self.serial.reactor.register_timer(
self.send_event, self.serial.reactor.NOW)
+ def unregister(self):
+ self.serial.unregister_callback(self.name)
+ self.serial.reactor.unregister_timer(self.send_timer)
def send_event(self, eventtime):
if self.response is not None:
return self.serial.reactor.NEVER
@@ -253,8 +260,10 @@ class SerialRetryCommand:
eventtime = self.serial.reactor.monotonic()
while self.response is None:
eventtime = self.serial.reactor.pause(eventtime + 0.05)
- self.serial.unregister_callback(self.name)
- self.serial.reactor.unregister_timer(self.send_timer)
+ if eventtime > self.min_query_time + self.TIMEOUT_TIME:
+ self.unregister()
+ raise error("Timeout on wait for '%s' response" % (self.name,))
+ self.unregister()
return self.response
# Code to start communication and download message type dictionary