docs: def get_buffer_data(self, start: int, count: int) -> typing.Optional[typing.List[typing.List[typing.Dict]]]:
          """Get recently acquired (buffered) data.
  
          The start parameter can be negative to index backwards from the end.
  
          If start refers to a buffer item that doesn't exist or if count requests too many buffer items given
          the start value, the returned list may have fewer elements than count.
  
          Returns None if buffering is not enabled.
          """
          if hasattr(self.__device, "get_buffer_data"):
              buffer_data = self.__device.get_buffer_data(start, count)
  
              enabled_channel_states = list()
              for channel_index in range(self.channel_count):
                  channel_state = self.get_channel_state(channel_index)
                  if channel_state.enabled:
                      enabled_channel_states.append(channel_state)
  
              scan_id = uuid.uuid4()
  
              for data_element_group in buffer_data:
                  for channel_index, (data_element, channel_state) in enumerate(zip(data_element_group, enabled_channel_states)):
                      channel_name = channel_state.name
                      channel_id = channel_state.channel_id
                      if self.subscan_enabled:
                          channel_id += "_subscan"
                      properties = data_element["properties"]
                      update_autostem_properties(data_element, self.__stem_controller)
                      update_calibration_metadata(data_element, None, data_element["data"].shape, scan_id, None, channel_name, channel_id, properties, None, 0)
                      data_element["properties"]["channel_index"] = channel_index
                      data_element["properties"]["hardware_source_name"] = self.display_name
                      data_element["properties"]["hardware_source_id"] = self.hardware_source_id
  
              return buffer_data
  
          return None