Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mbed-dev/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_SDK11/ble/ble_advertising/ble_advertising.c@60:8399756e1ba1, 2021-01-22 (annotated)
- Committer:
- MartinGurtner
- Date:
- Fri Jan 22 13:10:37 2021 +0000
- Revision:
- 60:8399756e1ba1
.
Who changed what in which revision?
| User | Revision | Line number | New 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 |