Establish a connection to a single SK8.

        Args:
            device: either a :class:`ScanResult` or a plain hardware address string
                in xx:xx:xx:xx:xx:xx format.
            calibration (bool): True to attempt to load calibration data for this
                device after connection, False otherwise. See :meth:`SK8.load_calibration`.

        Returns:
            tuple (`result`, `device`), where `result` is a bool indicating if a 
            connection was created successfully. If `result` is True, `device` will
            be set to a new :class:`SK8` instance. Otherwise it will be None.

def connect_direct(self, device, calibration=True):
        """Establish a connection to a single SK8.

        Args:
            device: either a :class:`ScanResult` or a plain hardware address string
                in xx:xx:xx:xx:xx:xx format.
            calibration (bool): True to attempt to load calibration data for this
                device after connection, False otherwise. See :meth:`SK8.load_calibration`.

        Returns:
            tuple (`result`, `device`), where `result` is a bool indicating if a 
            connection was created successfully. If `result` is True, `device` will
            be set to a new :class:`SK8` instance. Otherwise it will be None.
        """

        # convert string address into a ScanResult if needed
        if not isinstance(device, ScanResult):
            if isinstance(device, str):
                device = ScanResult(device, fmt_addr_raw(device))
            elif isinstance(device, unicode):
                device = device.encode('ascii')
                device = ScanResult(device, fmt_addr_raw(device))
            else:
                logger.warn('Expected ScanResult, found type {} instead!'.format(type(device)))
                return (False, None)

        logger.debug('Connecting directly to device address'.format(device.addr))
        # TODO check number of active connections and fail if exceeds max
        self._set_state(self._STATE_CONNECTING)

        # TODO parameters here = ???
        self.api.ble_cmd_gap_connect_direct(device.raw_addr, 0, 6, 14, 100, 50)
        self._wait_for_state(self._STATE_CONNECTING, 5)

        if self.state != self._STATE_CONNECTED:
            logger.warn('Connection failed!')
            # send end procedure to cancel connection attempt
            self._set_state(self._STATE_GAP_END)
            self.api.ble_cmd_gap_end_procedure()
            self._wait_for_state(self._STATE_GAP_END)
            return (False, None)

        conn_handle = self.conn_handles[-1]
        logger.info('Connection OK, handle is 0x{:02X}'.format(conn_handle))
        sk8 = SK8(self, conn_handle, device, calibration)
        self._add_device(sk8)
        sk8._discover_services()

        return (True, sk8)