code: def _read_packet(self):
          
          # Grab command, send it and decode response
          cmd = self._commands_to_read.popleft()
          try:
              raw_data = self._interface.read()
              raw_data = bytearray(raw_data)
              decoded_data = cmd.decode_data(raw_data)
          except Exception as exception:
              self._abort_all_transfers(exception)
              raise
  
          decoded_data = bytearray(decoded_data)
          self._command_response_buf.extend(decoded_data)
  
          # Attach data to transfers
          pos = 0
          while True:
              size_left = len(self._command_response_buf) - pos
              if size_left == 0:
                  # If size left is 0 then the transfer list might
                  # be empty, so don't try to access element 0
                  break
              transfer = self._transfer_list[0]
              size = transfer.get_data_size()
              if size > size_left:
                  break
  
              self._transfer_list.popleft()
              data = self._command_response_buf[pos:pos + size]
              pos += size
              transfer.add_response(data)
  
          # Remove used data from _command_response_buf
          if pos > 0:
              self._command_response_buf = self._command_response_buf[pos:]
docs: Reads and decodes a single packet
  
          Reads a single packet from the device and
          stores the data from it in the current Command
          object