diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2016-11-28 14:52:22 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2016-11-29 21:58:45 -0500 |
commit | a0829c63ded2b039e4aa0cc2ba5b5ca343a8ff82 (patch) | |
tree | e9a887f6d830195e97a738b7fd2a697d2fdb92f2 /klippy/serialhdl.py | |
parent | 535c7b99b43baf50272c71fcaf52b10f1a707175 (diff) | |
download | kutter-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.py | 27 |
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: |