1

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Thu Jul 02 09:08:44 2015 +0100
Revision:
362:6fa0d4d555f6
Parent:
361:d2405f5a4853
Child:
370:295f76db798e
Synchronized with git rev 2716309c
Author: Rohit Grover
Release 0.4.0
=============

This is a major release which introduces the GATT Client functionality. It
aligns with release 0.4.0 of BLE_API.

Enhancements
~~~~~~~~~~~~

* Introduce GattClient. This includes functionality for service-discovery,
connections, and attribute-reads and writes. You'll find a demo program for
LEDBlinker on the mbed.org Bluetooth team page to use the new APIs. Some of
the GATT client functionality hasn't been implemented yet, but the APIs have
been added.

* We've added an implementation for the abstract base class for
SecurityManager. All security related APIs have been moved into that.

* There has been a major cleanup of APIs under BLE. APIs have now been
categorized as belonging to Gap, GattServer, GattClient, or SecurityManager.
There are accessors to get references for Gap, GattServer, GattClient, and
SecurityManager. A former call to ble.setAddress(...) is now expected to be
achieved with ble.gap().setAddress(...).

* We've cleaned up our APIs, and this has resulted in dropping some APIs like
BLE::reset().

* We've also dropped GattServer::initializeGattDatabase(). THis was added at
some point to support controllers where a commit point was needed to
indicate when the application had finished constructing the GATT database.
This API would get called internally before Gap::startAdvertising(). We now
expect the underlying port to do the equivalent of initializeGattDatabase()
implicitly upon Gap::startAdvertising().

* We've added a version of Gap::disconnect() which takes a connection handle.
The previous API (which did not take a connection handle) has been
deprecated; it will still work for situations where there's only a single
active connection. We hold on to that API to allow existing code to migrate
to the new API.

Bugfixes
~~~~~~~~

* None.

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
Rohit Grover 22:c6ee8136847e 17 #include "nRF51Gap.h"
Rohit Grover 22:c6ee8136847e 18 #include "mbed.h"
Rohit Grover 22:c6ee8136847e 19
Rohit Grover 22:c6ee8136847e 20 #include "common/common.h"
Rohit Grover 22:c6ee8136847e 21 #include "ble_advdata.h"
Rohit Grover 22:c6ee8136847e 22 #include "ble_hci.h"
Rohit Grover 22:c6ee8136847e 23
rgrover1 181:ce044982b915 24 nRF51Gap &nRF51Gap::getInstance() {
rgrover1 181:ce044982b915 25 static nRF51Gap m_instance;
rgrover1 181:ce044982b915 26 return m_instance;
rgrover1 181:ce044982b915 27 }
rgrover1 181:ce044982b915 28
Rohit Grover 22:c6ee8136847e 29 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 30 /*!
Rohit Grover 22:c6ee8136847e 31 @brief Sets the advertising parameters and payload for the device
Rohit Grover 22:c6ee8136847e 32
Rohit Grover 22:c6ee8136847e 33 @param[in] params
Rohit Grover 22:c6ee8136847e 34 Basic advertising details, including the advertising
Rohit Grover 22:c6ee8136847e 35 delay, timeout and how the device should be advertised
Rohit Grover 22:c6ee8136847e 36 @params[in] advData
Rohit Grover 22:c6ee8136847e 37 The primary advertising data payload
Rohit Grover 22:c6ee8136847e 38 @params[in] scanResponse
Rohit Grover 22:c6ee8136847e 39 The optional Scan Response payload if the advertising
Rohit Grover 22:c6ee8136847e 40 type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED
Rohit Grover 22:c6ee8136847e 41 in \ref GapAdveritinngParams
Rohit Grover 22:c6ee8136847e 42
Rohit Grover 22:c6ee8136847e 43 @returns \ref ble_error_t
Rohit Grover 22:c6ee8136847e 44
Rohit Grover 22:c6ee8136847e 45 @retval BLE_ERROR_NONE
Rohit Grover 22:c6ee8136847e 46 Everything executed properly
Rohit Grover 22:c6ee8136847e 47
Rohit Grover 22:c6ee8136847e 48 @retval BLE_ERROR_BUFFER_OVERFLOW
Rohit Grover 22:c6ee8136847e 49 The proposed action would cause a buffer overflow. All
Rohit Grover 22:c6ee8136847e 50 advertising payloads must be <= 31 bytes, for example.
Rohit Grover 22:c6ee8136847e 51
Rohit Grover 22:c6ee8136847e 52 @retval BLE_ERROR_NOT_IMPLEMENTED
Rohit Grover 22:c6ee8136847e 53 A feature was requested that is not yet supported in the
Rohit Grover 22:c6ee8136847e 54 nRF51 firmware or hardware.
Rohit Grover 22:c6ee8136847e 55
Rohit Grover 22:c6ee8136847e 56 @retval BLE_ERROR_PARAM_OUT_OF_RANGE
Rohit Grover 22:c6ee8136847e 57 One of the proposed values is outside the valid range.
Rohit Grover 22:c6ee8136847e 58
Rohit Grover 22:c6ee8136847e 59 @section EXAMPLE
Rohit Grover 22:c6ee8136847e 60
Rohit Grover 22:c6ee8136847e 61 @code
Rohit Grover 22:c6ee8136847e 62
Rohit Grover 22:c6ee8136847e 63 @endcode
Rohit Grover 22:c6ee8136847e 64 */
Rohit Grover 22:c6ee8136847e 65 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 66 ble_error_t nRF51Gap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse)
Rohit Grover 22:c6ee8136847e 67 {
Rohit Grover 22:c6ee8136847e 68 /* Make sure we don't exceed the advertising payload length */
Rohit Grover 22:c6ee8136847e 69 if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) {
Rohit Grover 22:c6ee8136847e 70 return BLE_ERROR_BUFFER_OVERFLOW;
Rohit Grover 22:c6ee8136847e 71 }
Rohit Grover 22:c6ee8136847e 72
Rohit Grover 22:c6ee8136847e 73 /* Make sure we have a payload! */
Rohit Grover 22:c6ee8136847e 74 if (advData.getPayloadLen() == 0) {
Rohit Grover 22:c6ee8136847e 75 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 22:c6ee8136847e 76 }
Rohit Grover 22:c6ee8136847e 77
Rohit Grover 22:c6ee8136847e 78 /* Check the scan response payload limits */
Rohit Grover 22:c6ee8136847e 79 //if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED))
Rohit Grover 22:c6ee8136847e 80 //{
Rohit Grover 22:c6ee8136847e 81 // /* Check if we're within the upper limit */
Rohit Grover 22:c6ee8136847e 82 // if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD)
Rohit Grover 22:c6ee8136847e 83 // {
Rohit Grover 22:c6ee8136847e 84 // return BLE_ERROR_BUFFER_OVERFLOW;
Rohit Grover 22:c6ee8136847e 85 // }
Rohit Grover 22:c6ee8136847e 86 // /* Make sure we have a payload! */
Rohit Grover 22:c6ee8136847e 87 // if (advData.getPayloadLen() == 0)
Rohit Grover 22:c6ee8136847e 88 // {
Rohit Grover 22:c6ee8136847e 89 // return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 22:c6ee8136847e 90 // }
Rohit Grover 22:c6ee8136847e 91 //}
Rohit Grover 22:c6ee8136847e 92
Rohit Grover 22:c6ee8136847e 93 /* Send advertising data! */
Rohit Grover 22:c6ee8136847e 94 ASSERT(ERROR_NONE ==
Rohit Grover 22:c6ee8136847e 95 sd_ble_gap_adv_data_set(advData.getPayload(),
Rohit Grover 22:c6ee8136847e 96 advData.getPayloadLen(),
Rohit Grover 22:c6ee8136847e 97 scanResponse.getPayload(),
Rohit Grover 22:c6ee8136847e 98 scanResponse.getPayloadLen()),
Rohit Grover 22:c6ee8136847e 99 BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 22:c6ee8136847e 100
Rohit Grover 22:c6ee8136847e 101 /* Make sure the GAP Service appearance value is aligned with the
Rohit Grover 22:c6ee8136847e 102 *appearance from GapAdvertisingData */
Rohit Grover 22:c6ee8136847e 103 ASSERT(ERROR_NONE == sd_ble_gap_appearance_set(advData.getAppearance()),
Rohit Grover 22:c6ee8136847e 104 BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 22:c6ee8136847e 105
Rohit Grover 22:c6ee8136847e 106 /* ToDo: Perform some checks on the payload, for example the Scan Response can't */
Rohit Grover 22:c6ee8136847e 107 /* contains a flags AD type, etc. */
Rohit Grover 22:c6ee8136847e 108
Rohit Grover 22:c6ee8136847e 109 return BLE_ERROR_NONE;
Rohit Grover 22:c6ee8136847e 110 }
Rohit Grover 22:c6ee8136847e 111
Rohit Grover 22:c6ee8136847e 112 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 113 /*!
Rohit Grover 22:c6ee8136847e 114 @brief Starts the BLE HW, initialising any services that were
Rohit Grover 22:c6ee8136847e 115 added before this function was called.
Rohit Grover 22:c6ee8136847e 116
Rohit Grover 22:c6ee8136847e 117 @note All services must be added before calling this function!
Rohit Grover 22:c6ee8136847e 118
Rohit Grover 22:c6ee8136847e 119 @returns ble_error_t
Rohit Grover 22:c6ee8136847e 120
Rohit Grover 22:c6ee8136847e 121 @retval BLE_ERROR_NONE
Rohit Grover 22:c6ee8136847e 122 Everything executed properly
Rohit Grover 22:c6ee8136847e 123
Rohit Grover 22:c6ee8136847e 124 @section EXAMPLE
Rohit Grover 22:c6ee8136847e 125
Rohit Grover 22:c6ee8136847e 126 @code
Rohit Grover 22:c6ee8136847e 127
Rohit Grover 22:c6ee8136847e 128 @endcode
Rohit Grover 22:c6ee8136847e 129 */
Rohit Grover 22:c6ee8136847e 130 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 131 ble_error_t nRF51Gap::startAdvertising(const GapAdvertisingParams &params)
Rohit Grover 22:c6ee8136847e 132 {
Rohit Grover 22:c6ee8136847e 133 /* Make sure we support the advertising type */
Rohit Grover 22:c6ee8136847e 134 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) {
Rohit Grover 22:c6ee8136847e 135 /* ToDo: This requires a propery security implementation, etc. */
Rohit Grover 22:c6ee8136847e 136 return BLE_ERROR_NOT_IMPLEMENTED;
Rohit Grover 22:c6ee8136847e 137 }
Rohit Grover 22:c6ee8136847e 138
Rohit Grover 22:c6ee8136847e 139 /* Check interval range */
Rohit Grover 22:c6ee8136847e 140 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) {
Rohit Grover 22:c6ee8136847e 141 /* Min delay is slightly longer for unconnectable devices */
rgrover1 70:d57285f18f65 142 if ((params.getInterval() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) ||
rgrover1 70:d57285f18f65 143 (params.getInterval() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Rohit Grover 22:c6ee8136847e 144 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 22:c6ee8136847e 145 }
Rohit Grover 22:c6ee8136847e 146 } else {
rgrover1 70:d57285f18f65 147 if ((params.getInterval() < GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MIN) ||
rgrover1 70:d57285f18f65 148 (params.getInterval() > GapAdvertisingParams::GAP_ADV_PARAMS_INTERVAL_MAX)) {
Rohit Grover 22:c6ee8136847e 149 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 22:c6ee8136847e 150 }
Rohit Grover 22:c6ee8136847e 151 }
Rohit Grover 22:c6ee8136847e 152
Rohit Grover 22:c6ee8136847e 153 /* Check timeout is zero for Connectable Directed */
Rohit Grover 22:c6ee8136847e 154 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && (params.getTimeout() != 0)) {
Rohit Grover 22:c6ee8136847e 155 /* Timeout must be 0 with this type, although we'll never get here */
Rohit Grover 22:c6ee8136847e 156 /* since this isn't implemented yet anyway */
Rohit Grover 22:c6ee8136847e 157 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 22:c6ee8136847e 158 }
Rohit Grover 22:c6ee8136847e 159
Rohit Grover 22:c6ee8136847e 160 /* Check timeout for other advertising types */
Rohit Grover 22:c6ee8136847e 161 if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
rgrover1 70:d57285f18f65 162 (params.getTimeout() > GapAdvertisingParams::GAP_ADV_PARAMS_TIMEOUT_MAX)) {
Rohit Grover 22:c6ee8136847e 163 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 22:c6ee8136847e 164 }
Rohit Grover 22:c6ee8136847e 165
Rohit Grover 22:c6ee8136847e 166 /* Start Advertising */
Rohit Grover 22:c6ee8136847e 167 ble_gap_adv_params_t adv_para = {0};
Rohit Grover 22:c6ee8136847e 168
Rohit Grover 22:c6ee8136847e 169 adv_para.type = params.getAdvertisingType();
Rohit Grover 22:c6ee8136847e 170 adv_para.p_peer_addr = NULL; // Undirected advertisement
Rohit Grover 22:c6ee8136847e 171 adv_para.fp = BLE_GAP_ADV_FP_ANY;
Rohit Grover 22:c6ee8136847e 172 adv_para.p_whitelist = NULL;
Rohit Grover 22:c6ee8136847e 173 adv_para.interval = params.getInterval(); // advertising interval (in units of 0.625 ms)
Rohit Grover 22:c6ee8136847e 174 adv_para.timeout = params.getTimeout();
Rohit Grover 22:c6ee8136847e 175
Rohit Grover 56:a1071b629aa3 176 ASSERT(ERROR_NONE == sd_ble_gap_adv_start(&adv_para), BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 22:c6ee8136847e 177
Rohit Grover 22:c6ee8136847e 178 state.advertising = 1;
Rohit Grover 22:c6ee8136847e 179
Rohit Grover 22:c6ee8136847e 180 return BLE_ERROR_NONE;
Rohit Grover 22:c6ee8136847e 181 }
Rohit Grover 22:c6ee8136847e 182
Rohit Grover 22:c6ee8136847e 183 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 184 /*!
Rohit Grover 22:c6ee8136847e 185 @brief Stops the BLE HW and disconnects from any devices
Rohit Grover 22:c6ee8136847e 186
Rohit Grover 22:c6ee8136847e 187 @returns ble_error_t
Rohit Grover 22:c6ee8136847e 188
Rohit Grover 22:c6ee8136847e 189 @retval BLE_ERROR_NONE
Rohit Grover 22:c6ee8136847e 190 Everything executed properly
Rohit Grover 22:c6ee8136847e 191
Rohit Grover 22:c6ee8136847e 192 @section EXAMPLE
Rohit Grover 22:c6ee8136847e 193
Rohit Grover 22:c6ee8136847e 194 @code
Rohit Grover 22:c6ee8136847e 195
Rohit Grover 22:c6ee8136847e 196 @endcode
Rohit Grover 22:c6ee8136847e 197 */
Rohit Grover 22:c6ee8136847e 198 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 199 ble_error_t nRF51Gap::stopAdvertising(void)
Rohit Grover 22:c6ee8136847e 200 {
Rohit Grover 22:c6ee8136847e 201 /* Stop Advertising */
Rohit Grover 22:c6ee8136847e 202 ASSERT(ERROR_NONE == sd_ble_gap_adv_stop(), BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 22:c6ee8136847e 203
Rohit Grover 22:c6ee8136847e 204 state.advertising = 0;
Rohit Grover 22:c6ee8136847e 205
Rohit Grover 22:c6ee8136847e 206 return BLE_ERROR_NONE;
Rohit Grover 22:c6ee8136847e 207 }
Rohit Grover 22:c6ee8136847e 208
rgrover1 362:6fa0d4d555f6 209 ble_error_t nRF51Gap::connect(const Address_t peerAddr,
rgrover1 362:6fa0d4d555f6 210 Gap::AddressType_t peerAddrType,
rgrover1 362:6fa0d4d555f6 211 const ConnectionParams_t *connectionParams,
rgrover1 362:6fa0d4d555f6 212 const GapScanningParams *scanParamsIn)
rgrover1 362:6fa0d4d555f6 213 {
rgrover1 362:6fa0d4d555f6 214 ble_gap_addr_t addr;
rgrover1 362:6fa0d4d555f6 215 addr.addr_type = peerAddrType;
rgrover1 362:6fa0d4d555f6 216 memcpy(addr.addr, peerAddr, Gap::ADDR_LEN);
rgrover1 344:2a44e5fd26bc 217
rgrover1 362:6fa0d4d555f6 218 ble_gap_conn_params_t connParams;
rgrover1 362:6fa0d4d555f6 219 if (connectionParams != NULL) {
rgrover1 362:6fa0d4d555f6 220 connParams.min_conn_interval = connectionParams->minConnectionInterval;
rgrover1 362:6fa0d4d555f6 221 connParams.max_conn_interval = connectionParams->maxConnectionInterval;
rgrover1 362:6fa0d4d555f6 222 connParams.slave_latency = connectionParams->slaveLatency;
rgrover1 362:6fa0d4d555f6 223 connParams.conn_sup_timeout = connectionParams->connectionSupervisionTimeout;
rgrover1 362:6fa0d4d555f6 224 } else {
rgrover1 362:6fa0d4d555f6 225 connParams.min_conn_interval = 50;
rgrover1 362:6fa0d4d555f6 226 connParams.max_conn_interval = 100;
rgrover1 362:6fa0d4d555f6 227 connParams.slave_latency = 0;
rgrover1 362:6fa0d4d555f6 228 connParams.conn_sup_timeout = 600;
rgrover1 362:6fa0d4d555f6 229 }
rgrover1 344:2a44e5fd26bc 230
rgrover1 362:6fa0d4d555f6 231 ble_gap_scan_params_t scanParams;
rgrover1 362:6fa0d4d555f6 232 scanParams.active = 0; /**< If 1, perform active scanning (scan requests). */
rgrover1 362:6fa0d4d555f6 233 scanParams.selective = 0; /**< If 1, ignore unknown devices (non whitelisted). */
rgrover1 362:6fa0d4d555f6 234 scanParams.p_whitelist = NULL; /**< Pointer to whitelist, NULL if none is given. */
rgrover1 362:6fa0d4d555f6 235 if (scanParamsIn != NULL) {
rgrover1 362:6fa0d4d555f6 236 scanParams.interval = scanParamsIn->getInterval(); /**< Scan interval between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */
rgrover1 362:6fa0d4d555f6 237 scanParams.window = scanParamsIn->getWindow(); /**< Scan window between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */
rgrover1 362:6fa0d4d555f6 238 scanParams.timeout = scanParamsIn->getTimeout(); /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */
rgrover1 362:6fa0d4d555f6 239 } else {
rgrover1 362:6fa0d4d555f6 240 scanParams.interval = 500; /**< Scan interval between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */
rgrover1 362:6fa0d4d555f6 241 scanParams.window = 200; /**< Scan window between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */
rgrover1 362:6fa0d4d555f6 242 scanParams.timeout = 0; /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */
rgrover1 362:6fa0d4d555f6 243 }
rgrover1 344:2a44e5fd26bc 244
rgrover1 362:6fa0d4d555f6 245 uint32_t rc = sd_ble_gap_connect(&addr, &scanParams, &connParams);
rgrover1 362:6fa0d4d555f6 246 if (rc == NRF_SUCCESS) {
rgrover1 362:6fa0d4d555f6 247 return BLE_ERROR_NONE;
rgrover1 362:6fa0d4d555f6 248 }
rgrover1 362:6fa0d4d555f6 249 switch (rc) {
rgrover1 362:6fa0d4d555f6 250 case NRF_ERROR_INVALID_ADDR:
rgrover1 362:6fa0d4d555f6 251 return BLE_ERROR_INVALID_PARAM;
rgrover1 362:6fa0d4d555f6 252 case NRF_ERROR_INVALID_PARAM:
rgrover1 362:6fa0d4d555f6 253 return BLE_ERROR_INVALID_PARAM;
rgrover1 362:6fa0d4d555f6 254 case NRF_ERROR_INVALID_STATE:
rgrover1 362:6fa0d4d555f6 255 return BLE_ERROR_INVALID_STATE;
rgrover1 362:6fa0d4d555f6 256 case BLE_ERROR_GAP_INVALID_BLE_ADDR:
rgrover1 362:6fa0d4d555f6 257 return BLE_ERROR_INVALID_PARAM;
rgrover1 362:6fa0d4d555f6 258 case NRF_ERROR_NO_MEM:
rgrover1 362:6fa0d4d555f6 259 return BLE_ERROR_NO_MEM;
rgrover1 362:6fa0d4d555f6 260 case NRF_ERROR_BUSY:
rgrover1 362:6fa0d4d555f6 261 return BLE_STACK_BUSY;
rgrover1 362:6fa0d4d555f6 262 default:
rgrover1 362:6fa0d4d555f6 263 case BLE_ERROR_GAP_WHITELIST_IN_USE:
rgrover1 362:6fa0d4d555f6 264 return BLE_ERROR_UNSPECIFIED;
rgrover1 362:6fa0d4d555f6 265 }
rgrover1 362:6fa0d4d555f6 266 }
rgrover1 362:6fa0d4d555f6 267
rgrover1 362:6fa0d4d555f6 268 ble_error_t nRF51Gap::disconnect(Handle_t connectionHandle, DisconnectionReason_t reason)
Rohit Grover 22:c6ee8136847e 269 {
Rohit Grover 22:c6ee8136847e 270 state.advertising = 0;
Rohit Grover 22:c6ee8136847e 271 state.connected = 0;
Rohit Grover 22:c6ee8136847e 272
Rohit Grover 56:a1071b629aa3 273 uint8_t code = BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION;
Rohit Grover 56:a1071b629aa3 274 switch (reason) {
Rohit Grover 56:a1071b629aa3 275 case REMOTE_USER_TERMINATED_CONNECTION:
Rohit Grover 56:a1071b629aa3 276 code = BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION;
Rohit Grover 56:a1071b629aa3 277 break;
Rohit Grover 56:a1071b629aa3 278 case CONN_INTERVAL_UNACCEPTABLE:
Rohit Grover 56:a1071b629aa3 279 code = BLE_HCI_CONN_INTERVAL_UNACCEPTABLE;
Rohit Grover 56:a1071b629aa3 280 break;
rgrover1 362:6fa0d4d555f6 281 default:
rgrover1 362:6fa0d4d555f6 282 break;
Rohit Grover 56:a1071b629aa3 283 }
Rohit Grover 56:a1071b629aa3 284
Rohit Grover 22:c6ee8136847e 285 /* Disconnect if we are connected to a central device */
rgrover1 362:6fa0d4d555f6 286 ASSERT_INT(ERROR_NONE, sd_ble_gap_disconnect(connectionHandle, code), BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 22:c6ee8136847e 287
Rohit Grover 22:c6ee8136847e 288 return BLE_ERROR_NONE;
Rohit Grover 22:c6ee8136847e 289 }
Rohit Grover 22:c6ee8136847e 290
rgrover1 362:6fa0d4d555f6 291 /*!
rgrover1 362:6fa0d4d555f6 292 @brief Disconnects if we are connected to a central device
rgrover1 362:6fa0d4d555f6 293
rgrover1 362:6fa0d4d555f6 294 @returns ble_error_t
rgrover1 362:6fa0d4d555f6 295
rgrover1 362:6fa0d4d555f6 296 @retval BLE_ERROR_NONE
rgrover1 362:6fa0d4d555f6 297 Everything executed properly
rgrover1 362:6fa0d4d555f6 298 */
rgrover1 362:6fa0d4d555f6 299 ble_error_t nRF51Gap::disconnect(DisconnectionReason_t reason)
rgrover1 362:6fa0d4d555f6 300 {
rgrover1 362:6fa0d4d555f6 301 return disconnect(m_connectionHandle, reason);
rgrover1 362:6fa0d4d555f6 302 }
rgrover1 362:6fa0d4d555f6 303
Rohit Grover 44:47da5c62e067 304 ble_error_t nRF51Gap::getPreferredConnectionParams(ConnectionParams_t *params)
Rohit Grover 44:47da5c62e067 305 {
Rohit Grover 44:47da5c62e067 306 ASSERT_INT(NRF_SUCCESS,
Rohit Grover 44:47da5c62e067 307 sd_ble_gap_ppcp_get(reinterpret_cast<ble_gap_conn_params_t *>(params)),
Rohit Grover 44:47da5c62e067 308 BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 44:47da5c62e067 309
Rohit Grover 44:47da5c62e067 310 return BLE_ERROR_NONE;
Rohit Grover 44:47da5c62e067 311 }
Rohit Grover 44:47da5c62e067 312
Rohit Grover 44:47da5c62e067 313 ble_error_t nRF51Gap::setPreferredConnectionParams(const ConnectionParams_t *params)
Rohit Grover 44:47da5c62e067 314 {
Rohit Grover 44:47da5c62e067 315 ASSERT_INT(NRF_SUCCESS,
Rohit Grover 44:47da5c62e067 316 sd_ble_gap_ppcp_set(reinterpret_cast<const ble_gap_conn_params_t *>(params)),
Rohit Grover 44:47da5c62e067 317 BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 44:47da5c62e067 318
Rohit Grover 44:47da5c62e067 319 return BLE_ERROR_NONE;
Rohit Grover 44:47da5c62e067 320 }
Rohit Grover 44:47da5c62e067 321
Rohit Grover 44:47da5c62e067 322 ble_error_t nRF51Gap::updateConnectionParams(Handle_t handle, const ConnectionParams_t *newParams)
Rohit Grover 44:47da5c62e067 323 {
Rohit Grover 44:47da5c62e067 324 uint32_t rc;
Rohit Grover 44:47da5c62e067 325
Rohit Grover 56:a1071b629aa3 326 rc = sd_ble_gap_conn_param_update(handle, reinterpret_cast<ble_gap_conn_params_t *>(const_cast<ConnectionParams_t*>(newParams)));
Rohit Grover 44:47da5c62e067 327 if (rc == NRF_SUCCESS) {
Rohit Grover 44:47da5c62e067 328 return BLE_ERROR_NONE;
Rohit Grover 44:47da5c62e067 329 } else {
Rohit Grover 44:47da5c62e067 330 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 44:47da5c62e067 331 }
Rohit Grover 44:47da5c62e067 332 }
Rohit Grover 44:47da5c62e067 333
Rohit Grover 22:c6ee8136847e 334 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 335 /*!
Rohit Grover 22:c6ee8136847e 336 @brief Sets the 16-bit connection handle
Rohit Grover 22:c6ee8136847e 337 */
Rohit Grover 22:c6ee8136847e 338 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 339 void nRF51Gap::setConnectionHandle(uint16_t con_handle)
Rohit Grover 22:c6ee8136847e 340 {
Rohit Grover 22:c6ee8136847e 341 m_connectionHandle = con_handle;
Rohit Grover 22:c6ee8136847e 342 }
Rohit Grover 22:c6ee8136847e 343
Rohit Grover 22:c6ee8136847e 344 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 345 /*!
Rohit Grover 22:c6ee8136847e 346 @brief Gets the 16-bit connection handle
Rohit Grover 22:c6ee8136847e 347 */
Rohit Grover 22:c6ee8136847e 348 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 349 uint16_t nRF51Gap::getConnectionHandle(void)
Rohit Grover 22:c6ee8136847e 350 {
Rohit Grover 22:c6ee8136847e 351 return m_connectionHandle;
Rohit Grover 22:c6ee8136847e 352 }
Rohit Grover 22:c6ee8136847e 353
Rohit Grover 22:c6ee8136847e 354 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 355 /*!
Rohit Grover 22:c6ee8136847e 356 @brief Sets the BLE device address
Rohit Grover 22:c6ee8136847e 357
Rohit Grover 22:c6ee8136847e 358 @returns ble_error_t
Rohit Grover 22:c6ee8136847e 359
Rohit Grover 22:c6ee8136847e 360 @section EXAMPLE
Rohit Grover 22:c6ee8136847e 361
Rohit Grover 22:c6ee8136847e 362 @code
Rohit Grover 22:c6ee8136847e 363
Rohit Grover 22:c6ee8136847e 364 uint8_t device_address[6] = { 0xca, 0xfe, 0xf0, 0xf0, 0xf0, 0xf0 };
Rohit Grover 22:c6ee8136847e 365 nrf.getGap().setAddress(Gap::ADDR_TYPE_RANDOM_STATIC, device_address);
Rohit Grover 22:c6ee8136847e 366
Rohit Grover 22:c6ee8136847e 367 @endcode
Rohit Grover 22:c6ee8136847e 368 */
Rohit Grover 22:c6ee8136847e 369 /**************************************************************************/
rgrover1 362:6fa0d4d555f6 370 ble_error_t nRF51Gap::setAddress(AddressType_t type, const Address_t address)
Rohit Grover 22:c6ee8136847e 371 {
Rohit Grover 22:c6ee8136847e 372 if (type > ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE) {
Rohit Grover 22:c6ee8136847e 373 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 22:c6ee8136847e 374 }
Rohit Grover 22:c6ee8136847e 375
Rohit Grover 22:c6ee8136847e 376 ble_gap_addr_t dev_addr;
Rohit Grover 22:c6ee8136847e 377 dev_addr.addr_type = type;
Rohit Grover 69:61da91a52bd6 378 memcpy(dev_addr.addr, address, ADDR_LEN);
Rohit Grover 69:61da91a52bd6 379
Rohit Grover 69:61da91a52bd6 380 ASSERT_INT(ERROR_NONE, sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &dev_addr), BLE_ERROR_PARAM_OUT_OF_RANGE);
Rohit Grover 69:61da91a52bd6 381
Rohit Grover 69:61da91a52bd6 382 return BLE_ERROR_NONE;
Rohit Grover 69:61da91a52bd6 383 }
Rohit Grover 22:c6ee8136847e 384
rgrover1 362:6fa0d4d555f6 385 ble_error_t nRF51Gap::getAddress(AddressType_t *typeP, Address_t address)
Rohit Grover 69:61da91a52bd6 386 {
Rohit Grover 69:61da91a52bd6 387 ble_gap_addr_t dev_addr;
Rohit Grover 69:61da91a52bd6 388 if (sd_ble_gap_address_get(&dev_addr) != NRF_SUCCESS) {
Rohit Grover 69:61da91a52bd6 389 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 69:61da91a52bd6 390 }
Rohit Grover 22:c6ee8136847e 391
Rohit Grover 69:61da91a52bd6 392 if (typeP != NULL) {
rgrover1 179:10e4c13360d9 393 *typeP = static_cast<AddressType_t>(dev_addr.addr_type);
Rohit Grover 69:61da91a52bd6 394 }
rgrover1 77:9886b2865631 395 if (address != NULL) {
rgrover1 77:9886b2865631 396 memcpy(address, dev_addr.addr, ADDR_LEN);
Rohit Grover 69:61da91a52bd6 397 }
Rohit Grover 22:c6ee8136847e 398 return BLE_ERROR_NONE;
Rohit Grover 22:c6ee8136847e 399 }
Rohit Grover 56:a1071b629aa3 400
Rohit Grover 56:a1071b629aa3 401 ble_error_t nRF51Gap::setDeviceName(const uint8_t *deviceName)
Rohit Grover 56:a1071b629aa3 402 {
Rohit Grover 56:a1071b629aa3 403 ble_gap_conn_sec_mode_t sec_mode;
Rohit Grover 56:a1071b629aa3 404 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); // no security is needed
Rohit Grover 56:a1071b629aa3 405
Rohit Grover 56:a1071b629aa3 406 if (sd_ble_gap_device_name_set(&sec_mode, deviceName, strlen((const char *)deviceName)) == NRF_SUCCESS) {
Rohit Grover 56:a1071b629aa3 407 return BLE_ERROR_NONE;
Rohit Grover 56:a1071b629aa3 408 } else {
Rohit Grover 56:a1071b629aa3 409 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 56:a1071b629aa3 410 }
Rohit Grover 56:a1071b629aa3 411 }
Rohit Grover 56:a1071b629aa3 412
Rohit Grover 56:a1071b629aa3 413 ble_error_t nRF51Gap::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
Rohit Grover 56:a1071b629aa3 414 {
Rohit Grover 56:a1071b629aa3 415 if (sd_ble_gap_device_name_get(deviceName, (uint16_t *)lengthP) == NRF_SUCCESS) {
Rohit Grover 56:a1071b629aa3 416 return BLE_ERROR_NONE;
Rohit Grover 56:a1071b629aa3 417 } else {
Rohit Grover 56:a1071b629aa3 418 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 56:a1071b629aa3 419 }
Rohit Grover 56:a1071b629aa3 420 }
Rohit Grover 56:a1071b629aa3 421
rgrover1 362:6fa0d4d555f6 422 ble_error_t nRF51Gap::setAppearance(GapAdvertisingData::Appearance appearance)
Rohit Grover 56:a1071b629aa3 423 {
Rohit Grover 56:a1071b629aa3 424 if (sd_ble_gap_appearance_set(appearance) == NRF_SUCCESS) {
Rohit Grover 56:a1071b629aa3 425 return BLE_ERROR_NONE;
Rohit Grover 56:a1071b629aa3 426 } else {
Rohit Grover 56:a1071b629aa3 427 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 56:a1071b629aa3 428 }
Rohit Grover 56:a1071b629aa3 429 }
Rohit Grover 56:a1071b629aa3 430
rgrover1 362:6fa0d4d555f6 431 ble_error_t nRF51Gap::getAppearance(GapAdvertisingData::Appearance *appearanceP)
Rohit Grover 56:a1071b629aa3 432 {
rgrover1 362:6fa0d4d555f6 433 if (sd_ble_gap_appearance_get(reinterpret_cast<uint16_t *>(appearanceP))) {
Rohit Grover 56:a1071b629aa3 434 return BLE_ERROR_NONE;
Rohit Grover 56:a1071b629aa3 435 } else {
Rohit Grover 56:a1071b629aa3 436 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 56:a1071b629aa3 437 }
rgrover1 362:6fa0d4d555f6 438 }
rgrover1 362:6fa0d4d555f6 439
rgrover1 362:6fa0d4d555f6 440 /* (Valid values are -40, -20, -16, -12, -8, -4, 0, 4) */
rgrover1 362:6fa0d4d555f6 441 ble_error_t nRF51Gap::setTxPower(int8_t txPower)
rgrover1 362:6fa0d4d555f6 442 {
rgrover1 362:6fa0d4d555f6 443 unsigned rc;
rgrover1 362:6fa0d4d555f6 444 if ((rc = sd_ble_gap_tx_power_set(txPower)) != NRF_SUCCESS) {
rgrover1 362:6fa0d4d555f6 445 switch (rc) {
rgrover1 362:6fa0d4d555f6 446 case NRF_ERROR_BUSY:
rgrover1 362:6fa0d4d555f6 447 return BLE_STACK_BUSY;
rgrover1 362:6fa0d4d555f6 448 case NRF_ERROR_INVALID_PARAM:
rgrover1 362:6fa0d4d555f6 449 default:
rgrover1 362:6fa0d4d555f6 450 return BLE_ERROR_PARAM_OUT_OF_RANGE;
rgrover1 362:6fa0d4d555f6 451 }
rgrover1 362:6fa0d4d555f6 452 }
rgrover1 362:6fa0d4d555f6 453
rgrover1 362:6fa0d4d555f6 454 return BLE_ERROR_NONE;
rgrover1 362:6fa0d4d555f6 455 }
rgrover1 362:6fa0d4d555f6 456
rgrover1 362:6fa0d4d555f6 457 void nRF51Gap::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP)
rgrover1 362:6fa0d4d555f6 458 {
rgrover1 362:6fa0d4d555f6 459 static const int8_t permittedTxValues[] = {
rgrover1 362:6fa0d4d555f6 460 -40, -30, -20, -16, -12, -8, -4, 0, 4
rgrover1 362:6fa0d4d555f6 461 };
rgrover1 362:6fa0d4d555f6 462
rgrover1 362:6fa0d4d555f6 463 *valueArrayPP = permittedTxValues;
rgrover1 362:6fa0d4d555f6 464 *countP = sizeof(permittedTxValues) / sizeof(int8_t);
rgrover1 70:d57285f18f65 465 }