code: async def _sonar_data(self, data):
          
  
          # strip off sysex start and end
          data = data[1:-1]
          pin_number = data[0]
          val = int((data[PrivateConstants.MSB] << 7) +
                    data[PrivateConstants.LSB])
          reply_data = []
  
          sonar_pin_entry = self.active_sonar_map[pin_number]
  
          if sonar_pin_entry[0] is not None:
              # check if value changed since last reading
              if sonar_pin_entry[2] != val:
                  sonar_pin_entry[2] = val
                  self.active_sonar_map[pin_number] = sonar_pin_entry
                  # Do a callback if one is specified in the table
                  if sonar_pin_entry[0]:
                      # if this is an asyncio callback type
                      reply_data.append(pin_number)
                      reply_data.append(val)
                      if sonar_pin_entry[1]:
                          await sonar_pin_entry[0](reply_data)
                      else:
                          # sonar_pin_entry[0]([pin_number, val])
                          loop = self.loop
                          loop.call_soon(sonar_pin_entry[0], reply_data)
          # update the data in the table with latest value
          else:
              sonar_pin_entry[1] = val
              self.active_sonar_map[pin_number] = sonar_pin_entry
  
          await asyncio.sleep(self.sleep_tune)
docs: This method handles the incoming sonar data message and stores
          the data in the response table.
  
          :param data: Message data from Firmata
  
          :returns: No return value.