Begins a BLE scan and returns immediately.

        Using this method you can begin a BLE scan and leave the dongle in scanning
        mode in the background. It will remain in scanning mode until you call the
        :meth:`end_scan` method or the :meth:`reset` method. 

        Args:
            callback (callbable): a callback that will be called for each new device
                discovered by the scanning process. Will be passed a single argument,
                a :class:`ScanResult` object. May be None if not needed.
            interval (int): BLE scan interval, in units of 625us
            window (int): BLE scan window, in units of 625us

        Returns:
            True on success, False otherwise.

def begin_scan(self, callback=None, interval=DEF_SCAN_INTERVAL, window=DEF_SCAN_WINDOW):
        """Begins a BLE scan and returns immediately.

        Using this method you can begin a BLE scan and leave the dongle in scanning
        mode in the background. It will remain in scanning mode until you call the
        :meth:`end_scan` method or the :meth:`reset` method. 

        Args:
            callback (callbable): a callback that will be called for each new device
                discovered by the scanning process. Will be passed a single argument,
                a :class:`ScanResult` object. May be None if not needed.
            interval (int): BLE scan interval, in units of 625us
            window (int): BLE scan window, in units of 625us

        Returns:
            True on success, False otherwise.
        """

        # TODO validate params and current state
        logger.debug('configuring scan parameters') 
        self.api.ble_cmd_gap_set_scan_parameters(interval, window, 1)
        self._set_state(self._STATE_CONFIGURE_SCAN)
        self.api.ble_cmd_gap_discover(1) # any discoverable devices
        self._wait_for_state(self._STATE_CONFIGURE_SCAN)
        # TODO check state

        logger.debug('starting async scan for devices')
        self.scan_targets = None
        self.scan_callback = callback
        self._set_state(self._STATE_SCANNING)
        return True