@ -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 */
}
}
}
@ -310,7 +349,6 @@ void ble_conn_params_on_ble_evt(ble_evt_t * p_ble_evt)
}
}
uint32_t ble_conn_params_change_conn_params ( ble_gap_conn_params_t * new_params )
{
uint32_t err_code ;