uint32_t ble_dfu_transport_close(void) { uint32_t err_code = NRF_SUCCESS; if ((m_flags & DFU_BLE_FLAG_TEAR_DOWN_IN_PROGRESS) != 0) { return NRF_SUCCESS; } m_flags |= DFU_BLE_FLAG_TEAR_DOWN_IN_PROGRESS; NRF_LOG_INFO("Waiting for buffers to be cleared before disconnect\r\n"); nrf_delay_ms(MAX_CONN_INTERVAL_MS*4); NRF_LOG_INFO("Disconnecting\r\n"); if (m_conn_handle != BLE_CONN_HANDLE_INVALID) { // Disconnect from peer. err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); VERIFY_SUCCESS(err_code); } else if ((m_flags & DFU_BLE_FLAG_IS_ADVERTISING) != 0) { // If not connected, then the device will be advertising. Hence stop the advertising. err_code = advertising_stop(); VERIFY_SUCCESS(err_code); } // Stop the timer, disregard the result. (void)ble_conn_params_stop(); return err_code; }
uint32_t dfu_transport_close() { uint32_t err_code; if (IS_CONNECTED()) { // Disconnect from peer. err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); APP_ERROR_CHECK(err_code); } else { // If not connected, then the device will be advertising. Hence stop the advertising. advertising_stop(); } err_code = ble_conn_params_stop(); APP_ERROR_CHECK(err_code); return NRF_SUCCESS; }
/**@brief Function for preparing for system reset. * * @details This function implements @ref dfu_app_reset_prepare_t. It will be called by * @ref dfu_app_handler.c before entering the bootloader/DFU. * This allows the current running application to shut down gracefully. */ static void reset_prepare(void) { uint32_t err_code; if (_conn_handle != BLE_CONN_HANDLE_INVALID) { // Disconnect from peer. err_code = sd_ble_gap_disconnect(_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); APP_ERROR_CHECK(err_code); } else { // If not connected, the device will be advertising. Hence stop the advertising. advertising_stop(); } err_code = ble_conn_params_stop(); APP_ERROR_CHECK(err_code); nrf_delay_ms(500); }
/** @snippet [DFU BLE Reset prepare] */ static void reset_prepare(void) { uint32_t err_code; if (m_conn_handle != BLE_CONN_HANDLE_INVALID) { // Disconnect from peer. err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); APP_ERROR_CHECK(err_code); } else { // If not connected, then the device will be advertising. Hence stop the advertising. advertising_stop(); } nrf_gpio_pin_clear(ADVERTISING_LED_PIN_NO); nrf_gpio_pin_clear(CONNECTED_LED_PIN_NO); err_code = ble_conn_params_stop(); APP_ERROR_CHECK(err_code); }
/**@brief Function for handling the Application's BLE Stack events. * * @param[in] p_ble_evt Bluetooth stack event. */ static void on_ble_evt(ble_evt_t * p_ble_evt) { uint32_t err_code; switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: // continue advertising nonconnectably app.conn_handle = p_ble_evt->evt.gap_evt.conn_handle; m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_NONCONN_IND; advertising_start(); break; case BLE_GAP_EVT_DISCONNECTED: app.conn_handle = BLE_CONN_HANDLE_INVALID; // advertise connectivity advertising_stop(); m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; advertising_start(); break; case BLE_GATTS_EVT_WRITE: { ble_gatts_evt_write_t* write_data = &(p_ble_evt->evt.gatts_evt.params.write); if (write_data->context.char_uuid.uuid == test_char_uuid16) { if (write_data->data[0] == 0x42) { //led_on(BLEES_LED_PIN); // enable higher connection interval. Only lasts for this connection ble_gap_conn_params_t gap_conn_params; memset(&gap_conn_params, 0, sizeof(gap_conn_params)); gap_conn_params.min_conn_interval = 0x06; // 7.5 ms gap_conn_params.max_conn_interval = MSEC_TO_UNITS(30, UNIT_1_25_MS); gap_conn_params.slave_latency = 0; gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; err_code = sd_ble_gap_conn_param_update(app.conn_handle, &gap_conn_params); APP_ERROR_CHECK(err_code); } } } break; case BLE_GAP_EVT_SEC_PARAMS_REQUEST: err_code = sd_ble_gap_sec_params_reply(app.conn_handle, BLE_GAP_SEC_STATUS_SUCCESS, &m_sec_params, NULL); APP_ERROR_CHECK(err_code); break; case BLE_GATTS_EVT_SYS_ATTR_MISSING: err_code = sd_ble_gatts_sys_attr_set(app.conn_handle, NULL, 0, 0); APP_ERROR_CHECK(err_code); break; case BLE_GAP_EVT_AUTH_STATUS: break; case BLE_GAP_EVT_SEC_INFO_REQUEST: // No keys found for this device. err_code = sd_ble_gap_sec_info_reply(app.conn_handle, NULL, NULL, NULL); APP_ERROR_CHECK(err_code); break; case BLE_GAP_EVT_TIMEOUT: if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISING) { err_code = sd_power_system_off(); APP_ERROR_CHECK(err_code); } break; default: break; } }
void post_comm_processing(void) { nrf_gpio_pin_set(LED_NO_FALL); advertising_stop(); if (SaveSnapshot == 1) { writeSnapshotToFlash(); SaveSnapshot = 0; } if (ClearSnapshots == 1) { // eraseAllSnapshots(); ClearSnapshots = 0; } if (ClearDataBuffer == 1) { // eraseAllStepData(); ClearDataBuffer = 0; } if (writeLog == 1) { // writeLogEntry(activityToSave); writeLog = 0; activityToSave = 0; } if (clearPerso == 1) { revert_to_defaults(); clearPerso = 0; } if (rewritePerso == 1) { writeTempToFlashPerso(); rewritePerso = 0; } /* if (writeUsername == 1) { setUsername(tempUsername); //error_flash = ble_flash_block_write((uint32_t *)livePerso->uname, (uint32_t*)tempUsername,UNAME_MAXLEN); // error_flash = ble_flash_block_write(USERNAME_ADDRESS, (uint32_t*)tempUsername,5); // error_flash = ble_flash_word_write(USERNAME_LENGTH, (uint32_t)tempUsernameLength); writeUsername = 0; } */ /* if (writeXYZ == 1) { error_flash = ble_flash_block_write(XYZ_ADDRESS, (uint32_t*)tempXYZ,3); error_flash = ble_flash_word_write(XYZ_LENGTH, (uint32_t)tempXYZLength); writeXYZ = 0; } if (writeSV == 1) { error_flash = ble_flash_block_write(SV_ADDRESS, (uint32_t*)tempSV,3); error_flash = ble_flash_word_write(SV_LENGTH, (uint32_t)tempSVLength); writeSV = 0; } */ advertising_start(); nrf_gpio_pin_clear(LED_NO_FALL); }
// handler for application's BLE Stack events static void on_ble_evt(ble_evt_t * p_ble_evt) { uint32_t err_code; switch(p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: app.conn_handle = p_ble_evt->evt.gap_evt.conn_handle; // resume advertising, but not connectably m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_NONCONN_IND; advertising_start(); break; case BLE_GAP_EVT_DISCONNECTED: app.conn_handle = BLE_CONN_HANDLE_INVALID; // go back to advertising connectably advertising_stop(); m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; advertising_start(); break; case BLE_GATTS_EVT_WRITE: //do to break; case BLE_GAP_EVT_SEC_PARAMS_REQUEST: err_code = sd_ble_gap_sec_params_reply(app.conn_handle, BLE_GAP_SEC_STATUS_SUCCESS, &m_sec_params, NULL); APP_ERROR_CHECK(err_code); break; case BLE_GATTS_EVT_SYS_ATTR_MISSING: err_code = sd_ble_gatts_sys_attr_set(app.conn_handle, NULL, 0, 0); APP_ERROR_CHECK(err_code); break; case BLE_GAP_EVT_AUTH_STATUS: break; case BLE_GAP_EVT_SEC_INFO_REQUEST: // no keys found for this device err_code = sd_ble_gap_sec_info_reply(app.conn_handle, NULL, NULL, NULL); APP_ERROR_CHECK(err_code); break; case BLE_GAP_EVT_TIMEOUT: if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISING) { err_code = sd_power_system_off(); APP_ERROR_CHECK(err_code); } break; case BLE_GATTS_EVT_TIMEOUT: if (p_ble_evt->evt.gatts_evt.params.timeout.src == BLE_GATT_TIMEOUT_SRC_PROTOCOL) { err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); APP_ERROR_CHECK(err_code); } break; default: break; } }