Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
btle.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #include "common/common.h " 00018 #include "nordic_common.h" 00019 00020 #include "app_timer.h " 00021 #include "btle.h" 00022 00023 #include "ble_stack_handler_types.h " 00024 #include "ble_radio_notification.h " 00025 #include "ble_flash.h " 00026 #if NEED_BOND_MANAGER 00027 #include "ble_bondmngr.h" 00028 #endif 00029 #include "ble_conn_params.h " 00030 00031 #include "btle_gap.h" 00032 #include "btle_advertising.h" 00033 #include "custom/custom_helper.h" 00034 00035 #include "softdevice_handler.h " 00036 #include "pstorage.h " 00037 00038 #include "GapEvents.h" 00039 #include "nRF51Gap.h" 00040 #include "nRF51GattServer.h" 00041 00042 #include "ble_hci.h" 00043 00044 #if NEED_BOND_MANAGER /* disabled by default */ 00045 static void service_error_callback(uint32_t nrf_error); 00046 #endif 00047 extern "C" void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name); 00048 void app_error_handler(uint32_t error_code, uint32_t line_num, const uint8_t *p_file_name); 00049 00050 #if NEED_BOND_MANAGER /* disabled by default */ 00051 static error_t bond_manager_init(void); 00052 #endif 00053 00054 static void btle_handler(ble_evt_t *p_ble_evt); 00055 00056 static void sys_evt_dispatch(uint32_t sys_evt) 00057 { 00058 #if NEED_PSTORAGE /* disabled by default */ 00059 pstorage_sys_event_handler(sys_evt); 00060 #endif 00061 } 00062 00063 error_t btle_init(void) 00064 { 00065 const bool useScheduler = false; 00066 #ifdef TARGET_HRM1017 00067 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_4000MS_CALIBRATION, useScheduler); 00068 #else 00069 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, useScheduler); 00070 #endif 00071 00072 // Enable BLE stack 00073 /** 00074 * Using this call, the application can select whether to include the 00075 * Service Changed characteristic in the GATT Server. The default in all 00076 * previous releases has been to include the Service Changed characteristic, 00077 * but this affects how GATT clients behave. Specifically, it requires 00078 * clients to subscribe to this attribute and not to cache attribute handles 00079 * between connections unless the devices are bonded. If the application 00080 * does not need to change the structure of the GATT server attributes at 00081 * runtime this adds unnecessary complexity to the interaction with peer 00082 * clients. If the SoftDevice is enabled with the Service Changed 00083 * Characteristics turned off, then clients are allowed to cache attribute 00084 * handles making applications simpler on both sides. 00085 */ 00086 static const bool IS_SRVC_CHANGED_CHARACT_PRESENT = true; 00087 ble_enable_params_t enableParams = { 00088 .gatts_enable_params = { 00089 .service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT 00090 } 00091 }; 00092 if (sd_ble_enable(&enableParams) != NRF_SUCCESS) { 00093 return ERROR_INVALID_PARAM; 00094 } 00095 00096 ble_gap_addr_t addr; 00097 if (sd_ble_gap_address_get(&addr) != NRF_SUCCESS) { 00098 return ERROR_INVALID_PARAM; 00099 } 00100 if (sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &addr) != NRF_SUCCESS) { 00101 return ERROR_INVALID_PARAM; 00102 } 00103 00104 ASSERT_STATUS( softdevice_ble_evt_handler_set(btle_handler)); 00105 ASSERT_STATUS( softdevice_sys_evt_handler_set(sys_evt_dispatch)); 00106 00107 #if NEED_BOND_MANAGER /* disabled by default */ 00108 bond_manager_init(); 00109 #endif 00110 btle_gap_init(); 00111 00112 return ERROR_NONE; 00113 } 00114 00115 static void btle_handler(ble_evt_t *p_ble_evt) 00116 { 00117 /* Library service handlers */ 00118 #if NEED_BOND_MANAGER /* disabled by default */ 00119 ble_bondmngr_on_ble_evt(p_ble_evt); 00120 #endif 00121 #if SDK_CONN_PARAMS_MODULE_ENABLE 00122 ble_conn_params_on_ble_evt(p_ble_evt); 00123 #endif 00124 00125 /* Custom event handler */ 00126 switch (p_ble_evt->header.evt_id) { 00127 case BLE_GAP_EVT_CONNECTED: { 00128 Gap::Handle_t handle = p_ble_evt->evt.gap_evt.conn_handle; 00129 nRF51Gap::getInstance().setConnectionHandle(handle); 00130 const Gap::ConnectionParams_t *params = reinterpret_cast<Gap::ConnectionParams_t *>(&(p_ble_evt->evt.gap_evt.params.connected.conn_params)); 00131 const ble_gap_addr_t *peer = &p_ble_evt->evt.gap_evt.params.connected.peer_addr; 00132 nRF51Gap::getInstance().processConnectionEvent(handle, static_cast<Gap::addr_type_t>(peer->addr_type), peer->addr, params); 00133 break; 00134 } 00135 00136 case BLE_GAP_EVT_DISCONNECTED: { 00137 Gap::Handle_t handle = p_ble_evt->evt.gap_evt.conn_handle; 00138 // Since we are not in a connection and have not started advertising, 00139 // store bonds 00140 nRF51Gap::getInstance().setConnectionHandle (BLE_CONN_HANDLE_INVALID); 00141 #if NEED_BOND_MANAGER /* disabled by default */ 00142 ASSERT_STATUS_RET_VOID ( ble_bondmngr_bonded_centrals_store()); 00143 #endif 00144 00145 Gap::DisconnectionReason_t reason; 00146 switch (p_ble_evt->evt.gap_evt.params.disconnected.reason) { 00147 case BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION: 00148 reason = Gap::LOCAL_HOST_TERMINATED_CONNECTION; 00149 break; 00150 case BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION: 00151 reason = Gap::REMOTE_USER_TERMINATED_CONNECTION; 00152 break; 00153 case BLE_HCI_CONN_INTERVAL_UNACCEPTABLE: 00154 reason = Gap::CONN_INTERVAL_UNACCEPTABLE; 00155 break; 00156 default: 00157 /* Please refer to the underlying transport library for an 00158 * interpretion of this reason's value. */ 00159 reason = static_cast<Gap::DisconnectionReason_t>(p_ble_evt->evt.gap_evt.params.disconnected.reason); 00160 break; 00161 } 00162 nRF51Gap::getInstance().processDisconnectionEvent(handle, reason); 00163 break; 00164 } 00165 00166 case BLE_GAP_EVT_SEC_PARAMS_REQUEST: { 00167 ble_gap_sec_params_t sec_params = {0}; 00168 00169 sec_params.timeout = 30; /*< Timeout for Pairing Request or 00170 * Security Request (in seconds). */ 00171 sec_params.bond = 1; /**< Perform bonding. */ 00172 sec_params.mitm = CFG_BLE_SEC_PARAM_MITM; 00173 sec_params.io_caps = CFG_BLE_SEC_PARAM_IO_CAPABILITIES; 00174 sec_params.oob = CFG_BLE_SEC_PARAM_OOB; 00175 sec_params.min_key_size = CFG_BLE_SEC_PARAM_MIN_KEY_SIZE; 00176 sec_params.max_key_size = CFG_BLE_SEC_PARAM_MAX_KEY_SIZE; 00177 00178 ASSERT_STATUS_RET_VOID(sd_ble_gap_sec_params_reply(nRF51Gap::getInstance().getConnectionHandle(), 00179 BLE_GAP_SEC_STATUS_SUCCESS, &sec_params)); 00180 } 00181 break; 00182 00183 case BLE_GAP_EVT_TIMEOUT: 00184 if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT) { 00185 nRF51Gap::getInstance().processEvent(GapEvents::GAP_EVENT_TIMEOUT); 00186 } 00187 break; 00188 00189 case BLE_GATTC_EVT_TIMEOUT: 00190 case BLE_GATTS_EVT_TIMEOUT: 00191 // Disconnect on GATT Server and Client timeout events. 00192 // ASSERT_STATUS_RET_VOID (sd_ble_gap_disconnect(m_conn_handle, 00193 // BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION)); 00194 break; 00195 00196 default: 00197 break; 00198 } 00199 00200 nRF51GattServer::getInstance().hwCallback(p_ble_evt); 00201 } 00202 00203 #if NEED_BOND_MANAGER /* disabled by default */ 00204 /**************************************************************************/ 00205 /*! 00206 @brief Initialises the bond manager 00207 00208 @note Bond data will be cleared on reset if the bond delete 00209 button is pressed during initialisation (the button is 00210 defined as CFG_BLE_BOND_DELETE_BUTTON_NUM). 00211 00212 @returns 00213 */ 00214 /**************************************************************************/ 00215 static error_t bond_manager_init(void) 00216 { 00217 ble_bondmngr_init_t bond_para = {0}; 00218 00219 ASSERT_STATUS ( pstorage_init()); 00220 00221 bond_para.flash_page_num_bond = CFG_BLE_BOND_FLASH_PAGE_BOND; 00222 bond_para.flash_page_num_sys_attr = CFG_BLE_BOND_FLASH_PAGE_SYS_ATTR; 00223 //bond_para.bonds_delete = boardButtonCheck(CFG_BLE_BOND_DELETE_BUTTON_NUM) ; 00224 bond_para.evt_handler = NULL; 00225 bond_para.error_handler = service_error_callback; 00226 00227 ASSERT_STATUS( ble_bondmngr_init( &bond_para )); 00228 00229 /* Init radio active/inactive notification to flash (to only perform flashing when the radio is inactive) */ 00230 // ASSERT_STATUS( ble_radio_notification_init(NRF_APP_PRIORITY_HIGH, 00231 // NRF_RADIO_NOTIFICATION_DISTANCE_4560US, 00232 // ble_flash_on_radio_active_evt) ); 00233 00234 return ERROR_NONE; 00235 } 00236 #endif // #if NEED_BOND_MANAGER 00237 00238 #if NEED_BOND_MANAGER /* disabled by default */ 00239 /**************************************************************************/ 00240 /*! 00241 @brief 00242 @param[in] nrf_error 00243 @returns 00244 */ 00245 /**************************************************************************/ 00246 static void service_error_callback(uint32_t nrf_error) 00247 { 00248 ASSERT_STATUS_RET_VOID( nrf_error ); 00249 } 00250 #endif // #if NEED_BOND_MANAGER 00251 00252 /**************************************************************************/ 00253 /*! 00254 @brief Callback when an error occurs inside the SoftDevice 00255 00256 @param[in] line_num 00257 @param[in] p-file_name 00258 00259 @returns 00260 */ 00261 /**************************************************************************/ 00262 void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name) 00263 { 00264 ASSERT(false, (void) 0); 00265 } 00266 00267 /**************************************************************************/ 00268 /*! 00269 @brief Handler for general errors above the SoftDevice layer. 00270 Typically we can' recover from this so we do a reset. 00271 00272 @param[in] error_code 00273 @param[in] line_num 00274 @param[in] p-file_name 00275 00276 @returns 00277 */ 00278 /**************************************************************************/ 00279 void app_error_handler(uint32_t error_code, 00280 uint32_t line_num, 00281 const uint8_t *p_file_name) 00282 { 00283 ASSERT_STATUS_RET_VOID( error_code ); 00284 NVIC_SystemReset(); 00285 }
Generated on Tue Jul 12 2022 20:04:42 by
