Nordic nrf51 sdk sources. Mirrored from https://github.com/ARMmbed/nrf51-sdk.

Dependents:   nRF51822 nRF51822

Committer:
vcoubard
Date:
Thu Apr 07 17:37:49 2016 +0100
Revision:
24:2aea0c1c57ee
Parent:
22:67a8d2c0bbbf
Child:
27:0fe148f1bca3
Synchronized with git rev 709d3cdb
Author: Liyou Zhou
Change version number in README

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 21:d9932bd925d0 1 /*
vcoubard 21:d9932bd925d0 2 * Copyright (c) Nordic Semiconductor ASA
vcoubard 21:d9932bd925d0 3 * All rights reserved.
vcoubard 21:d9932bd925d0 4 *
vcoubard 21:d9932bd925d0 5 * Redistribution and use in source and binary forms, with or without modification,
vcoubard 21:d9932bd925d0 6 * are permitted provided that the following conditions are met:
vcoubard 21:d9932bd925d0 7 *
vcoubard 21:d9932bd925d0 8 * 1. Redistributions of source code must retain the above copyright notice, this
vcoubard 21:d9932bd925d0 9 * list of conditions and the following disclaimer.
vcoubard 21:d9932bd925d0 10 *
vcoubard 21:d9932bd925d0 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this
vcoubard 21:d9932bd925d0 12 * list of conditions and the following disclaimer in the documentation and/or
vcoubard 21:d9932bd925d0 13 * other materials provided with the distribution.
vcoubard 21:d9932bd925d0 14 *
vcoubard 21:d9932bd925d0 15 * 3. Neither the name of Nordic Semiconductor ASA nor the names of other
vcoubard 21:d9932bd925d0 16 * contributors to this software may be used to endorse or promote products
vcoubard 21:d9932bd925d0 17 * derived from this software without specific prior written permission.
vcoubard 21:d9932bd925d0 18 *
vcoubard 21:d9932bd925d0 19 *
vcoubard 21:d9932bd925d0 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
vcoubard 21:d9932bd925d0 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
vcoubard 21:d9932bd925d0 22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
vcoubard 21:d9932bd925d0 23 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
vcoubard 21:d9932bd925d0 24 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
vcoubard 21:d9932bd925d0 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
vcoubard 21:d9932bd925d0 26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
vcoubard 21:d9932bd925d0 27 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
vcoubard 21:d9932bd925d0 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
vcoubard 21:d9932bd925d0 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
vcoubard 21:d9932bd925d0 30 *
vcoubard 21:d9932bd925d0 31 */
vcoubard 21:d9932bd925d0 32
vcoubard 21:d9932bd925d0 33 #include "ble_conn_params.h"
vcoubard 21:d9932bd925d0 34 #include <stdlib.h>
vcoubard 21:d9932bd925d0 35 #include "nordic_common.h"
vcoubard 21:d9932bd925d0 36 #include "ble_hci.h"
vcoubard 21:d9932bd925d0 37 #include "ble_srv_common.h"
vcoubard 21:d9932bd925d0 38 #include "app_util.h"
vcoubard 21:d9932bd925d0 39
vcoubard 21:d9932bd925d0 40 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 41 #include "app_timer.h"
vcoubard 21:d9932bd925d0 42 #else
vcoubard 21:d9932bd925d0 43 #include "mbed.h"
vcoubard 21:d9932bd925d0 44 #endif
vcoubard 21:d9932bd925d0 45
vcoubard 21:d9932bd925d0 46 static ble_conn_params_init_t m_conn_params_config; /**< Configuration as specified by the application. */
vcoubard 21:d9932bd925d0 47 static ble_gap_conn_params_t m_preferred_conn_params; /**< Connection parameters preferred by the application. */
vcoubard 21:d9932bd925d0 48 static uint8_t m_update_count; /**< Number of Connection Parameter Update messages that has currently been sent. */
vcoubard 21:d9932bd925d0 49 static uint16_t m_conn_handle; /**< Current connection handle. */
vcoubard 21:d9932bd925d0 50 static ble_gap_conn_params_t m_current_conn_params; /**< Connection parameters received in the most recent Connect event. */
vcoubard 21:d9932bd925d0 51 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 52 static app_timer_id_t m_conn_params_timer_id; /**< Connection parameters timer. */
vcoubard 21:d9932bd925d0 53 #else
vcoubard 21:d9932bd925d0 54 static Ticker m_conn_params_timer;
vcoubard 21:d9932bd925d0 55 #endif
vcoubard 21:d9932bd925d0 56
vcoubard 21:d9932bd925d0 57 static bool m_change_param = false;
vcoubard 21:d9932bd925d0 58
vcoubard 21:d9932bd925d0 59 static bool is_conn_params_ok(ble_gap_conn_params_t * p_conn_params)
vcoubard 21:d9932bd925d0 60 {
vcoubard 21:d9932bd925d0 61 // Check if interval is within the acceptable range.
vcoubard 21:d9932bd925d0 62 // NOTE: Using max_conn_interval in the received event data because this contains
vcoubard 21:d9932bd925d0 63 // the client's connection interval.
vcoubard 21:d9932bd925d0 64 if (
vcoubard 21:d9932bd925d0 65 (p_conn_params->max_conn_interval >= m_preferred_conn_params.min_conn_interval)
vcoubard 21:d9932bd925d0 66 &&
vcoubard 21:d9932bd925d0 67 (p_conn_params->max_conn_interval <= m_preferred_conn_params.max_conn_interval)
vcoubard 21:d9932bd925d0 68 )
vcoubard 21:d9932bd925d0 69 {
vcoubard 21:d9932bd925d0 70 return true;
vcoubard 21:d9932bd925d0 71 }
vcoubard 21:d9932bd925d0 72 else
vcoubard 21:d9932bd925d0 73 {
vcoubard 21:d9932bd925d0 74 return false;
vcoubard 21:d9932bd925d0 75 }
vcoubard 21:d9932bd925d0 76 }
vcoubard 21:d9932bd925d0 77
vcoubard 21:d9932bd925d0 78
vcoubard 21:d9932bd925d0 79 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 80 static void update_timeout_handler(void * p_context)
vcoubard 21:d9932bd925d0 81 {
vcoubard 21:d9932bd925d0 82 UNUSED_PARAMETER(p_context);
vcoubard 21:d9932bd925d0 83
vcoubard 21:d9932bd925d0 84 #else /* #if !USE_APP_TIMER */
vcoubard 21:d9932bd925d0 85 static void update_timeout_handler(void)
vcoubard 21:d9932bd925d0 86 {
vcoubard 21:d9932bd925d0 87 m_conn_params_timer.detach(); /* this is supposed to be a single-shot timer callback */
vcoubard 21:d9932bd925d0 88 #endif /* #if !USE_APP_TIMER */
vcoubard 21:d9932bd925d0 89 if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
vcoubard 21:d9932bd925d0 90 {
vcoubard 21:d9932bd925d0 91 // Check if we have reached the maximum number of attempts
vcoubard 21:d9932bd925d0 92 m_update_count++;
vcoubard 21:d9932bd925d0 93 if (m_update_count <= m_conn_params_config.max_conn_params_update_count)
vcoubard 21:d9932bd925d0 94 {
vcoubard 21:d9932bd925d0 95 uint32_t err_code;
vcoubard 21:d9932bd925d0 96
vcoubard 21:d9932bd925d0 97 // Parameters are not ok, send connection parameters update request.
vcoubard 21:d9932bd925d0 98 err_code = sd_ble_gap_conn_param_update(m_conn_handle, &m_preferred_conn_params);
vcoubard 21:d9932bd925d0 99 if ((err_code != NRF_SUCCESS) && (m_conn_params_config.error_handler != NULL))
vcoubard 21:d9932bd925d0 100 {
vcoubard 21:d9932bd925d0 101 m_conn_params_config.error_handler(err_code);
vcoubard 21:d9932bd925d0 102 }
vcoubard 21:d9932bd925d0 103 }
vcoubard 21:d9932bd925d0 104 else
vcoubard 21:d9932bd925d0 105 {
vcoubard 21:d9932bd925d0 106 m_update_count = 0;
vcoubard 21:d9932bd925d0 107
vcoubard 21:d9932bd925d0 108 // Negotiation failed, disconnect automatically if this has been configured
vcoubard 21:d9932bd925d0 109 if (m_conn_params_config.disconnect_on_fail)
vcoubard 21:d9932bd925d0 110 {
vcoubard 21:d9932bd925d0 111 uint32_t err_code;
vcoubard 21:d9932bd925d0 112
vcoubard 21:d9932bd925d0 113 err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
vcoubard 21:d9932bd925d0 114 if ((err_code != NRF_SUCCESS) && (m_conn_params_config.error_handler != NULL))
vcoubard 21:d9932bd925d0 115 {
vcoubard 21:d9932bd925d0 116 m_conn_params_config.error_handler(err_code);
vcoubard 21:d9932bd925d0 117 }
vcoubard 21:d9932bd925d0 118 }
vcoubard 21:d9932bd925d0 119
vcoubard 21:d9932bd925d0 120 // Notify the application that the procedure has failed
vcoubard 21:d9932bd925d0 121 if (m_conn_params_config.evt_handler != NULL)
vcoubard 21:d9932bd925d0 122 {
vcoubard 21:d9932bd925d0 123 ble_conn_params_evt_t evt;
vcoubard 21:d9932bd925d0 124
vcoubard 21:d9932bd925d0 125 evt.evt_type = BLE_CONN_PARAMS_EVT_FAILED;
vcoubard 21:d9932bd925d0 126 m_conn_params_config.evt_handler(&evt);
vcoubard 21:d9932bd925d0 127 }
vcoubard 21:d9932bd925d0 128 }
vcoubard 21:d9932bd925d0 129 }
vcoubard 21:d9932bd925d0 130 }
vcoubard 21:d9932bd925d0 131
vcoubard 21:d9932bd925d0 132
vcoubard 21:d9932bd925d0 133 uint32_t ble_conn_params_init(const ble_conn_params_init_t * p_init)
vcoubard 21:d9932bd925d0 134 {
vcoubard 21:d9932bd925d0 135 uint32_t err_code;
vcoubard 21:d9932bd925d0 136
vcoubard 21:d9932bd925d0 137 m_conn_params_config = *p_init;
vcoubard 21:d9932bd925d0 138 m_change_param = false;
vcoubard 21:d9932bd925d0 139 if (p_init->p_conn_params != NULL)
vcoubard 21:d9932bd925d0 140 {
vcoubard 21:d9932bd925d0 141 m_preferred_conn_params = *p_init->p_conn_params;
vcoubard 21:d9932bd925d0 142
vcoubard 21:d9932bd925d0 143 // Set the connection params in stack
vcoubard 21:d9932bd925d0 144 err_code = sd_ble_gap_ppcp_set(&m_preferred_conn_params);
vcoubard 21:d9932bd925d0 145 if (err_code != NRF_SUCCESS)
vcoubard 21:d9932bd925d0 146 {
vcoubard 21:d9932bd925d0 147 return err_code;
vcoubard 21:d9932bd925d0 148 }
vcoubard 21:d9932bd925d0 149 }
vcoubard 21:d9932bd925d0 150 else
vcoubard 21:d9932bd925d0 151 {
vcoubard 21:d9932bd925d0 152 // Fetch the connection params from stack
vcoubard 21:d9932bd925d0 153 err_code = sd_ble_gap_ppcp_get(&m_preferred_conn_params);
vcoubard 21:d9932bd925d0 154 if (err_code != NRF_SUCCESS)
vcoubard 21:d9932bd925d0 155 {
vcoubard 21:d9932bd925d0 156 return err_code;
vcoubard 21:d9932bd925d0 157 }
vcoubard 21:d9932bd925d0 158 }
vcoubard 21:d9932bd925d0 159
vcoubard 21:d9932bd925d0 160 m_conn_handle = BLE_CONN_HANDLE_INVALID;
vcoubard 21:d9932bd925d0 161 m_update_count = 0;
vcoubard 21:d9932bd925d0 162
vcoubard 21:d9932bd925d0 163 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 164 return app_timer_create(&m_conn_params_timer_id,
vcoubard 21:d9932bd925d0 165 APP_TIMER_MODE_SINGLE_SHOT,
vcoubard 21:d9932bd925d0 166 update_timeout_handler);
vcoubard 21:d9932bd925d0 167 #else
vcoubard 21:d9932bd925d0 168 return NRF_SUCCESS;
vcoubard 21:d9932bd925d0 169 #endif
vcoubard 21:d9932bd925d0 170 }
vcoubard 21:d9932bd925d0 171
vcoubard 21:d9932bd925d0 172
vcoubard 21:d9932bd925d0 173 uint32_t ble_conn_params_stop(void)
vcoubard 21:d9932bd925d0 174 {
vcoubard 21:d9932bd925d0 175 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 176 return app_timer_stop(m_conn_params_timer_id);
vcoubard 21:d9932bd925d0 177 #else /* #if !USE_APP_TIMER */
vcoubard 21:d9932bd925d0 178 m_conn_params_timer.detach();
vcoubard 21:d9932bd925d0 179 return NRF_SUCCESS;
vcoubard 21:d9932bd925d0 180 #endif /* #if !USE_APP_TIMER */
vcoubard 21:d9932bd925d0 181 }
vcoubard 21:d9932bd925d0 182
vcoubard 21:d9932bd925d0 183
vcoubard 21:d9932bd925d0 184 static void conn_params_negotiation(void)
vcoubard 21:d9932bd925d0 185 {
vcoubard 21:d9932bd925d0 186 // Start negotiation if the received connection parameters are not acceptable
vcoubard 21:d9932bd925d0 187 if (!is_conn_params_ok(&m_current_conn_params))
vcoubard 21:d9932bd925d0 188 {
vcoubard 21:d9932bd925d0 189 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 190 uint32_t err_code;
vcoubard 21:d9932bd925d0 191 #endif
vcoubard 21:d9932bd925d0 192 uint32_t timeout_ticks;
vcoubard 21:d9932bd925d0 193
vcoubard 21:d9932bd925d0 194 if (m_change_param)
vcoubard 21:d9932bd925d0 195 {
vcoubard 21:d9932bd925d0 196 // Notify the application that the procedure has failed
vcoubard 21:d9932bd925d0 197 if (m_conn_params_config.evt_handler != NULL)
vcoubard 21:d9932bd925d0 198 {
vcoubard 21:d9932bd925d0 199 ble_conn_params_evt_t evt;
vcoubard 21:d9932bd925d0 200
vcoubard 21:d9932bd925d0 201 evt.evt_type = BLE_CONN_PARAMS_EVT_FAILED;
vcoubard 21:d9932bd925d0 202 m_conn_params_config.evt_handler(&evt);
vcoubard 21:d9932bd925d0 203 }
vcoubard 21:d9932bd925d0 204 }
vcoubard 21:d9932bd925d0 205 else
vcoubard 21:d9932bd925d0 206 {
vcoubard 21:d9932bd925d0 207 if (m_update_count == 0)
vcoubard 21:d9932bd925d0 208 {
vcoubard 21:d9932bd925d0 209 // First connection parameter update
vcoubard 21:d9932bd925d0 210 timeout_ticks = m_conn_params_config.first_conn_params_update_delay;
vcoubard 21:d9932bd925d0 211 }
vcoubard 21:d9932bd925d0 212 else
vcoubard 21:d9932bd925d0 213 {
vcoubard 21:d9932bd925d0 214 timeout_ticks = m_conn_params_config.next_conn_params_update_delay;
vcoubard 21:d9932bd925d0 215 }
vcoubard 21:d9932bd925d0 216
vcoubard 21:d9932bd925d0 217 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 218 err_code = app_timer_start(m_conn_params_timer_id, timeout_ticks, NULL);
vcoubard 21:d9932bd925d0 219 if ((err_code != NRF_SUCCESS) && (m_conn_params_config.error_handler != NULL))
vcoubard 21:d9932bd925d0 220 {
vcoubard 21:d9932bd925d0 221 m_conn_params_config.error_handler(err_code);
vcoubard 21:d9932bd925d0 222 }
vcoubard 21:d9932bd925d0 223 #else
vcoubard 21:d9932bd925d0 224 m_conn_params_timer.attach(update_timeout_handler, timeout_ticks / 32768);
vcoubard 21:d9932bd925d0 225 #endif
vcoubard 21:d9932bd925d0 226 }
vcoubard 21:d9932bd925d0 227 }
vcoubard 21:d9932bd925d0 228 else
vcoubard 21:d9932bd925d0 229 {
vcoubard 21:d9932bd925d0 230 // Notify the application that the procedure has succeded
vcoubard 21:d9932bd925d0 231 if (m_conn_params_config.evt_handler != NULL)
vcoubard 21:d9932bd925d0 232 {
vcoubard 21:d9932bd925d0 233 ble_conn_params_evt_t evt;
vcoubard 21:d9932bd925d0 234
vcoubard 21:d9932bd925d0 235 evt.evt_type = BLE_CONN_PARAMS_EVT_SUCCEEDED;
vcoubard 21:d9932bd925d0 236 m_conn_params_config.evt_handler(&evt);
vcoubard 21:d9932bd925d0 237 }
vcoubard 21:d9932bd925d0 238 }
vcoubard 21:d9932bd925d0 239 m_change_param = false;
vcoubard 21:d9932bd925d0 240 }
vcoubard 21:d9932bd925d0 241
vcoubard 21:d9932bd925d0 242
vcoubard 21:d9932bd925d0 243 static void on_connect(ble_evt_t * p_ble_evt)
vcoubard 21:d9932bd925d0 244 {
vcoubard 21:d9932bd925d0 245 // Save connection parameters
vcoubard 21:d9932bd925d0 246 m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
vcoubard 21:d9932bd925d0 247 m_current_conn_params = p_ble_evt->evt.gap_evt.params.connected.conn_params;
vcoubard 21:d9932bd925d0 248 m_update_count = 0; // Connection parameter negotiation should re-start every connection
vcoubard 21:d9932bd925d0 249
vcoubard 21:d9932bd925d0 250 // Check if we shall handle negotiation on connect
vcoubard 21:d9932bd925d0 251 if (m_conn_params_config.start_on_notify_cccd_handle == BLE_GATT_HANDLE_INVALID)
vcoubard 21:d9932bd925d0 252 {
vcoubard 21:d9932bd925d0 253 conn_params_negotiation();
vcoubard 21:d9932bd925d0 254 }
vcoubard 21:d9932bd925d0 255 }
vcoubard 21:d9932bd925d0 256
vcoubard 21:d9932bd925d0 257
vcoubard 21:d9932bd925d0 258 static void on_disconnect(ble_evt_t * p_ble_evt)
vcoubard 21:d9932bd925d0 259 {
vcoubard 21:d9932bd925d0 260 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 261 uint32_t err_code;
vcoubard 21:d9932bd925d0 262 #endif
vcoubard 21:d9932bd925d0 263
vcoubard 21:d9932bd925d0 264 m_conn_handle = BLE_CONN_HANDLE_INVALID;
vcoubard 21:d9932bd925d0 265
vcoubard 21:d9932bd925d0 266 // Stop timer if running
vcoubard 21:d9932bd925d0 267 m_update_count = 0; // Connection parameters updates should happen during every connection
vcoubard 21:d9932bd925d0 268
vcoubard 21:d9932bd925d0 269 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 270 err_code = app_timer_stop(m_conn_params_timer_id);
vcoubard 21:d9932bd925d0 271 if ((err_code != NRF_SUCCESS) && (m_conn_params_config.error_handler != NULL))
vcoubard 21:d9932bd925d0 272 {
vcoubard 21:d9932bd925d0 273 m_conn_params_config.error_handler(err_code);
vcoubard 21:d9932bd925d0 274 }
vcoubard 21:d9932bd925d0 275 #else
vcoubard 21:d9932bd925d0 276 m_conn_params_timer.detach();
vcoubard 21:d9932bd925d0 277 #endif
vcoubard 21:d9932bd925d0 278 }
vcoubard 21:d9932bd925d0 279
vcoubard 21:d9932bd925d0 280
vcoubard 21:d9932bd925d0 281 static void on_write(ble_evt_t * p_ble_evt)
vcoubard 21:d9932bd925d0 282 {
vcoubard 21:d9932bd925d0 283 ble_gatts_evt_write_t * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;
vcoubard 21:d9932bd925d0 284
vcoubard 21:d9932bd925d0 285 // Check if this the correct CCCD
vcoubard 21:d9932bd925d0 286 if (
vcoubard 21:d9932bd925d0 287 (p_evt_write->handle == m_conn_params_config.start_on_notify_cccd_handle)
vcoubard 21:d9932bd925d0 288 &&
vcoubard 21:d9932bd925d0 289 (p_evt_write->len == 2)
vcoubard 21:d9932bd925d0 290 )
vcoubard 21:d9932bd925d0 291 {
vcoubard 21:d9932bd925d0 292 // Check if this is a 'start notification'
vcoubard 21:d9932bd925d0 293 if (ble_srv_is_notification_enabled(p_evt_write->data))
vcoubard 21:d9932bd925d0 294 {
vcoubard 21:d9932bd925d0 295 // Do connection parameter negotiation if necessary
vcoubard 21:d9932bd925d0 296 conn_params_negotiation();
vcoubard 21:d9932bd925d0 297 }
vcoubard 21:d9932bd925d0 298 else
vcoubard 21:d9932bd925d0 299 {
vcoubard 21:d9932bd925d0 300 #ifdef USE_APP_TIMER
vcoubard 21:d9932bd925d0 301 uint32_t err_code;
vcoubard 21:d9932bd925d0 302
vcoubard 21:d9932bd925d0 303 // Stop timer if running
vcoubard 21:d9932bd925d0 304 err_code = app_timer_stop(m_conn_params_timer_id);
vcoubard 21:d9932bd925d0 305 if ((err_code != NRF_SUCCESS) && (m_conn_params_config.error_handler != NULL))
vcoubard 21:d9932bd925d0 306 {
vcoubard 21:d9932bd925d0 307 m_conn_params_config.error_handler(err_code);
vcoubard 21:d9932bd925d0 308 }
vcoubard 21:d9932bd925d0 309 #else /* #if !USE_APP_TIMER */
vcoubard 21:d9932bd925d0 310 m_conn_params_timer.detach();
vcoubard 21:d9932bd925d0 311 #endif /* #if !USE_APP_TIMER */
vcoubard 21:d9932bd925d0 312 }
vcoubard 21:d9932bd925d0 313 }
vcoubard 21:d9932bd925d0 314 }
vcoubard 21:d9932bd925d0 315
vcoubard 21:d9932bd925d0 316
vcoubard 21:d9932bd925d0 317 static void on_conn_params_update(ble_evt_t * p_ble_evt)
vcoubard 21:d9932bd925d0 318 {
vcoubard 21:d9932bd925d0 319 // Copy the parameters
vcoubard 21:d9932bd925d0 320 m_current_conn_params = p_ble_evt->evt.gap_evt.params.conn_param_update.conn_params;
vcoubard 21:d9932bd925d0 321
vcoubard 21:d9932bd925d0 322 conn_params_negotiation();
vcoubard 21:d9932bd925d0 323 }
vcoubard 21:d9932bd925d0 324
vcoubard 21:d9932bd925d0 325
vcoubard 21:d9932bd925d0 326 void ble_conn_params_on_ble_evt(ble_evt_t * p_ble_evt)
vcoubard 21:d9932bd925d0 327 {
vcoubard 21:d9932bd925d0 328 switch (p_ble_evt->header.evt_id)
vcoubard 21:d9932bd925d0 329 {
vcoubard 21:d9932bd925d0 330 case BLE_GAP_EVT_CONNECTED:
vcoubard 21:d9932bd925d0 331 on_connect(p_ble_evt);
vcoubard 21:d9932bd925d0 332 break;
vcoubard 21:d9932bd925d0 333
vcoubard 21:d9932bd925d0 334 case BLE_GAP_EVT_DISCONNECTED:
vcoubard 21:d9932bd925d0 335 on_disconnect(p_ble_evt);
vcoubard 21:d9932bd925d0 336 break;
vcoubard 21:d9932bd925d0 337
vcoubard 21:d9932bd925d0 338 case BLE_GATTS_EVT_WRITE:
vcoubard 21:d9932bd925d0 339 on_write(p_ble_evt);
vcoubard 21:d9932bd925d0 340 break;
vcoubard 21:d9932bd925d0 341
vcoubard 21:d9932bd925d0 342 case BLE_GAP_EVT_CONN_PARAM_UPDATE:
vcoubard 21:d9932bd925d0 343 on_conn_params_update(p_ble_evt);
vcoubard 21:d9932bd925d0 344 break;
vcoubard 21:d9932bd925d0 345
vcoubard 21:d9932bd925d0 346 default:
vcoubard 21:d9932bd925d0 347 // No implementation needed.
vcoubard 21:d9932bd925d0 348 break;
vcoubard 21:d9932bd925d0 349 }
vcoubard 21:d9932bd925d0 350 }
vcoubard 21:d9932bd925d0 351
vcoubard 24:2aea0c1c57ee 352
vcoubard 21:d9932bd925d0 353 uint32_t ble_conn_params_change_conn_params(ble_gap_conn_params_t * new_params)
vcoubard 21:d9932bd925d0 354 {
vcoubard 21:d9932bd925d0 355 uint32_t err_code;
vcoubard 21:d9932bd925d0 356
vcoubard 21:d9932bd925d0 357 m_preferred_conn_params = *new_params;
vcoubard 21:d9932bd925d0 358 // Set the connection params in stack
vcoubard 21:d9932bd925d0 359 err_code = sd_ble_gap_ppcp_set(&m_preferred_conn_params);
vcoubard 21:d9932bd925d0 360 if (err_code == NRF_SUCCESS)
vcoubard 21:d9932bd925d0 361 {
vcoubard 21:d9932bd925d0 362 if (!is_conn_params_ok(&m_current_conn_params))
vcoubard 21:d9932bd925d0 363 {
vcoubard 21:d9932bd925d0 364 m_change_param = true;
vcoubard 21:d9932bd925d0 365 err_code = sd_ble_gap_conn_param_update(m_conn_handle, &m_preferred_conn_params);
vcoubard 21:d9932bd925d0 366 m_update_count = 1;
vcoubard 21:d9932bd925d0 367 }
vcoubard 21:d9932bd925d0 368 else
vcoubard 21:d9932bd925d0 369 {
vcoubard 21:d9932bd925d0 370 // Notify the application that the procedure has succeded
vcoubard 21:d9932bd925d0 371 if (m_conn_params_config.evt_handler != NULL)
vcoubard 21:d9932bd925d0 372 {
vcoubard 21:d9932bd925d0 373 ble_conn_params_evt_t evt;
vcoubard 21:d9932bd925d0 374
vcoubard 21:d9932bd925d0 375 evt.evt_type = BLE_CONN_PARAMS_EVT_SUCCEEDED;
vcoubard 21:d9932bd925d0 376 m_conn_params_config.evt_handler(&evt);
vcoubard 21:d9932bd925d0 377 }
vcoubard 21:d9932bd925d0 378 err_code = NRF_SUCCESS;
vcoubard 21:d9932bd925d0 379 }
vcoubard 21:d9932bd925d0 380 }
vcoubard 21:d9932bd925d0 381 return err_code;
vcoubard 21:d9932bd925d0 382 }