/**@brief Function for handling advertising events. * * @details This function is called for advertising events that are passed to the application. * * @param[in] ble_adv_evt Advertising event. */ static void on_adv_evt(ble_adv_evt_t ble_adv_evt) { uint32_t err_code; QS_BEGIN(TRACE_ADV_EVT, &l_SD) QS_U8(0, ble_adv_evt); QS_END() QS_START_TX(); switch (ble_adv_evt) { case BLE_ADV_EVT_IDLE: BSP_stop(); break; case BLE_ADV_EVT_WHITELIST_REQUEST: { ble_gap_whitelist_t whitelist; ble_gap_addr_t * p_whitelist_addr[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; ble_gap_irk_t * p_whitelist_irk[BLE_GAP_WHITELIST_IRK_MAX_COUNT]; whitelist.addr_count = BLE_GAP_WHITELIST_ADDR_MAX_COUNT; whitelist.irk_count = BLE_GAP_WHITELIST_IRK_MAX_COUNT; whitelist.pp_addrs = p_whitelist_addr; whitelist.pp_irks = p_whitelist_irk; err_code = dm_whitelist_create(&m_app_handle, &whitelist); APP_ERROR_CHECK(err_code); err_code = ble_advertising_whitelist_reply(&whitelist); APP_ERROR_CHECK(err_code); break; } } }
/**@breif Function to start scanning. */ static void scan_start(void) { ble_gap_whitelist_t whitelist; ble_gap_addr_t * p_whitelist_addr[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; ble_gap_irk_t * p_whitelist_irk[BLE_GAP_WHITELIST_IRK_MAX_COUNT]; uint32_t err_code; uint32_t count; // Verify if there is any flash access pending, if yes delay starting scanning until // it's complete. err_code = pstorage_access_status_get(&count); APP_ERROR_CHECK(err_code); if (count != 0) { m_memory_access_in_progress = true; return; } // Initialize whitelist parameters. whitelist.addr_count = BLE_GAP_WHITELIST_ADDR_MAX_COUNT; whitelist.irk_count = 0; whitelist.pp_addrs = p_whitelist_addr; whitelist.pp_irks = p_whitelist_irk; // Request creating of whitelist. err_code = dm_whitelist_create(&m_dm_app_id,&whitelist); APP_ERROR_CHECK(err_code); if (((whitelist.addr_count == 0) && (whitelist.irk_count == 0)) || (m_scan_mode != BLE_WHITELIST_SCAN)) { // No devices in whitelist, hence non selective performed. m_scan_param.active = 0; // Active scanning set. m_scan_param.selective = 0; // Selective scanning not set. m_scan_param.interval = SCAN_INTERVAL;// Scan interval. m_scan_param.window = SCAN_WINDOW; // Scan window. m_scan_param.p_whitelist = NULL; // No whitelist provided. m_scan_param.timeout = 0x0000; // No timeout. } else { // Selective scanning based on whitelist first. m_scan_param.active = 0; // Active scanning set. m_scan_param.selective = 1; // Selective scanning not set. m_scan_param.interval = SCAN_INTERVAL;// Scan interval. m_scan_param.window = SCAN_WINDOW; // Scan window. m_scan_param.p_whitelist = &whitelist; // Provide whitelist. m_scan_param.timeout = 0x001E; // 30 seconds timeout. // Set whitelist scanning state. m_scan_mode = BLE_WHITELIST_SCAN; } err_code = sd_ble_gap_scan_start(&m_scan_param); APP_ERROR_CHECK(err_code); err_code = bsp_indication_set(BSP_INDICATE_SCANNING); APP_ERROR_CHECK(err_code); }
/**@brief Function for handling advertising events. * * @details This function will be called for advertising events which are passed to the application. * * @param[in] ble_adv_evt Advertising event. */ static void on_adv_evt(ble_adv_evt_t ble_adv_evt) { uint32_t err_code; switch (ble_adv_evt) { case BLE_ADV_EVT_DIRECTED: err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING_DIRECTED); APP_ERROR_CHECK(err_code); break; case BLE_ADV_EVT_FAST: err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING); APP_ERROR_CHECK(err_code); break; case BLE_ADV_EVT_SLOW: err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING_SLOW); APP_ERROR_CHECK(err_code); break; case BLE_ADV_EVT_FAST_WHITELIST: err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING_WHITELIST); APP_ERROR_CHECK(err_code); break; case BLE_ADV_EVT_SLOW_WHITELIST: err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING_WHITELIST); APP_ERROR_CHECK(err_code); err_code = ble_advertising_restart_without_whitelist(); APP_ERROR_CHECK(err_code); break; case BLE_ADV_EVT_IDLE: sleep_mode_enter(); break; case BLE_ADV_EVT_WHITELIST_REQUEST: { ble_gap_whitelist_t whitelist; ble_gap_addr_t * p_whitelist_addr[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; ble_gap_irk_t * p_whitelist_irk[BLE_GAP_WHITELIST_IRK_MAX_COUNT]; whitelist.addr_count = BLE_GAP_WHITELIST_ADDR_MAX_COUNT; whitelist.irk_count = BLE_GAP_WHITELIST_IRK_MAX_COUNT; whitelist.pp_addrs = p_whitelist_addr; whitelist.pp_irks = p_whitelist_irk; err_code = dm_whitelist_create(&m_app_handle, &whitelist); APP_ERROR_CHECK(err_code); err_code = ble_advertising_whitelist_reply(&whitelist); APP_ERROR_CHECK(err_code); break; } default: break; } }
ble_error_t btle_createWhitelistFromBondTable(ble_gap_whitelist_t *p_whitelist) { if (!btle_hasInitializedSecurity()) { return BLE_ERROR_INITIALIZATION_INCOMPLETE; } ret_code_t err = dm_whitelist_create(&applicationInstance, p_whitelist); if (err == NRF_SUCCESS) { return BLE_ERROR_NONE; } else if (err == NRF_ERROR_NULL) { return BLE_ERROR_PARAM_OUT_OF_RANGE; } else { return BLE_ERROR_INVALID_STATE; } }
/**@brief Function for starting advertising. */ static void advertising_start(void) { uint32_t err_code; ble_gap_adv_params_t adv_params; ble_gap_whitelist_t whitelist; uint32_t count; // Verify if there is any flash access pending, if yes delay starting advertising until // it's complete. err_code = pstorage_access_status_get(&count); APP_ERROR_CHECK(err_code); if (count != 0) { m_memory_access_in_progress = true; return; } // Initialize advertising parameters with defaults values memset(&adv_params, 0, sizeof(adv_params)); adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; adv_params.p_peer_addr = NULL; adv_params.fp = BLE_GAP_ADV_FP_ANY; adv_params.p_whitelist = NULL; // Configure advertisement according to current advertising state switch (m_advertising_mode) { case BLE_NO_ADV: m_advertising_mode = BLE_FAST_ADV_WHITELIST; // fall through. case BLE_FAST_ADV_WHITELIST: { ble_gap_addr_t * p_whitelist_addr[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; ble_gap_irk_t * p_whitelist_irk[BLE_GAP_WHITELIST_IRK_MAX_COUNT]; whitelist.addr_count = BLE_GAP_WHITELIST_ADDR_MAX_COUNT; whitelist.irk_count = BLE_GAP_WHITELIST_IRK_MAX_COUNT; whitelist.pp_addrs = p_whitelist_addr; whitelist.pp_irks = p_whitelist_irk; err_code = dm_whitelist_create(&m_app_handle, &whitelist); APP_ERROR_CHECK(err_code); if ((whitelist.addr_count != 0) || (whitelist.irk_count != 0)) { adv_params.fp = BLE_GAP_ADV_FP_FILTER_CONNREQ; adv_params.p_whitelist = &whitelist; advertising_init(BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED); m_advertising_mode = BLE_FAST_ADV; } else { m_advertising_mode = BLE_SLOW_ADV; } adv_params.interval = APP_ADV_INTERVAL_FAST; adv_params.timeout = APP_FAST_ADV_TIMEOUT; err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING_WHITELIST); APP_ERROR_CHECK(err_code); break; } case BLE_FAST_ADV: advertising_init(BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE); adv_params.interval = APP_ADV_INTERVAL_FAST; adv_params.timeout = APP_FAST_ADV_TIMEOUT; m_advertising_mode = BLE_SLOW_ADV; err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING); APP_ERROR_CHECK(err_code); break; case BLE_SLOW_ADV: advertising_init(BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE); adv_params.interval = APP_ADV_INTERVAL_SLOW; adv_params.timeout = APP_SLOW_ADV_TIMEOUT; m_advertising_mode = BLE_SLEEP; err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING_SLOW); APP_ERROR_CHECK(err_code); break; default: // No implementation needed. break; } // Start advertising. err_code = sd_ble_gap_adv_start(&adv_params); APP_ERROR_CHECK(err_code); }