This method must be called immediately after the class is instantiated.
        It instantiates the serial interface and then performs auto pin
        discovery.
        It is intended for use by pymata3 applications that do not
        use asyncio coroutines directly.

        :returns: No return value.

def start(self):
        """
        This method must be called immediately after the class is instantiated.
        It instantiates the serial interface and then performs auto pin
        discovery.
        It is intended for use by pymata3 applications that do not
        use asyncio coroutines directly.

        :returns: No return value.
        """

        # check if user specified a socket transport
        if self.ip_address:
            self.socket = PymataSocket(self.ip_address, self.ip_port, self.loop)
            self.loop.run_until_complete((self.socket.start()))
            # set the read and write handles
            self.read = self.socket.read
            self.write = self.socket.write
            for i in range(0, len(self.ip_handshake)):
                self.loop.run_until_complete((self.read()))
        else:
            try:
                self.serial_port = PymataSerial(self.com_port, 57600,
                                                self.sleep_tune,
                                                self.log_output)
                # set the read and write handles
                self.read = self.serial_port.read
                self.write = self.serial_port.write
            except serial.SerialException:
                if self.log_output:
                    log_string = 'Cannot instantiate serial interface: ' \
                                 + self.com_port
                    logging.exception(log_string)
                else:
                    print(
                        'Cannot instantiate serial interface: ' + self.com_port)
                    print('To see a list of serial ports, type: "list_serial_ports" in your console.')
                sys.exit(0)

        # wait for arduino to go through a reset cycle if need be
        time.sleep(self.arduino_wait)

        # register the get_command method with the event loop
        # self.loop = asyncio.get_event_loop()
        self.the_task = self.loop.create_task(self._command_dispatcher())

        # get arduino firmware version and print it
        try:
            firmware_version = self.loop.run_until_complete(self.get_firmware_version())
            if self.log_output:
                log_string = "\nArduino Firmware ID: " + firmware_version
                logging.exception(log_string)
            else:
                print("\nArduino Firmware ID: " + firmware_version)
        except TypeError:
            print('\nIs your serial cable plugged in and do you have the correct Firmata sketch loaded?')
            print('Is the COM port correct?')
            print('To see a list of serial ports, type: "list_serial_ports" in your console.')
            sys.exit(0)

        # try to get an analog pin map. if it comes back as none - shutdown
        report = self.loop.run_until_complete(self.get_analog_map())
        if not report:
            if self.log_output:
                log_string = '*** Analog map retrieval timed out. ***'

                logging.exception(log_string)
                log_string = '\nDo you have Arduino connectivity and do you ' \
                             'have a Firmata sketch uploaded to the board?'
                logging.exception(log_string)

            else:
                print('*** Analog map retrieval timed out. ***')
                print('\nDo you have Arduino connectivity and do you have a '
                      'Firmata sketch uploaded to the board?')
            try:
                loop = self.loop
                for t in asyncio.Task.all_tasks(loop):
                    t.cancel()
                loop.run_until_complete(asyncio.sleep(.1))
                loop.close()
                loop.stop()
                sys.exit(0)
            except RuntimeError:
                # this suppresses the Event Loop Is Running message, which may
                # be a bug in python 3
                sys.exit(0)
            except TypeError:
                sys.exit(0)

        # custom assemble the pin lists
        for pin in report:
            digital_data = PinData()
            self.digital_pins.append(digital_data)
            if pin != Constants.IGNORE:
                analog_data = PinData()
                self.analog_pins.append(analog_data)

        if self.log_output:
            log_string = 'Auto-discovery complete. Found ' + \
                         str(len(self.digital_pins)) + ' Digital Pins and ' + \
                         str(len(self.analog_pins)) + ' Analog Pins'
            logging.info(log_string)
        else:
            print('{} {} {} {} {}'.format('Auto-discovery complete. Found',
                                          len(self.digital_pins),
                                          'Digital Pins and',
                                          len(self.analog_pins),
                                          'Analog Pins\n\n'))
        self.first_analog_pin = len(self.digital_pins) - len(self.analog_pins)