code: async def _report_firmware(self, sysex_data):
          
          # first byte after command is major number
          major = sysex_data[1]
          version_string = str(major)
  
          # next byte is minor number
          minor = sysex_data[2]
  
          # append a dot to major number
          version_string += '.'
  
          # append minor number
          version_string += str(minor)
          # add a space after the major and minor numbers
          version_string += ' '
  
          # slice the identifier - from the first byte after the minor
          #  number up until, but not including the END_SYSEX byte
  
          name = sysex_data[3:-1]
          firmware_name_iterator = iter(name)
  
          # convert each element from two 7-bit bytes into characters, then add each
          # character to the version string
          for e in firmware_name_iterator:
              version_string += chr(e + (next(firmware_name_iterator) << 7))
  
          # store the value
          self.query_reply_data[PrivateConstants.REPORT_FIRMWARE] = version_string
docs: This is a private message handler method.
          This method handles the sysex 'report firmware' command sent by
          Firmata (0x79).
          It assembles the firmware version by concatenating the major and
           minor version number components and
          the firmware identifier into a string.
          e.g. "2.3 StandardFirmata.ino"
  
          :param sysex_data: Sysex data sent from Firmata
  
          :returns: None