ble_error_t nRF5xGap::startRadioScan(const GapScanningParams &scanningParams) { ble_gap_scan_params_t scanParams; #if (NRF_SD_BLE_API_VERSION <= 2) /* Allocate the stack's whitelist statically */ ble_gap_whitelist_t whitelist; ble_gap_addr_t *whitelistAddressPtrs[YOTTA_CFG_WHITELIST_MAX_SIZE]; ble_gap_irk_t *whitelistIrkPtrs[YOTTA_CFG_IRK_TABLE_MAX_SIZE]; /* Initialize the whitelist */ whitelist.pp_addrs = whitelistAddressPtrs; whitelist.pp_irks = whitelistIrkPtrs; whitelist.addr_count = 0; whitelist.irk_count = 0; /* Add missing IRKs to whitelist from the bond table held by the SoftDevice */ if (scanningPolicyMode != Gap::SCAN_POLICY_IGNORE_WHITELIST) { ble_error_t error = generateStackWhitelist(whitelist); if (error != BLE_ERROR_NONE) { return error; } } // FIXME: fill the irk list once addresses are resolved by the softdevice. scanParams.selective = scanningPolicyMode; /**< If 1, ignore unknown devices (non whitelisted). */ scanParams.p_whitelist = &whitelist; /**< Pointer to whitelist, NULL if none is given. */ #else /* For NRF_SD_BLE_API_VERSION >= 3 nRF5xGap::setWhitelist setups the whitelist. */ scanParams.use_whitelist = scanningPolicyMode; scanParams.adv_dir_report = 0; #endif scanParams.active = scanningParams.getActiveScanning(); /**< If 1, perform active scanning (scan requests). */ scanParams.interval = scanningParams.getInterval(); /**< Scan interval between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ scanParams.window = scanningParams.getWindow(); /**< Scan window between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ scanParams.timeout = scanningParams.getTimeout(); /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ if (_privacy_enabled) { bool enable_resolution = _central_privacy_configuration.resolution_strategy != CentralPrivacyConfiguration_t::DO_NOT_RESOLVE; update_identities_list(enable_resolution); if (_central_privacy_configuration.use_non_resolvable_random_address) { set_private_non_resolvable_address(); } else { set_private_resolvable_address(); } } if (sd_ble_gap_scan_start(&scanParams) != NRF_SUCCESS) { return BLE_ERROR_PARAM_OUT_OF_RANGE; } return BLE_ERROR_NONE; }
ble_error_t Gap::setScanParams(const GapScanningParams& scanningParams) { return setScanParams( scanningParams.getInterval(), scanningParams.getWindow(), scanningParams.getTimeout(), scanningParams.getActiveScanning() ); }
ble_error_t GenericGap::startRadioScan(const GapScanningParams &scanningParams) { if (is_scan_params_valid(&scanningParams) == false) { return BLE_ERROR_INVALID_PARAM; } if (_scanning_filter_policy == pal::scanning_filter_policy_t::FILTER_ADVERTISING && _whitelist.size == 0) { return BLE_ERROR_INVALID_STATE; } ble_error_t err = _pal_gap.set_scan_parameters( scanningParams.getActiveScanning(), scanningParams.getInterval(), scanningParams.getWindow(), get_own_address_type(), _scanning_filter_policy ); if (err) { return err; } err = _pal_gap.scan_enable(true, false); if (err) { return err; } _scan_timeout.detach(); uint16_t timeout = scanningParams.getTimeout(); if (timeout) { _scan_timeout.attach_us( mbed::callback(this, &GenericGap::on_scan_timeout), scanningParams.getTimeout() * 1000000U ); } return BLE_ERROR_NONE; }
ble_error_t nRF5xGap::startRadioScan(const GapScanningParams &scanningParams) { /* Allocate the stack's whitelist statically */ ble_gap_whitelist_t whitelist; ble_gap_addr_t *whitelistAddressPtrs[YOTTA_CFG_WHITELIST_MAX_SIZE]; ble_gap_irk_t *whitelistIrkPtrs[YOTTA_CFG_IRK_TABLE_MAX_SIZE]; /* Initialize the whitelist */ whitelist.pp_addrs = whitelistAddressPtrs; whitelist.pp_irks = whitelistIrkPtrs; whitelist.addr_count = 0; whitelist.irk_count = 0; /* Add missing IRKs to whitelist from the bond table held by the SoftDevice */ if (scanningPolicyMode != Gap::SCAN_POLICY_IGNORE_WHITELIST) { ble_error_t error = generateStackWhitelist(whitelist); if (error != BLE_ERROR_NONE) { return error; } } ble_gap_scan_params_t scanParams = { .active = scanningParams.getActiveScanning(), /**< If 1, perform active scanning (scan requests). */ .selective = scanningPolicyMode, /**< If 1, ignore unknown devices (non whitelisted). */ .p_whitelist = &whitelist, /**< Pointer to whitelist, NULL if none is given. */ .interval = scanningParams.getInterval(), /**< Scan interval between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ .window = scanningParams.getWindow(), /**< Scan window between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ .timeout = scanningParams.getTimeout(), /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ }; if (sd_ble_gap_scan_start(&scanParams) != NRF_SUCCESS) { return BLE_ERROR_PARAM_OUT_OF_RANGE; } return BLE_ERROR_NONE; } ble_error_t nRF5xGap::stopScan(void) { if (sd_ble_gap_scan_stop() == NRF_SUCCESS) { return BLE_ERROR_NONE; } return BLE_STACK_BUSY; } #endif /**************************************************************************/ /*! @brief Stops the BLE HW and disconnects from any devices @returns ble_error_t @retval BLE_ERROR_NONE Everything executed properly @section EXAMPLE @code @endcode */ /**************************************************************************/ ble_error_t nRF5xGap::stopAdvertising(void) { /* Stop Advertising */ ASSERT_TRUE(ERROR_NONE == sd_ble_gap_adv_stop(), BLE_ERROR_PARAM_OUT_OF_RANGE); state.advertising = 0; return BLE_ERROR_NONE; }
ble_error_t nRF5xGap::startRadioScan(const GapScanningParams &scanningParams) { ble_gap_scan_params_t scanParams; #if (NRF_SD_BLE_API_VERSION <= 2) /* Allocate the stack's whitelist statically */ ble_gap_whitelist_t whitelist; ble_gap_addr_t *whitelistAddressPtrs[YOTTA_CFG_WHITELIST_MAX_SIZE]; ble_gap_irk_t *whitelistIrkPtrs[YOTTA_CFG_IRK_TABLE_MAX_SIZE]; /* Initialize the whitelist */ whitelist.pp_addrs = whitelistAddressPtrs; whitelist.pp_irks = whitelistIrkPtrs; whitelist.addr_count = 0; whitelist.irk_count = 0; whitelist.addr_count = whitelistAddressesSize; for (uint32_t i = 0; i < whitelistAddressesSize; ++i) { whitelistAddressPtrs[i] = &whitelistAddresses[i]; } if (_privacy_enabled) { if (_central_privacy_configuration.resolution_strategy != CentralPrivacyConfiguration_t::DO_NOT_RESOLVE) { ArrayView<resolving_list_entry_t> entries = get_sm().get_resolving_list(); size_t limit = std::min( entries.size(), (size_t) YOTTA_CFG_IRK_TABLE_MAX_SIZE ); for (size_t i = 0; i < limit; ++i) { whitelistIrkPtrs[i] = (ble_gap_irk_t*) entries[i].peer_irk.data(); } whitelist.irk_count = limit; } } scanParams.selective = scanningPolicyMode; /**< If 1, ignore unknown devices (non whitelisted). */ scanParams.p_whitelist = &whitelist; /**< Pointer to whitelist, NULL if none is given. */ #else /* For NRF_SD_BLE_API_VERSION >= 3 nRF5xGap::setWhitelist setups the whitelist. */ scanParams.use_whitelist = scanningPolicyMode; scanParams.adv_dir_report = 0; #endif scanParams.active = scanningParams.getActiveScanning(); /**< If 1, perform active scanning (scan requests). */ scanParams.interval = scanningParams.getInterval(); /**< Scan interval between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ scanParams.window = scanningParams.getWindow(); /**< Scan window between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ scanParams.timeout = scanningParams.getTimeout(); /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ if (_privacy_enabled) { if (_central_privacy_configuration.use_non_resolvable_random_address) { set_private_non_resolvable_address(); } else { set_private_resolvable_address(); } } if (sd_ble_gap_scan_start(&scanParams) != NRF_SUCCESS) { return BLE_ERROR_PARAM_OUT_OF_RANGE; } return BLE_ERROR_NONE; }