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 "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 //SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, useScheduler); 00067 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_4000MS_CALIBRATION, false); 00068 00069 // Enable BLE stack 00070 /** 00071 * Using this call, the application can select whether to include the 00072 * Service Changed characteristic in the GATT Server. The default in all 00073 * previous releases has been to include the Service Changed characteristic, 00074 * but this affects how GATT clients behave. Specifically, it requires 00075 * clients to subscribe to this attribute and not to cache attribute handles 00076 * between connections unless the devices are bonded. If the application 00077 * does not need to change the structure of the GATT server attributes at 00078 * runtime this adds unnecessary complexity to the interaction with peer 00079 * clients. If the SoftDevice is enabled with the Service Changed 00080 * Characteristics turned off, then clients are allowed to cache attribute 00081 * handles making applications simpler on both sides. 00082 */ 00083 static const bool IS_SRVC_CHANGED_CHARACT_PRESENT = false; 00084 ble_enable_params_t enableParams = { 00085 .gatts_enable_params = { 00086 .service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT 00087 } 00088 }; 00089 if (sd_ble_enable(&enableParams) != NRF_SUCCESS) { 00090 return ERROR_INVALID_PARAM; 00091 } 00092 00093 ble_gap_addr_t addr; 00094 if (sd_ble_gap_address_get(&addr) != NRF_SUCCESS) { 00095 return ERROR_INVALID_PARAM; 00096 } 00097 if (sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &addr) != NRF_SUCCESS) { 00098 return ERROR_INVALID_PARAM; 00099 } 00100 00101 ASSERT_STATUS( softdevice_ble_evt_handler_set(btle_handler)); 00102 ASSERT_STATUS( softdevice_sys_evt_handler_set(sys_evt_dispatch)); 00103 00104 #if NEED_BOND_MANAGER /* disabled by default */ 00105 bond_manager_init(); 00106 #endif 00107 btle_gap_init(); 00108 00109 return ERROR_NONE; 00110 } 00111 00112 static void btle_handler(ble_evt_t *p_ble_evt) 00113 { 00114 /* Library service handlers */ 00115 #if NEED_BOND_MANAGER /* disabled by default */ 00116 ble_bondmngr_on_ble_evt(p_ble_evt); 00117 #endif 00118 #if SDK_CONN_PARAMS_MODULE_ENABLE 00119 ble_conn_params_on_ble_evt(p_ble_evt); 00120 #endif 00121 00122 /* Custom event handler */ 00123 switch (p_ble_evt->header.evt_id) { 00124 case BLE_GAP_EVT_CONNECTED: { 00125 Gap::Handle_t handle = p_ble_evt->evt.gap_evt.conn_handle; 00126 nRF51Gap::getInstance().setConnectionHandle(handle); 00127 const Gap::ConnectionParams_t *params = reinterpret_cast<Gap::ConnectionParams_t *>(&(p_ble_evt->evt.gap_evt.params.connected.conn_params)); 00128 nRF51Gap::getInstance().processConnectionEvent(handle, 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 // if (p_ble_evt->evt.gap_evt.params.disconnected.reason == BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION) { 00142 nRF51Gap::getInstance().processDisconnectionEvent(handle, Gap::LOCAL_HOST_TERMINATED_CONNECTION); 00143 // } 00144 break; 00145 } 00146 00147 case BLE_GAP_EVT_SEC_PARAMS_REQUEST: { 00148 ble_gap_sec_params_t sec_params = {0}; 00149 00150 sec_params.timeout = 30; /*< Timeout for Pairing Request or 00151 * Security Request (in seconds). */ 00152 sec_params.bond = 1; /**< Perform bonding. */ 00153 sec_params.mitm = CFG_BLE_SEC_PARAM_MITM; 00154 sec_params.io_caps = CFG_BLE_SEC_PARAM_IO_CAPABILITIES; 00155 sec_params.oob = CFG_BLE_SEC_PARAM_OOB; 00156 sec_params.min_key_size = CFG_BLE_SEC_PARAM_MIN_KEY_SIZE; 00157 sec_params.max_key_size = CFG_BLE_SEC_PARAM_MAX_KEY_SIZE; 00158 00159 ASSERT_STATUS_RET_VOID(sd_ble_gap_sec_params_reply(nRF51Gap::getInstance().getConnectionHandle(), 00160 BLE_GAP_SEC_STATUS_SUCCESS, &sec_params)); 00161 } 00162 break; 00163 00164 case BLE_GAP_EVT_TIMEOUT: 00165 if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT) { 00166 nRF51Gap::getInstance().processEvent(GapEvents::GAP_EVENT_TIMEOUT); 00167 } 00168 break; 00169 00170 case BLE_GATTC_EVT_TIMEOUT: 00171 case BLE_GATTS_EVT_TIMEOUT: 00172 // Disconnect on GATT Server and Client timeout events. 00173 // ASSERT_STATUS_RET_VOID (sd_ble_gap_disconnect(m_conn_handle, 00174 // BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION)); 00175 break; 00176 00177 default: 00178 break; 00179 } 00180 00181 nRF51GattServer::getInstance().hwCallback(p_ble_evt); 00182 } 00183 00184 #if NEED_BOND_MANAGER /* disabled by default */ 00185 /**************************************************************************/ 00186 /*! 00187 @brief Initialises the bond manager 00188 00189 @note Bond data will be cleared on reset if the bond delete 00190 button is pressed during initialisation (the button is 00191 defined as CFG_BLE_BOND_DELETE_BUTTON_NUM). 00192 00193 @returns 00194 */ 00195 /**************************************************************************/ 00196 static error_t bond_manager_init(void) 00197 { 00198 ble_bondmngr_init_t bond_para = {0}; 00199 00200 ASSERT_STATUS ( pstorage_init()); 00201 00202 bond_para.flash_page_num_bond = CFG_BLE_BOND_FLASH_PAGE_BOND; 00203 bond_para.flash_page_num_sys_attr = CFG_BLE_BOND_FLASH_PAGE_SYS_ATTR; 00204 //bond_para.bonds_delete = boardButtonCheck(CFG_BLE_BOND_DELETE_BUTTON_NUM) ; 00205 bond_para.evt_handler = NULL; 00206 bond_para.error_handler = service_error_callback; 00207 00208 ASSERT_STATUS( ble_bondmngr_init( &bond_para )); 00209 00210 /* Init radio active/inactive notification to flash (to only perform flashing when the radio is inactive) */ 00211 // ASSERT_STATUS( ble_radio_notification_init(NRF_APP_PRIORITY_HIGH, 00212 // NRF_RADIO_NOTIFICATION_DISTANCE_4560US, 00213 // ble_flash_on_radio_active_evt) ); 00214 00215 return ERROR_NONE; 00216 } 00217 #endif // #if NEED_BOND_MANAGER 00218 00219 #if NEED_BOND_MANAGER /* disabled by default */ 00220 /**************************************************************************/ 00221 /*! 00222 @brief 00223 @param[in] nrf_error 00224 @returns 00225 */ 00226 /**************************************************************************/ 00227 static void service_error_callback(uint32_t nrf_error) 00228 { 00229 ASSERT_STATUS_RET_VOID( nrf_error ); 00230 } 00231 #endif // #if NEED_BOND_MANAGER 00232 00233 /**************************************************************************/ 00234 /*! 00235 @brief Callback when an error occurs inside the SoftDevice 00236 00237 @param[in] line_num 00238 @param[in] p-file_name 00239 00240 @returns 00241 */ 00242 /**************************************************************************/ 00243 void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name) 00244 { 00245 ASSERT(false, (void) 0); 00246 } 00247 00248 /**************************************************************************/ 00249 /*! 00250 @brief Handler for general errors above the SoftDevice layer. 00251 Typically we can' recover from this so we do a reset. 00252 00253 @param[in] error_code 00254 @param[in] line_num 00255 @param[in] p-file_name 00256 00257 @returns 00258 */ 00259 /**************************************************************************/ 00260 void app_error_handler(uint32_t error_code, 00261 uint32_t line_num, 00262 const uint8_t *p_file_name) 00263 { 00264 ASSERT_STATUS_RET_VOID( error_code ); 00265 NVIC_SystemReset(); 00266 }
Generated on Tue Jul 12 2022 14:11:55 by
