diff --git a/include/zble_module.h b/include/zble_module.h index 30e6182..e98a100 100644 --- a/include/zble_module.h +++ b/include/zble_module.h @@ -33,6 +33,10 @@ void zble_module_reglistener(zble_event_listener_t event_listener); void zble_module_start_adv(); void zble_module_stop_adv(); bool zble_module_is_connected(); +uint32_t zble_module_has_disconnected_ms(); + bool zble_module_disconnect(); + + int32_t zble_module_get_mtu_size(); \ No newline at end of file diff --git a/src/zble_module.c b/src/zble_module.c index d4b9247..fa63bc4 100644 --- a/src/zble_module.c +++ b/src/zble_module.c @@ -5,9 +5,9 @@ #include #include +#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;//30s + p_config->ble_adv_fast_timeout = 3000; // 30s } -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); } \ No newline at end of file