| @@ -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): | |||