docs: def _read_channel_timing(self, delay_factor=1, max_loops=150):
          """Read data on the channel based on timing delays.
  
          Attempt to read channel max_loops number of times. If no data this will cause a 15 second
          delay.
  
          Once data is encountered read channel for another two seconds (2 * delay_factor) to make
          sure reading of channel is complete.
  
          :param delay_factor: multiplicative factor to adjust delay when reading channel (delays
              get multiplied by this factor)
          :type delay_factor: int or float
  
          :param max_loops: maximum number of loops to iterate through before returning channel data.
              Will default to be based upon self.timeout.
          :type max_loops: int
          """
          # Time to delay in each read loop
          loop_delay = 0.1
          final_delay = 2
  
          # Default to making loop time be roughly equivalent to self.timeout (support old max_loops
          # and delay_factor arguments for backwards compatibility).
          delay_factor = self.select_delay_factor(delay_factor)
          if delay_factor == 1 and max_loops == 150:
              max_loops = int(self.timeout / loop_delay)
  
          channel_data = ""
          i = 0
          while i <= max_loops:
              time.sleep(loop_delay * delay_factor)
              new_data = self.read_channel()
              if new_data:
                  channel_data += new_data
              else:
                  # Safeguard to make sure really done
                  time.sleep(final_delay * delay_factor)
                  new_data = self.read_channel()
                  if not new_data:
                      break
                  else:
                      channel_data += new_data
              i += 1
          return channel_data