Martin Gurtner / HKC_MiniCheetah
Committer:
MartinGurtner
Date:
Fri Jan 22 13:10:37 2021 +0000
Revision:
60:8399756e1ba1
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MartinGurtner 60:8399756e1ba1 1 /*
MartinGurtner 60:8399756e1ba1 2 * Copyright (c) 2015 Nordic Semiconductor ASA
MartinGurtner 60:8399756e1ba1 3 * All rights reserved.
MartinGurtner 60:8399756e1ba1 4 *
MartinGurtner 60:8399756e1ba1 5 * Redistribution and use in source and binary forms, with or without modification,
MartinGurtner 60:8399756e1ba1 6 * are permitted provided that the following conditions are met:
MartinGurtner 60:8399756e1ba1 7 *
MartinGurtner 60:8399756e1ba1 8 * 1. Redistributions of source code must retain the above copyright notice, this list
MartinGurtner 60:8399756e1ba1 9 * of conditions and the following disclaimer.
MartinGurtner 60:8399756e1ba1 10 *
MartinGurtner 60:8399756e1ba1 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
MartinGurtner 60:8399756e1ba1 12 * integrated circuit in a product or a software update for such product, must reproduce
MartinGurtner 60:8399756e1ba1 13 * the above copyright notice, this list of conditions and the following disclaimer in
MartinGurtner 60:8399756e1ba1 14 * the documentation and/or other materials provided with the distribution.
MartinGurtner 60:8399756e1ba1 15 *
MartinGurtner 60:8399756e1ba1 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
MartinGurtner 60:8399756e1ba1 17 * used to endorse or promote products derived from this software without specific prior
MartinGurtner 60:8399756e1ba1 18 * written permission.
MartinGurtner 60:8399756e1ba1 19 *
MartinGurtner 60:8399756e1ba1 20 * 4. This software, with or without modification, must only be used with a
MartinGurtner 60:8399756e1ba1 21 * Nordic Semiconductor ASA integrated circuit.
MartinGurtner 60:8399756e1ba1 22 *
MartinGurtner 60:8399756e1ba1 23 * 5. Any software provided in binary or object form under this license must not be reverse
MartinGurtner 60:8399756e1ba1 24 * engineered, decompiled, modified and/or disassembled.
MartinGurtner 60:8399756e1ba1 25 *
MartinGurtner 60:8399756e1ba1 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
MartinGurtner 60:8399756e1ba1 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
MartinGurtner 60:8399756e1ba1 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
MartinGurtner 60:8399756e1ba1 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
MartinGurtner 60:8399756e1ba1 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
MartinGurtner 60:8399756e1ba1 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
MartinGurtner 60:8399756e1ba1 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
MartinGurtner 60:8399756e1ba1 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
MartinGurtner 60:8399756e1ba1 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
MartinGurtner 60:8399756e1ba1 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
MartinGurtner 60:8399756e1ba1 36 *
MartinGurtner 60:8399756e1ba1 37 */
MartinGurtner 60:8399756e1ba1 38
MartinGurtner 60:8399756e1ba1 39
MartinGurtner 60:8399756e1ba1 40
MartinGurtner 60:8399756e1ba1 41 #include "ble_advdata.h"
MartinGurtner 60:8399756e1ba1 42 #include "ble_advertising.h"
MartinGurtner 60:8399756e1ba1 43 #include "nrf_soc.h"
MartinGurtner 60:8399756e1ba1 44 #include "nrf_log.h"
MartinGurtner 60:8399756e1ba1 45 #include "pstorage.h"
MartinGurtner 60:8399756e1ba1 46 #include "fstorage.h"
MartinGurtner 60:8399756e1ba1 47 #include "sdk_common.h"
MartinGurtner 60:8399756e1ba1 48
MartinGurtner 60:8399756e1ba1 49
MartinGurtner 60:8399756e1ba1 50 #define ADV_LOG(...)
MartinGurtner 60:8399756e1ba1 51
MartinGurtner 60:8399756e1ba1 52 static bool m_advertising_start_pending = false; /**< Flag to keep track of ongoing operations on persistent memory. */
MartinGurtner 60:8399756e1ba1 53
MartinGurtner 60:8399756e1ba1 54 static ble_gap_addr_t m_peer_address; /**< Address of the most recently connected peer, used for direct advertising. */
MartinGurtner 60:8399756e1ba1 55 static ble_advdata_t m_advdata; /**< Used by the initialization function to set name, appearance, and UUIDs and advertising flags visible to peer devices. */
MartinGurtner 60:8399756e1ba1 56 static ble_adv_evt_t m_adv_evt; /**< Advertising event propogated to the main application. The event is either a transaction to a new advertising mode, or a request for whitelist or peer address.. */
MartinGurtner 60:8399756e1ba1 57 static ble_advertising_evt_handler_t m_evt_handler; /**< Handler for the advertising events. Can be initialized as NULL if no handling is implemented on in the main application. */
MartinGurtner 60:8399756e1ba1 58 static ble_advertising_error_handler_t m_error_handler; /**< Handler for the advertising error events. */
MartinGurtner 60:8399756e1ba1 59
MartinGurtner 60:8399756e1ba1 60 static ble_adv_mode_t m_adv_mode_current; /**< Variable to keep track of the current advertising mode. */
MartinGurtner 60:8399756e1ba1 61 static ble_adv_modes_config_t m_adv_modes_config; /**< Struct to keep track of disabled and enabled advertising modes, as well as time-outs and intervals.*/
MartinGurtner 60:8399756e1ba1 62
MartinGurtner 60:8399756e1ba1 63 static ble_gap_whitelist_t m_whitelist; /**< Struct that points to whitelisted addresses. */
MartinGurtner 60:8399756e1ba1 64 static ble_gap_addr_t * mp_whitelist_addr[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; /**< Pointer to a list of addresses. Pointed to by the whitelist */
MartinGurtner 60:8399756e1ba1 65 static ble_gap_irk_t * mp_whitelist_irk[BLE_GAP_WHITELIST_IRK_MAX_COUNT]; /**< Pointer to a list of Identity Resolving Keys (IRK). Pointed to by the whitelist */
MartinGurtner 60:8399756e1ba1 66 static bool m_whitelist_temporarily_disabled = false; /**< Flag to keep track of temporary disabling of the whitelist. */
MartinGurtner 60:8399756e1ba1 67 static bool m_whitelist_reply_expected = false; /**< Flag to verify that whitelist is only set when it is requested. */
MartinGurtner 60:8399756e1ba1 68 static bool m_peer_addr_reply_expected = false; /**< Flag to verify that peer address is only set when requested. */
MartinGurtner 60:8399756e1ba1 69
MartinGurtner 60:8399756e1ba1 70 static ble_advdata_manuf_data_t m_manuf_specific_data; /**< Manufacturer specific data structure*/
MartinGurtner 60:8399756e1ba1 71 static uint8_t m_manuf_data_array[BLE_GAP_ADV_MAX_SIZE]; /**< Array to store the Manufacturer specific data*/
MartinGurtner 60:8399756e1ba1 72 static ble_advdata_service_data_t m_service_data; /**< Service data structure. */
MartinGurtner 60:8399756e1ba1 73 static uint8_t m_service_data_array[BLE_GAP_ADV_MAX_SIZE]; /**< Array to store the service data. */
MartinGurtner 60:8399756e1ba1 74 static ble_advdata_conn_int_t m_slave_conn_int; /**< Connection interval range structure.*/
MartinGurtner 60:8399756e1ba1 75 static int8_t m_tx_power_level; /**< TX power level*/
MartinGurtner 60:8399756e1ba1 76
MartinGurtner 60:8399756e1ba1 77
MartinGurtner 60:8399756e1ba1 78 /**@brief Function for checking that the whitelist has entries.
MartinGurtner 60:8399756e1ba1 79 */
MartinGurtner 60:8399756e1ba1 80 static bool whitelist_has_entries(ble_gap_whitelist_t const * whitelist)
MartinGurtner 60:8399756e1ba1 81 {
MartinGurtner 60:8399756e1ba1 82 if ((whitelist->addr_count != 0) || (whitelist->irk_count != 0))
MartinGurtner 60:8399756e1ba1 83 {
MartinGurtner 60:8399756e1ba1 84 return true;
MartinGurtner 60:8399756e1ba1 85 }
MartinGurtner 60:8399756e1ba1 86 return false;
MartinGurtner 60:8399756e1ba1 87 }
MartinGurtner 60:8399756e1ba1 88
MartinGurtner 60:8399756e1ba1 89
MartinGurtner 60:8399756e1ba1 90 /**@brief Function for setting the stored peer address back to zero.
MartinGurtner 60:8399756e1ba1 91 */
MartinGurtner 60:8399756e1ba1 92 static void ble_advertising_peer_address_clear()
MartinGurtner 60:8399756e1ba1 93 {
MartinGurtner 60:8399756e1ba1 94 memset(&m_peer_address, 0, sizeof(m_peer_address));
MartinGurtner 60:8399756e1ba1 95 }
MartinGurtner 60:8399756e1ba1 96
MartinGurtner 60:8399756e1ba1 97
MartinGurtner 60:8399756e1ba1 98 /**@brief Function for checking if an address is non-zero. Used to determine if
MartinGurtner 60:8399756e1ba1 99 */
MartinGurtner 60:8399756e1ba1 100 static bool peer_address_exists(uint8_t const * address)
MartinGurtner 60:8399756e1ba1 101 {
MartinGurtner 60:8399756e1ba1 102 uint32_t i;
MartinGurtner 60:8399756e1ba1 103
MartinGurtner 60:8399756e1ba1 104 for (i = 0; i < BLE_GAP_ADDR_LEN; i++)
MartinGurtner 60:8399756e1ba1 105 {
MartinGurtner 60:8399756e1ba1 106 if (address[i] != 0)
MartinGurtner 60:8399756e1ba1 107 {
MartinGurtner 60:8399756e1ba1 108 return true;
MartinGurtner 60:8399756e1ba1 109 }
MartinGurtner 60:8399756e1ba1 110 }
MartinGurtner 60:8399756e1ba1 111 return false;
MartinGurtner 60:8399756e1ba1 112 }
MartinGurtner 60:8399756e1ba1 113
MartinGurtner 60:8399756e1ba1 114
MartinGurtner 60:8399756e1ba1 115 uint32_t ble_advertising_init(ble_advdata_t const * p_advdata,
MartinGurtner 60:8399756e1ba1 116 ble_advdata_t const * p_srdata,
MartinGurtner 60:8399756e1ba1 117 ble_adv_modes_config_t const * p_config,
MartinGurtner 60:8399756e1ba1 118 ble_advertising_evt_handler_t const evt_handler,
MartinGurtner 60:8399756e1ba1 119 ble_advertising_error_handler_t const error_handler)
MartinGurtner 60:8399756e1ba1 120 {
MartinGurtner 60:8399756e1ba1 121 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 122
MartinGurtner 60:8399756e1ba1 123 VERIFY_PARAM_NOT_NULL(p_advdata);
MartinGurtner 60:8399756e1ba1 124 VERIFY_PARAM_NOT_NULL(p_config);
MartinGurtner 60:8399756e1ba1 125
MartinGurtner 60:8399756e1ba1 126 m_adv_mode_current = BLE_ADV_MODE_IDLE;
MartinGurtner 60:8399756e1ba1 127 m_evt_handler = evt_handler;
MartinGurtner 60:8399756e1ba1 128 m_error_handler = error_handler;
MartinGurtner 60:8399756e1ba1 129 m_adv_modes_config = *p_config;
MartinGurtner 60:8399756e1ba1 130
MartinGurtner 60:8399756e1ba1 131 ble_advertising_peer_address_clear();
MartinGurtner 60:8399756e1ba1 132
MartinGurtner 60:8399756e1ba1 133 // Prepare Whitelist. Address and IRK double pointers point to allocated arrays.
MartinGurtner 60:8399756e1ba1 134 m_whitelist.pp_addrs = mp_whitelist_addr;
MartinGurtner 60:8399756e1ba1 135 m_whitelist.pp_irks = mp_whitelist_irk;
MartinGurtner 60:8399756e1ba1 136
MartinGurtner 60:8399756e1ba1 137 // Copy and set advertising data.
MartinGurtner 60:8399756e1ba1 138 memset(&m_advdata, 0, sizeof(m_advdata));
MartinGurtner 60:8399756e1ba1 139
MartinGurtner 60:8399756e1ba1 140 // Copy advertising data.
MartinGurtner 60:8399756e1ba1 141 m_advdata.name_type = p_advdata->name_type;
MartinGurtner 60:8399756e1ba1 142 m_advdata.include_appearance = p_advdata->include_appearance;
MartinGurtner 60:8399756e1ba1 143 m_advdata.flags = p_advdata->flags;
MartinGurtner 60:8399756e1ba1 144 m_advdata.short_name_len = p_advdata->short_name_len;
MartinGurtner 60:8399756e1ba1 145 /*
MartinGurtner 60:8399756e1ba1 146 if(p_advdata->uuids_complete != NULL)
MartinGurtner 60:8399756e1ba1 147 {
MartinGurtner 60:8399756e1ba1 148 m_advdata.uuids_complete = p_advdata->uuids_complete;
MartinGurtner 60:8399756e1ba1 149 }
MartinGurtner 60:8399756e1ba1 150 */
MartinGurtner 60:8399756e1ba1 151 m_advdata.uuids_complete = p_advdata->uuids_complete;
MartinGurtner 60:8399756e1ba1 152 m_advdata.uuids_more_available = p_advdata->uuids_more_available;
MartinGurtner 60:8399756e1ba1 153 m_advdata.uuids_solicited = p_advdata->uuids_solicited;
MartinGurtner 60:8399756e1ba1 154
MartinGurtner 60:8399756e1ba1 155 if(p_advdata->p_manuf_specific_data != NULL)
MartinGurtner 60:8399756e1ba1 156 {
MartinGurtner 60:8399756e1ba1 157 m_advdata.p_manuf_specific_data = &m_manuf_specific_data;
MartinGurtner 60:8399756e1ba1 158 m_manuf_specific_data.data.p_data = m_manuf_data_array;
MartinGurtner 60:8399756e1ba1 159 m_advdata.p_manuf_specific_data->company_identifier =
MartinGurtner 60:8399756e1ba1 160 p_advdata->p_manuf_specific_data->company_identifier;
MartinGurtner 60:8399756e1ba1 161 m_advdata.p_manuf_specific_data->data.size = p_advdata->p_manuf_specific_data->data.size;
MartinGurtner 60:8399756e1ba1 162
MartinGurtner 60:8399756e1ba1 163 for(uint32_t i = 0; i < m_advdata.p_manuf_specific_data->data.size; i++)
MartinGurtner 60:8399756e1ba1 164 {
MartinGurtner 60:8399756e1ba1 165 m_manuf_data_array[i] = p_advdata->p_manuf_specific_data->data.p_data[i];
MartinGurtner 60:8399756e1ba1 166 }
MartinGurtner 60:8399756e1ba1 167 }
MartinGurtner 60:8399756e1ba1 168
MartinGurtner 60:8399756e1ba1 169 if(p_advdata->p_service_data_array != NULL)
MartinGurtner 60:8399756e1ba1 170 {
MartinGurtner 60:8399756e1ba1 171 m_service_data.data.p_data = m_service_data_array;
MartinGurtner 60:8399756e1ba1 172 m_advdata.p_service_data_array = &m_service_data;
MartinGurtner 60:8399756e1ba1 173 m_advdata.p_service_data_array->data.p_data = m_service_data_array;
MartinGurtner 60:8399756e1ba1 174 m_advdata.p_service_data_array->data.size = p_advdata->p_service_data_array->data.size;
MartinGurtner 60:8399756e1ba1 175 m_advdata.p_service_data_array->service_uuid = p_advdata->p_service_data_array->service_uuid;
MartinGurtner 60:8399756e1ba1 176
MartinGurtner 60:8399756e1ba1 177 for(uint32_t i = 0; i < m_advdata.p_service_data_array->data.size; i++)
MartinGurtner 60:8399756e1ba1 178 {
MartinGurtner 60:8399756e1ba1 179 m_service_data_array[i] = p_advdata->p_service_data_array->data.p_data[i];
MartinGurtner 60:8399756e1ba1 180 }
MartinGurtner 60:8399756e1ba1 181
MartinGurtner 60:8399756e1ba1 182 m_advdata.service_data_count = p_advdata->service_data_count;
MartinGurtner 60:8399756e1ba1 183 }
MartinGurtner 60:8399756e1ba1 184
MartinGurtner 60:8399756e1ba1 185
MartinGurtner 60:8399756e1ba1 186 if(p_advdata->p_slave_conn_int != NULL)
MartinGurtner 60:8399756e1ba1 187 {
MartinGurtner 60:8399756e1ba1 188 m_advdata.p_slave_conn_int = &m_slave_conn_int;
MartinGurtner 60:8399756e1ba1 189 m_advdata.p_slave_conn_int->max_conn_interval = p_advdata->p_slave_conn_int->max_conn_interval;
MartinGurtner 60:8399756e1ba1 190 m_advdata.p_slave_conn_int->min_conn_interval = p_advdata->p_slave_conn_int->min_conn_interval;
MartinGurtner 60:8399756e1ba1 191 }
MartinGurtner 60:8399756e1ba1 192
MartinGurtner 60:8399756e1ba1 193 if(p_advdata->p_tx_power_level != NULL)
MartinGurtner 60:8399756e1ba1 194 {
MartinGurtner 60:8399756e1ba1 195 m_advdata.p_tx_power_level = &m_tx_power_level;
MartinGurtner 60:8399756e1ba1 196 m_advdata.p_tx_power_level = p_advdata->p_tx_power_level;
MartinGurtner 60:8399756e1ba1 197 }
MartinGurtner 60:8399756e1ba1 198 err_code = ble_advdata_set(&m_advdata, p_srdata);
MartinGurtner 60:8399756e1ba1 199 return err_code;
MartinGurtner 60:8399756e1ba1 200 }
MartinGurtner 60:8399756e1ba1 201
MartinGurtner 60:8399756e1ba1 202 /** @brief Function to determine if a flash access in in progress. If it is the case, we can not
MartinGurtner 60:8399756e1ba1 203 * start advertising until it is finished. attempted restart
MartinGurtner 60:8399756e1ba1 204 * in @ref ble_advertising_on_sys_evt
MartinGurtner 60:8399756e1ba1 205 *
MartinGurtner 60:8399756e1ba1 206 * @return true if a flash access is in progress, false if not.
MartinGurtner 60:8399756e1ba1 207 */
MartinGurtner 60:8399756e1ba1 208 static bool flash_access_in_progress()
MartinGurtner 60:8399756e1ba1 209 {
MartinGurtner 60:8399756e1ba1 210 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 211 uint32_t count = 0;
MartinGurtner 60:8399756e1ba1 212
MartinGurtner 60:8399756e1ba1 213 err_code = pstorage_access_status_get(&count);
MartinGurtner 60:8399756e1ba1 214 if ((err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_SUCCESS))
MartinGurtner 60:8399756e1ba1 215 {
MartinGurtner 60:8399756e1ba1 216 ADV_LOG("[ADV]: pstorage_access_status_get returned %d.\r\n", err_code);
MartinGurtner 60:8399756e1ba1 217 return true;
MartinGurtner 60:8399756e1ba1 218 }
MartinGurtner 60:8399756e1ba1 219
MartinGurtner 60:8399756e1ba1 220 if (err_code == NRF_ERROR_INVALID_STATE)
MartinGurtner 60:8399756e1ba1 221 {
MartinGurtner 60:8399756e1ba1 222 err_code = fs_queued_op_count_get(&count);
MartinGurtner 60:8399756e1ba1 223 if (err_code != FS_SUCCESS)
MartinGurtner 60:8399756e1ba1 224 {
MartinGurtner 60:8399756e1ba1 225 return false;
MartinGurtner 60:8399756e1ba1 226 }
MartinGurtner 60:8399756e1ba1 227 ADV_LOG("[ADV]: fs_queued_op_count_get gives count %d.\r\n", count);
MartinGurtner 60:8399756e1ba1 228 }
MartinGurtner 60:8399756e1ba1 229
MartinGurtner 60:8399756e1ba1 230 if(count != 0)
MartinGurtner 60:8399756e1ba1 231 {
MartinGurtner 60:8399756e1ba1 232 return true;
MartinGurtner 60:8399756e1ba1 233 }
MartinGurtner 60:8399756e1ba1 234 else
MartinGurtner 60:8399756e1ba1 235 {
MartinGurtner 60:8399756e1ba1 236 return false;
MartinGurtner 60:8399756e1ba1 237 }
MartinGurtner 60:8399756e1ba1 238 }
MartinGurtner 60:8399756e1ba1 239
MartinGurtner 60:8399756e1ba1 240 uint32_t ble_advertising_start(ble_adv_mode_t advertising_mode)
MartinGurtner 60:8399756e1ba1 241 {
MartinGurtner 60:8399756e1ba1 242 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 243 ble_gap_adv_params_t adv_params;
MartinGurtner 60:8399756e1ba1 244
MartinGurtner 60:8399756e1ba1 245 m_adv_mode_current = advertising_mode;
MartinGurtner 60:8399756e1ba1 246
MartinGurtner 60:8399756e1ba1 247 // Verify if there are any pending flash operations. If so, delay starting advertising until
MartinGurtner 60:8399756e1ba1 248 // the flash operations are complete.
MartinGurtner 60:8399756e1ba1 249 if(flash_access_in_progress())
MartinGurtner 60:8399756e1ba1 250 {
MartinGurtner 60:8399756e1ba1 251 m_advertising_start_pending = true;
MartinGurtner 60:8399756e1ba1 252 return NRF_SUCCESS;
MartinGurtner 60:8399756e1ba1 253 }
MartinGurtner 60:8399756e1ba1 254
MartinGurtner 60:8399756e1ba1 255 ADV_LOG("[ADV]: no flash operations in progress, prepare advertising.\r\n");
MartinGurtner 60:8399756e1ba1 256 // Fetch the peer address.
MartinGurtner 60:8399756e1ba1 257 ble_advertising_peer_address_clear();
MartinGurtner 60:8399756e1ba1 258
MartinGurtner 60:8399756e1ba1 259 if ( ((m_adv_modes_config.ble_adv_directed_enabled) && (m_adv_mode_current == BLE_ADV_MODE_DIRECTED))
MartinGurtner 60:8399756e1ba1 260 ||((m_adv_modes_config.ble_adv_directed_slow_enabled) && (m_adv_mode_current == BLE_ADV_MODE_DIRECTED))
MartinGurtner 60:8399756e1ba1 261 ||((m_adv_modes_config.ble_adv_directed_slow_enabled) && (m_adv_mode_current == BLE_ADV_MODE_DIRECTED_SLOW))
MartinGurtner 60:8399756e1ba1 262 )
MartinGurtner 60:8399756e1ba1 263 {
MartinGurtner 60:8399756e1ba1 264 if (m_evt_handler != NULL)
MartinGurtner 60:8399756e1ba1 265 {
MartinGurtner 60:8399756e1ba1 266 m_peer_addr_reply_expected = true;
MartinGurtner 60:8399756e1ba1 267 m_evt_handler(BLE_ADV_EVT_PEER_ADDR_REQUEST);
MartinGurtner 60:8399756e1ba1 268 }
MartinGurtner 60:8399756e1ba1 269 else
MartinGurtner 60:8399756e1ba1 270 {
MartinGurtner 60:8399756e1ba1 271 m_peer_addr_reply_expected = false;
MartinGurtner 60:8399756e1ba1 272 }
MartinGurtner 60:8399756e1ba1 273 }
MartinGurtner 60:8399756e1ba1 274
MartinGurtner 60:8399756e1ba1 275 // If a mode is disabled, continue to the next mode. I.e fast instead of direct, slow instead of fast, idle instead of slow.
MartinGurtner 60:8399756e1ba1 276 if ( (m_adv_mode_current == BLE_ADV_MODE_DIRECTED)
MartinGurtner 60:8399756e1ba1 277 &&(!m_adv_modes_config.ble_adv_directed_enabled || !peer_address_exists(m_peer_address.addr)))
MartinGurtner 60:8399756e1ba1 278 {
MartinGurtner 60:8399756e1ba1 279 m_adv_mode_current = BLE_ADV_MODE_DIRECTED_SLOW;
MartinGurtner 60:8399756e1ba1 280 }
MartinGurtner 60:8399756e1ba1 281 if ( (m_adv_mode_current == BLE_ADV_MODE_DIRECTED_SLOW)
MartinGurtner 60:8399756e1ba1 282 &&(!m_adv_modes_config.ble_adv_directed_slow_enabled || !peer_address_exists(m_peer_address.addr)))
MartinGurtner 60:8399756e1ba1 283 {
MartinGurtner 60:8399756e1ba1 284 m_adv_mode_current = BLE_ADV_MODE_FAST;
MartinGurtner 60:8399756e1ba1 285 }
MartinGurtner 60:8399756e1ba1 286 if (!m_adv_modes_config.ble_adv_fast_enabled && m_adv_mode_current == BLE_ADV_MODE_FAST)
MartinGurtner 60:8399756e1ba1 287 {
MartinGurtner 60:8399756e1ba1 288 m_adv_mode_current = BLE_ADV_MODE_SLOW;
MartinGurtner 60:8399756e1ba1 289 }
MartinGurtner 60:8399756e1ba1 290 if (!m_adv_modes_config.ble_adv_slow_enabled && m_adv_mode_current == BLE_ADV_MODE_SLOW)
MartinGurtner 60:8399756e1ba1 291 {
MartinGurtner 60:8399756e1ba1 292 m_adv_mode_current = BLE_ADV_MODE_IDLE;
MartinGurtner 60:8399756e1ba1 293 m_adv_evt = BLE_ADV_EVT_IDLE;
MartinGurtner 60:8399756e1ba1 294 }
MartinGurtner 60:8399756e1ba1 295
MartinGurtner 60:8399756e1ba1 296 // Fetch the whitelist.
MartinGurtner 60:8399756e1ba1 297 if ( (m_evt_handler != NULL)
MartinGurtner 60:8399756e1ba1 298 && (m_adv_mode_current == BLE_ADV_MODE_FAST || m_adv_mode_current == BLE_ADV_MODE_SLOW)
MartinGurtner 60:8399756e1ba1 299 && (m_adv_modes_config.ble_adv_whitelist_enabled)
MartinGurtner 60:8399756e1ba1 300 && (!m_whitelist_temporarily_disabled))
MartinGurtner 60:8399756e1ba1 301 {
MartinGurtner 60:8399756e1ba1 302 m_whitelist_reply_expected = true;
MartinGurtner 60:8399756e1ba1 303 m_evt_handler(BLE_ADV_EVT_WHITELIST_REQUEST);
MartinGurtner 60:8399756e1ba1 304 }
MartinGurtner 60:8399756e1ba1 305 else
MartinGurtner 60:8399756e1ba1 306 {
MartinGurtner 60:8399756e1ba1 307 m_whitelist_reply_expected = false;
MartinGurtner 60:8399756e1ba1 308 }
MartinGurtner 60:8399756e1ba1 309
MartinGurtner 60:8399756e1ba1 310 // Initialize advertising parameters with default values.
MartinGurtner 60:8399756e1ba1 311 memset(&adv_params, 0, sizeof(adv_params));
MartinGurtner 60:8399756e1ba1 312
MartinGurtner 60:8399756e1ba1 313 adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
MartinGurtner 60:8399756e1ba1 314 adv_params.p_peer_addr = NULL;
MartinGurtner 60:8399756e1ba1 315 adv_params.fp = BLE_GAP_ADV_FP_ANY;
MartinGurtner 60:8399756e1ba1 316 adv_params.p_whitelist = NULL;
MartinGurtner 60:8399756e1ba1 317
MartinGurtner 60:8399756e1ba1 318 // Set advertising parameters and events according to selected advertising mode.
MartinGurtner 60:8399756e1ba1 319 switch (m_adv_mode_current)
MartinGurtner 60:8399756e1ba1 320 {
MartinGurtner 60:8399756e1ba1 321 case BLE_ADV_MODE_DIRECTED:
MartinGurtner 60:8399756e1ba1 322 ADV_LOG("[ADV]: Starting direct advertisement.\r\n");
MartinGurtner 60:8399756e1ba1 323 adv_params.p_peer_addr = &m_peer_address; // Directed advertising.
MartinGurtner 60:8399756e1ba1 324 adv_params.type = BLE_GAP_ADV_TYPE_ADV_DIRECT_IND;
MartinGurtner 60:8399756e1ba1 325 adv_params.timeout = 0;
MartinGurtner 60:8399756e1ba1 326 adv_params.interval = 0;
MartinGurtner 60:8399756e1ba1 327 m_adv_evt = BLE_ADV_EVT_DIRECTED;
MartinGurtner 60:8399756e1ba1 328 break;
MartinGurtner 60:8399756e1ba1 329
MartinGurtner 60:8399756e1ba1 330 case BLE_ADV_MODE_DIRECTED_SLOW:
MartinGurtner 60:8399756e1ba1 331 ADV_LOG("[ADV]: Starting direct advertisement.\r\n");
MartinGurtner 60:8399756e1ba1 332 adv_params.p_peer_addr = &m_peer_address; // Directed advertising.
MartinGurtner 60:8399756e1ba1 333 adv_params.type = BLE_GAP_ADV_TYPE_ADV_DIRECT_IND;
MartinGurtner 60:8399756e1ba1 334 adv_params.timeout = m_adv_modes_config.ble_adv_directed_slow_timeout;
MartinGurtner 60:8399756e1ba1 335 adv_params.interval = m_adv_modes_config.ble_adv_directed_slow_interval;
MartinGurtner 60:8399756e1ba1 336 m_adv_evt = BLE_ADV_EVT_DIRECTED_SLOW;
MartinGurtner 60:8399756e1ba1 337 break;
MartinGurtner 60:8399756e1ba1 338
MartinGurtner 60:8399756e1ba1 339 case BLE_ADV_MODE_FAST:
MartinGurtner 60:8399756e1ba1 340 adv_params.timeout = m_adv_modes_config.ble_adv_fast_timeout;
MartinGurtner 60:8399756e1ba1 341 adv_params.interval = m_adv_modes_config.ble_adv_fast_interval;
MartinGurtner 60:8399756e1ba1 342
MartinGurtner 60:8399756e1ba1 343 if ( whitelist_has_entries(&m_whitelist)
MartinGurtner 60:8399756e1ba1 344 && m_adv_modes_config.ble_adv_whitelist_enabled
MartinGurtner 60:8399756e1ba1 345 && !m_whitelist_temporarily_disabled)
MartinGurtner 60:8399756e1ba1 346 {
MartinGurtner 60:8399756e1ba1 347 adv_params.fp = BLE_GAP_ADV_FP_FILTER_CONNREQ;
MartinGurtner 60:8399756e1ba1 348 adv_params.p_whitelist = &m_whitelist;
MartinGurtner 60:8399756e1ba1 349 m_advdata.flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;
MartinGurtner 60:8399756e1ba1 350 err_code = ble_advdata_set(&m_advdata, NULL);
MartinGurtner 60:8399756e1ba1 351 VERIFY_SUCCESS(err_code);
MartinGurtner 60:8399756e1ba1 352
MartinGurtner 60:8399756e1ba1 353 m_adv_evt = BLE_ADV_EVT_FAST_WHITELIST;
MartinGurtner 60:8399756e1ba1 354 ADV_LOG("[ADV]: Starting fast advertisement with whitelist.\r\n");
MartinGurtner 60:8399756e1ba1 355 }
MartinGurtner 60:8399756e1ba1 356 else
MartinGurtner 60:8399756e1ba1 357 {
MartinGurtner 60:8399756e1ba1 358 m_adv_evt = BLE_ADV_EVT_FAST;
MartinGurtner 60:8399756e1ba1 359 ADV_LOG("[ADV]: Starting fast advertisement.\r\n");
MartinGurtner 60:8399756e1ba1 360 }
MartinGurtner 60:8399756e1ba1 361 break;
MartinGurtner 60:8399756e1ba1 362
MartinGurtner 60:8399756e1ba1 363 case BLE_ADV_MODE_SLOW:
MartinGurtner 60:8399756e1ba1 364 adv_params.interval = m_adv_modes_config.ble_adv_slow_interval;
MartinGurtner 60:8399756e1ba1 365 adv_params.timeout = m_adv_modes_config.ble_adv_slow_timeout;
MartinGurtner 60:8399756e1ba1 366
MartinGurtner 60:8399756e1ba1 367 if ( whitelist_has_entries(&m_whitelist)
MartinGurtner 60:8399756e1ba1 368 && m_adv_modes_config.ble_adv_whitelist_enabled
MartinGurtner 60:8399756e1ba1 369 && !m_whitelist_temporarily_disabled)
MartinGurtner 60:8399756e1ba1 370 {
MartinGurtner 60:8399756e1ba1 371 adv_params.fp = BLE_GAP_ADV_FP_FILTER_CONNREQ;
MartinGurtner 60:8399756e1ba1 372 adv_params.p_whitelist = &m_whitelist;
MartinGurtner 60:8399756e1ba1 373 m_advdata.flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;
MartinGurtner 60:8399756e1ba1 374 err_code = ble_advdata_set(&m_advdata, NULL);
MartinGurtner 60:8399756e1ba1 375 VERIFY_SUCCESS(err_code);
MartinGurtner 60:8399756e1ba1 376
MartinGurtner 60:8399756e1ba1 377 m_adv_evt = BLE_ADV_EVT_SLOW_WHITELIST;
MartinGurtner 60:8399756e1ba1 378 ADV_LOG("[ADV]: Starting slow advertisement with whitelist.\r\n");
MartinGurtner 60:8399756e1ba1 379 }
MartinGurtner 60:8399756e1ba1 380 else
MartinGurtner 60:8399756e1ba1 381 {
MartinGurtner 60:8399756e1ba1 382 m_adv_evt = BLE_ADV_EVT_SLOW;
MartinGurtner 60:8399756e1ba1 383 ADV_LOG("[ADV]: Starting slow advertisement.\r\n");
MartinGurtner 60:8399756e1ba1 384 }
MartinGurtner 60:8399756e1ba1 385 break;
MartinGurtner 60:8399756e1ba1 386
MartinGurtner 60:8399756e1ba1 387 default:
MartinGurtner 60:8399756e1ba1 388 break;
MartinGurtner 60:8399756e1ba1 389 }
MartinGurtner 60:8399756e1ba1 390 if (m_adv_mode_current != BLE_ADV_MODE_IDLE)
MartinGurtner 60:8399756e1ba1 391 {
MartinGurtner 60:8399756e1ba1 392 err_code = sd_ble_gap_adv_start(&adv_params);
MartinGurtner 60:8399756e1ba1 393 VERIFY_SUCCESS(err_code);
MartinGurtner 60:8399756e1ba1 394 }
MartinGurtner 60:8399756e1ba1 395 if (m_evt_handler != NULL)
MartinGurtner 60:8399756e1ba1 396 {
MartinGurtner 60:8399756e1ba1 397 m_evt_handler(m_adv_evt);
MartinGurtner 60:8399756e1ba1 398 }
MartinGurtner 60:8399756e1ba1 399
MartinGurtner 60:8399756e1ba1 400 return NRF_SUCCESS;
MartinGurtner 60:8399756e1ba1 401 }
MartinGurtner 60:8399756e1ba1 402
MartinGurtner 60:8399756e1ba1 403
MartinGurtner 60:8399756e1ba1 404 void ble_advertising_on_ble_evt(ble_evt_t const * p_ble_evt)
MartinGurtner 60:8399756e1ba1 405 {
MartinGurtner 60:8399756e1ba1 406 static uint16_t current_slave_link_conn_handle = BLE_CONN_HANDLE_INVALID;
MartinGurtner 60:8399756e1ba1 407
MartinGurtner 60:8399756e1ba1 408 switch (p_ble_evt->header.evt_id)
MartinGurtner 60:8399756e1ba1 409 {
MartinGurtner 60:8399756e1ba1 410 case BLE_GAP_EVT_CONNECTED:
MartinGurtner 60:8399756e1ba1 411 if (p_ble_evt->evt.gap_evt.params.connected.role == BLE_GAP_ROLE_PERIPH)
MartinGurtner 60:8399756e1ba1 412 {
MartinGurtner 60:8399756e1ba1 413 current_slave_link_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
MartinGurtner 60:8399756e1ba1 414 }
MartinGurtner 60:8399756e1ba1 415 break;
MartinGurtner 60:8399756e1ba1 416
MartinGurtner 60:8399756e1ba1 417 // Upon disconnection, whitelist will be activated and direct advertising is started.
MartinGurtner 60:8399756e1ba1 418 case BLE_GAP_EVT_DISCONNECTED:
MartinGurtner 60:8399756e1ba1 419 {
MartinGurtner 60:8399756e1ba1 420 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 421 m_whitelist_temporarily_disabled = false;
MartinGurtner 60:8399756e1ba1 422
MartinGurtner 60:8399756e1ba1 423 if (p_ble_evt->evt.gap_evt.conn_handle == current_slave_link_conn_handle)
MartinGurtner 60:8399756e1ba1 424 {
MartinGurtner 60:8399756e1ba1 425 err_code = ble_advertising_start(BLE_ADV_MODE_DIRECTED);
MartinGurtner 60:8399756e1ba1 426 if ((err_code != NRF_SUCCESS) && (m_error_handler != NULL))
MartinGurtner 60:8399756e1ba1 427 {
MartinGurtner 60:8399756e1ba1 428 m_error_handler(err_code);
MartinGurtner 60:8399756e1ba1 429 }
MartinGurtner 60:8399756e1ba1 430 }
MartinGurtner 60:8399756e1ba1 431 break;
MartinGurtner 60:8399756e1ba1 432 }
MartinGurtner 60:8399756e1ba1 433 // Upon time-out, the next advertising mode is started, i.e. go from fast to slow or from slow to idle.
MartinGurtner 60:8399756e1ba1 434 case BLE_GAP_EVT_TIMEOUT:
MartinGurtner 60:8399756e1ba1 435 if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISING)
MartinGurtner 60:8399756e1ba1 436 {
MartinGurtner 60:8399756e1ba1 437 switch (m_adv_mode_current)
MartinGurtner 60:8399756e1ba1 438 {
MartinGurtner 60:8399756e1ba1 439 case BLE_ADV_MODE_DIRECTED:
MartinGurtner 60:8399756e1ba1 440 ADV_LOG("[ADV]: Timed out from directed advertising.\r\n");
MartinGurtner 60:8399756e1ba1 441 {
MartinGurtner 60:8399756e1ba1 442 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 443 err_code = ble_advertising_start(BLE_ADV_MODE_DIRECTED_SLOW);
MartinGurtner 60:8399756e1ba1 444 if ((err_code != NRF_SUCCESS) && (m_error_handler != NULL))
MartinGurtner 60:8399756e1ba1 445 {
MartinGurtner 60:8399756e1ba1 446 m_error_handler(err_code);
MartinGurtner 60:8399756e1ba1 447 }
MartinGurtner 60:8399756e1ba1 448 }
MartinGurtner 60:8399756e1ba1 449 break;
MartinGurtner 60:8399756e1ba1 450 case BLE_ADV_MODE_DIRECTED_SLOW:
MartinGurtner 60:8399756e1ba1 451 ADV_LOG("[ADV]: Timed out from directed slow advertising.\r\n");
MartinGurtner 60:8399756e1ba1 452 {
MartinGurtner 60:8399756e1ba1 453 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 454 err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
MartinGurtner 60:8399756e1ba1 455 if ((err_code != NRF_SUCCESS) && (m_error_handler != NULL))
MartinGurtner 60:8399756e1ba1 456 {
MartinGurtner 60:8399756e1ba1 457 m_error_handler(err_code);
MartinGurtner 60:8399756e1ba1 458 }
MartinGurtner 60:8399756e1ba1 459 }
MartinGurtner 60:8399756e1ba1 460 break;
MartinGurtner 60:8399756e1ba1 461 case BLE_ADV_MODE_FAST:
MartinGurtner 60:8399756e1ba1 462 {
MartinGurtner 60:8399756e1ba1 463 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 464 m_adv_evt = BLE_ADV_EVT_FAST;
MartinGurtner 60:8399756e1ba1 465 ADV_LOG("[ADV]: Timed out from fast advertising, starting slow advertising.\r\n");
MartinGurtner 60:8399756e1ba1 466 err_code = ble_advertising_start(BLE_ADV_MODE_SLOW);
MartinGurtner 60:8399756e1ba1 467 if ((err_code != NRF_SUCCESS) && (m_error_handler != NULL))
MartinGurtner 60:8399756e1ba1 468 {
MartinGurtner 60:8399756e1ba1 469 m_error_handler(err_code);
MartinGurtner 60:8399756e1ba1 470 }
MartinGurtner 60:8399756e1ba1 471 break;
MartinGurtner 60:8399756e1ba1 472 }
MartinGurtner 60:8399756e1ba1 473 case BLE_ADV_MODE_SLOW:
MartinGurtner 60:8399756e1ba1 474 m_adv_evt = BLE_ADV_EVT_IDLE;
MartinGurtner 60:8399756e1ba1 475 ADV_LOG("[ADV]: Timed out from slow advertising, stopping advertising.\r\n");
MartinGurtner 60:8399756e1ba1 476 if (m_evt_handler != NULL)
MartinGurtner 60:8399756e1ba1 477 {
MartinGurtner 60:8399756e1ba1 478 m_evt_handler(m_adv_evt);
MartinGurtner 60:8399756e1ba1 479 }
MartinGurtner 60:8399756e1ba1 480 break;
MartinGurtner 60:8399756e1ba1 481
MartinGurtner 60:8399756e1ba1 482 default:
MartinGurtner 60:8399756e1ba1 483 // No implementation needed.
MartinGurtner 60:8399756e1ba1 484 break;
MartinGurtner 60:8399756e1ba1 485 }
MartinGurtner 60:8399756e1ba1 486 }
MartinGurtner 60:8399756e1ba1 487 break;
MartinGurtner 60:8399756e1ba1 488
MartinGurtner 60:8399756e1ba1 489 default:
MartinGurtner 60:8399756e1ba1 490 // No implementation needed.
MartinGurtner 60:8399756e1ba1 491 break;
MartinGurtner 60:8399756e1ba1 492 }
MartinGurtner 60:8399756e1ba1 493 }
MartinGurtner 60:8399756e1ba1 494 void ble_advertising_on_sys_evt(uint32_t sys_evt)
MartinGurtner 60:8399756e1ba1 495 {
MartinGurtner 60:8399756e1ba1 496 uint32_t err_code = NRF_SUCCESS;
MartinGurtner 60:8399756e1ba1 497 switch (sys_evt)
MartinGurtner 60:8399756e1ba1 498 {
MartinGurtner 60:8399756e1ba1 499
MartinGurtner 60:8399756e1ba1 500 case NRF_EVT_FLASH_OPERATION_SUCCESS:
MartinGurtner 60:8399756e1ba1 501 // Fall through.
MartinGurtner 60:8399756e1ba1 502
MartinGurtner 60:8399756e1ba1 503 //When a flash operation finishes, advertising no longer needs to be pending.
MartinGurtner 60:8399756e1ba1 504 case NRF_EVT_FLASH_OPERATION_ERROR:
MartinGurtner 60:8399756e1ba1 505 if (m_advertising_start_pending)
MartinGurtner 60:8399756e1ba1 506 {
MartinGurtner 60:8399756e1ba1 507 m_advertising_start_pending = false;
MartinGurtner 60:8399756e1ba1 508 err_code = ble_advertising_start(m_adv_mode_current);
MartinGurtner 60:8399756e1ba1 509 if ((err_code != NRF_SUCCESS) && (m_error_handler != NULL))
MartinGurtner 60:8399756e1ba1 510 {
MartinGurtner 60:8399756e1ba1 511 m_error_handler(err_code);
MartinGurtner 60:8399756e1ba1 512 }
MartinGurtner 60:8399756e1ba1 513 }
MartinGurtner 60:8399756e1ba1 514 break;
MartinGurtner 60:8399756e1ba1 515
MartinGurtner 60:8399756e1ba1 516 default:
MartinGurtner 60:8399756e1ba1 517 // No implementation needed.
MartinGurtner 60:8399756e1ba1 518 break;
MartinGurtner 60:8399756e1ba1 519 }
MartinGurtner 60:8399756e1ba1 520 }
MartinGurtner 60:8399756e1ba1 521
MartinGurtner 60:8399756e1ba1 522 uint32_t ble_advertising_peer_addr_reply(ble_gap_addr_t * p_peer_address)
MartinGurtner 60:8399756e1ba1 523 {
MartinGurtner 60:8399756e1ba1 524 if(m_peer_addr_reply_expected == false)
MartinGurtner 60:8399756e1ba1 525 {
MartinGurtner 60:8399756e1ba1 526 return NRF_ERROR_INVALID_STATE;
MartinGurtner 60:8399756e1ba1 527 }
MartinGurtner 60:8399756e1ba1 528
MartinGurtner 60:8399756e1ba1 529 m_peer_address.addr_type = p_peer_address->addr_type;
MartinGurtner 60:8399756e1ba1 530
MartinGurtner 60:8399756e1ba1 531 for (int i = 0; i < BLE_GAP_ADDR_LEN; i++)
MartinGurtner 60:8399756e1ba1 532 {
MartinGurtner 60:8399756e1ba1 533 m_peer_address.addr[i] = p_peer_address->addr[i];
MartinGurtner 60:8399756e1ba1 534 }
MartinGurtner 60:8399756e1ba1 535
MartinGurtner 60:8399756e1ba1 536 m_peer_addr_reply_expected = false;
MartinGurtner 60:8399756e1ba1 537 return NRF_SUCCESS;
MartinGurtner 60:8399756e1ba1 538 }
MartinGurtner 60:8399756e1ba1 539
MartinGurtner 60:8399756e1ba1 540
MartinGurtner 60:8399756e1ba1 541 uint32_t ble_advertising_whitelist_reply(ble_gap_whitelist_t * p_whitelist)
MartinGurtner 60:8399756e1ba1 542 {
MartinGurtner 60:8399756e1ba1 543 uint32_t i;
MartinGurtner 60:8399756e1ba1 544
MartinGurtner 60:8399756e1ba1 545 if(m_whitelist_reply_expected == false)
MartinGurtner 60:8399756e1ba1 546 {
MartinGurtner 60:8399756e1ba1 547 return NRF_ERROR_INVALID_STATE;
MartinGurtner 60:8399756e1ba1 548 }
MartinGurtner 60:8399756e1ba1 549
MartinGurtner 60:8399756e1ba1 550 m_whitelist.addr_count = p_whitelist->addr_count;
MartinGurtner 60:8399756e1ba1 551 m_whitelist.irk_count = p_whitelist->irk_count;
MartinGurtner 60:8399756e1ba1 552
MartinGurtner 60:8399756e1ba1 553 for (i = 0; i < m_whitelist.irk_count; i++)
MartinGurtner 60:8399756e1ba1 554 {
MartinGurtner 60:8399756e1ba1 555 mp_whitelist_irk[i] = p_whitelist->pp_irks[i];
MartinGurtner 60:8399756e1ba1 556 }
MartinGurtner 60:8399756e1ba1 557
MartinGurtner 60:8399756e1ba1 558 for (i = 0; i < m_whitelist.addr_count; i++)
MartinGurtner 60:8399756e1ba1 559 {
MartinGurtner 60:8399756e1ba1 560 mp_whitelist_addr[i] = p_whitelist->pp_addrs[i];
MartinGurtner 60:8399756e1ba1 561 }
MartinGurtner 60:8399756e1ba1 562
MartinGurtner 60:8399756e1ba1 563 m_whitelist_reply_expected = false;
MartinGurtner 60:8399756e1ba1 564 return NRF_SUCCESS;
MartinGurtner 60:8399756e1ba1 565 }
MartinGurtner 60:8399756e1ba1 566
MartinGurtner 60:8399756e1ba1 567
MartinGurtner 60:8399756e1ba1 568 uint32_t ble_advertising_restart_without_whitelist(void)
MartinGurtner 60:8399756e1ba1 569 {
MartinGurtner 60:8399756e1ba1 570 uint32_t err_code;
MartinGurtner 60:8399756e1ba1 571
MartinGurtner 60:8399756e1ba1 572 if( m_adv_modes_config.ble_adv_whitelist_enabled == BLE_ADV_WHITELIST_ENABLED
MartinGurtner 60:8399756e1ba1 573 && !m_whitelist_temporarily_disabled)
MartinGurtner 60:8399756e1ba1 574 {
MartinGurtner 60:8399756e1ba1 575 if (m_adv_mode_current != BLE_ADV_MODE_IDLE)
MartinGurtner 60:8399756e1ba1 576 {
MartinGurtner 60:8399756e1ba1 577 err_code = sd_ble_gap_adv_stop();
MartinGurtner 60:8399756e1ba1 578 VERIFY_SUCCESS(err_code);
MartinGurtner 60:8399756e1ba1 579 }
MartinGurtner 60:8399756e1ba1 580 m_whitelist_temporarily_disabled = true;
MartinGurtner 60:8399756e1ba1 581 m_advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
MartinGurtner 60:8399756e1ba1 582 err_code = ble_advdata_set(&m_advdata, NULL);
MartinGurtner 60:8399756e1ba1 583 VERIFY_SUCCESS(err_code);
MartinGurtner 60:8399756e1ba1 584
MartinGurtner 60:8399756e1ba1 585 err_code = ble_advertising_start(m_adv_mode_current);
MartinGurtner 60:8399756e1ba1 586 if ((err_code != NRF_SUCCESS) && (m_error_handler != NULL))
MartinGurtner 60:8399756e1ba1 587 {
MartinGurtner 60:8399756e1ba1 588 m_error_handler(err_code);
MartinGurtner 60:8399756e1ba1 589 }
MartinGurtner 60:8399756e1ba1 590 }
MartinGurtner 60:8399756e1ba1 591 return NRF_SUCCESS;
MartinGurtner 60:8399756e1ba1 592 }
MartinGurtner 60:8399756e1ba1 593
MartinGurtner 60:8399756e1ba1 594