From ea9a40d42e3d3b03bad7008a03d8d7b00aeccbee Mon Sep 17 00:00:00 2001 From: Andrew Kay Date: Wed, 31 Jul 2019 19:10:52 -0500 Subject: [PATCH] Refactor POLL delay --- oec/controller.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/oec/controller.py b/oec/controller.py index d6332a4..bacc686 100644 --- a/oec/controller.py +++ b/oec/controller.py @@ -34,11 +34,11 @@ class Controller: self.connected_poll_period = 1 / 10 self.disconnected_poll_period = 5 + self.last_poll_time = None + self.last_poll_response = None + def run(self): """Run the controller.""" - last_poll_time = None - last_poll_response = None - self.running = True while self.running: @@ -48,8 +48,6 @@ class Controller: except SessionDisconnectedError: self._handle_session_disconnected() - last_poll_time = self._poll_delay(last_poll_time, last_poll_response) - try: poll_response = self._poll() except ReceiveTimeout: @@ -70,8 +68,6 @@ class Controller: if poll_response: self._handle_poll_response(poll_response) - last_poll_response = poll_response - def _handle_terminal_attached(self, poll_response): self.logger.info('Terminal attached') @@ -143,6 +139,13 @@ class Controller: self.session.handle_key(key, modifiers, scan_code) def _poll(self): + delay = self._calculate_poll_delay() + + if delay > 0: + time.sleep(delay) + + self.last_poll_time = time.perf_counter() + poll_response = poll(self.interface, timeout=1) if poll_response: @@ -153,18 +156,20 @@ class Controller: except ProtocolError as error: self.logger.warning(f'POLL_ACK protocol error: {error}', exc_info=error) + self.last_poll_response = poll_response + return poll_response - def _poll_delay(self, last_poll_time, last_poll_response): - if last_poll_response is None and last_poll_time is not None: - if self.terminal: - period = self.connected_poll_period - else: - period = self.disconnected_poll_period + def _calculate_poll_delay(self): + if self.last_poll_response is not None: + return 0 - delay = (last_poll_time + period) - time.perf_counter() + if self.last_poll_time is None: + return 0 - if delay > 0: - time.sleep(delay) + if self.terminal: + period = self.connected_poll_period + else: + period = self.disconnected_poll_period - return time.perf_counter() + return (self.last_poll_time + period) - time.perf_counter()