def identify_connection(self):
        """Identifies which processor this serial connection is talking to."""

        # keep looping and wait for an ID response

        msg = ''

        while True:
            self.platform.log.debug("Sending 'ID:' command to port '%s'",
                                    self.serial_connection.name)
            self.serial_connection.write('ID:\r')
            msg = self.serial_io.readline()  # todo timeout
            if msg.startswith('ID:'):
                break

        # examples of ID responses
        # ID:DMD FP-CPU-002-1 00.87
        # ID:NET FP-CPU-002-2 00.85
        # ID:RGB FP-CPU-002-2 00.85

        try:
            self.remote_processor, self.remote_model, self.remote_firmware = (
                msg[3:].split())
        except __HOLE__:
            self.remote_processor, self.remote_model, = msg[3:].split()

        self.platform.log.info("Received ID acknowledgement. Processor: %s, "
                               "Board: %s, Firmware: %s", self.remote_processor,
                               self.remote_model, self.remote_firmware)

        if self.remote_processor == 'DMD':
            min_version = DMD_MIN_FW
            latest_version = DMD_LATEST_FW
            self.dmd = True
        elif self.remote_processor == 'NET':
            min_version = NET_MIN_FW
            latest_version = NET_LATEST_FW
        else:
            min_version = RGB_MIN_FW
            latest_version = RGB_LATEST_FW

        if StrictVersion(min_version) > StrictVersion(self.remote_firmware):
            self.platform.log.critical("Firmware version mismatch. MPF requires"
                " the %s processor to be firmware %s, but yours is %s",
                self.remote_processor, min_version, self.remote_firmware)
            sys.exit()

        if self.remote_processor == 'NET' and self.platform.machine_type == 'fast':
            self.query_fast_io_boards()
dataset/ETHPy150Open missionpinball/mpf/mpf/platform/fast.py/SerialCommunicator.identify_connection