code: def get_raw_data(self, ptr, unbuffered=False):
          
          if unbuffered:
              self._data_pos = None
          # round down ptr to a 'block boundary'
          idx = ptr - (ptr % 0x20)
          ptr -= idx
          count = self.reading_len[self.ws_type]
          if self._data_pos == idx:
              # cache contains useful data
              result = self._data_block[ptr:ptr + count]
              if len(result) >= count:
                  return result
          else:
              result = list()
          if ptr + count > 0x20:
              # need part of next block, which may be in cache
              if self._data_pos != idx + 0x20:
                  self._data_pos = idx + 0x20
                  self._data_block = self._read_block(self._data_pos)
              result += self._data_block[0:ptr + count - 0x20]
              if len(result) >= count:
                  return result
          # read current block
          self._data_pos = idx
          self._data_block = self._read_block(self._data_pos)
          result = self._data_block[ptr:ptr + count] + result
          return result
docs: Get raw data from circular buffer.
  
          If unbuffered is false then a cached value that was obtained
          earlier may be returned.