Nordic stack and drivers for the mbed BLE API

Dependents:   idd_hw5_bleFanProto

Fork of nRF51822 by Nordic Semiconductor

Committer:
Rohit Grover
Date:
Thu Jun 26 14:58:41 2014 +0100
Revision:
33:8efbbf54b66f
Parent:
32:84dea0924a63
Child:
34:48d24b1d2fe6
disabling the persistent storage module; will be re-enabled as necessary
Is needed only for storing bonding information.
Was taking up excessive amounts of RAM.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rohit Grover 22:c6ee8136847e 1 /* mbed Microcontroller Library
Rohit Grover 22:c6ee8136847e 2 * Copyright (c) 2006-2013 ARM Limited
Rohit Grover 22:c6ee8136847e 3 *
Rohit Grover 22:c6ee8136847e 4 * Licensed under the Apache License, Version 2.0 (the "License");
Rohit Grover 22:c6ee8136847e 5 * you may not use this file except in compliance with the License.
Rohit Grover 22:c6ee8136847e 6 * You may obtain a copy of the License at
Rohit Grover 22:c6ee8136847e 7 *
Rohit Grover 22:c6ee8136847e 8 * http://www.apache.org/licenses/LICENSE-2.0
Rohit Grover 22:c6ee8136847e 9 *
Rohit Grover 22:c6ee8136847e 10 * Unless required by applicable law or agreed to in writing, software
Rohit Grover 22:c6ee8136847e 11 * distributed under the License is distributed on an "AS IS" BASIS,
Rohit Grover 22:c6ee8136847e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Rohit Grover 22:c6ee8136847e 13 * See the License for the specific language governing permissions and
Rohit Grover 22:c6ee8136847e 14 * limitations under the License.
Rohit Grover 22:c6ee8136847e 15 */
Rohit Grover 22:c6ee8136847e 16 #include "common/common.h"
Rohit Grover 22:c6ee8136847e 17
Rohit Grover 22:c6ee8136847e 18 #include "app_timer.h"
Rohit Grover 22:c6ee8136847e 19 #include "btle.h"
Rohit Grover 22:c6ee8136847e 20
Rohit Grover 22:c6ee8136847e 21 #include "ble_stack_handler_types.h"
Rohit Grover 22:c6ee8136847e 22 #include "ble_radio_notification.h"
Rohit Grover 22:c6ee8136847e 23 #include "ble_flash.h"
Rohit Grover 22:c6ee8136847e 24 #include "ble_bondmngr.h"
Rohit Grover 22:c6ee8136847e 25 #include "ble_conn_params.h"
Rohit Grover 22:c6ee8136847e 26
Rohit Grover 22:c6ee8136847e 27 #include "btle_gap.h"
Rohit Grover 22:c6ee8136847e 28 #include "btle_advertising.h"
Rohit Grover 22:c6ee8136847e 29 #include "custom/custom_helper.h"
Rohit Grover 22:c6ee8136847e 30
Rohit Grover 22:c6ee8136847e 31 #include "nordic_common.h"
Rohit Grover 22:c6ee8136847e 32 #include "softdevice_handler.h"
Rohit Grover 22:c6ee8136847e 33 #include "pstorage.h"
Rohit Grover 22:c6ee8136847e 34
Rohit Grover 22:c6ee8136847e 35 #include "hw/GapEvents.h"
Rohit Grover 22:c6ee8136847e 36 #include "nRF51Gap.h"
Rohit Grover 22:c6ee8136847e 37 #include "nRF51GattServer.h"
Rohit Grover 22:c6ee8136847e 38
Rohit Grover 32:84dea0924a63 39 #if NEED_BOND_MANAGER /* disabled by default */
Rohit Grover 22:c6ee8136847e 40 static void service_error_callback(uint32_t nrf_error);
Rohit Grover 32:84dea0924a63 41 #endif
Rohit Grover 22:c6ee8136847e 42 void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name);
Rohit Grover 22:c6ee8136847e 43 void app_error_handler(uint32_t error_code,
Rohit Grover 22:c6ee8136847e 44 uint32_t line_num,
Rohit Grover 22:c6ee8136847e 45 const uint8_t *p_file_name);
Rohit Grover 22:c6ee8136847e 46
Rohit Grover 32:84dea0924a63 47 #if NEED_BOND_MANAGER /* disabled by default */
Rohit Grover 22:c6ee8136847e 48 static error_t bond_manager_init(void);
Rohit Grover 32:84dea0924a63 49 #endif
Rohit Grover 22:c6ee8136847e 50
Rohit Grover 22:c6ee8136847e 51 static void btle_handler(ble_evt_t *p_ble_evt);
Rohit Grover 22:c6ee8136847e 52
Rohit Grover 22:c6ee8136847e 53 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 54 /*!
Rohit Grover 22:c6ee8136847e 55
Rohit Grover 22:c6ee8136847e 56 */
Rohit Grover 22:c6ee8136847e 57 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 58 static void sys_evt_dispatch(uint32_t sys_evt)
Rohit Grover 22:c6ee8136847e 59 {
Rohit Grover 33:8efbbf54b66f 60 #if NEED_PSTORAGE /* disabled by default */
Rohit Grover 22:c6ee8136847e 61 pstorage_sys_event_handler(sys_evt);
Rohit Grover 33:8efbbf54b66f 62 #endif
Rohit Grover 22:c6ee8136847e 63 }
Rohit Grover 22:c6ee8136847e 64
Rohit Grover 22:c6ee8136847e 65 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 66 /*!
Rohit Grover 22:c6ee8136847e 67 @brief Initialises BTLE and the underlying HW/SoftDevice
Rohit Grover 22:c6ee8136847e 68
Rohit Grover 22:c6ee8136847e 69 @returns
Rohit Grover 22:c6ee8136847e 70 */
Rohit Grover 22:c6ee8136847e 71 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 72 error_t btle_init(void)
Rohit Grover 22:c6ee8136847e 73 {
Rohit Grover 22:c6ee8136847e 74 APP_TIMER_INIT(0, 8, 5, false);
Rohit Grover 22:c6ee8136847e 75 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false);
Rohit Grover 22:c6ee8136847e 76
Rohit Grover 22:c6ee8136847e 77 ASSERT_STATUS( softdevice_ble_evt_handler_set(btle_handler));
Rohit Grover 22:c6ee8136847e 78 ASSERT_STATUS( softdevice_sys_evt_handler_set(sys_evt_dispatch));
Rohit Grover 22:c6ee8136847e 79
Rohit Grover 32:84dea0924a63 80 #if NEED_BOND_MANAGER /* disabled by default */
Rohit Grover 22:c6ee8136847e 81 bond_manager_init();
Rohit Grover 32:84dea0924a63 82 #endif
Rohit Grover 22:c6ee8136847e 83 btle_gap_init();
Rohit Grover 22:c6ee8136847e 84
Rohit Grover 22:c6ee8136847e 85 return ERROR_NONE;
Rohit Grover 22:c6ee8136847e 86 }
Rohit Grover 22:c6ee8136847e 87
Rohit Grover 22:c6ee8136847e 88 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 89 /*!
Rohit Grover 22:c6ee8136847e 90 @brief
Rohit Grover 22:c6ee8136847e 91
Rohit Grover 22:c6ee8136847e 92 @param[in] p_ble_evt
Rohit Grover 22:c6ee8136847e 93
Rohit Grover 22:c6ee8136847e 94 @returns
Rohit Grover 22:c6ee8136847e 95 */
Rohit Grover 22:c6ee8136847e 96 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 97 static void btle_handler(ble_evt_t *p_ble_evt)
Rohit Grover 22:c6ee8136847e 98 {
Rohit Grover 22:c6ee8136847e 99 /* Library service handlers */
Rohit Grover 32:84dea0924a63 100 #if NEED_BOND_MANAGER /* disabled by default */
Rohit Grover 22:c6ee8136847e 101 ble_bondmngr_on_ble_evt(p_ble_evt);
Rohit Grover 32:84dea0924a63 102 #endif
Rohit Grover 22:c6ee8136847e 103 ble_conn_params_on_ble_evt(p_ble_evt);
Rohit Grover 22:c6ee8136847e 104
Rohit Grover 22:c6ee8136847e 105 /* Custom event handler */
Rohit Grover 22:c6ee8136847e 106 switch (p_ble_evt->header.evt_id) {
Rohit Grover 22:c6ee8136847e 107 case BLE_GAP_EVT_CONNECTED:
Rohit Grover 22:c6ee8136847e 108 nRF51Gap::getInstance().setConnectionHandle(
Rohit Grover 22:c6ee8136847e 109 p_ble_evt->evt.gap_evt.conn_handle );
Rohit Grover 22:c6ee8136847e 110 nRF51Gap::getInstance().handleEvent(GapEvents::GAP_EVENT_CONNECTED);
Rohit Grover 22:c6ee8136847e 111 break;
Rohit Grover 22:c6ee8136847e 112
Rohit Grover 22:c6ee8136847e 113 case BLE_GAP_EVT_DISCONNECTED:
Rohit Grover 22:c6ee8136847e 114 // Since we are not in a connection and have not started advertising,
Rohit Grover 22:c6ee8136847e 115 // store bonds
Rohit Grover 22:c6ee8136847e 116 nRF51Gap::getInstance().setConnectionHandle (BLE_CONN_HANDLE_INVALID);
Rohit Grover 32:84dea0924a63 117 #if NEED_BOND_MANAGER /* disabled by default */
Rohit Grover 22:c6ee8136847e 118 ASSERT_STATUS_RET_VOID ( ble_bondmngr_bonded_centrals_store());
Rohit Grover 32:84dea0924a63 119 #endif
Rohit Grover 22:c6ee8136847e 120 nRF51Gap::getInstance().handleEvent(GapEvents::GAP_EVENT_DISCONNECTED);
Rohit Grover 22:c6ee8136847e 121 break;
Rohit Grover 22:c6ee8136847e 122
Rohit Grover 22:c6ee8136847e 123 case BLE_GAP_EVT_SEC_PARAMS_REQUEST: {
Rohit Grover 22:c6ee8136847e 124 ble_gap_sec_params_t sec_params = {0};
Rohit Grover 22:c6ee8136847e 125
Rohit Grover 22:c6ee8136847e 126 sec_params.timeout = 30; /*< Timeout for Pairing Request or
Rohit Grover 22:c6ee8136847e 127 * Security Request (in seconds). */
Rohit Grover 22:c6ee8136847e 128 sec_params.bond = 1; /**< Perform bonding. */
Rohit Grover 22:c6ee8136847e 129 sec_params.mitm = CFG_BLE_SEC_PARAM_MITM;
Rohit Grover 22:c6ee8136847e 130 sec_params.io_caps = CFG_BLE_SEC_PARAM_IO_CAPABILITIES;
Rohit Grover 22:c6ee8136847e 131 sec_params.oob = CFG_BLE_SEC_PARAM_OOB;
Rohit Grover 22:c6ee8136847e 132 sec_params.min_key_size = CFG_BLE_SEC_PARAM_MIN_KEY_SIZE;
Rohit Grover 22:c6ee8136847e 133 sec_params.max_key_size = CFG_BLE_SEC_PARAM_MAX_KEY_SIZE;
Rohit Grover 22:c6ee8136847e 134
Rohit Grover 22:c6ee8136847e 135 ASSERT_STATUS_RET_VOID(
Rohit Grover 22:c6ee8136847e 136 sd_ble_gap_sec_params_reply(nRF51Gap::getInstance().
Rohit Grover 22:c6ee8136847e 137 getConnectionHandle(),
Rohit Grover 22:c6ee8136847e 138 BLE_GAP_SEC_STATUS_SUCCESS,
Rohit Grover 22:c6ee8136847e 139 &sec_params));
Rohit Grover 22:c6ee8136847e 140 }
Rohit Grover 22:c6ee8136847e 141 break;
Rohit Grover 22:c6ee8136847e 142
Rohit Grover 22:c6ee8136847e 143 case BLE_GAP_EVT_TIMEOUT:
Rohit Grover 22:c6ee8136847e 144 if (p_ble_evt->evt.gap_evt.params.timeout.src ==
Rohit Grover 22:c6ee8136847e 145 BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT) {
Rohit Grover 22:c6ee8136847e 146 nRF51Gap::getInstance().handleEvent(GapEvents::GAP_EVENT_TIMEOUT);
Rohit Grover 22:c6ee8136847e 147 }
Rohit Grover 22:c6ee8136847e 148 break;
Rohit Grover 22:c6ee8136847e 149
Rohit Grover 22:c6ee8136847e 150 case BLE_GATTC_EVT_TIMEOUT:
Rohit Grover 22:c6ee8136847e 151 case BLE_GATTS_EVT_TIMEOUT:
Rohit Grover 22:c6ee8136847e 152 // Disconnect on GATT Server and Client timeout events.
Rohit Grover 22:c6ee8136847e 153 // ASSERT_STATUS_RET_VOID (sd_ble_gap_disconnect(m_conn_handle,
Rohit Grover 22:c6ee8136847e 154 // BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION));
Rohit Grover 22:c6ee8136847e 155 break;
Rohit Grover 22:c6ee8136847e 156
Rohit Grover 22:c6ee8136847e 157 default:
Rohit Grover 22:c6ee8136847e 158 break;
Rohit Grover 22:c6ee8136847e 159 }
Rohit Grover 22:c6ee8136847e 160
Rohit Grover 22:c6ee8136847e 161 nRF51GattServer::getInstance().hwCallback(p_ble_evt);
Rohit Grover 22:c6ee8136847e 162 }
Rohit Grover 22:c6ee8136847e 163
Rohit Grover 32:84dea0924a63 164 #if NEED_BOND_MANAGER /* disabled by default */
Rohit Grover 22:c6ee8136847e 165 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 166 /*!
Rohit Grover 22:c6ee8136847e 167 @brief Initialises the bond manager
Rohit Grover 22:c6ee8136847e 168
Rohit Grover 22:c6ee8136847e 169 @note Bond data will be cleared on reset if the bond delete
Rohit Grover 22:c6ee8136847e 170 button is pressed during initialisation (the button is
Rohit Grover 22:c6ee8136847e 171 defined as CFG_BLE_BOND_DELETE_BUTTON_NUM).
Rohit Grover 22:c6ee8136847e 172
Rohit Grover 22:c6ee8136847e 173 @returns
Rohit Grover 22:c6ee8136847e 174 */
Rohit Grover 22:c6ee8136847e 175 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 176 static error_t bond_manager_init(void)
Rohit Grover 22:c6ee8136847e 177 {
Rohit Grover 22:c6ee8136847e 178 ble_bondmngr_init_t bond_para = {0};
Rohit Grover 22:c6ee8136847e 179
Rohit Grover 22:c6ee8136847e 180 ASSERT_STATUS ( pstorage_init());
Rohit Grover 22:c6ee8136847e 181
Rohit Grover 22:c6ee8136847e 182 bond_para.flash_page_num_bond = CFG_BLE_BOND_FLASH_PAGE_BOND;
Rohit Grover 22:c6ee8136847e 183 bond_para.flash_page_num_sys_attr = CFG_BLE_BOND_FLASH_PAGE_SYS_ATTR;
Rohit Grover 22:c6ee8136847e 184 //bond_para.bonds_delete = boardButtonCheck(CFG_BLE_BOND_DELETE_BUTTON_NUM) ;
Rohit Grover 22:c6ee8136847e 185 bond_para.evt_handler = NULL;
Rohit Grover 22:c6ee8136847e 186 bond_para.error_handler = service_error_callback;
Rohit Grover 22:c6ee8136847e 187
Rohit Grover 22:c6ee8136847e 188 ASSERT_STATUS( ble_bondmngr_init( &bond_para ));
Rohit Grover 22:c6ee8136847e 189
Rohit Grover 22:c6ee8136847e 190 /* Init radio active/inactive notification to flash (to only perform flashing when the radio is inactive) */
Rohit Grover 22:c6ee8136847e 191 // ASSERT_STATUS( ble_radio_notification_init(NRF_APP_PRIORITY_HIGH,
Rohit Grover 22:c6ee8136847e 192 // NRF_RADIO_NOTIFICATION_DISTANCE_4560US,
Rohit Grover 22:c6ee8136847e 193 // ble_flash_on_radio_active_evt) );
Rohit Grover 22:c6ee8136847e 194
Rohit Grover 22:c6ee8136847e 195 return ERROR_NONE;
Rohit Grover 22:c6ee8136847e 196 }
Rohit Grover 32:84dea0924a63 197 #endif // #if NEED_BOND_MANAGER
Rohit Grover 22:c6ee8136847e 198
Rohit Grover 32:84dea0924a63 199 #if NEED_BOND_MANAGER /* disabled by default */
Rohit Grover 22:c6ee8136847e 200 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 201 /*!
Rohit Grover 22:c6ee8136847e 202 @brief
Rohit Grover 22:c6ee8136847e 203 @param[in] nrf_error
Rohit Grover 22:c6ee8136847e 204 @returns
Rohit Grover 22:c6ee8136847e 205 */
Rohit Grover 22:c6ee8136847e 206 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 207 static void service_error_callback(uint32_t nrf_error)
Rohit Grover 22:c6ee8136847e 208 {
Rohit Grover 22:c6ee8136847e 209 ASSERT_STATUS_RET_VOID( nrf_error );
Rohit Grover 22:c6ee8136847e 210 }
Rohit Grover 32:84dea0924a63 211 #endif // #if NEED_BOND_MANAGER
Rohit Grover 22:c6ee8136847e 212
Rohit Grover 22:c6ee8136847e 213 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 214 /*!
Rohit Grover 22:c6ee8136847e 215 @brief Callback when an error occurs inside the SoftDevice
Rohit Grover 22:c6ee8136847e 216
Rohit Grover 22:c6ee8136847e 217 @param[in] line_num
Rohit Grover 22:c6ee8136847e 218 @param[in] p-file_name
Rohit Grover 22:c6ee8136847e 219
Rohit Grover 22:c6ee8136847e 220 @returns
Rohit Grover 22:c6ee8136847e 221 */
Rohit Grover 22:c6ee8136847e 222 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 223 void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name)
Rohit Grover 22:c6ee8136847e 224 {
Rohit Grover 22:c6ee8136847e 225 ASSERT(false, (void) 0);
Rohit Grover 22:c6ee8136847e 226 }
Rohit Grover 22:c6ee8136847e 227
Rohit Grover 22:c6ee8136847e 228 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 229 /*!
Rohit Grover 22:c6ee8136847e 230 @brief Handler for general errors above the SoftDevice layer.
Rohit Grover 22:c6ee8136847e 231 Typically we can' recover from this so we do a reset.
Rohit Grover 22:c6ee8136847e 232
Rohit Grover 22:c6ee8136847e 233 @param[in] error_code
Rohit Grover 22:c6ee8136847e 234 @param[in] line_num
Rohit Grover 22:c6ee8136847e 235 @param[in] p-file_name
Rohit Grover 22:c6ee8136847e 236
Rohit Grover 22:c6ee8136847e 237 @returns
Rohit Grover 22:c6ee8136847e 238 */
Rohit Grover 22:c6ee8136847e 239 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 240 void app_error_handler(uint32_t error_code,
Rohit Grover 22:c6ee8136847e 241 uint32_t line_num,
Rohit Grover 22:c6ee8136847e 242 const uint8_t *p_file_name)
Rohit Grover 22:c6ee8136847e 243 {
Rohit Grover 22:c6ee8136847e 244 ASSERT_STATUS_RET_VOID( error_code );
Rohit Grover 22:c6ee8136847e 245 NVIC_SystemReset();
Rohit Grover 22:c6ee8136847e 246 }