Nordic stack and drivers for the mbed BLE API

Dependents:   BLE_ANCS_SDAPI BLE_temperature BLE_HeartRate writable_gatt ... more

Committer:
Vincent Coubard
Date:
Wed Sep 14 14:39:43 2016 +0100
Revision:
638:c90ae1400bf2
Sync with bdab10dc0f90748b6989c8b577771bb403ca6bd8 from ARMmbed/mbed-os.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vincent Coubard 638:c90ae1400bf2 1 /*
Vincent Coubard 638:c90ae1400bf2 2 * Copyright (c) Nordic Semiconductor ASA
Vincent Coubard 638:c90ae1400bf2 3 * All rights reserved.
Vincent Coubard 638:c90ae1400bf2 4 *
Vincent Coubard 638:c90ae1400bf2 5 * Redistribution and use in source and binary forms, with or without modification,
Vincent Coubard 638:c90ae1400bf2 6 * are permitted provided that the following conditions are met:
Vincent Coubard 638:c90ae1400bf2 7 *
Vincent Coubard 638:c90ae1400bf2 8 * 1. Redistributions of source code must retain the above copyright notice, this
Vincent Coubard 638:c90ae1400bf2 9 * list of conditions and the following disclaimer.
Vincent Coubard 638:c90ae1400bf2 10 *
Vincent Coubard 638:c90ae1400bf2 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this
Vincent Coubard 638:c90ae1400bf2 12 * list of conditions and the following disclaimer in the documentation and/or
Vincent Coubard 638:c90ae1400bf2 13 * other materials provided with the distribution.
Vincent Coubard 638:c90ae1400bf2 14 *
Vincent Coubard 638:c90ae1400bf2 15 * 3. Neither the name of Nordic Semiconductor ASA nor the names of other
Vincent Coubard 638:c90ae1400bf2 16 * contributors to this software may be used to endorse or promote products
Vincent Coubard 638:c90ae1400bf2 17 * derived from this software without specific prior written permission.
Vincent Coubard 638:c90ae1400bf2 18 *
Vincent Coubard 638:c90ae1400bf2 19 *
Vincent Coubard 638:c90ae1400bf2 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
Vincent Coubard 638:c90ae1400bf2 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Vincent Coubard 638:c90ae1400bf2 22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Vincent Coubard 638:c90ae1400bf2 23 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
Vincent Coubard 638:c90ae1400bf2 24 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Vincent Coubard 638:c90ae1400bf2 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Vincent Coubard 638:c90ae1400bf2 26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
Vincent Coubard 638:c90ae1400bf2 27 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Vincent Coubard 638:c90ae1400bf2 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Vincent Coubard 638:c90ae1400bf2 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Vincent Coubard 638:c90ae1400bf2 30 *
Vincent Coubard 638:c90ae1400bf2 31 */
Vincent Coubard 638:c90ae1400bf2 32
Vincent Coubard 638:c90ae1400bf2 33 #include "ble_conn_state.h"
Vincent Coubard 638:c90ae1400bf2 34 #include <stdbool.h>
Vincent Coubard 638:c90ae1400bf2 35 #include <stdint.h>
Vincent Coubard 638:c90ae1400bf2 36 #include <string.h>
Vincent Coubard 638:c90ae1400bf2 37 #include "nrf_ble.h"
Vincent Coubard 638:c90ae1400bf2 38 #include "sdk_mapped_flags.h"
Vincent Coubard 638:c90ae1400bf2 39 #include "app_error.h"
Vincent Coubard 638:c90ae1400bf2 40
Vincent Coubard 638:c90ae1400bf2 41
Vincent Coubard 638:c90ae1400bf2 42 #if defined(__CC_ARM)
Vincent Coubard 638:c90ae1400bf2 43 #pragma push
Vincent Coubard 638:c90ae1400bf2 44 #pragma anon_unions
Vincent Coubard 638:c90ae1400bf2 45 #elif defined(__ICCARM__)
Vincent Coubard 638:c90ae1400bf2 46 #pragma language=extended
Vincent Coubard 638:c90ae1400bf2 47 #elif defined(__GNUC__)
Vincent Coubard 638:c90ae1400bf2 48 /* anonymous unions are enabled by default */
Vincent Coubard 638:c90ae1400bf2 49 #endif
Vincent Coubard 638:c90ae1400bf2 50
Vincent Coubard 638:c90ae1400bf2 51
Vincent Coubard 638:c90ae1400bf2 52 #define BLE_CONN_STATE_N_DEFAULT_FLAGS 5 /**< The number of flags kept for each connection, excluding user flags. */
Vincent Coubard 638:c90ae1400bf2 53 #define BLE_CONN_STATE_N_FLAGS (BLE_CONN_STATE_N_DEFAULT_FLAGS + BLE_CONN_STATE_N_USER_FLAGS) /**< The number of flags kept for each connection, including user flags. */
Vincent Coubard 638:c90ae1400bf2 54
Vincent Coubard 638:c90ae1400bf2 55
Vincent Coubard 638:c90ae1400bf2 56 /**@brief Structure containing all the flag collections maintained by the Connection State module.
Vincent Coubard 638:c90ae1400bf2 57 */
Vincent Coubard 638:c90ae1400bf2 58 typedef struct
Vincent Coubard 638:c90ae1400bf2 59 {
Vincent Coubard 638:c90ae1400bf2 60 sdk_mapped_flags_t valid_flags; /**< Flags indicating which connection handles are valid. */
Vincent Coubard 638:c90ae1400bf2 61 sdk_mapped_flags_t connected_flags; /**< Flags indicating which connections are connected, since disconnected connection handles will not immediately be invalidated. */
Vincent Coubard 638:c90ae1400bf2 62 sdk_mapped_flags_t central_flags; /**< Flags indicating in which connections the local device is the central. */
Vincent Coubard 638:c90ae1400bf2 63 sdk_mapped_flags_t encrypted_flags; /**< Flags indicating which connections are encrypted. */
Vincent Coubard 638:c90ae1400bf2 64 sdk_mapped_flags_t mitm_protected_flags; /**< Flags indicating which connections have encryption with protection from man-in-the-middle attacks. */
Vincent Coubard 638:c90ae1400bf2 65 sdk_mapped_flags_t user_flags[BLE_CONN_STATE_N_USER_FLAGS]; /**< Flags that can be reserved by the user. The flags will be cleared when a connection is invalidated, otherwise, the user is wholly responsible for the flag states. */
Vincent Coubard 638:c90ae1400bf2 66 } ble_conn_state_flag_collections_t;
Vincent Coubard 638:c90ae1400bf2 67
Vincent Coubard 638:c90ae1400bf2 68
Vincent Coubard 638:c90ae1400bf2 69 /**@brief Structure containing the internal state of the Connection State module.
Vincent Coubard 638:c90ae1400bf2 70 */
Vincent Coubard 638:c90ae1400bf2 71 typedef struct
Vincent Coubard 638:c90ae1400bf2 72 {
Vincent Coubard 638:c90ae1400bf2 73 uint16_t acquired_flags; /**< Bitmap for keeping track of which user flags have been acquired. */
Vincent Coubard 638:c90ae1400bf2 74 uint16_t valid_conn_handles[SDK_MAPPED_FLAGS_N_KEYS]; /**< List of connection handles used as keys for the sdk_mapped_flags module. */
Vincent Coubard 638:c90ae1400bf2 75 union
Vincent Coubard 638:c90ae1400bf2 76 {
Vincent Coubard 638:c90ae1400bf2 77 ble_conn_state_flag_collections_t flags; /**< Flag collections kept by the Connection State module. */
Vincent Coubard 638:c90ae1400bf2 78 sdk_mapped_flags_t flag_array[BLE_CONN_STATE_N_FLAGS]; /**< Flag collections as array to allow use of @ref sdk_mapped_flags_bulk_update_by_key() when setting all flags. */
Vincent Coubard 638:c90ae1400bf2 79 };
Vincent Coubard 638:c90ae1400bf2 80 } ble_conn_state_t;
Vincent Coubard 638:c90ae1400bf2 81
Vincent Coubard 638:c90ae1400bf2 82
Vincent Coubard 638:c90ae1400bf2 83 #if defined(__CC_ARM)
Vincent Coubard 638:c90ae1400bf2 84 #pragma pop
Vincent Coubard 638:c90ae1400bf2 85 #elif defined(__ICCARM__)
Vincent Coubard 638:c90ae1400bf2 86 /* leave anonymous unions enabled */
Vincent Coubard 638:c90ae1400bf2 87 #elif defined(__GNUC__)
Vincent Coubard 638:c90ae1400bf2 88 /* anonymous unions are enabled by default */
Vincent Coubard 638:c90ae1400bf2 89 #endif
Vincent Coubard 638:c90ae1400bf2 90
Vincent Coubard 638:c90ae1400bf2 91
Vincent Coubard 638:c90ae1400bf2 92 static ble_conn_state_t m_bcs = {0}; /**< Instantiation of the internal state. */
Vincent Coubard 638:c90ae1400bf2 93
Vincent Coubard 638:c90ae1400bf2 94
Vincent Coubard 638:c90ae1400bf2 95 /**@brief Function for resetting all internal memory to the values it had at initialization.
Vincent Coubard 638:c90ae1400bf2 96 */
Vincent Coubard 638:c90ae1400bf2 97 void bcs_internal_state_reset(void)
Vincent Coubard 638:c90ae1400bf2 98 {
Vincent Coubard 638:c90ae1400bf2 99 memset( &m_bcs, 0, sizeof(ble_conn_state_t) );
Vincent Coubard 638:c90ae1400bf2 100 }
Vincent Coubard 638:c90ae1400bf2 101
Vincent Coubard 638:c90ae1400bf2 102
Vincent Coubard 638:c90ae1400bf2 103 /**@brief Function for activating a connection record.
Vincent Coubard 638:c90ae1400bf2 104 *
Vincent Coubard 638:c90ae1400bf2 105 * @param p_record The record to activate.
Vincent Coubard 638:c90ae1400bf2 106 * @param conn_handle The connection handle to copy into the record.
Vincent Coubard 638:c90ae1400bf2 107 * @param role The role of the connection.
Vincent Coubard 638:c90ae1400bf2 108 *
Vincent Coubard 638:c90ae1400bf2 109 * @return whether the record was activated successfully.
Vincent Coubard 638:c90ae1400bf2 110 */
Vincent Coubard 638:c90ae1400bf2 111 static bool record_activate(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 112 {
Vincent Coubard 638:c90ae1400bf2 113 uint16_t available_index = sdk_mapped_flags_first_key_index_get(~m_bcs.flags.valid_flags);
Vincent Coubard 638:c90ae1400bf2 114
Vincent Coubard 638:c90ae1400bf2 115 if (available_index != SDK_MAPPED_FLAGS_INVALID_INDEX)
Vincent Coubard 638:c90ae1400bf2 116 {
Vincent Coubard 638:c90ae1400bf2 117 m_bcs.valid_conn_handles[available_index] = conn_handle;
Vincent Coubard 638:c90ae1400bf2 118 sdk_mapped_flags_update_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 119 &m_bcs.flags.connected_flags,
Vincent Coubard 638:c90ae1400bf2 120 conn_handle,
Vincent Coubard 638:c90ae1400bf2 121 1);
Vincent Coubard 638:c90ae1400bf2 122 sdk_mapped_flags_update_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 123 &m_bcs.flags.valid_flags,
Vincent Coubard 638:c90ae1400bf2 124 conn_handle,
Vincent Coubard 638:c90ae1400bf2 125 1);
Vincent Coubard 638:c90ae1400bf2 126
Vincent Coubard 638:c90ae1400bf2 127 return true;
Vincent Coubard 638:c90ae1400bf2 128 }
Vincent Coubard 638:c90ae1400bf2 129
Vincent Coubard 638:c90ae1400bf2 130 return false;
Vincent Coubard 638:c90ae1400bf2 131 }
Vincent Coubard 638:c90ae1400bf2 132
Vincent Coubard 638:c90ae1400bf2 133
Vincent Coubard 638:c90ae1400bf2 134 /**@brief Function for marking a connection record as invalid and resetting the values.
Vincent Coubard 638:c90ae1400bf2 135 *
Vincent Coubard 638:c90ae1400bf2 136 * @param p_record The record to invalidate.
Vincent Coubard 638:c90ae1400bf2 137 */
Vincent Coubard 638:c90ae1400bf2 138 static void record_invalidate(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 139 {
Vincent Coubard 638:c90ae1400bf2 140 sdk_mapped_flags_bulk_update_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 141 m_bcs.flag_array,
Vincent Coubard 638:c90ae1400bf2 142 BLE_CONN_STATE_N_FLAGS,
Vincent Coubard 638:c90ae1400bf2 143 conn_handle,
Vincent Coubard 638:c90ae1400bf2 144 0);
Vincent Coubard 638:c90ae1400bf2 145 }
Vincent Coubard 638:c90ae1400bf2 146
Vincent Coubard 638:c90ae1400bf2 147
Vincent Coubard 638:c90ae1400bf2 148 /**@brief Function for marking a connection as disconnected. See @ref BLE_CONN_STATUS_DISCONNECTED.
Vincent Coubard 638:c90ae1400bf2 149 *
Vincent Coubard 638:c90ae1400bf2 150 * @param p_record The record of the connection to set as disconnected.
Vincent Coubard 638:c90ae1400bf2 151 */
Vincent Coubard 638:c90ae1400bf2 152 static void record_set_disconnected(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 153 {
Vincent Coubard 638:c90ae1400bf2 154 sdk_mapped_flags_update_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 155 &m_bcs.flags.connected_flags,
Vincent Coubard 638:c90ae1400bf2 156 conn_handle,
Vincent Coubard 638:c90ae1400bf2 157 0);
Vincent Coubard 638:c90ae1400bf2 158 }
Vincent Coubard 638:c90ae1400bf2 159
Vincent Coubard 638:c90ae1400bf2 160
Vincent Coubard 638:c90ae1400bf2 161 /**@brief Function for invalidating records with a @ref BLE_CONN_STATUS_DISCONNECTED
Vincent Coubard 638:c90ae1400bf2 162 * connection status
Vincent Coubard 638:c90ae1400bf2 163 */
Vincent Coubard 638:c90ae1400bf2 164 static void record_purge_disconnected()
Vincent Coubard 638:c90ae1400bf2 165 {
Vincent Coubard 638:c90ae1400bf2 166 sdk_mapped_flags_key_list_t disconnected_list;
Vincent Coubard 638:c90ae1400bf2 167
Vincent Coubard 638:c90ae1400bf2 168 disconnected_list = sdk_mapped_flags_key_list_get(
Vincent Coubard 638:c90ae1400bf2 169 m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 170 (~m_bcs.flags.connected_flags) & (m_bcs.flags.valid_flags));
Vincent Coubard 638:c90ae1400bf2 171
Vincent Coubard 638:c90ae1400bf2 172 for (int i = 0; i < disconnected_list.len; i++)
Vincent Coubard 638:c90ae1400bf2 173 {
Vincent Coubard 638:c90ae1400bf2 174 record_invalidate(disconnected_list.flag_keys[i]);
Vincent Coubard 638:c90ae1400bf2 175 }
Vincent Coubard 638:c90ae1400bf2 176 }
Vincent Coubard 638:c90ae1400bf2 177
Vincent Coubard 638:c90ae1400bf2 178
Vincent Coubard 638:c90ae1400bf2 179 /**@brief Function for checking if a user flag has been acquired.
Vincent Coubard 638:c90ae1400bf2 180 *
Vincent Coubard 638:c90ae1400bf2 181 * @param[in] flag_id Which flag to check.
Vincent Coubard 638:c90ae1400bf2 182 *
Vincent Coubard 638:c90ae1400bf2 183 * @return Whether the flag has been acquired.
Vincent Coubard 638:c90ae1400bf2 184 */
Vincent Coubard 638:c90ae1400bf2 185 static bool user_flag_is_acquired(ble_conn_state_user_flag_id_t flag_id)
Vincent Coubard 638:c90ae1400bf2 186 {
Vincent Coubard 638:c90ae1400bf2 187 return ((m_bcs.acquired_flags & (1 << flag_id)) != 0);
Vincent Coubard 638:c90ae1400bf2 188 }
Vincent Coubard 638:c90ae1400bf2 189
Vincent Coubard 638:c90ae1400bf2 190
Vincent Coubard 638:c90ae1400bf2 191 /**@brief Function for marking a user flag as acquired.
Vincent Coubard 638:c90ae1400bf2 192 *
Vincent Coubard 638:c90ae1400bf2 193 * @param[in] flag_id Which flag to mark.
Vincent Coubard 638:c90ae1400bf2 194 */
Vincent Coubard 638:c90ae1400bf2 195 static void user_flag_acquire(ble_conn_state_user_flag_id_t flag_id)
Vincent Coubard 638:c90ae1400bf2 196 {
Vincent Coubard 638:c90ae1400bf2 197 m_bcs.acquired_flags |= (1 << flag_id);
Vincent Coubard 638:c90ae1400bf2 198 }
Vincent Coubard 638:c90ae1400bf2 199
Vincent Coubard 638:c90ae1400bf2 200
Vincent Coubard 638:c90ae1400bf2 201 void ble_conn_state_init(void)
Vincent Coubard 638:c90ae1400bf2 202 {
Vincent Coubard 638:c90ae1400bf2 203 bcs_internal_state_reset();
Vincent Coubard 638:c90ae1400bf2 204 }
Vincent Coubard 638:c90ae1400bf2 205
Vincent Coubard 638:c90ae1400bf2 206
Vincent Coubard 638:c90ae1400bf2 207 void ble_conn_state_on_ble_evt(ble_evt_t * p_ble_evt)
Vincent Coubard 638:c90ae1400bf2 208 {
Vincent Coubard 638:c90ae1400bf2 209 switch (p_ble_evt->header.evt_id)
Vincent Coubard 638:c90ae1400bf2 210 {
Vincent Coubard 638:c90ae1400bf2 211 case BLE_GAP_EVT_CONNECTED:
Vincent Coubard 638:c90ae1400bf2 212 record_purge_disconnected();
Vincent Coubard 638:c90ae1400bf2 213
Vincent Coubard 638:c90ae1400bf2 214 if ( !record_activate(p_ble_evt->evt.gap_evt.conn_handle) )
Vincent Coubard 638:c90ae1400bf2 215 {
Vincent Coubard 638:c90ae1400bf2 216 // No more records available. Should not happen.
Vincent Coubard 638:c90ae1400bf2 217 APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
Vincent Coubard 638:c90ae1400bf2 218 }
Vincent Coubard 638:c90ae1400bf2 219 else
Vincent Coubard 638:c90ae1400bf2 220 {
Vincent Coubard 638:c90ae1400bf2 221 #if defined(TARGET_MCU_NRF51_16K_S110) || defined(TARGET_MCU_NRF51_32K_S110)
Vincent Coubard 638:c90ae1400bf2 222 bool is_central = false;
Vincent Coubard 638:c90ae1400bf2 223 #elif defined(TARGET_MCU_NRF51_16K_S120) || defined(TARGET_MCU_NRF51_32K_S120)
Vincent Coubard 638:c90ae1400bf2 224 bool is_central = true;
Vincent Coubard 638:c90ae1400bf2 225 #else
Vincent Coubard 638:c90ae1400bf2 226 bool is_central =
Vincent Coubard 638:c90ae1400bf2 227 (p_ble_evt->evt.gap_evt.params.connected.role == BLE_GAP_ROLE_CENTRAL);
Vincent Coubard 638:c90ae1400bf2 228 #endif
Vincent Coubard 638:c90ae1400bf2 229
Vincent Coubard 638:c90ae1400bf2 230 sdk_mapped_flags_update_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 231 &m_bcs.flags.central_flags,
Vincent Coubard 638:c90ae1400bf2 232 p_ble_evt->evt.gap_evt.conn_handle,
Vincent Coubard 638:c90ae1400bf2 233 is_central);
Vincent Coubard 638:c90ae1400bf2 234 }
Vincent Coubard 638:c90ae1400bf2 235
Vincent Coubard 638:c90ae1400bf2 236 break;
Vincent Coubard 638:c90ae1400bf2 237
Vincent Coubard 638:c90ae1400bf2 238 case BLE_GAP_EVT_DISCONNECTED:
Vincent Coubard 638:c90ae1400bf2 239 record_set_disconnected(p_ble_evt->evt.gap_evt.conn_handle);
Vincent Coubard 638:c90ae1400bf2 240 break;
Vincent Coubard 638:c90ae1400bf2 241
Vincent Coubard 638:c90ae1400bf2 242 case BLE_GAP_EVT_CONN_SEC_UPDATE:
Vincent Coubard 638:c90ae1400bf2 243 sdk_mapped_flags_update_by_key(
Vincent Coubard 638:c90ae1400bf2 244 m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 245 &m_bcs.flags.encrypted_flags,
Vincent Coubard 638:c90ae1400bf2 246 p_ble_evt->evt.gap_evt.conn_handle,
Vincent Coubard 638:c90ae1400bf2 247 (p_ble_evt->evt.gap_evt.params.conn_sec_update.conn_sec.sec_mode.lv > 1));
Vincent Coubard 638:c90ae1400bf2 248 sdk_mapped_flags_update_by_key(
Vincent Coubard 638:c90ae1400bf2 249 m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 250 &m_bcs.flags.mitm_protected_flags,
Vincent Coubard 638:c90ae1400bf2 251 p_ble_evt->evt.gap_evt.conn_handle,
Vincent Coubard 638:c90ae1400bf2 252 (p_ble_evt->evt.gap_evt.params.conn_sec_update.conn_sec.sec_mode.lv > 2));
Vincent Coubard 638:c90ae1400bf2 253 break;
Vincent Coubard 638:c90ae1400bf2 254 }
Vincent Coubard 638:c90ae1400bf2 255 }
Vincent Coubard 638:c90ae1400bf2 256
Vincent Coubard 638:c90ae1400bf2 257
Vincent Coubard 638:c90ae1400bf2 258 bool ble_conn_state_valid(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 259 {
Vincent Coubard 638:c90ae1400bf2 260 return sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 261 m_bcs.flags.valid_flags,
Vincent Coubard 638:c90ae1400bf2 262 conn_handle);
Vincent Coubard 638:c90ae1400bf2 263 }
Vincent Coubard 638:c90ae1400bf2 264
Vincent Coubard 638:c90ae1400bf2 265
Vincent Coubard 638:c90ae1400bf2 266 uint8_t ble_conn_state_role(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 267 {
Vincent Coubard 638:c90ae1400bf2 268 uint8_t role = BLE_GAP_ROLE_INVALID;
Vincent Coubard 638:c90ae1400bf2 269
Vincent Coubard 638:c90ae1400bf2 270 if ( sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles, m_bcs.flags.valid_flags, conn_handle) )
Vincent Coubard 638:c90ae1400bf2 271 {
Vincent Coubard 638:c90ae1400bf2 272 bool central = sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 273 m_bcs.flags.central_flags,
Vincent Coubard 638:c90ae1400bf2 274 conn_handle);
Vincent Coubard 638:c90ae1400bf2 275
Vincent Coubard 638:c90ae1400bf2 276 role = central ? BLE_GAP_ROLE_CENTRAL : BLE_GAP_ROLE_PERIPH;
Vincent Coubard 638:c90ae1400bf2 277 }
Vincent Coubard 638:c90ae1400bf2 278
Vincent Coubard 638:c90ae1400bf2 279 return role;
Vincent Coubard 638:c90ae1400bf2 280 }
Vincent Coubard 638:c90ae1400bf2 281
Vincent Coubard 638:c90ae1400bf2 282
Vincent Coubard 638:c90ae1400bf2 283 ble_conn_state_status_t ble_conn_state_status(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 284 {
Vincent Coubard 638:c90ae1400bf2 285 ble_conn_state_status_t conn_status = BLE_CONN_STATUS_INVALID;
Vincent Coubard 638:c90ae1400bf2 286 bool valid = sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 287 m_bcs.flags.valid_flags,
Vincent Coubard 638:c90ae1400bf2 288 conn_handle);
Vincent Coubard 638:c90ae1400bf2 289
Vincent Coubard 638:c90ae1400bf2 290 if (valid)
Vincent Coubard 638:c90ae1400bf2 291 {
Vincent Coubard 638:c90ae1400bf2 292 bool connected = sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 293 m_bcs.flags.connected_flags,
Vincent Coubard 638:c90ae1400bf2 294 conn_handle);
Vincent Coubard 638:c90ae1400bf2 295
Vincent Coubard 638:c90ae1400bf2 296 conn_status = connected ? BLE_CONN_STATUS_CONNECTED : BLE_CONN_STATUS_DISCONNECTED;
Vincent Coubard 638:c90ae1400bf2 297 }
Vincent Coubard 638:c90ae1400bf2 298
Vincent Coubard 638:c90ae1400bf2 299 return conn_status;
Vincent Coubard 638:c90ae1400bf2 300 }
Vincent Coubard 638:c90ae1400bf2 301
Vincent Coubard 638:c90ae1400bf2 302
Vincent Coubard 638:c90ae1400bf2 303 bool ble_conn_state_encrypted(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 304 {
Vincent Coubard 638:c90ae1400bf2 305 return sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 306 m_bcs.flags.encrypted_flags,
Vincent Coubard 638:c90ae1400bf2 307 conn_handle);
Vincent Coubard 638:c90ae1400bf2 308 }
Vincent Coubard 638:c90ae1400bf2 309
Vincent Coubard 638:c90ae1400bf2 310
Vincent Coubard 638:c90ae1400bf2 311 bool ble_conn_state_mitm_protected(uint16_t conn_handle)
Vincent Coubard 638:c90ae1400bf2 312 {
Vincent Coubard 638:c90ae1400bf2 313 return sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 314 m_bcs.flags.mitm_protected_flags,
Vincent Coubard 638:c90ae1400bf2 315 conn_handle);
Vincent Coubard 638:c90ae1400bf2 316 }
Vincent Coubard 638:c90ae1400bf2 317
Vincent Coubard 638:c90ae1400bf2 318
Vincent Coubard 638:c90ae1400bf2 319 uint32_t ble_conn_state_n_connections(void)
Vincent Coubard 638:c90ae1400bf2 320 {
Vincent Coubard 638:c90ae1400bf2 321 return sdk_mapped_flags_n_flags_set(m_bcs.flags.connected_flags);
Vincent Coubard 638:c90ae1400bf2 322 }
Vincent Coubard 638:c90ae1400bf2 323
Vincent Coubard 638:c90ae1400bf2 324
Vincent Coubard 638:c90ae1400bf2 325 uint32_t ble_conn_state_n_centrals(void)
Vincent Coubard 638:c90ae1400bf2 326 {
Vincent Coubard 638:c90ae1400bf2 327 return sdk_mapped_flags_n_flags_set((m_bcs.flags.central_flags) & (m_bcs.flags.connected_flags));
Vincent Coubard 638:c90ae1400bf2 328 }
Vincent Coubard 638:c90ae1400bf2 329
Vincent Coubard 638:c90ae1400bf2 330
Vincent Coubard 638:c90ae1400bf2 331 uint32_t ble_conn_state_n_peripherals(void)
Vincent Coubard 638:c90ae1400bf2 332 {
Vincent Coubard 638:c90ae1400bf2 333 return sdk_mapped_flags_n_flags_set((~m_bcs.flags.central_flags) & (m_bcs.flags.connected_flags));
Vincent Coubard 638:c90ae1400bf2 334 }
Vincent Coubard 638:c90ae1400bf2 335
Vincent Coubard 638:c90ae1400bf2 336
Vincent Coubard 638:c90ae1400bf2 337 sdk_mapped_flags_key_list_t ble_conn_state_conn_handles(void)
Vincent Coubard 638:c90ae1400bf2 338 {
Vincent Coubard 638:c90ae1400bf2 339 return sdk_mapped_flags_key_list_get(m_bcs.valid_conn_handles, m_bcs.flags.valid_flags);
Vincent Coubard 638:c90ae1400bf2 340 }
Vincent Coubard 638:c90ae1400bf2 341
Vincent Coubard 638:c90ae1400bf2 342
Vincent Coubard 638:c90ae1400bf2 343 sdk_mapped_flags_key_list_t ble_conn_state_central_handles(void)
Vincent Coubard 638:c90ae1400bf2 344 {
Vincent Coubard 638:c90ae1400bf2 345 return sdk_mapped_flags_key_list_get(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 346 (m_bcs.flags.central_flags) & (m_bcs.flags.connected_flags));
Vincent Coubard 638:c90ae1400bf2 347 }
Vincent Coubard 638:c90ae1400bf2 348
Vincent Coubard 638:c90ae1400bf2 349
Vincent Coubard 638:c90ae1400bf2 350 sdk_mapped_flags_key_list_t ble_conn_state_periph_handles(void)
Vincent Coubard 638:c90ae1400bf2 351 {
Vincent Coubard 638:c90ae1400bf2 352 return sdk_mapped_flags_key_list_get(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 353 (~m_bcs.flags.central_flags) & (m_bcs.flags.connected_flags));
Vincent Coubard 638:c90ae1400bf2 354 }
Vincent Coubard 638:c90ae1400bf2 355
Vincent Coubard 638:c90ae1400bf2 356
Vincent Coubard 638:c90ae1400bf2 357 ble_conn_state_user_flag_id_t ble_conn_state_user_flag_acquire(void)
Vincent Coubard 638:c90ae1400bf2 358 {
Vincent Coubard 638:c90ae1400bf2 359 for (ble_conn_state_user_flag_id_t i = BLE_CONN_STATE_USER_FLAG0;
Vincent Coubard 638:c90ae1400bf2 360 i < BLE_CONN_STATE_N_USER_FLAGS;
Vincent Coubard 638:c90ae1400bf2 361 i++)
Vincent Coubard 638:c90ae1400bf2 362 {
Vincent Coubard 638:c90ae1400bf2 363 if ( !user_flag_is_acquired(i) )
Vincent Coubard 638:c90ae1400bf2 364 {
Vincent Coubard 638:c90ae1400bf2 365 user_flag_acquire(i);
Vincent Coubard 638:c90ae1400bf2 366 return i;
Vincent Coubard 638:c90ae1400bf2 367 }
Vincent Coubard 638:c90ae1400bf2 368 }
Vincent Coubard 638:c90ae1400bf2 369
Vincent Coubard 638:c90ae1400bf2 370 return BLE_CONN_STATE_USER_FLAG_INVALID;
Vincent Coubard 638:c90ae1400bf2 371 }
Vincent Coubard 638:c90ae1400bf2 372
Vincent Coubard 638:c90ae1400bf2 373
Vincent Coubard 638:c90ae1400bf2 374 bool ble_conn_state_user_flag_get(uint16_t conn_handle, ble_conn_state_user_flag_id_t flag_id)
Vincent Coubard 638:c90ae1400bf2 375 {
Vincent Coubard 638:c90ae1400bf2 376 if (user_flag_is_acquired(flag_id))
Vincent Coubard 638:c90ae1400bf2 377 {
Vincent Coubard 638:c90ae1400bf2 378 return sdk_mapped_flags_get_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 379 m_bcs.flags.user_flags[flag_id],
Vincent Coubard 638:c90ae1400bf2 380 conn_handle);
Vincent Coubard 638:c90ae1400bf2 381 }
Vincent Coubard 638:c90ae1400bf2 382 else
Vincent Coubard 638:c90ae1400bf2 383 {
Vincent Coubard 638:c90ae1400bf2 384 return false;
Vincent Coubard 638:c90ae1400bf2 385 }
Vincent Coubard 638:c90ae1400bf2 386 }
Vincent Coubard 638:c90ae1400bf2 387
Vincent Coubard 638:c90ae1400bf2 388
Vincent Coubard 638:c90ae1400bf2 389 void ble_conn_state_user_flag_set(uint16_t conn_handle,
Vincent Coubard 638:c90ae1400bf2 390 ble_conn_state_user_flag_id_t flag_id,
Vincent Coubard 638:c90ae1400bf2 391 bool value)
Vincent Coubard 638:c90ae1400bf2 392 {
Vincent Coubard 638:c90ae1400bf2 393 if (user_flag_is_acquired(flag_id))
Vincent Coubard 638:c90ae1400bf2 394 {
Vincent Coubard 638:c90ae1400bf2 395 sdk_mapped_flags_update_by_key(m_bcs.valid_conn_handles,
Vincent Coubard 638:c90ae1400bf2 396 &m_bcs.flags.user_flags[flag_id],
Vincent Coubard 638:c90ae1400bf2 397 conn_handle,
Vincent Coubard 638:c90ae1400bf2 398 value);
Vincent Coubard 638:c90ae1400bf2 399 }
Vincent Coubard 638:c90ae1400bf2 400 }
Vincent Coubard 638:c90ae1400bf2 401
Vincent Coubard 638:c90ae1400bf2 402
Vincent Coubard 638:c90ae1400bf2 403 sdk_mapped_flags_t ble_conn_state_user_flag_collection(ble_conn_state_user_flag_id_t flag_id)
Vincent Coubard 638:c90ae1400bf2 404 {
Vincent Coubard 638:c90ae1400bf2 405 if ( user_flag_is_acquired(flag_id) )
Vincent Coubard 638:c90ae1400bf2 406 {
Vincent Coubard 638:c90ae1400bf2 407 return m_bcs.flags.user_flags[flag_id];
Vincent Coubard 638:c90ae1400bf2 408 }
Vincent Coubard 638:c90ae1400bf2 409 else
Vincent Coubard 638:c90ae1400bf2 410 {
Vincent Coubard 638:c90ae1400bf2 411 return 0;
Vincent Coubard 638:c90ae1400bf2 412 }
Vincent Coubard 638:c90ae1400bf2 413 }
Vincent Coubard 638:c90ae1400bf2 414