78 lines
2.3 KiB
C
78 lines
2.3 KiB
C
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
#include "app_config.h"
|
|
#include "apply_old_config.h"
|
|
#include "sdk_config.h"
|
|
|
|
#include "nrf_log.h"
|
|
#include "nrf_log_ctrl.h"
|
|
#include "nrf_log_default_backends.h"
|
|
|
|
#include "nrf_delay.h"
|
|
#include "nrf_gpio.h"
|
|
|
|
#include "nrf_sdh.h"
|
|
#include "nrf_sdh_ble.h"
|
|
#include "nrf_sdh_freertos.h"
|
|
|
|
#include "ble_conn_state.h"
|
|
|
|
#include "ble_dis.h"
|
|
#include "ble_dfu.h"
|
|
#include "nrf_ble_gatt.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);
|
|
}
|