|
|
|
@ -34,17 +34,25 @@
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include "nordic_common.h"
|
|
|
|
|
#include "ble_hci.h"
|
|
|
|
|
#include "app_timer.h"
|
|
|
|
|
#include "ble_srv_common.h"
|
|
|
|
|
#include "app_util.h"
|
|
|
|
|
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
#include "app_timer.h"
|
|
|
|
|
#else
|
|
|
|
|
#include "mbed.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static ble_conn_params_init_t m_conn_params_config; /**< Configuration as specified by the application. */
|
|
|
|
|
static ble_gap_conn_params_t m_preferred_conn_params; /**< Connection parameters preferred by the application. */
|
|
|
|
|
static uint8_t m_update_count; /**< Number of Connection Parameter Update messages that has currently been sent. */
|
|
|
|
|
static uint16_t m_conn_handle; /**< Current connection handle. */
|
|
|
|
|
static ble_gap_conn_params_t m_current_conn_params; /**< Connection parameters received in the most recent Connect event. */
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
static app_timer_id_t m_conn_params_timer_id; /**< Connection parameters timer. */
|
|
|
|
|
#else
|
|
|
|
|
static Ticker m_conn_params_timer;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static bool m_change_param = false;
|
|
|
|
|
|
|
|
|
@ -68,10 +76,16 @@ static bool is_conn_params_ok(ble_gap_conn_params_t * p_conn_params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
static void update_timeout_handler(void * p_context)
|
|
|
|
|
{
|
|
|
|
|
UNUSED_PARAMETER(p_context);
|
|
|
|
|
|
|
|
|
|
#else /* #if !USE_APP_TIMER */
|
|
|
|
|
static void update_timeout_handler(void)
|
|
|
|
|
{
|
|
|
|
|
m_conn_params_timer.detach(); /* this is supposed to be a single-shot timer callback */
|
|
|
|
|
#endif /* #if !USE_APP_TIMER */
|
|
|
|
|
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
|
|
|
|
|
{
|
|
|
|
|
// Check if we have reached the maximum number of attempts
|
|
|
|
@ -146,15 +160,24 @@ uint32_t ble_conn_params_init(const ble_conn_params_init_t * p_init)
|
|
|
|
|
m_conn_handle = BLE_CONN_HANDLE_INVALID;
|
|
|
|
|
m_update_count = 0;
|
|
|
|
|
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
return app_timer_create(&m_conn_params_timer_id,
|
|
|
|
|
APP_TIMER_MODE_SINGLE_SHOT,
|
|
|
|
|
update_timeout_handler);
|
|
|
|
|
#else
|
|
|
|
|
return NRF_SUCCESS;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t ble_conn_params_stop(void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
return app_timer_stop(m_conn_params_timer_id);
|
|
|
|
|
#else /* #if !USE_APP_TIMER */
|
|
|
|
|
m_conn_params_timer.detach();
|
|
|
|
|
return NRF_SUCCESS;
|
|
|
|
|
#endif /* #if !USE_APP_TIMER */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -163,7 +186,9 @@ static void conn_params_negotiation(void)
|
|
|
|
|
// Start negotiation if the received connection parameters are not acceptable
|
|
|
|
|
if (!is_conn_params_ok(&m_current_conn_params))
|
|
|
|
|
{
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
uint32_t err_code;
|
|
|
|
|
#endif
|
|
|
|
|
uint32_t timeout_ticks;
|
|
|
|
|
|
|
|
|
|
if (m_change_param)
|
|
|
|
@ -189,11 +214,15 @@ static void conn_params_negotiation(void)
|
|
|
|
|
timeout_ticks = m_conn_params_config.next_conn_params_update_delay;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
err_code = app_timer_start(m_conn_params_timer_id, timeout_ticks, NULL);
|
|
|
|
|
if ((err_code != NRF_SUCCESS) && (m_conn_params_config.error_handler != NULL))
|
|
|
|
|
{
|
|
|
|
|
m_conn_params_config.error_handler(err_code);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
m_conn_params_timer.attach(update_timeout_handler, timeout_ticks / 32768);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -228,18 +257,24 @@ static void on_connect(ble_evt_t * p_ble_evt)
|
|
|
|
|
|
|
|
|
|
static void on_disconnect(ble_evt_t * p_ble_evt)
|
|
|
|
|
{
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
uint32_t err_code;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
m_conn_handle = BLE_CONN_HANDLE_INVALID;
|
|
|
|
|
|
|
|
|
|
// Stop timer if running
|
|
|
|
|
m_update_count = 0; // Connection parameters updates should happen during every connection
|
|
|
|
|
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
err_code = app_timer_stop(m_conn_params_timer_id);
|
|
|
|
|
if ((err_code != NRF_SUCCESS) && (m_conn_params_config.error_handler != NULL))
|
|
|
|
|
{
|
|
|
|
|
m_conn_params_config.error_handler(err_code);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
m_conn_params_timer.detach();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -262,6 +297,7 @@ static void on_write(ble_evt_t * p_ble_evt)
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
#ifdef USE_APP_TIMER
|
|
|
|
|
uint32_t err_code;
|
|
|
|
|
|
|
|
|
|
// Stop timer if running
|
|
|
|
@ -270,6 +306,9 @@ static void on_write(ble_evt_t * p_ble_evt)
|
|
|
|
|
{
|
|
|
|
|
m_conn_params_config.error_handler(err_code);
|
|
|
|
|
}
|
|
|
|
|
#else /* #if !USE_APP_TIMER */
|
|
|
|
|
m_conn_params_timer.detach();
|
|
|
|
|
#endif /* #if !USE_APP_TIMER */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|