diff --git a/alarmdecoder/devices.py b/alarmdecoder/devices.py index 9451d39..76d5896 100644 --- a/alarmdecoder/devices.py +++ b/alarmdecoder/devices.py @@ -418,7 +418,7 @@ class USBDevice(Device): """ Reads a line from the device. - :param timeout: Read timeout + :param timeout: The read timeout. :type timeout: float :param purge_buffer: Indicates whether to purge the buffer prior to reading. @@ -428,21 +428,18 @@ class USBDevice(Device): :raises: CommError, TimeoutError """ - if purge_buffer: - self._buffer = '' - def timeout_event(): """Handles read timeout event""" timeout_event.reading = False - timeout_event.reading = True - got_line = False - ret = None + if purge_buffer: + self._buffer = '' + + got_line, ret = False, None - timer = None + timer = threading.Timer(timeout, timeout_event) if timeout > 0: - timer = threading.Timer(timeout, timeout_event) timer.start() try: @@ -453,37 +450,27 @@ class USBDevice(Device): self._buffer += buf if buf == "\n": - if len(self._buffer) > 1: - if self._buffer[-2] == "\r": - self._buffer = self._buffer[:-2] - - # Ignore if we just got \r\n with nothing else - # in the buffer. - if len(self._buffer) != 0: - got_line = True - break - else: - self._buffer = self._buffer[:-1] + self._buffer = self._buffer.rstrip("\r\n") - except (usb.core.USBError, FtdiError), err: - if timer: - timer.cancel() + if len(self._buffer) > 0: + got_line = True + break + except (usb.core.USBError, FtdiError), err: raise CommError('Error reading from device: {0}'.format(str(err)), err) else: if got_line: - ret = self._buffer - self._buffer = '' + ret, self._buffer = self._buffer, '' self.on_read(data=ret) - if timer: - if timer.is_alive(): - timer.cancel() else: raise TimeoutError('Timeout while waiting for line terminator.') + finally: + timer.cancel() + return ret def _get_serial_number(self): @@ -719,25 +706,22 @@ class SerialDevice(Device): reading. :type purge_buffer: bool - :returns: The line read. + :returns: The line that was read. :raises: CommError, TimeoutError """ - if purge_buffer: - self._buffer = '' - def timeout_event(): """Handles read timeout event""" timeout_event.reading = False - timeout_event.reading = True - got_line = False - ret = None + if purge_buffer: + self._buffer = '' + + got_line, ret = False, None - timer = None + timer = threading.Timer(timeout, timeout_event) if timeout > 0: - timer = threading.Timer(timeout, timeout_event) timer.start() try: @@ -749,37 +733,27 @@ class SerialDevice(Device): self._buffer += buf if buf == "\n": - if len(self._buffer) > 1: - if self._buffer[-2] == "\r": - self._buffer = self._buffer[:-2] - - # Ignore if we just got \r\n with nothing else - # in the buffer. - if len(self._buffer) != 0: - got_line = True - break - else: - self._buffer = self._buffer[:-1] + self._buffer = self._buffer.rstrip("\r\n") - except (OSError, serial.SerialException), err: - if timer: - timer.cancel() + if len(self._buffer) > 0: + got_line = True + break + except (OSError, serial.SerialException), err: raise CommError('Error reading from device: {0}'.format(str(err)), err) else: if got_line: - ret = self._buffer - self._buffer = '' + ret, self._buffer = self._buffer, '' self.on_read(data=ret) - if timer: - if timer.is_alive(): - timer.cancel() else: raise TimeoutError('Timeout while waiting for line terminator.') + finally: + timer.cancel() + return ret @@ -1008,25 +982,22 @@ class SocketDevice(Device): reading. :type purge_buffer: bool - :returns: The line read from the device. + :returns: The line that was read.: :raises: CommError, TimeoutError """ - if purge_buffer: - self._buffer = '' - def timeout_event(): """Handles read timeout event""" timeout_event.reading = False - timeout_event.reading = True - got_line = False - ret = None + if purge_buffer: + self._buffer = '' - timer = None + got_line, ret = False, None + + timer = threading.Timer(timeout, timeout_event) if timeout > 0: - timer = threading.Timer(timeout, timeout_event) timer.start() try: @@ -1037,37 +1008,27 @@ class SocketDevice(Device): self._buffer += buf if buf == "\n": - if len(self._buffer) > 1: - if self._buffer[-2] == "\r": - self._buffer = self._buffer[:-2] - - # Ignore if we just got \r\n with nothing else - # in the buffer. - if len(self._buffer) != 0: - got_line = True - break - else: - self._buffer = self._buffer[:-1] + self._buffer = self._buffer.rstrip("\r\n") - except socket.error, err: - if timer: - timer.cancel() + if len(self._buffer) > 0: + got_line = True + break + except socket.error, err: raise CommError('Error reading from device: {0}'.format(str(err)), err) else: if got_line: - ret = self._buffer - self._buffer = '' + ret, self._buffer = self._buffer, '' self.on_read(data=ret) - if timer: - if timer.is_alive(): - timer.cancel() else: raise TimeoutError('Timeout while waiting for line terminator.') + finally: + timer.cancel() + return ret def _init_ssl(self):