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