#ifdef __cplusplus extern "C" { #endif #include "app_config.h" #include "app_error.h" #include "ble_conn_state.h" #include "ble_dfu.h" #include "nrf_log.h" #ifdef __cplusplus } #endif static void le_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."); // 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. extern void le_gap_disconnect(uint16_t conn_handle, void *p_context); uint32_t conn_count = ble_conn_state_for_each_connected(le_gap_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; } } void le_dfu_init(void) { // ble dfu service ble_dfu_buttonless_init_t dfus_init = { 0 }; dfus_init.evt_handler = le_dfu_evt_handler; ret_code_t err_code = ble_dfu_buttonless_init(&dfus_init); APP_ERROR_CHECK(err_code); }