aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/serialhdl.py
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2016-11-28 14:52:22 -0500
committerKevin O'Connor <kevin@koconnor.net>2016-11-29 21:58:45 -0500
commita0829c63ded2b039e4aa0cc2ba5b5ca343a8ff82 (patch)
treee9a887f6d830195e97a738b7fd2a697d2fdb92f2 /klippy/serialhdl.py
parent535c7b99b43baf50272c71fcaf52b10f1a707175 (diff)
downloadkutter-a0829c63ded2b039e4aa0cc2ba5b5ca343a8ff82.tar.gz
kutter-a0829c63ded2b039e4aa0cc2ba5b5ca343a8ff82.tar.xz
kutter-a0829c63ded2b039e4aa0cc2ba5b5ca343a8ff82.zip
serialhdl: Make SerialReader.send_with_response() blocking
Use the greenlet mechanism to wait for the response directly in the send_with_response() method. This simplifies the calling code. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/serialhdl.py')
-rw-r--r--klippy/serialhdl.py27
1 files changed, 17 insertions, 10 deletions
diff --git a/klippy/serialhdl.py b/klippy/serialhdl.py
index 09b775cc..a0b3a4ed 100644
--- a/klippy/serialhdl.py
+++ b/klippy/serialhdl.py
@@ -146,8 +146,9 @@ class SerialReader:
def encode_and_send(self, data, minclock, reqclock, cq):
self.ffi_lib.serialqueue_encode_and_send(
self.serialqueue, cq, data, len(data), minclock, reqclock)
- def send_with_response(self, cmd, callback, name):
- SerialRetryCommand(self, cmd, callback, name)
+ def send_with_response(self, cmd, name):
+ src = SerialRetryCommand(self, cmd, name)
+ return src.get_response()
def send_flush(self):
self.ffi_lib.serialqueue_flush_ready(self.serialqueue)
def alloc_command_queue(self):
@@ -207,25 +208,31 @@ class SerialReader:
# Class to retry sending of a query command until a given response is received
class SerialRetryCommand:
RETRY_TIME = 0.500
- def __init__(self, serial, cmd, callback, name):
+ def __init__(self, serial, cmd, name):
self.serial = serial
self.cmd = cmd
- self.callback = callback
self.name = name
+ self.response = None
+ self.min_query_time = time.time()
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 send_event(self, eventtime):
- if self.callback is None:
- self.serial.reactor.unregister_timer(self.send_timer)
+ if self.response is not None:
return self.serial.reactor.NEVER
self.serial.send(self.cmd)
return eventtime + self.RETRY_TIME
def handle_callback(self, params):
- done = self.callback(params)
- if done:
- self.serial.unregister_callback(self.name)
- self.callback = None
+ last_sent_time = params['#sent_time']
+ if last_sent_time >= self.min_query_time:
+ self.response = params
+ def get_response(self):
+ eventtime = time.time()
+ 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)
+ return self.response
# Code to start communication and download message type dictionary
class SerialBootStrap: