@ -5,9 +5,9 @@
# include <stdint.h>
# include <string.h>
# include "aproject_config/config.h"
# include "ble_bas.h"
# include "znordic.h"
# include "aproject_config/config.h"
# if BLE_DFU_ENABLED
# include "nrf_bootloader_info.h"
@ -15,11 +15,11 @@
/*******************************************************************************
* 广 播 包 配 ? ? *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
# define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
# define SLAVE_LATENCY 0 /**< Slave latency. */
# define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
# define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**< UUID type for the Nordic UART Service (vendor specific). */
# define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
# define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
# define SLAVE_LATENCY 0 /**< Slave latency. */
# define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
# define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**< UUID type for the Nordic UART Service (vendor specific). */
BLE_ADVERTISING_DEF ( m_advertising ) ; /**< Advertising module instance. */
@ -31,128 +31,117 @@ NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */
/*******************************************************************************
* 连 接 参 数 配 置 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
# define FIRST_CONN_PARAMS_UPDATE_DELAY \
APP_TIMER_TICKS ( 5000 ) /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). \
*/
# define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
# define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */
# define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */
/*******************************************************************************
* CODE *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID ; /**< 当前连接句柄 */
static uint16_t m_mtu_size = BLE_GATT_ATT_MTU_DEFAULT - 3 ;
static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID ; /**< 当前连接句柄 */
static uint16_t m_mtu_size = BLE_GATT_ATT_MTU_DEFAULT - 3 ;
static zble_event_listener_t m_event_listener ;
static uint32_t m_last_disconnected_tp ;
static void ble_evt_handler ( ble_evt_t const * p_ble_evt , void * p_context )
{
uint32_t err_code ;
static void ble_evt_handler ( ble_evt_t const * p_ble_evt , void * p_context ) {
uint32_t err_code ;
static zble_event_t zevent ;
switch ( p_ble_evt - > header . evt_id )
{
case BLE_GAP_EVT_CONNECTED :
m_conn_handle = p_ble_evt - > evt . gap_evt . conn_handle ;
zevent . eventType = kzble_event_connected ;
if ( m_event_listener )
m_event_listener ( & zevent ) ;
break ;
case BLE_GAP_EVT_DISCONNECTED :
m_conn_handle = BLE_CONN_HANDLE_INVALID ;
zevent . eventType = kzble_event_disconnected ;
if ( m_event_listener )
m_event_listener ( & zevent ) ;
break ;
case BLE_GAP_EVT_PHY_UPDATE_REQUEST :
{
NRF_LOG_DEBUG ( " PHY update request. " ) ;
ble_gap_phys_t const phys = {
. rx_phys = BLE_GAP_PHY_AUTO ,
. tx_phys = BLE_GAP_PHY_AUTO ,
} ;
err_code = sd_ble_gap_phy_update ( p_ble_evt - > evt . gap_evt . conn_handle , & phys ) ;
ZERROR_CHECK ( err_code ) ;
}
break ;
case BLE_GAP_EVT_SEC_PARAMS_REQUEST :
/ / Pairing not supported
err_code = sd_ble_gap_sec_params_reply ( m_conn_handle , BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP , NULL , NULL ) ;
ZERROR_CHECK ( err_code ) ;
break ;
case BLE_GATTS_EVT_SYS_ATTR_MISSING :
/ / No system attributes have been stored .
err_code = sd_ble_gatts_sys_attr_set ( m_conn_handle , NULL , 0 , 0 ) ;
ZERROR_CHECK ( err_code ) ;
break ;
case BLE_GATTC_EVT_TIMEOUT :
/ / Disconnect on GATT Client timeout event .
err_code = sd_ble_gap_disconnect ( p_ble_evt - > evt . gattc_evt . conn_handle , BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION ) ;
ZERROR_CHECK ( err_code ) ;
break ;
case BLE_GATTS_EVT_TIMEOUT :
/ / Disconnect on GATT Server timeout event .
err_code = sd_ble_gap_disconnect ( p_ble_evt - > evt . gatts_evt . conn_handle , BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION ) ;
ZERROR_CHECK ( err_code ) ;
break ;
default :
/ / No implementation needed .
break ;
switch ( p_ble_evt - > header . evt_id ) {
case BLE_GAP_EVT_CONNECTED :
m_conn_handle = p_ble_evt - > evt . gap_evt . conn_handle ;
zevent . eventType = kzble_event_connected ;
if ( m_event_listener ) m_event_listener ( & zevent ) ;
break ;
case BLE_GAP_EVT_DISCONNECTED :
m_conn_handle = BLE_CONN_HANDLE_INVALID ;
zevent . eventType = kzble_event_disconnected ;
m_last_disconnected_tp = znordic_getpower_on_ms ( ) ;
if ( m_event_listener ) m_event_listener ( & zevent ) ;
break ;
case BLE_GAP_EVT_PHY_UPDATE_REQUEST : {
NRF_LOG_DEBUG ( " PHY update request. " ) ;
ble_gap_phys_t const phys = {
. rx_phys = BLE_GAP_PHY_AUTO ,
. tx_phys = BLE_GAP_PHY_AUTO ,
} ;
err_code = sd_ble_gap_phy_update ( p_ble_evt - > evt . gap_evt . conn_handle , & phys ) ;
ZERROR_CHECK ( err_code ) ;
} break ;
case BLE_GAP_EVT_SEC_PARAMS_REQUEST :
/ / Pairing not supported
err_code = sd_ble_gap_sec_params_reply ( m_conn_handle , BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP , NULL , NULL ) ;
ZERROR_CHECK ( err_code ) ;
break ;
case BLE_GATTS_EVT_SYS_ATTR_MISSING :
/ / No system attributes have been stored .
err_code = sd_ble_gatts_sys_attr_set ( m_conn_handle , NULL , 0 , 0 ) ;
ZERROR_CHECK ( err_code ) ;
break ;
case BLE_GATTC_EVT_TIMEOUT :
/ / Disconnect on GATT Client timeout event .
err_code = sd_ble_gap_disconnect ( p_ble_evt - > evt . gattc_evt . conn_handle , BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION ) ;
ZERROR_CHECK ( err_code ) ;
break ;
case BLE_GATTS_EVT_TIMEOUT :
/ / Disconnect on GATT Server timeout event .
err_code = sd_ble_gap_disconnect ( p_ble_evt - > evt . gatts_evt . conn_handle , BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION ) ;
ZERROR_CHECK ( err_code ) ;
break ;
default :
/ / No implementation needed .
break ;
}
}
static void gatt_evt_handler ( nrf_ble_gatt_t * p_gatt , nrf_ble_gatt_evt_t const * p_evt )
{
static void gatt_evt_handler ( nrf_ble_gatt_t * p_gatt , nrf_ble_gatt_evt_t const * p_evt ) {
/*******************************************************************************
* MTU SIZE 更 新 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
if ( ( m_conn_handle = = p_evt - > conn_handle ) & & ( p_evt - > evt_id = = NRF_BLE_GATT_EVT_ATT_MTU_UPDATED ) )
{
if ( ( m_conn_handle = = p_evt - > conn_handle ) & & ( p_evt - > evt_id = = NRF_BLE_GATT_EVT_ATT_MTU_UPDATED ) ) {
m_mtu_size = p_evt - > params . att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH ;
NRF_LOG_DEBUG ( " ATT MTU exchange completed. central %d peripheral %d " , p_gatt - > att_mtu_desired_central , p_gatt - > att_mtu_desired_periph ) ;
}
}
static void on_conn_params_evt ( ble_conn_params_evt_t * p_evt )
{
static void on_conn_params_evt ( ble_conn_params_evt_t * p_evt ) {
uint32_t err_code ;
if ( p_evt - > evt_type = = BLE_CONN_PARAMS_EVT_FAILED )
{
if ( p_evt - > evt_type = = BLE_CONN_PARAMS_EVT_FAILED ) {
err_code = sd_ble_gap_disconnect ( m_conn_handle , BLE_HCI_CONN_INTERVAL_UNACCEPTABLE ) ;
ZERROR_CHECK ( err_code ) ;
}
}
static void conn_params_error_handler ( uint32_t nrf_error ) { APP_ERROR_HANDLER ( nrf_error ) ; }
static void on_adv_evt ( ble_adv_evt_t ble_adv_evt )
{
switch ( ble_adv_evt )
{
case BLE_ADV_EVT_FAST :
ZLOGI ( " Fast advertising " ) ;
break ;
case BLE_ADV_EVT_SLOW :
ZLOGI ( " Slow advertising " ) ;
break ;
case BLE_ADV_EVT_IDLE :
ZLOGI ( " Advertising stopped " ) ;
break ;
default :
break ;
static void on_adv_evt ( ble_adv_evt_t ble_adv_evt ) {
switch ( ble_adv_evt ) {
case BLE_ADV_EVT_FAST :
ZLOGI ( " Fast advertising " ) ;
break ;
case BLE_ADV_EVT_SLOW :
ZLOGI ( " Slow advertising " ) ;
break ;
case BLE_ADV_EVT_IDLE :
ZLOGI ( " Advertising stopped " ) ;
break ;
default :
break ;
}
}
void zble_module_start_adv ( )
{
void zble_module_start_adv ( ) {
sd_ble_gap_adv_stop ( m_advertising . adv_handle ) ;
uint32_t err_code = ble_advertising_start ( & m_advertising , BLE_ADV_MODE_FAST ) ;
ZERROR_CHECK ( err_code ) ;
}
void zble_module_stop_adv ( )
{
void zble_module_stop_adv ( ) {
sd_ble_gap_adv_stop ( m_advertising . adv_handle ) ;
/ / ZERROR_CHECK ( err_code ) ;
}
@ -175,41 +164,39 @@ void zble_module_reglistener(zble_event_listener_t event_listener) { m_event_lis
*
* @ retval True if shutdown is allowed by this power manager handler , otherwise false .
*/
static bool app_shutdown_handler ( nrf_pwr_mgmt_evt_t event )
{
switch ( event )
{
case NRF_PWR_MGMT_EVT_PREPARE_DFU :
NRF_LOG_INFO ( " Power management wants to reset to DFU mode. " ) ;
/ / YOUR_JOB : Get ready to reset into DFU mode
/ /
/ / If you aren ' t finished with any ongoing tasks , return " false " to
/ / signal to the system that reset is impossible at this stage .
/ /
/ / Here is an example using a variable to delay resetting the device .
/ /
/ / if ( ! m_ready_for_reset )
/ / {
/ / return false ;
/ / }
/ / else
/ / {
/ /
/ / / / Device ready to enter
/ / uint32_t err_code ;
/ / err_code = sd_softdevice_disable ( ) ;
/ / APP_ERROR_CHECK ( err_code ) ;
/ / err_code = app_timer_stop_all ( ) ;
/ / APP_ERROR_CHECK ( err_code ) ;
/ / }
break ;
default :
/ / YOUR_JOB : Implement any of the other events available from the power management module :
/ / - NRF_PWR_MGMT_EVT_PREPARE_SYSOFF
/ / - NRF_PWR_MGMT_EVT_PREPARE_WAKEUP
/ / - NRF_PWR_MGMT_EVT_PREPARE_RESET
return true ;
static bool app_shutdown_handler ( nrf_pwr_mgmt_evt_t event ) {
switch ( event ) {
case NRF_PWR_MGMT_EVT_PREPARE_DFU :
NRF_LOG_INFO ( " Power management wants to reset to DFU mode. " ) ;
/ / YOUR_JOB : Get ready to reset into DFU mode
/ /
/ / If you aren ' t finished with any ongoing tasks , return " false " to
/ / signal to the system that reset is impossible at this stage .
/ /
/ / Here is an example using a variable to delay resetting the device .
/ /
/ / if ( ! m_ready_for_reset )
/ / {
/ / return false ;
/ / }
/ / else
/ / {
/ /
/ / / / Device ready to enter
/ / uint32_t err_code ;
/ / err_code = sd_softdevice_disable ( ) ;
/ / APP_ERROR_CHECK ( err_code ) ;
/ / err_code = app_timer_stop_all ( ) ;
/ / APP_ERROR_CHECK ( err_code ) ;
/ / }
break ;
default :
/ / YOUR_JOB : Implement any of the other events available from the power management module :
/ / - NRF_PWR_MGMT_EVT_PREPARE_SYSOFF
/ / - NRF_PWR_MGMT_EVT_PREPARE_WAKEUP
/ / - NRF_PWR_MGMT_EVT_PREPARE_RESET
return true ;
}
NRF_LOG_INFO ( " Power management allowed to reset to DFU mode. " ) ;
@ -221,10 +208,8 @@ static bool app_shutdown_handler(nrf_pwr_mgmt_evt_t event)
*/
NRF_PWR_MGMT_HANDLER_REGISTER ( app_shutdown_handler , 0 ) ;
static void buttonless_dfu_sdh_state_observer ( nrf_sdh_state_evt_t state , void * p_context )
{
if ( state = = NRF_SDH_EVT_STATE_DISABLED )
{
static void buttonless_dfu_sdh_state_observer ( nrf_sdh_state_evt_t state , void * p_context ) {
if ( state = = NRF_SDH_EVT_STATE_DISABLED ) {
/ / Softdevice was disabled before going into reset . Inform bootloader to skip CRC on next boot .
nrf_power_gpregret2_set ( BOOTLOADER_DFU_SKIP_CRC ) ;
@ -238,26 +223,21 @@ NRF_SDH_STATE_OBSERVER(m_buttonless_dfu_state_obs, 0) = {
. handler = buttonless_dfu_sdh_state_observer ,
} ;
static void dfu_advertising_config_get ( ble_adv_modes_config_t * p_config )
{
static void dfu_advertising_config_get ( ble_adv_modes_config_t * p_config ) {
memset ( p_config , 0 , sizeof ( ble_adv_modes_config_t ) ) ;
p_config - > ble_adv_fast_enabled = true ;
p_config - > ble_adv_fast_enabled = true ;
p_config - > ble_adv_fast_interval = 64 ;
p_config - > ble_adv_fast_timeout = 3000 ; / / 30 s
p_config - > ble_adv_fast_timeout = 3000 ; / / 30 s
}
static void disconnect ( uint16_t conn_handle , void * p_context )
{
static void disconnect ( uint16_t conn_handle , void * p_context ) {
UNUSED_PARAMETER ( p_context ) ;
ret_code_t err_code = sd_ble_gap_disconnect ( conn_handle , BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION ) ;
if ( err_code ! = NRF_SUCCESS )
{
if ( err_code ! = NRF_SUCCESS ) {
NRF_LOG_WARNING ( " Failed to disconnect connection. Connection handle: %d Error: %d " , conn_handle , err_code ) ;
}
else
{
} else {
NRF_LOG_DEBUG ( " Disconnected connection handle %d " , conn_handle ) ;
}
}
@ -267,50 +247,47 @@ static void disconnect(uint16_t conn_handle, void *p_context)
*
* @ param [ in ] event Event from the Buttonless Secure DFU service .
*/
static void ble_dfu_evt_handler ( ble_dfu_buttonless_evt_type_t event )
{
switch ( event )
{
case BLE_DFU_EVT_BOOTLOADER_ENTER_PREPARE :
{
NRF_LOG_INFO ( " Device is preparing to enter bootloader mode. " ) ;
/ / Prevent device from advertising on disconnect .
ble_adv_modes_config_t config ;
dfu_advertising_config_get ( & config ) ;
config . ble_adv_on_disconnect_disabled = true ;
ble_advertising_modes_config_set ( & m_advertising , & config ) ;
/ / Disconnect all other bonded devices that currently are connected .
/ / This is required to receive a service changed indication
/ / on bootup after a successful ( or aborted ) Device Firmware Update .
uint32_t conn_count = ble_conn_state_for_each_connected ( disconnect , NULL ) ;
NRF_LOG_INFO ( " Disconnected %d links. " , conn_count ) ;
break ;
}
case BLE_DFU_EVT_BOOTLOADER_ENTER :
/ / YOUR_JOB : Write app - specific unwritten data to FLASH , control finalization of this
/ / by delaying reset by reporting false in app_shutdown_handler
NRF_LOG_INFO ( " Device will enter bootloader mode. " ) ;
break ;
case BLE_DFU_EVT_BOOTLOADER_ENTER_FAILED :
NRF_LOG_ERROR ( " Request to enter bootloader mode failed asynchroneously. " ) ;
/ / YOUR_JOB : Take corrective measures to resolve the issue
/ / like calling APP_ERROR_CHECK to reset the device .
break ;
case BLE_DFU_EVT_RESPONSE_SEND_ERROR :
NRF_LOG_ERROR ( " Request to send a response to client failed. " ) ;
/ / YOUR_JOB : Take corrective measures to resolve the issue
/ / like calling APP_ERROR_CHECK to reset the device .
APP_ERROR_CHECK ( false ) ;
break ;
default :
NRF_LOG_ERROR ( " Unknown event from ble_dfu_buttonless. " ) ;
break ;
static void ble_dfu_evt_handler ( ble_dfu_buttonless_evt_type_t event ) {
switch ( event ) {
case BLE_DFU_EVT_BOOTLOADER_ENTER_PREPARE : {
NRF_LOG_INFO ( " Device is preparing to enter bootloader mode. " ) ;
/ / Prevent device from advertising on disconnect .
ble_adv_modes_config_t config ;
dfu_advertising_config_get ( & config ) ;
config . ble_adv_on_disconnect_disabled = true ;
ble_advertising_modes_config_set ( & m_advertising , & config ) ;
/ / Disconnect all other bonded devices that currently are connected .
/ / This is required to receive a service changed indication
/ / on bootup after a successful ( or aborted ) Device Firmware Update .
uint32_t conn_count = ble_conn_state_for_each_connected ( disconnect , NULL ) ;
NRF_LOG_INFO ( " Disconnected %d links. " , conn_count ) ;
break ;
}
case BLE_DFU_EVT_BOOTLOADER_ENTER :
/ / YOUR_JOB : Write app - specific unwritten data to FLASH , control finalization of this
/ / by delaying reset by reporting false in app_shutdown_handler
NRF_LOG_INFO ( " Device will enter bootloader mode. " ) ;
break ;
case BLE_DFU_EVT_BOOTLOADER_ENTER_FAILED :
NRF_LOG_ERROR ( " Request to enter bootloader mode failed asynchroneously. " ) ;
/ / YOUR_JOB : Take corrective measures to resolve the issue
/ / like calling APP_ERROR_CHECK to reset the device .
break ;
case BLE_DFU_EVT_RESPONSE_SEND_ERROR :
NRF_LOG_ERROR ( " Request to send a response to client failed. " ) ;
/ / YOUR_JOB : Take corrective measures to resolve the issue
/ / like calling APP_ERROR_CHECK to reset the device .
APP_ERROR_CHECK ( false ) ;
break ;
default :
NRF_LOG_ERROR ( " Unknown event from ble_dfu_buttonless. " ) ;
break ;
}
}
# endif
@ -320,28 +297,24 @@ static void ble_dfu_evt_handler(ble_dfu_buttonless_evt_type_t event)
/ / static ble_uuid_t m_adv_uuids [ ] = { { BLE_UUID_DEVICE_INFORMATION_SERVICE , BLE_UUID_TYPE_BLE } } ;
# define COMPANY_IDENTIFIER_DATA_LEGTH 2 /**< Total length of information advertised by the Beacon. */
static uint8_t p_company_identifier_data [ COMPANY_IDENTIFIER_DATA_LEGTH ] =
{
( FIRMWARE_VERSION > > 8 ) & 0xFF ,
FIRMWARE_VERSION & 0xFF ,
static uint8_t p_company_identifier_data [ COMPANY_IDENTIFIER_DATA_LEGTH ] = {
( FIRMWARE_VERSION > > 8 ) & 0xFF ,
FIRMWARE_VERSION & 0xFF ,
} ;
void zble_module_init ( zble_module_cfg_t * cfg )
{
void zble_module_init ( zble_module_cfg_t * cfg ) {
/**
* @ brief
* 初 始 化 蓝 牙 协 议 栈 , 并 注 册 蓝 牙 事 件 处 理 函 数 , 固 定 代 码 , 勿 修 ? ?
*/
{
NRF_SDH_BLE_OBSERVER ( m_ble_observer , 3 , ble_evt_handler , NULL ) ;
}
{ NRF_SDH_BLE_OBSERVER ( m_ble_observer , 3 , ble_evt_handler , NULL ) ; }
/*******************************************************************************
* GAP初始 ? ? *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
{
uint32_t err_code ;
ble_gap_conn_params_t gap_conn_params ;
uint32_t err_code ;
ble_gap_conn_params_t gap_conn_params ;
ble_gap_conn_sec_mode_t sec_mode ;
BLE_GAP_CONN_SEC_MODE_SET_OPEN ( & sec_mode ) ;
@ -353,8 +326,8 @@ void zble_module_init(zble_module_cfg_t *cfg)
gap_conn_params . min_conn_interval = MIN_CONN_INTERVAL ;
gap_conn_params . max_conn_interval = MAX_CONN_INTERVAL ;
gap_conn_params . slave_latency = SLAVE_LATENCY ;
gap_conn_params . conn_sup_timeout = CONN_SUP_TIMEOUT ;
gap_conn_params . slave_latency = SLAVE_LATENCY ;
gap_conn_params . conn_sup_timeout = CONN_SUP_TIMEOUT ;
err_code = sd_ble_gap_ppcp_set ( & gap_conn_params ) ;
ZERROR_CHECK ( err_code ) ;
@ -377,17 +350,17 @@ void zble_module_init(zble_module_cfg_t *cfg)
* 广 播 初 始 ? ? *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
{
uint32_t err_code ;
uint32_t err_code ;
ble_advertising_init_t init ;
memset ( & init , 0 , sizeof ( init ) ) ;
static ble_advdata_manuf_data_t manuf_specific_data ;
manuf_specific_data . company_identifier = APP_COMPANY_IDENTIFIER ;
manuf_specific_data . data . p_data = ( uint8_t * ) p_company_identifier_data ;
manuf_specific_data . data . size = COMPANY_IDENTIFIER_DATA_LEGTH ;
manuf_specific_data . data . p_data = ( uint8_t * ) p_company_identifier_data ;
manuf_specific_data . data . size = COMPANY_IDENTIFIER_DATA_LEGTH ;
init . advdata . name_type = BLE_ADVDATA_FULL_NAME ;
init . advdata . include_appearance = true ;
init . advdata . name_type = BLE_ADVDATA_FULL_NAME ;
init . advdata . include_appearance = true ;
init . advdata . p_manuf_specific_data = & manuf_specific_data ;
/ / init . advdata . flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE ;
init . advdata . flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE ;
@ -399,16 +372,15 @@ void zble_module_init(zble_module_cfg_t *cfg)
APP_ERROR_CHECK ( err_code ) ;
init . srdata . uuids_complete . uuid_cnt = 0 ;
init . srdata . uuids_complete . p_uuids = NULL ;
init . srdata . uuids_complete . p_uuids = NULL ;
init . config . ble_adv_fast_enabled = true ;
init . config . ble_adv_fast_interval = 64 ; / /*0.625ms
init . config . ble_adv_fast_timeout = 100 ; / /*10ms
init . config . ble_adv_fast_enabled = true ;
init . config . ble_adv_fast_interval = 64 ; / /*0.625ms
init . config . ble_adv_fast_timeout = 100 ; / /*10ms
init . config . ble_adv_slow_enabled = true ;
init . config . ble_adv_slow_interval = 32 * 100 ; / /*0.625ms
init . config . ble_adv_slow_timeout = 0 ; / /*10ms
init . config . ble_adv_slow_enabled = true ;
init . config . ble_adv_slow_interval = 32 * 100 ; / /*0.625ms
init . config . ble_adv_slow_timeout = 0 ; / /*10ms
init . evt_handler = on_adv_evt ;
@ -424,11 +396,10 @@ void zble_module_init(zble_module_cfg_t *cfg)
# if BLE_DFU_ENABLED
{
ble_dfu_buttonless_init_t dfus_init = { 0 } ;
dfus_init . evt_handler = ble_dfu_evt_handler ;
ret_code_t err_code = ble_dfu_buttonless_init ( & dfus_init ) ;
dfus_init . evt_handler = ble_dfu_evt_handler ;
ret_code_t err_code = ble_dfu_buttonless_init ( & dfus_init ) ;
ZERROR_CHECK ( err_code ) ;
if ( cfg - > on_service_init )
cfg - > on_service_init ( ) ;
if ( cfg - > on_service_init ) cfg - > on_service_init ( ) ;
}
# endif
@ -436,19 +407,19 @@ void zble_module_init(zble_module_cfg_t *cfg)
* 连 接 参 数 初 始 ? ? *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
{
uint32_t err_code ;
uint32_t err_code ;
ble_conn_params_init_t cp_init ;
memset ( & cp_init , 0 , sizeof ( cp_init ) ) ;
cp_init . p_conn_params = NULL ;
cp_init . p_conn_params = NULL ;
cp_init . first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY ;
cp_init . next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY ;
cp_init . max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT ;
cp_init . start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID ;
cp_init . disconnect_on_fail = false ;
cp_init . evt_handler = on_conn_params_evt ;
cp_init . error_handler = conn_params_error_handler ;
cp_init . next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY ;
cp_init . max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT ;
cp_init . start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID ;
cp_init . disconnect_on_fail = false ;
cp_init . evt_handler = on_conn_params_evt ;
cp_init . error_handler = conn_params_error_handler ;
err_code = ble_conn_params_init ( & cp_init ) ;
ZERROR_CHECK ( err_code ) ;
@ -459,7 +430,14 @@ void zble_module_init(zble_module_cfg_t *cfg)
int32_t zble_module_get_mtu_size ( ) { return m_mtu_size ; }
bool zble_module_disconnect ( ) {
bool zble_module_disconnect ( ) {
ble_conn_state_for_each_connected ( disconnect , NULL ) ;
return true ;
}
uint32_t zble_module_has_disconnected_ms ( ) {
if ( m_conn_handle ! = BLE_CONN_HANDLE_INVALID ) {
return 0 ;
}
return znordic_haspassed_ms ( m_last_disconnected_tp ) ;
}