High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Thu Jul 02 09:06:11 2015 +0100
Revision:
715:6d415ac147aa
Parent:
567:e4b38e43de7c
Child:
569:a5a6a1681fcf
Synchronized with git rev 69726547
Author: Rohit Grover
Release 0.3.9
=============

A minor patch to fix a build error introduced by the previous
release. This has to do with certain declarations being made members
of class UUID.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 567:e4b38e43de7c 1 /* mbed Microcontroller Library
rgrover1 567:e4b38e43de7c 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 567:e4b38e43de7c 3 *
rgrover1 567:e4b38e43de7c 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 567:e4b38e43de7c 5 * you may not use this file except in compliance with the License.
rgrover1 567:e4b38e43de7c 6 * You may obtain a copy of the License at
rgrover1 567:e4b38e43de7c 7 *
rgrover1 567:e4b38e43de7c 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 567:e4b38e43de7c 9 *
rgrover1 567:e4b38e43de7c 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 567:e4b38e43de7c 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 567:e4b38e43de7c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 567:e4b38e43de7c 13 * See the License for the specific language governing permissions and
rgrover1 567:e4b38e43de7c 14 * limitations under the License.
rgrover1 567:e4b38e43de7c 15 */
rgrover1 567:e4b38e43de7c 16
rgrover1 567:e4b38e43de7c 17 #ifndef __BLE_DEVICE__
rgrover1 567:e4b38e43de7c 18 #define __BLE_DEVICE__
rgrover1 567:e4b38e43de7c 19
rgrover1 567:e4b38e43de7c 20 #include "blecommon.h"
rgrover1 567:e4b38e43de7c 21 #include "Gap.h"
rgrover1 567:e4b38e43de7c 22 #include "GattServer.h"
rgrover1 567:e4b38e43de7c 23 #include "GapScanningParams.h"
rgrover1 567:e4b38e43de7c 24 #include "BLEDeviceInstanceBase.h"
rgrover1 567:e4b38e43de7c 25
rgrover1 567:e4b38e43de7c 26 /**
rgrover1 567:e4b38e43de7c 27 * The base class used to abstract away BLE capable radio transceivers or SOCs,
rgrover1 567:e4b38e43de7c 28 * to enable this BLE API to work with any radio transparently.
rgrover1 567:e4b38e43de7c 29 */
rgrover1 567:e4b38e43de7c 30 class BLEDevice
rgrover1 567:e4b38e43de7c 31 {
rgrover1 567:e4b38e43de7c 32 public:
rgrover1 567:e4b38e43de7c 33 /**
rgrover1 567:e4b38e43de7c 34 * Initialize the BLE controller. This should be called before using
rgrover1 567:e4b38e43de7c 35 * anything else in the BLE_API.
rgrover1 567:e4b38e43de7c 36 *
rgrover1 567:e4b38e43de7c 37 * init() hands control to the underlying BLE module to accomplish
rgrover1 567:e4b38e43de7c 38 * initialization. This initialization may tacitly depend on other hardware
rgrover1 567:e4b38e43de7c 39 * setup (such as clocks or power-modes) which happens early on during
rgrover1 567:e4b38e43de7c 40 * system startup. It may not be safe to call init() from global static
rgrover1 567:e4b38e43de7c 41 * context where ordering is compiler specific and can't be guaranteed--it
rgrover1 567:e4b38e43de7c 42 * is safe to call BLEDevice::init() from within main().
rgrover1 567:e4b38e43de7c 43 */
rgrover1 567:e4b38e43de7c 44 ble_error_t init();
rgrover1 567:e4b38e43de7c 45
rgrover1 567:e4b38e43de7c 46 ble_error_t reset(void);
rgrover1 567:e4b38e43de7c 47
rgrover1 567:e4b38e43de7c 48 /**
rgrover1 567:e4b38e43de7c 49 * Purge the BLE stack of GATT and GAP state. init() must be called afterwards to re-instate services and GAP state.
rgrover1 567:e4b38e43de7c 50 */
rgrover1 567:e4b38e43de7c 51 ble_error_t shutdown(void);
rgrover1 567:e4b38e43de7c 52
rgrover1 567:e4b38e43de7c 53 /* GAP specific APIs */
rgrover1 567:e4b38e43de7c 54 public:
rgrover1 567:e4b38e43de7c 55 /**
rgrover1 567:e4b38e43de7c 56 * Set the BTLE MAC address and type.
rgrover1 567:e4b38e43de7c 57 * @return BLE_ERROR_NONE on success.
rgrover1 567:e4b38e43de7c 58 */
rgrover1 567:e4b38e43de7c 59 ble_error_t setAddress(Gap::AddressType_t type, const Gap::Address_t address);
rgrover1 567:e4b38e43de7c 60
rgrover1 567:e4b38e43de7c 61 /**
rgrover1 567:e4b38e43de7c 62 * Fetch the BTLE MAC address and type.
rgrover1 567:e4b38e43de7c 63 * @return BLE_ERROR_NONE on success.
rgrover1 567:e4b38e43de7c 64 */
rgrover1 567:e4b38e43de7c 65 ble_error_t getAddress(Gap::AddressType_t *typeP, Gap::Address_t address);
rgrover1 567:e4b38e43de7c 66
rgrover1 567:e4b38e43de7c 67 /**
rgrover1 567:e4b38e43de7c 68 * @param[in] advType
rgrover1 567:e4b38e43de7c 69 * The GAP advertising mode to use for this device. Valid
rgrover1 567:e4b38e43de7c 70 * values are defined in AdvertisingType:
rgrover1 567:e4b38e43de7c 71 *
rgrover1 567:e4b38e43de7c 72 * \par ADV_NON_CONNECTABLE_UNDIRECTED
rgrover1 567:e4b38e43de7c 73 * All connections to the peripheral device will be refused.
rgrover1 567:e4b38e43de7c 74 *
rgrover1 567:e4b38e43de7c 75 * \par ADV_CONNECTABLE_DIRECTED
rgrover1 567:e4b38e43de7c 76 * Only connections from a pre-defined central device will be
rgrover1 567:e4b38e43de7c 77 * accepted.
rgrover1 567:e4b38e43de7c 78 *
rgrover1 567:e4b38e43de7c 79 * \par ADV_CONNECTABLE_UNDIRECTED
rgrover1 567:e4b38e43de7c 80 * Any central device can connect to this peripheral.
rgrover1 567:e4b38e43de7c 81 *
rgrover1 567:e4b38e43de7c 82 * \par ADV_SCANNABLE_UNDIRECTED
rgrover1 567:e4b38e43de7c 83 * Include support for Scan Response payloads.
rgrover1 567:e4b38e43de7c 84 *
rgrover1 567:e4b38e43de7c 85 * \par
rgrover1 567:e4b38e43de7c 86 * See Bluetooth Core Specification 4.0 (Vol. 3), Part C,
rgrover1 567:e4b38e43de7c 87 * Section 9.3 and Core Specification 4.0 (Vol. 6), Part B,
rgrover1 567:e4b38e43de7c 88 * Section 2.3.1 for further information on GAP connection
rgrover1 567:e4b38e43de7c 89 * modes
rgrover1 567:e4b38e43de7c 90 */
rgrover1 567:e4b38e43de7c 91 void setAdvertisingType(GapAdvertisingParams::AdvertisingType);
rgrover1 567:e4b38e43de7c 92
rgrover1 567:e4b38e43de7c 93 /**
rgrover1 567:e4b38e43de7c 94 * @param[in] interval
rgrover1 567:e4b38e43de7c 95 * Advertising interval in units of milliseconds. Advertising
rgrover1 567:e4b38e43de7c 96 * is disabled if interval is 0. If interval is smaller than
rgrover1 567:e4b38e43de7c 97 * the minimum supported value, then the minimum supported
rgrover1 567:e4b38e43de7c 98 * value is used instead.
rgrover1 567:e4b38e43de7c 99 *
rgrover1 567:e4b38e43de7c 100 * \par
rgrover1 567:e4b38e43de7c 101 * Decreasing this value will allow central devices to detect
rgrover1 567:e4b38e43de7c 102 * your peripheral faster at the expense of more power being
rgrover1 567:e4b38e43de7c 103 * used by the radio due to the higher data transmit rate.
rgrover1 567:e4b38e43de7c 104 *
rgrover1 567:e4b38e43de7c 105 * \par
rgrover1 567:e4b38e43de7c 106 * This field must be set to 0 if connectionMode is equal
rgrover1 567:e4b38e43de7c 107 * to ADV_CONNECTABLE_DIRECTED
rgrover1 567:e4b38e43de7c 108 *
rgrover1 567:e4b38e43de7c 109 * \par
rgrover1 567:e4b38e43de7c 110 * See Bluetooth Core Specification, Vol 3., Part C,
rgrover1 567:e4b38e43de7c 111 * Appendix A for suggested advertising intervals.
rgrover1 567:e4b38e43de7c 112 *
rgrover1 567:e4b38e43de7c 113 * @Note: [WARNING] This API previously used 0.625ms as the unit for its
rgrover1 567:e4b38e43de7c 114 * 'interval' argument. That required an explicit conversion from
rgrover1 567:e4b38e43de7c 115 * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is
rgrover1 567:e4b38e43de7c 116 * no longer required as the new units are milliseconds. Any application
rgrover1 567:e4b38e43de7c 117 * code depending on the old semantics would need to be updated accordingly.
rgrover1 567:e4b38e43de7c 118 */
rgrover1 567:e4b38e43de7c 119 void setAdvertisingInterval(uint16_t interval);
rgrover1 567:e4b38e43de7c 120
rgrover1 567:e4b38e43de7c 121 /**
rgrover1 567:e4b38e43de7c 122 * @return Minimum Advertising interval in milliseconds.
rgrover1 567:e4b38e43de7c 123 */
rgrover1 567:e4b38e43de7c 124 uint16_t getMinAdvertisingInterval(void) const;
rgrover1 567:e4b38e43de7c 125 /**
rgrover1 567:e4b38e43de7c 126 * @return Minimum Advertising interval in milliseconds for non connectible mode.
rgrover1 567:e4b38e43de7c 127 */
rgrover1 567:e4b38e43de7c 128 uint16_t getMinNonConnectableAdvertisingInterval(void) const;
rgrover1 567:e4b38e43de7c 129 /**
rgrover1 567:e4b38e43de7c 130 * @return Maximum Advertising interval in milliseconds.
rgrover1 567:e4b38e43de7c 131 */
rgrover1 567:e4b38e43de7c 132 uint16_t getMaxAdvertisingInterval(void) const;
rgrover1 567:e4b38e43de7c 133
rgrover1 567:e4b38e43de7c 134 /**
rgrover1 567:e4b38e43de7c 135 * @param[in] timeout
rgrover1 567:e4b38e43de7c 136 * Advertising timeout between 0x1 and 0x3FFF (1 and 16383)
rgrover1 567:e4b38e43de7c 137 * in seconds. Enter 0 to disable the advertising timeout.
rgrover1 567:e4b38e43de7c 138 */
rgrover1 567:e4b38e43de7c 139 void setAdvertisingTimeout(uint16_t timeout);
rgrover1 567:e4b38e43de7c 140
rgrover1 567:e4b38e43de7c 141 /**
rgrover1 567:e4b38e43de7c 142 * Please refer to the APIs above.
rgrover1 567:e4b38e43de7c 143 */
rgrover1 567:e4b38e43de7c 144 void setAdvertisingParams(const GapAdvertisingParams &advParams);
rgrover1 567:e4b38e43de7c 145
rgrover1 567:e4b38e43de7c 146 /**
rgrover1 567:e4b38e43de7c 147 * @return Read back advertising parameters. Useful for storing and
rgrover1 567:e4b38e43de7c 148 * restoring parameters rapidly.
rgrover1 567:e4b38e43de7c 149 */
rgrover1 567:e4b38e43de7c 150 const GapAdvertisingParams &getAdvertisingParams(void) const;
rgrover1 567:e4b38e43de7c 151
rgrover1 567:e4b38e43de7c 152 /**
rgrover1 567:e4b38e43de7c 153 * This API is typically used as an internal helper to udpate the transport
rgrover1 567:e4b38e43de7c 154 * backend with advertising data before starting to advertise. It may also
rgrover1 567:e4b38e43de7c 155 * be explicity used to dynamically reset the accumulated advertising
rgrover1 567:e4b38e43de7c 156 * payload and scanResponse; to do this, the application can clear and re-
rgrover1 567:e4b38e43de7c 157 * accumulate a new advertising payload (and scanResponse) before using this
rgrover1 567:e4b38e43de7c 158 * API.
rgrover1 567:e4b38e43de7c 159 */
rgrover1 567:e4b38e43de7c 160 ble_error_t setAdvertisingPayload(void);
rgrover1 567:e4b38e43de7c 161
rgrover1 567:e4b38e43de7c 162 /**
rgrover1 567:e4b38e43de7c 163 * Set advertising data using object.
rgrover1 567:e4b38e43de7c 164 */
rgrover1 567:e4b38e43de7c 165 ble_error_t setAdvertisingData(const GapAdvertisingData &advData);
rgrover1 567:e4b38e43de7c 166
rgrover1 567:e4b38e43de7c 167 /**
rgrover1 567:e4b38e43de7c 168 * @return Read back advertising data. Useful for storing and
rgrover1 567:e4b38e43de7c 169 * restoring payload.
rgrover1 567:e4b38e43de7c 170 */
rgrover1 567:e4b38e43de7c 171 const GapAdvertisingData &getAdvertisingData(void) const;
rgrover1 567:e4b38e43de7c 172
rgrover1 567:e4b38e43de7c 173 /**
rgrover1 567:e4b38e43de7c 174 * Reset any advertising payload prepared from prior calls to
rgrover1 567:e4b38e43de7c 175 * accumulateAdvertisingPayload().
rgrover1 567:e4b38e43de7c 176 *
rgrover1 567:e4b38e43de7c 177 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 567:e4b38e43de7c 178 * startAdvertising() before the update takes effect.
rgrover1 567:e4b38e43de7c 179 */
rgrover1 567:e4b38e43de7c 180 void clearAdvertisingPayload(void);
rgrover1 567:e4b38e43de7c 181
rgrover1 567:e4b38e43de7c 182 /**
rgrover1 567:e4b38e43de7c 183 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 567:e4b38e43de7c 184 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 567:e4b38e43de7c 185 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 567:e4b38e43de7c 186 * small.
rgrover1 567:e4b38e43de7c 187 *
rgrover1 567:e4b38e43de7c 188 * @param flags
rgrover1 567:e4b38e43de7c 189 * The flags to be added. Multiple flags may be specified in
rgrover1 567:e4b38e43de7c 190 * combination.
rgrover1 567:e4b38e43de7c 191 */
rgrover1 567:e4b38e43de7c 192 ble_error_t accumulateAdvertisingPayload(uint8_t flags);
rgrover1 567:e4b38e43de7c 193
rgrover1 567:e4b38e43de7c 194 /**
rgrover1 567:e4b38e43de7c 195 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 567:e4b38e43de7c 196 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 567:e4b38e43de7c 197 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 567:e4b38e43de7c 198 * small.
rgrover1 567:e4b38e43de7c 199 *
rgrover1 567:e4b38e43de7c 200 * @param app
rgrover1 567:e4b38e43de7c 201 * The appearance of the peripheral.
rgrover1 567:e4b38e43de7c 202 */
rgrover1 567:e4b38e43de7c 203 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app);
rgrover1 567:e4b38e43de7c 204
rgrover1 567:e4b38e43de7c 205 /**
rgrover1 567:e4b38e43de7c 206 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 567:e4b38e43de7c 207 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 567:e4b38e43de7c 208 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 567:e4b38e43de7c 209 * small.
rgrover1 567:e4b38e43de7c 210 *
rgrover1 567:e4b38e43de7c 211 * @param app
rgrover1 567:e4b38e43de7c 212 * The max transmit power to be used by the controller. This is
rgrover1 567:e4b38e43de7c 213 * only a hint.
rgrover1 567:e4b38e43de7c 214 */
rgrover1 567:e4b38e43de7c 215 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power);
rgrover1 567:e4b38e43de7c 216
rgrover1 567:e4b38e43de7c 217 /**
rgrover1 567:e4b38e43de7c 218 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 567:e4b38e43de7c 219 * advertising payload. Please note that the payload is limited to 31 bytes.
rgrover1 567:e4b38e43de7c 220 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
rgrover1 567:e4b38e43de7c 221 * advertising payload proves to be too small.
rgrover1 567:e4b38e43de7c 222 *
rgrover1 567:e4b38e43de7c 223 * @param type The type which describes the variable length data.
rgrover1 567:e4b38e43de7c 224 * @param data data bytes.
rgrover1 567:e4b38e43de7c 225 * @param len length of data.
rgrover1 567:e4b38e43de7c 226 */
rgrover1 567:e4b38e43de7c 227 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len);
rgrover1 567:e4b38e43de7c 228
rgrover1 567:e4b38e43de7c 229 /**
rgrover1 567:e4b38e43de7c 230 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 567:e4b38e43de7c 231 * scanResponse payload.
rgrover1 567:e4b38e43de7c 232 *
rgrover1 567:e4b38e43de7c 233 * @param type The type which describes the variable length data.
rgrover1 567:e4b38e43de7c 234 * @param data data bytes.
rgrover1 567:e4b38e43de7c 235 * @param len length of data.
rgrover1 567:e4b38e43de7c 236 */
rgrover1 567:e4b38e43de7c 237 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len);
rgrover1 567:e4b38e43de7c 238
rgrover1 567:e4b38e43de7c 239 /**
rgrover1 567:e4b38e43de7c 240 * Reset any scan response prepared from prior calls to
rgrover1 567:e4b38e43de7c 241 * accumulateScanResponse().
rgrover1 567:e4b38e43de7c 242 *
rgrover1 567:e4b38e43de7c 243 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 567:e4b38e43de7c 244 * startAdvertising() before the update takes effect.
rgrover1 567:e4b38e43de7c 245 */
rgrover1 567:e4b38e43de7c 246 void clearScanResponse(void);
rgrover1 567:e4b38e43de7c 247
rgrover1 567:e4b38e43de7c 248 /**
rgrover1 567:e4b38e43de7c 249 * Start advertising (GAP Discoverable, Connectable modes, Broadcast
rgrover1 567:e4b38e43de7c 250 * Procedure).
rgrover1 567:e4b38e43de7c 251 */
rgrover1 567:e4b38e43de7c 252 ble_error_t startAdvertising(void);
rgrover1 567:e4b38e43de7c 253
rgrover1 567:e4b38e43de7c 254 /**
rgrover1 567:e4b38e43de7c 255 * Stop advertising (GAP Discoverable, Connectable modes, Broadcast
rgrover1 567:e4b38e43de7c 256 * Procedure).
rgrover1 567:e4b38e43de7c 257 */
rgrover1 567:e4b38e43de7c 258 ble_error_t stopAdvertising(void);
rgrover1 567:e4b38e43de7c 259
rgrover1 567:e4b38e43de7c 260 /**
rgrover1 567:e4b38e43de7c 261 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 567:e4b38e43de7c 262 * @param interval Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 567:e4b38e43de7c 263 * @param window Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 567:e4b38e43de7c 264 * @param timeout Scan timeout (in seconds) between 0x0001 and 0xFFFF, 0x0000 disables timeout.
rgrover1 567:e4b38e43de7c 265 * @param activeScanning Set to True if active-scanning is required. This is used to fetch the
rgrover1 567:e4b38e43de7c 266 * scan response from a peer if possible.
rgrover1 567:e4b38e43de7c 267 *
rgrover1 567:e4b38e43de7c 268 * The scanning window divided by the interval determines the duty cycle for
rgrover1 567:e4b38e43de7c 269 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 567:e4b38e43de7c 270 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 567:e4b38e43de7c 271 * to have the interval and window set to the same value. In this case,
rgrover1 567:e4b38e43de7c 272 * scanning is continuous, with a change of scanning frequency once every
rgrover1 567:e4b38e43de7c 273 * interval.
rgrover1 567:e4b38e43de7c 274 *
rgrover1 567:e4b38e43de7c 275 * Once the scanning parameters have been configured, scanning can be
rgrover1 567:e4b38e43de7c 276 * enabled by using startScan().
rgrover1 567:e4b38e43de7c 277 *
rgrover1 567:e4b38e43de7c 278 * @Note: The scan interval and window are recommendations to the BLE stack.
rgrover1 567:e4b38e43de7c 279 */
rgrover1 567:e4b38e43de7c 280 ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
rgrover1 567:e4b38e43de7c 281 uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
rgrover1 567:e4b38e43de7c 282 uint16_t timeout = 0,
rgrover1 567:e4b38e43de7c 283 bool activeScanning = false);
rgrover1 567:e4b38e43de7c 284 ble_error_t setScanInterval(uint16_t interval);
rgrover1 567:e4b38e43de7c 285 ble_error_t setScanWindow (uint16_t window);
rgrover1 567:e4b38e43de7c 286 ble_error_t setScanTimeout (uint16_t timeout);
rgrover1 567:e4b38e43de7c 287 void setActiveScan (bool activeScanning);
rgrover1 567:e4b38e43de7c 288
rgrover1 567:e4b38e43de7c 289 /**
rgrover1 567:e4b38e43de7c 290 * Start scanning (Observer Procedure) based on the scan-params currently
rgrover1 567:e4b38e43de7c 291 * in effect.
rgrover1 567:e4b38e43de7c 292 *
rgrover1 567:e4b38e43de7c 293 * @param callback The application callback to be invoked upon receiving
rgrover1 567:e4b38e43de7c 294 * every advertisement report. Can be passed in as NULL, in which case
rgrover1 567:e4b38e43de7c 295 * scanning may not be enabled at all.
rgrover1 567:e4b38e43de7c 296 */
rgrover1 567:e4b38e43de7c 297 ble_error_t startScan(void (*callback)(const Gap::AdvertisementCallbackParams_t *params));
rgrover1 567:e4b38e43de7c 298
rgrover1 567:e4b38e43de7c 299 /**
rgrover1 567:e4b38e43de7c 300 * Start scanning (Observer Procedure) based on the scan-params currently
rgrover1 567:e4b38e43de7c 301 * in effect.
rgrover1 567:e4b38e43de7c 302 *
rgrover1 567:e4b38e43de7c 303 * @param[in] object
rgrover1 567:e4b38e43de7c 304 * @param[in] callbackMember
rgrover1 567:e4b38e43de7c 305 * The above pair of parameters define the callback object
rgrover1 567:e4b38e43de7c 306 * and member function to receive the advertisement params.
rgrover1 567:e4b38e43de7c 307 */
rgrover1 567:e4b38e43de7c 308 template<typename T>
rgrover1 567:e4b38e43de7c 309 ble_error_t startScan(T *object, void (T::*memberCallback)(const Gap::AdvertisementCallbackParams_t *params));
rgrover1 567:e4b38e43de7c 310
rgrover1 567:e4b38e43de7c 311 /**
rgrover1 567:e4b38e43de7c 312 * Stop scanning. The current scanning parameters remain in effect.
rgrover1 567:e4b38e43de7c 313 *
rgrover1 567:e4b38e43de7c 314 * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
rgrover1 567:e4b38e43de7c 315 */
rgrover1 567:e4b38e43de7c 316 ble_error_t stopScan(void);
rgrover1 567:e4b38e43de7c 317
rgrover1 567:e4b38e43de7c 318 /**
rgrover1 567:e4b38e43de7c 319 * This call initiates the disconnection procedure, and its completion will
rgrover1 567:e4b38e43de7c 320 * be communicated to the application with an invocation of the
rgrover1 567:e4b38e43de7c 321 * onDisconnection callback.
rgrover1 567:e4b38e43de7c 322 *
rgrover1 567:e4b38e43de7c 323 * @param reason
rgrover1 567:e4b38e43de7c 324 * The reason for disconnection to be sent back to the peer.
rgrover1 567:e4b38e43de7c 325 */
rgrover1 567:e4b38e43de7c 326 ble_error_t disconnect(Gap::DisconnectionReason_t reason);
rgrover1 567:e4b38e43de7c 327
rgrover1 567:e4b38e43de7c 328 /* APIs to set GAP callbacks. */
rgrover1 567:e4b38e43de7c 329 void onTimeout(Gap::EventCallback_t timeoutCallback);
rgrover1 567:e4b38e43de7c 330
rgrover1 567:e4b38e43de7c 331 void onConnection(Gap::ConnectionEventCallback_t connectionCallback);
rgrover1 567:e4b38e43de7c 332 /**
rgrover1 567:e4b38e43de7c 333 * Used to setup a callback for GAP disconnection.
rgrover1 567:e4b38e43de7c 334 */
rgrover1 567:e4b38e43de7c 335 void onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback);
rgrover1 567:e4b38e43de7c 336
rgrover1 567:e4b38e43de7c 337 /**
rgrover1 567:e4b38e43de7c 338 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 567:e4b38e43de7c 339 * callbacks receive no context and are therefore different from the
rgrover1 567:e4b38e43de7c 340 * onDisconnection callback.
rgrover1 567:e4b38e43de7c 341 */
rgrover1 567:e4b38e43de7c 342 template<typename T>
rgrover1 567:e4b38e43de7c 343 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void));
rgrover1 567:e4b38e43de7c 344
rgrover1 567:e4b38e43de7c 345 /**
rgrover1 567:e4b38e43de7c 346 * Add a callback for the GATT event DATA_SENT (which is triggered when
rgrover1 567:e4b38e43de7c 347 * updates are sent out by GATT in the form of notifications).
rgrover1 567:e4b38e43de7c 348 *
rgrover1 567:e4b38e43de7c 349 * @Note: it is possible to chain together multiple onDataSent callbacks
rgrover1 567:e4b38e43de7c 350 * (potentially from different modules of an application) to receive updates
rgrover1 567:e4b38e43de7c 351 * to characteristics.
rgrover1 567:e4b38e43de7c 352 *
rgrover1 567:e4b38e43de7c 353 * @Note: it is also possible to setup a callback into a member function of
rgrover1 567:e4b38e43de7c 354 * some object.
rgrover1 567:e4b38e43de7c 355 */
rgrover1 567:e4b38e43de7c 356 void onDataSent(void (*callback)(unsigned count));
rgrover1 567:e4b38e43de7c 357 template <typename T> void onDataSent(T * objPtr, void (T::*memberPtr)(unsigned count));
rgrover1 567:e4b38e43de7c 358
rgrover1 567:e4b38e43de7c 359 /**
rgrover1 567:e4b38e43de7c 360 * Setup a callback for when a characteristic has its value updated by a
rgrover1 567:e4b38e43de7c 361 * client.
rgrover1 567:e4b38e43de7c 362 *
rgrover1 567:e4b38e43de7c 363 * @Note: it is possible to chain together multiple onDataWritten callbacks
rgrover1 567:e4b38e43de7c 364 * (potentially from different modules of an application) to receive updates
rgrover1 567:e4b38e43de7c 365 * to characteristics. Many services, such as DFU and UART add their own
rgrover1 567:e4b38e43de7c 366 * onDataWritten callbacks behind the scenes to trap interesting events.
rgrover1 567:e4b38e43de7c 367 *
rgrover1 567:e4b38e43de7c 368 * @Note: it is also possible to setup a callback into a member function of
rgrover1 567:e4b38e43de7c 369 * some object.
rgrover1 567:e4b38e43de7c 370 */
rgrover1 567:e4b38e43de7c 371 void onDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP));
rgrover1 567:e4b38e43de7c 372 template <typename T> void onDataWritten(T * objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context));
rgrover1 567:e4b38e43de7c 373
rgrover1 567:e4b38e43de7c 374 /**
rgrover1 567:e4b38e43de7c 375 * Setup a callback for when a characteristic is being read by a client.
rgrover1 567:e4b38e43de7c 376 *
rgrover1 567:e4b38e43de7c 377 * @Note: this functionality may not be available on all underlying stacks.
rgrover1 567:e4b38e43de7c 378 * You could use GattCharacteristic::setReadAuthorizationCallback() as an
rgrover1 567:e4b38e43de7c 379 * alternative.
rgrover1 567:e4b38e43de7c 380 *
rgrover1 567:e4b38e43de7c 381 * @Note: it is possible to chain together multiple onDataRead callbacks
rgrover1 567:e4b38e43de7c 382 * (potentially from different modules of an application) to receive updates
rgrover1 567:e4b38e43de7c 383 * to characteristics. Services may add their own onDataRead callbacks
rgrover1 567:e4b38e43de7c 384 * behind the scenes to trap interesting events.
rgrover1 567:e4b38e43de7c 385 *
rgrover1 567:e4b38e43de7c 386 * @Note: it is also possible to setup a callback into a member function of
rgrover1 567:e4b38e43de7c 387 * some object.
rgrover1 567:e4b38e43de7c 388 *
rgrover1 567:e4b38e43de7c 389 * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
rgrover1 567:e4b38e43de7c 390 * else BLE_ERROR_NONE.
rgrover1 567:e4b38e43de7c 391 */
rgrover1 567:e4b38e43de7c 392 ble_error_t onDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP));
rgrover1 567:e4b38e43de7c 393 template <typename T> ble_error_t onDataRead(T * objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context));
rgrover1 567:e4b38e43de7c 394
rgrover1 567:e4b38e43de7c 395 void onUpdatesEnabled(GattServer::EventCallback_t callback);
rgrover1 567:e4b38e43de7c 396 void onUpdatesDisabled(GattServer::EventCallback_t callback);
rgrover1 567:e4b38e43de7c 397 void onConfirmationReceived(GattServer::EventCallback_t callback);
rgrover1 567:e4b38e43de7c 398
rgrover1 567:e4b38e43de7c 399 /**
rgrover1 567:e4b38e43de7c 400 * Radio Notification is a feature that enables ACTIVE and INACTIVE
rgrover1 567:e4b38e43de7c 401 * (nACTIVE) signals from the stack that notify the application when the
rgrover1 567:e4b38e43de7c 402 * radio is in use. The signal is sent using software interrupt.
rgrover1 567:e4b38e43de7c 403 *
rgrover1 567:e4b38e43de7c 404 * The ACTIVE signal is sent before the Radio Event starts. The nACTIVE
rgrover1 567:e4b38e43de7c 405 * signal is sent at the end of the Radio Event. These signals can be used
rgrover1 567:e4b38e43de7c 406 * by the application programmer to synchronize application logic with radio
rgrover1 567:e4b38e43de7c 407 * activity. For example, the ACTIVE signal can be used to shut off external
rgrover1 567:e4b38e43de7c 408 * devices to manage peak current drawn during periods when the radio is on,
rgrover1 567:e4b38e43de7c 409 * or to trigger sensor data collection for transmission in the Radio Event.
rgrover1 567:e4b38e43de7c 410 *
rgrover1 567:e4b38e43de7c 411 * @param callback
rgrover1 567:e4b38e43de7c 412 * The application handler to be invoked in response to a radio
rgrover1 567:e4b38e43de7c 413 * ACTIVE/INACTIVE event.
rgrover1 567:e4b38e43de7c 414 */
rgrover1 567:e4b38e43de7c 415 void onRadioNotification(Gap::RadioNotificationEventCallback_t callback);
rgrover1 567:e4b38e43de7c 416
rgrover1 567:e4b38e43de7c 417 /**
rgrover1 567:e4b38e43de7c 418 * Add a service declaration to the local server ATT table. Also add the
rgrover1 567:e4b38e43de7c 419 * characteristics contained within.
rgrover1 567:e4b38e43de7c 420 */
rgrover1 567:e4b38e43de7c 421 ble_error_t addService(GattService &service);
rgrover1 567:e4b38e43de7c 422
rgrover1 567:e4b38e43de7c 423 /**
rgrover1 567:e4b38e43de7c 424 * Returns the current GAP state of the device using a bitmask which
rgrover1 567:e4b38e43de7c 425 * describes whether the device is advertising and/or connected.
rgrover1 567:e4b38e43de7c 426 */
rgrover1 567:e4b38e43de7c 427 Gap::GapState_t getGapState(void) const;
rgrover1 567:e4b38e43de7c 428
rgrover1 567:e4b38e43de7c 429 /**
rgrover1 567:e4b38e43de7c 430 * @param[in/out] lengthP
rgrover1 567:e4b38e43de7c 431 * input: Length in bytes to be read,
rgrover1 567:e4b38e43de7c 432 * output: Total length of attribute value upon successful return.
rgrover1 567:e4b38e43de7c 433 */
rgrover1 567:e4b38e43de7c 434 ble_error_t readCharacteristicValue(GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP);
rgrover1 567:e4b38e43de7c 435 /**
rgrover1 567:e4b38e43de7c 436 * A version of the same as above with connection handle parameter to allow fetches for connection-specific multivalued attribtues (such as the CCCDs).
rgrover1 567:e4b38e43de7c 437 */
rgrover1 567:e4b38e43de7c 438 ble_error_t readCharacteristicValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP);
rgrover1 567:e4b38e43de7c 439
rgrover1 567:e4b38e43de7c 440 /**
rgrover1 567:e4b38e43de7c 441 * @param localOnly
rgrover1 567:e4b38e43de7c 442 * Only update the characteristic locally regardless of notify/indicate flags in the CCCD.
rgrover1 567:e4b38e43de7c 443 */
rgrover1 567:e4b38e43de7c 444 ble_error_t updateCharacteristicValue(GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false);
rgrover1 567:e4b38e43de7c 445 /**
rgrover1 567:e4b38e43de7c 446 * A version of the same as above with connection handle parameter to allow updates for connection-specific multivalued attribtues (such as the CCCDs).
rgrover1 567:e4b38e43de7c 447 */
rgrover1 567:e4b38e43de7c 448 ble_error_t updateCharacteristicValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly = false);
rgrover1 567:e4b38e43de7c 449
rgrover1 567:e4b38e43de7c 450 /**
rgrover1 567:e4b38e43de7c 451 * Yield control to the BLE stack or to other tasks waiting for events. This
rgrover1 567:e4b38e43de7c 452 * is a sleep function which will return when there is an application
rgrover1 567:e4b38e43de7c 453 * specific interrupt, but the MCU might wake up several times before
rgrover1 567:e4b38e43de7c 454 * returning (to service the stack). This is not always interchangeable with
rgrover1 567:e4b38e43de7c 455 * WFE().
rgrover1 567:e4b38e43de7c 456 */
rgrover1 567:e4b38e43de7c 457 void waitForEvent(void);
rgrover1 567:e4b38e43de7c 458
rgrover1 567:e4b38e43de7c 459 ble_error_t getPreferredConnectionParams(Gap::ConnectionParams_t *params);
rgrover1 567:e4b38e43de7c 460 ble_error_t setPreferredConnectionParams(const Gap::ConnectionParams_t *params);
rgrover1 567:e4b38e43de7c 461 ble_error_t updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params);
rgrover1 567:e4b38e43de7c 462
rgrover1 567:e4b38e43de7c 463 /**
rgrover1 567:e4b38e43de7c 464 * This call allows the application to get the BLE stack version information.
rgrover1 567:e4b38e43de7c 465 *
rgrover1 567:e4b38e43de7c 466 * @return A pointer to a const string representing the version.
rgrover1 567:e4b38e43de7c 467 * Note: The string is owned by the BLE_API.
rgrover1 567:e4b38e43de7c 468 */
rgrover1 567:e4b38e43de7c 469 const char *getVersion(void);
rgrover1 567:e4b38e43de7c 470
rgrover1 567:e4b38e43de7c 471 /**
rgrover1 567:e4b38e43de7c 472 * Set the device name characteristic in the GAP service.
rgrover1 567:e4b38e43de7c 473 * @param deviceName The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
rgrover1 567:e4b38e43de7c 474 */
rgrover1 567:e4b38e43de7c 475 ble_error_t setDeviceName(const uint8_t *deviceName);
rgrover1 567:e4b38e43de7c 476
rgrover1 567:e4b38e43de7c 477 /**
rgrover1 567:e4b38e43de7c 478 * Get the value of the device name characteristic in the GAP service.
rgrover1 567:e4b38e43de7c 479 * @param[out] deviceName Pointer to an empty buffer where the UTF-8 *non NULL-
rgrover1 567:e4b38e43de7c 480 * terminated* string will be placed. Set this
rgrover1 567:e4b38e43de7c 481 * value to NULL in order to obtain the deviceName-length
rgrover1 567:e4b38e43de7c 482 * from the 'length' parameter.
rgrover1 567:e4b38e43de7c 483 *
rgrover1 567:e4b38e43de7c 484 * @param[in/out] lengthP (on input) Length of the buffer pointed to by deviceName;
rgrover1 567:e4b38e43de7c 485 * (on output) the complete device name length (without the
rgrover1 567:e4b38e43de7c 486 * null terminator).
rgrover1 567:e4b38e43de7c 487 *
rgrover1 567:e4b38e43de7c 488 * @note If the device name is longer than the size of the supplied buffer,
rgrover1 567:e4b38e43de7c 489 * length will return the complete device name length,
rgrover1 567:e4b38e43de7c 490 * and not the number of bytes actually returned in deviceName.
rgrover1 567:e4b38e43de7c 491 * The application may use this information to retry with a suitable buffer size.
rgrover1 567:e4b38e43de7c 492 *
rgrover1 567:e4b38e43de7c 493 * Sample use:
rgrover1 567:e4b38e43de7c 494 * uint8_t deviceName[20];
rgrover1 567:e4b38e43de7c 495 * unsigned length = sizeof(deviceName);
rgrover1 567:e4b38e43de7c 496 * ble.getDeviceName(deviceName, &length);
rgrover1 567:e4b38e43de7c 497 * if (length < sizeof(deviceName)) {
rgrover1 567:e4b38e43de7c 498 * deviceName[length] = 0;
rgrover1 567:e4b38e43de7c 499 * }
rgrover1 567:e4b38e43de7c 500 * DEBUG("length: %u, deviceName: %s\r\n", length, deviceName);
rgrover1 567:e4b38e43de7c 501 */
rgrover1 567:e4b38e43de7c 502 ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP);
rgrover1 567:e4b38e43de7c 503
rgrover1 567:e4b38e43de7c 504 /**
rgrover1 567:e4b38e43de7c 505 * Set the appearance characteristic in the GAP service.
rgrover1 567:e4b38e43de7c 506 * @param[in] appearance The new value for the device-appearance.
rgrover1 567:e4b38e43de7c 507 */
rgrover1 567:e4b38e43de7c 508 ble_error_t setAppearance(uint16_t appearance);
rgrover1 567:e4b38e43de7c 509
rgrover1 567:e4b38e43de7c 510 /**
rgrover1 567:e4b38e43de7c 511 * Set the appearance characteristic in the GAP service.
rgrover1 567:e4b38e43de7c 512 * @param[out] appearance The new value for the device-appearance.
rgrover1 567:e4b38e43de7c 513 */
rgrover1 567:e4b38e43de7c 514 ble_error_t getAppearance(uint16_t *appearanceP);
rgrover1 567:e4b38e43de7c 515
rgrover1 567:e4b38e43de7c 516 /**
rgrover1 567:e4b38e43de7c 517 * Set the radio's transmit power.
rgrover1 567:e4b38e43de7c 518 * @param[in] txPower Radio transmit power in dBm.
rgrover1 567:e4b38e43de7c 519 */
rgrover1 567:e4b38e43de7c 520 ble_error_t setTxPower(int8_t txPower);
rgrover1 567:e4b38e43de7c 521
rgrover1 567:e4b38e43de7c 522 /**
rgrover1 567:e4b38e43de7c 523 * Query the underlying stack for permitted arguments for setTxPower().
rgrover1 567:e4b38e43de7c 524 *
rgrover1 567:e4b38e43de7c 525 * @param[out] valueArrayPP
rgrover1 567:e4b38e43de7c 526 * Out parameter to receive the immutable array of Tx values.
rgrover1 567:e4b38e43de7c 527 * @param[out] countP
rgrover1 567:e4b38e43de7c 528 * Out parameter to receive the array's size.
rgrover1 567:e4b38e43de7c 529 */
rgrover1 567:e4b38e43de7c 530 void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP);
rgrover1 567:e4b38e43de7c 531
rgrover1 567:e4b38e43de7c 532 /**
rgrover1 567:e4b38e43de7c 533 * Enable the BLE stack's Security Manager. The Security Manager implements
rgrover1 567:e4b38e43de7c 534 * the actual cryptographic algorithms and protocol exchanges that allow two
rgrover1 567:e4b38e43de7c 535 * devices to securely exchange data and privately detect each other.
rgrover1 567:e4b38e43de7c 536 * Calling this API is a prerequisite for encryption and pairing (bonding).
rgrover1 567:e4b38e43de7c 537 *
rgrover1 567:e4b38e43de7c 538 * @param[in] enableBonding Allow for bonding.
rgrover1 567:e4b38e43de7c 539 * @param[in] requireMITM Require protection for man-in-the-middle attacks.
rgrover1 567:e4b38e43de7c 540 * @param[in] iocaps To specify IO capabilities of this peripheral,
rgrover1 567:e4b38e43de7c 541 * such as availability of a display or keyboard to
rgrover1 567:e4b38e43de7c 542 * support out-of-band exchanges of security data.
rgrover1 567:e4b38e43de7c 543 * @param[in] passkey To specify a static passkey.
rgrover1 567:e4b38e43de7c 544 *
rgrover1 567:e4b38e43de7c 545 * @return BLE_ERROR_NONE on success.
rgrover1 567:e4b38e43de7c 546 */
rgrover1 567:e4b38e43de7c 547 ble_error_t initializeSecurity(bool enableBonding = true,
rgrover1 567:e4b38e43de7c 548 bool requireMITM = true,
rgrover1 567:e4b38e43de7c 549 Gap::SecurityIOCapabilities_t iocaps = Gap::IO_CAPS_NONE,
rgrover1 567:e4b38e43de7c 550 const Gap::Passkey_t passkey = NULL);
rgrover1 567:e4b38e43de7c 551
rgrover1 567:e4b38e43de7c 552 /**
rgrover1 567:e4b38e43de7c 553 * Setup a callback for when the security setup procedure (key generation
rgrover1 567:e4b38e43de7c 554 * and exchange) for a link has started. This will be skipped for bonded
rgrover1 567:e4b38e43de7c 555 * devices. The callback is passed in parameters received from the peer's
rgrover1 567:e4b38e43de7c 556 * security request: bool allowBonding, bool requireMITM, and
rgrover1 567:e4b38e43de7c 557 * SecurityIOCapabilities_t.
rgrover1 567:e4b38e43de7c 558 */
rgrover1 567:e4b38e43de7c 559 void onSecuritySetupInitiated(Gap::SecuritySetupInitiatedCallback_t callback);
rgrover1 567:e4b38e43de7c 560
rgrover1 567:e4b38e43de7c 561 /**
rgrover1 567:e4b38e43de7c 562 * Setup a callback for when the security setup procedure (key generation
rgrover1 567:e4b38e43de7c 563 * and exchange) for a link has completed. This will be skipped for bonded
rgrover1 567:e4b38e43de7c 564 * devices. The callback is passed in the success/failure status of the
rgrover1 567:e4b38e43de7c 565 * security setup procedure.
rgrover1 567:e4b38e43de7c 566 */
rgrover1 567:e4b38e43de7c 567 void onSecuritySetupCompleted(Gap::SecuritySetupCompletedCallback_t callback);
rgrover1 567:e4b38e43de7c 568
rgrover1 567:e4b38e43de7c 569 /**
rgrover1 567:e4b38e43de7c 570 * Setup a callback for when a link with the peer is secured. For bonded
rgrover1 567:e4b38e43de7c 571 * devices, subsequent reconnections with bonded peer will result only in
rgrover1 567:e4b38e43de7c 572 * this callback when the link is secured and setup procedures will not
rgrover1 567:e4b38e43de7c 573 * occur unless the bonding information is either lost or deleted on either
rgrover1 567:e4b38e43de7c 574 * or both sides. The callback is passed in a Gap::SecurityMode_t according
rgrover1 567:e4b38e43de7c 575 * to the level of security in effect for the secured link.
rgrover1 567:e4b38e43de7c 576 */
rgrover1 567:e4b38e43de7c 577 void onLinkSecured(Gap::LinkSecuredCallback_t callback);
rgrover1 567:e4b38e43de7c 578
rgrover1 567:e4b38e43de7c 579 /**
rgrover1 567:e4b38e43de7c 580 * Setup a callback for successful bonding; i.e. that link-specific security
rgrover1 567:e4b38e43de7c 581 * context is stored persistently for a peer device.
rgrover1 567:e4b38e43de7c 582 */
rgrover1 567:e4b38e43de7c 583 void onSecurityContextStored(Gap::HandleSpecificEvent_t callback);
rgrover1 567:e4b38e43de7c 584
rgrover1 567:e4b38e43de7c 585 /**
rgrover1 567:e4b38e43de7c 586 * Setup a callback for when the passkey needs to be displayed on a
rgrover1 567:e4b38e43de7c 587 * peripheral with DISPLAY capability. This happens when security is
rgrover1 567:e4b38e43de7c 588 * configured to prevent Man-In-The-Middle attacks, and a PIN (or passkey)
rgrover1 567:e4b38e43de7c 589 * needs to be exchanged between the peers to authenticate the connection
rgrover1 567:e4b38e43de7c 590 * attempt.
rgrover1 567:e4b38e43de7c 591 */
rgrover1 567:e4b38e43de7c 592 void onPasskeyDisplay(Gap::PasskeyDisplayCallback_t callback);
rgrover1 567:e4b38e43de7c 593
rgrover1 567:e4b38e43de7c 594 /**
rgrover1 567:e4b38e43de7c 595 * Get the security status of a connection.
rgrover1 567:e4b38e43de7c 596 *
rgrover1 567:e4b38e43de7c 597 * @param[in] connectionHandle Handle to identify the connection.
rgrover1 567:e4b38e43de7c 598 * @param[out] securityStatusP security status.
rgrover1 567:e4b38e43de7c 599 *
rgrover1 567:e4b38e43de7c 600 * @return BLE_SUCCESS Or appropriate error code indicating reason for failure.
rgrover1 567:e4b38e43de7c 601 */
rgrover1 567:e4b38e43de7c 602 ble_error_t getLinkSecurity(Gap::Handle_t connectionHandle, Gap::LinkSecurityStatus_t *securityStatusP);
rgrover1 567:e4b38e43de7c 603
rgrover1 567:e4b38e43de7c 604 /**
rgrover1 567:e4b38e43de7c 605 * Delete all peer device context and all related bonding information from
rgrover1 567:e4b38e43de7c 606 * the database within the security manager.
rgrover1 567:e4b38e43de7c 607 *
rgrover1 567:e4b38e43de7c 608 * @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure.
rgrover1 567:e4b38e43de7c 609 * @retval BLE_ERROR_INVALID_STATE If the API is called without module initialization and/or
rgrover1 567:e4b38e43de7c 610 * application registration.
rgrover1 567:e4b38e43de7c 611 */
rgrover1 567:e4b38e43de7c 612 ble_error_t purgeAllBondingState(void);
rgrover1 567:e4b38e43de7c 613
rgrover1 567:e4b38e43de7c 614 public:
rgrover1 567:e4b38e43de7c 615 BLEDevice() : transport(createBLEDeviceInstance()), advParams(), advPayload(), scanResponse(), needToSetAdvPayload(true), scanningParams() {
rgrover1 567:e4b38e43de7c 616 advPayload.clear();
rgrover1 567:e4b38e43de7c 617 scanResponse.clear();
rgrover1 567:e4b38e43de7c 618 }
rgrover1 567:e4b38e43de7c 619
rgrover1 567:e4b38e43de7c 620 private:
rgrover1 567:e4b38e43de7c 621 BLEDeviceInstanceBase *const transport; /* the device specific backend */
rgrover1 567:e4b38e43de7c 622
rgrover1 567:e4b38e43de7c 623 GapAdvertisingParams advParams;
rgrover1 567:e4b38e43de7c 624 GapAdvertisingData advPayload;
rgrover1 567:e4b38e43de7c 625 GapAdvertisingData scanResponse;
rgrover1 567:e4b38e43de7c 626
rgrover1 567:e4b38e43de7c 627 /* Accumulation of AD structures in the advertisement payload should
rgrover1 567:e4b38e43de7c 628 * eventually result in a call to the target's setAdvertisingData() before
rgrover1 567:e4b38e43de7c 629 * the server begins advertising. This flag marks the status of the pending update.*/
rgrover1 567:e4b38e43de7c 630 bool needToSetAdvPayload;
rgrover1 567:e4b38e43de7c 631
rgrover1 567:e4b38e43de7c 632 GapScanningParams scanningParams;
rgrover1 567:e4b38e43de7c 633 };
rgrover1 567:e4b38e43de7c 634
rgrover1 567:e4b38e43de7c 635 /* BLEDevice methods. Most of these simply forward the calls to the underlying
rgrover1 567:e4b38e43de7c 636 * transport.*/
rgrover1 567:e4b38e43de7c 637
rgrover1 567:e4b38e43de7c 638 inline ble_error_t
rgrover1 567:e4b38e43de7c 639 BLEDevice::reset(void)
rgrover1 567:e4b38e43de7c 640 {
rgrover1 567:e4b38e43de7c 641 return transport->reset();
rgrover1 567:e4b38e43de7c 642 }
rgrover1 567:e4b38e43de7c 643
rgrover1 567:e4b38e43de7c 644 inline ble_error_t
rgrover1 567:e4b38e43de7c 645 BLEDevice::shutdown(void)
rgrover1 567:e4b38e43de7c 646 {
rgrover1 567:e4b38e43de7c 647 clearAdvertisingPayload();
rgrover1 567:e4b38e43de7c 648 return transport->shutdown();
rgrover1 567:e4b38e43de7c 649 }
rgrover1 567:e4b38e43de7c 650
rgrover1 567:e4b38e43de7c 651 inline ble_error_t
rgrover1 567:e4b38e43de7c 652 BLEDevice::setAddress(Gap::AddressType_t type, const Gap::Address_t address)
rgrover1 567:e4b38e43de7c 653 {
rgrover1 567:e4b38e43de7c 654 return transport->getGap().setAddress(type, address);
rgrover1 567:e4b38e43de7c 655 }
rgrover1 567:e4b38e43de7c 656
rgrover1 567:e4b38e43de7c 657 inline ble_error_t
rgrover1 567:e4b38e43de7c 658 BLEDevice::getAddress(Gap::AddressType_t *typeP, Gap::Address_t address)
rgrover1 567:e4b38e43de7c 659 {
rgrover1 567:e4b38e43de7c 660 return transport->getGap().getAddress(typeP, address);
rgrover1 567:e4b38e43de7c 661 }
rgrover1 567:e4b38e43de7c 662
rgrover1 567:e4b38e43de7c 663 inline void
rgrover1 567:e4b38e43de7c 664 BLEDevice::setAdvertisingType(GapAdvertisingParams::AdvertisingType advType)
rgrover1 567:e4b38e43de7c 665 {
rgrover1 567:e4b38e43de7c 666 advParams.setAdvertisingType(advType);
rgrover1 567:e4b38e43de7c 667 }
rgrover1 567:e4b38e43de7c 668
rgrover1 567:e4b38e43de7c 669 inline void
rgrover1 567:e4b38e43de7c 670 BLEDevice::setAdvertisingInterval(uint16_t interval)
rgrover1 567:e4b38e43de7c 671 {
rgrover1 567:e4b38e43de7c 672 if (interval == 0) {
rgrover1 567:e4b38e43de7c 673 stopAdvertising();
rgrover1 567:e4b38e43de7c 674 } else if (interval < getMinAdvertisingInterval()) {
rgrover1 567:e4b38e43de7c 675 interval = getMinAdvertisingInterval();
rgrover1 567:e4b38e43de7c 676 }
rgrover1 567:e4b38e43de7c 677 advParams.setInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(interval));
rgrover1 567:e4b38e43de7c 678 }
rgrover1 567:e4b38e43de7c 679
rgrover1 567:e4b38e43de7c 680 inline uint16_t
rgrover1 567:e4b38e43de7c 681 BLEDevice::getMinAdvertisingInterval(void) const {
rgrover1 567:e4b38e43de7c 682 return transport->getGap().getMinAdvertisingInterval();
rgrover1 567:e4b38e43de7c 683 }
rgrover1 567:e4b38e43de7c 684
rgrover1 567:e4b38e43de7c 685 inline uint16_t
rgrover1 567:e4b38e43de7c 686 BLEDevice::getMinNonConnectableAdvertisingInterval(void) const {
rgrover1 567:e4b38e43de7c 687 return transport->getGap().getMinNonConnectableAdvertisingInterval();
rgrover1 567:e4b38e43de7c 688 }
rgrover1 567:e4b38e43de7c 689
rgrover1 567:e4b38e43de7c 690 inline uint16_t
rgrover1 567:e4b38e43de7c 691 BLEDevice::getMaxAdvertisingInterval(void) const {
rgrover1 567:e4b38e43de7c 692 return transport->getGap().getMaxAdvertisingInterval();
rgrover1 567:e4b38e43de7c 693 }
rgrover1 567:e4b38e43de7c 694
rgrover1 567:e4b38e43de7c 695 inline void
rgrover1 567:e4b38e43de7c 696 BLEDevice::setAdvertisingTimeout(uint16_t timeout)
rgrover1 567:e4b38e43de7c 697 {
rgrover1 567:e4b38e43de7c 698 advParams.setTimeout(timeout);
rgrover1 567:e4b38e43de7c 699 }
rgrover1 567:e4b38e43de7c 700
rgrover1 567:e4b38e43de7c 701 inline void
rgrover1 567:e4b38e43de7c 702 BLEDevice::setAdvertisingParams(const GapAdvertisingParams &newAdvParams)
rgrover1 567:e4b38e43de7c 703 {
rgrover1 567:e4b38e43de7c 704 advParams = newAdvParams;
rgrover1 567:e4b38e43de7c 705 }
rgrover1 567:e4b38e43de7c 706
rgrover1 567:e4b38e43de7c 707 inline const GapAdvertisingParams &
rgrover1 567:e4b38e43de7c 708 BLEDevice::getAdvertisingParams(void) const
rgrover1 567:e4b38e43de7c 709 {
rgrover1 567:e4b38e43de7c 710 return advParams;
rgrover1 567:e4b38e43de7c 711 }
rgrover1 567:e4b38e43de7c 712
rgrover1 567:e4b38e43de7c 713 inline void
rgrover1 567:e4b38e43de7c 714 BLEDevice::clearAdvertisingPayload(void)
rgrover1 567:e4b38e43de7c 715 {
rgrover1 567:e4b38e43de7c 716 needToSetAdvPayload = true;
rgrover1 567:e4b38e43de7c 717 advPayload.clear();
rgrover1 567:e4b38e43de7c 718 }
rgrover1 567:e4b38e43de7c 719
rgrover1 567:e4b38e43de7c 720 inline ble_error_t
rgrover1 567:e4b38e43de7c 721 BLEDevice::accumulateAdvertisingPayload(uint8_t flags)
rgrover1 567:e4b38e43de7c 722 {
rgrover1 567:e4b38e43de7c 723 needToSetAdvPayload = true;
rgrover1 567:e4b38e43de7c 724 return advPayload.addFlags(flags);
rgrover1 567:e4b38e43de7c 725 }
rgrover1 567:e4b38e43de7c 726
rgrover1 567:e4b38e43de7c 727 inline ble_error_t
rgrover1 567:e4b38e43de7c 728 BLEDevice::accumulateAdvertisingPayload(GapAdvertisingData::Appearance app)
rgrover1 567:e4b38e43de7c 729 {
rgrover1 567:e4b38e43de7c 730 needToSetAdvPayload = true;
rgrover1 567:e4b38e43de7c 731 transport->getGap().setAppearance(app);
rgrover1 567:e4b38e43de7c 732 return advPayload.addAppearance(app);
rgrover1 567:e4b38e43de7c 733 }
rgrover1 567:e4b38e43de7c 734
rgrover1 567:e4b38e43de7c 735 inline ble_error_t
rgrover1 567:e4b38e43de7c 736 BLEDevice::accumulateAdvertisingPayloadTxPower(int8_t txPower)
rgrover1 567:e4b38e43de7c 737 {
rgrover1 567:e4b38e43de7c 738 needToSetAdvPayload = true;
rgrover1 567:e4b38e43de7c 739 return advPayload.addTxPower(txPower);
rgrover1 567:e4b38e43de7c 740 }
rgrover1 567:e4b38e43de7c 741
rgrover1 567:e4b38e43de7c 742 inline ble_error_t
rgrover1 567:e4b38e43de7c 743 BLEDevice::accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len)
rgrover1 567:e4b38e43de7c 744 {
rgrover1 567:e4b38e43de7c 745 needToSetAdvPayload = true;
rgrover1 567:e4b38e43de7c 746 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
rgrover1 567:e4b38e43de7c 747 transport->getGap().setDeviceName(data);
rgrover1 567:e4b38e43de7c 748 }
rgrover1 567:e4b38e43de7c 749 return advPayload.addData(type, data, len);
rgrover1 567:e4b38e43de7c 750 }
rgrover1 567:e4b38e43de7c 751
rgrover1 567:e4b38e43de7c 752 inline ble_error_t
rgrover1 567:e4b38e43de7c 753 BLEDevice::accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len)
rgrover1 567:e4b38e43de7c 754 {
rgrover1 567:e4b38e43de7c 755 needToSetAdvPayload = true;
rgrover1 567:e4b38e43de7c 756 return scanResponse.addData(type, data, len);
rgrover1 567:e4b38e43de7c 757 }
rgrover1 567:e4b38e43de7c 758
rgrover1 567:e4b38e43de7c 759 inline void
rgrover1 567:e4b38e43de7c 760 BLEDevice::clearScanResponse(void)
rgrover1 567:e4b38e43de7c 761 {
rgrover1 567:e4b38e43de7c 762 needToSetAdvPayload = true;
rgrover1 567:e4b38e43de7c 763 scanResponse.clear();
rgrover1 567:e4b38e43de7c 764 }
rgrover1 567:e4b38e43de7c 765
rgrover1 567:e4b38e43de7c 766 inline ble_error_t
rgrover1 567:e4b38e43de7c 767 BLEDevice::setAdvertisingPayload(void) {
rgrover1 567:e4b38e43de7c 768 needToSetAdvPayload = false;
rgrover1 567:e4b38e43de7c 769 return transport->getGap().setAdvertisingData(advPayload, scanResponse);
rgrover1 567:e4b38e43de7c 770 }
rgrover1 567:e4b38e43de7c 771
rgrover1 567:e4b38e43de7c 772 inline ble_error_t
rgrover1 567:e4b38e43de7c 773 BLEDevice::setAdvertisingData(const GapAdvertisingData& newPayload)
rgrover1 567:e4b38e43de7c 774 {
rgrover1 567:e4b38e43de7c 775 advPayload = newPayload;
rgrover1 567:e4b38e43de7c 776
rgrover1 567:e4b38e43de7c 777 return setAdvertisingPayload();
rgrover1 567:e4b38e43de7c 778 }
rgrover1 567:e4b38e43de7c 779
rgrover1 567:e4b38e43de7c 780 inline const GapAdvertisingData &
rgrover1 567:e4b38e43de7c 781 BLEDevice::getAdvertisingData(void) const {
rgrover1 567:e4b38e43de7c 782 return advPayload;
rgrover1 567:e4b38e43de7c 783 }
rgrover1 567:e4b38e43de7c 784
rgrover1 567:e4b38e43de7c 785 inline ble_error_t
rgrover1 567:e4b38e43de7c 786 BLEDevice::startAdvertising(void)
rgrover1 567:e4b38e43de7c 787 {
rgrover1 567:e4b38e43de7c 788 ble_error_t rc;
rgrover1 567:e4b38e43de7c 789 if ((rc = transport->getGattServer().initializeGATTDatabase()) != BLE_ERROR_NONE) {
rgrover1 567:e4b38e43de7c 790 return rc;
rgrover1 567:e4b38e43de7c 791 }
rgrover1 567:e4b38e43de7c 792 if (needToSetAdvPayload) {
rgrover1 567:e4b38e43de7c 793 if ((rc = setAdvertisingPayload()) != BLE_ERROR_NONE) {
rgrover1 567:e4b38e43de7c 794 return rc;
rgrover1 567:e4b38e43de7c 795 }
rgrover1 567:e4b38e43de7c 796 }
rgrover1 567:e4b38e43de7c 797
rgrover1 567:e4b38e43de7c 798 return transport->getGap().startAdvertising(advParams);
rgrover1 567:e4b38e43de7c 799 }
rgrover1 567:e4b38e43de7c 800
rgrover1 567:e4b38e43de7c 801 inline ble_error_t
rgrover1 567:e4b38e43de7c 802 BLEDevice::stopAdvertising(void)
rgrover1 567:e4b38e43de7c 803 {
rgrover1 567:e4b38e43de7c 804 return transport->getGap().stopAdvertising();
rgrover1 567:e4b38e43de7c 805 }
rgrover1 567:e4b38e43de7c 806
rgrover1 567:e4b38e43de7c 807 inline ble_error_t
rgrover1 567:e4b38e43de7c 808 BLEDevice::setScanParams(uint16_t interval, uint16_t window, uint16_t timeout, bool activeScanning) {
rgrover1 567:e4b38e43de7c 809 ble_error_t rc;
rgrover1 567:e4b38e43de7c 810 if (((rc = scanningParams.setInterval(interval)) == BLE_ERROR_NONE) &&
rgrover1 567:e4b38e43de7c 811 ((rc = scanningParams.setWindow(window)) == BLE_ERROR_NONE) &&
rgrover1 567:e4b38e43de7c 812 ((rc = scanningParams.setTimeout(timeout)) == BLE_ERROR_NONE)) {
rgrover1 567:e4b38e43de7c 813 scanningParams.setActiveScanning(activeScanning);
rgrover1 567:e4b38e43de7c 814 return BLE_ERROR_NONE;
rgrover1 567:e4b38e43de7c 815 }
rgrover1 567:e4b38e43de7c 816
rgrover1 567:e4b38e43de7c 817 return rc;
rgrover1 567:e4b38e43de7c 818 }
rgrover1 567:e4b38e43de7c 819
rgrover1 567:e4b38e43de7c 820 inline ble_error_t
rgrover1 567:e4b38e43de7c 821 BLEDevice::setScanInterval(uint16_t interval) {
rgrover1 567:e4b38e43de7c 822 return scanningParams.setInterval(interval);
rgrover1 567:e4b38e43de7c 823 }
rgrover1 567:e4b38e43de7c 824
rgrover1 567:e4b38e43de7c 825 inline ble_error_t
rgrover1 567:e4b38e43de7c 826 BLEDevice::setScanWindow(uint16_t window) {
rgrover1 567:e4b38e43de7c 827 return scanningParams.setWindow(window);
rgrover1 567:e4b38e43de7c 828 }
rgrover1 567:e4b38e43de7c 829
rgrover1 567:e4b38e43de7c 830 inline ble_error_t
rgrover1 567:e4b38e43de7c 831 BLEDevice::setScanTimeout(uint16_t timeout) {
rgrover1 567:e4b38e43de7c 832 return scanningParams.setTimeout(timeout);
rgrover1 567:e4b38e43de7c 833 }
rgrover1 567:e4b38e43de7c 834
rgrover1 567:e4b38e43de7c 835 inline void
rgrover1 567:e4b38e43de7c 836 BLEDevice::setActiveScan(bool activeScanning) {
rgrover1 567:e4b38e43de7c 837 return scanningParams.setActiveScanning(activeScanning);
rgrover1 567:e4b38e43de7c 838 }
rgrover1 567:e4b38e43de7c 839
rgrover1 567:e4b38e43de7c 840 inline ble_error_t
rgrover1 567:e4b38e43de7c 841 BLEDevice::startScan(void (*callback)(const Gap::AdvertisementCallbackParams_t *params)) {
rgrover1 567:e4b38e43de7c 842 return transport->getGap().startScan(scanningParams, callback);
rgrover1 567:e4b38e43de7c 843 }
rgrover1 567:e4b38e43de7c 844
rgrover1 567:e4b38e43de7c 845 template<typename T>
rgrover1 567:e4b38e43de7c 846 inline ble_error_t
rgrover1 567:e4b38e43de7c 847 BLEDevice::startScan(T *object, void (T::*memberCallback)(const Gap::AdvertisementCallbackParams_t *params)) {
rgrover1 567:e4b38e43de7c 848 return transport->getGap().startScan(scanningParams, object, memberCallback);
rgrover1 567:e4b38e43de7c 849 }
rgrover1 567:e4b38e43de7c 850
rgrover1 567:e4b38e43de7c 851 inline ble_error_t
rgrover1 567:e4b38e43de7c 852 BLEDevice::stopScan(void) {
rgrover1 567:e4b38e43de7c 853 return transport->getGap().stopScan();
rgrover1 567:e4b38e43de7c 854 }
rgrover1 567:e4b38e43de7c 855
rgrover1 567:e4b38e43de7c 856 inline ble_error_t
rgrover1 567:e4b38e43de7c 857 BLEDevice::disconnect(Gap::DisconnectionReason_t reason)
rgrover1 567:e4b38e43de7c 858 {
rgrover1 567:e4b38e43de7c 859 return transport->getGap().disconnect(reason);
rgrover1 567:e4b38e43de7c 860 }
rgrover1 567:e4b38e43de7c 861
rgrover1 567:e4b38e43de7c 862 inline void
rgrover1 567:e4b38e43de7c 863 BLEDevice::onTimeout(Gap::EventCallback_t timeoutCallback)
rgrover1 567:e4b38e43de7c 864 {
rgrover1 567:e4b38e43de7c 865 transport->getGap().setOnTimeout(timeoutCallback);
rgrover1 567:e4b38e43de7c 866 }
rgrover1 567:e4b38e43de7c 867
rgrover1 567:e4b38e43de7c 868 inline void
rgrover1 567:e4b38e43de7c 869 BLEDevice::onConnection(Gap::ConnectionEventCallback_t connectionCallback)
rgrover1 567:e4b38e43de7c 870 {
rgrover1 567:e4b38e43de7c 871 transport->getGap().setOnConnection(connectionCallback);
rgrover1 567:e4b38e43de7c 872 }
rgrover1 567:e4b38e43de7c 873
rgrover1 567:e4b38e43de7c 874 inline void
rgrover1 567:e4b38e43de7c 875 BLEDevice::onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback)
rgrover1 567:e4b38e43de7c 876 {
rgrover1 567:e4b38e43de7c 877 transport->getGap().setOnDisconnection(disconnectionCallback);
rgrover1 567:e4b38e43de7c 878 }
rgrover1 567:e4b38e43de7c 879
rgrover1 567:e4b38e43de7c 880 template<typename T>
rgrover1 567:e4b38e43de7c 881 inline void
rgrover1 567:e4b38e43de7c 882 BLEDevice::addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {
rgrover1 567:e4b38e43de7c 883 transport->getGap().addToDisconnectionCallChain(tptr, mptr);
rgrover1 567:e4b38e43de7c 884 }
rgrover1 567:e4b38e43de7c 885
rgrover1 567:e4b38e43de7c 886 inline void
rgrover1 567:e4b38e43de7c 887 BLEDevice::onDataSent(void (*callback)(unsigned count)) {
rgrover1 567:e4b38e43de7c 888 transport->getGattServer().setOnDataSent(callback);
rgrover1 567:e4b38e43de7c 889 }
rgrover1 567:e4b38e43de7c 890
rgrover1 567:e4b38e43de7c 891 template <typename T> inline void
rgrover1 567:e4b38e43de7c 892 BLEDevice::onDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
rgrover1 567:e4b38e43de7c 893 transport->getGattServer().setOnDataSent(objPtr, memberPtr);
rgrover1 567:e4b38e43de7c 894 }
rgrover1 567:e4b38e43de7c 895
rgrover1 567:e4b38e43de7c 896 inline void
rgrover1 567:e4b38e43de7c 897 BLEDevice::onDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP)) {
rgrover1 567:e4b38e43de7c 898 transport->getGattServer().setOnDataWritten(callback);
rgrover1 567:e4b38e43de7c 899 }
rgrover1 567:e4b38e43de7c 900
rgrover1 567:e4b38e43de7c 901 template <typename T> inline void
rgrover1 567:e4b38e43de7c 902 BLEDevice::onDataWritten(T *objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context)) {
rgrover1 567:e4b38e43de7c 903 transport->getGattServer().setOnDataWritten(objPtr, memberPtr);
rgrover1 567:e4b38e43de7c 904 }
rgrover1 567:e4b38e43de7c 905
rgrover1 567:e4b38e43de7c 906 inline ble_error_t
rgrover1 567:e4b38e43de7c 907 BLEDevice::onDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP)) {
rgrover1 567:e4b38e43de7c 908 return transport->getGattServer().setOnDataRead(callback);
rgrover1 567:e4b38e43de7c 909 }
rgrover1 567:e4b38e43de7c 910
rgrover1 567:e4b38e43de7c 911 template <typename T> inline ble_error_t
rgrover1 567:e4b38e43de7c 912 BLEDevice::onDataRead(T *objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context)) {
rgrover1 567:e4b38e43de7c 913 return transport->getGattServer().setOnDataRead(objPtr, memberPtr);
rgrover1 567:e4b38e43de7c 914 }
rgrover1 567:e4b38e43de7c 915
rgrover1 567:e4b38e43de7c 916 inline void
rgrover1 567:e4b38e43de7c 917 BLEDevice::onUpdatesEnabled(GattServer::EventCallback_t callback)
rgrover1 567:e4b38e43de7c 918 {
rgrover1 567:e4b38e43de7c 919 transport->getGattServer().setOnUpdatesEnabled(callback);
rgrover1 567:e4b38e43de7c 920 }
rgrover1 567:e4b38e43de7c 921
rgrover1 567:e4b38e43de7c 922 inline void
rgrover1 567:e4b38e43de7c 923 BLEDevice::onUpdatesDisabled(GattServer::EventCallback_t callback)
rgrover1 567:e4b38e43de7c 924 {
rgrover1 567:e4b38e43de7c 925 transport->getGattServer().setOnUpdatesDisabled(callback);
rgrover1 567:e4b38e43de7c 926 }
rgrover1 567:e4b38e43de7c 927
rgrover1 567:e4b38e43de7c 928 inline void
rgrover1 567:e4b38e43de7c 929 BLEDevice::onConfirmationReceived(GattServer::EventCallback_t callback)
rgrover1 567:e4b38e43de7c 930 {
rgrover1 567:e4b38e43de7c 931 transport->getGattServer().setOnConfirmationReceived(callback);
rgrover1 567:e4b38e43de7c 932 }
rgrover1 567:e4b38e43de7c 933
rgrover1 567:e4b38e43de7c 934 inline void
rgrover1 567:e4b38e43de7c 935 BLEDevice::onRadioNotification(Gap::RadioNotificationEventCallback_t callback)
rgrover1 567:e4b38e43de7c 936 {
rgrover1 567:e4b38e43de7c 937 transport->getGap().setOnRadioNotification(callback);
rgrover1 567:e4b38e43de7c 938 }
rgrover1 567:e4b38e43de7c 939
rgrover1 567:e4b38e43de7c 940 inline ble_error_t
rgrover1 567:e4b38e43de7c 941 BLEDevice::addService(GattService &service)
rgrover1 567:e4b38e43de7c 942 {
rgrover1 567:e4b38e43de7c 943 return transport->getGattServer().addService(service);
rgrover1 567:e4b38e43de7c 944 }
rgrover1 567:e4b38e43de7c 945
rgrover1 567:e4b38e43de7c 946 inline Gap::GapState_t
rgrover1 567:e4b38e43de7c 947 BLEDevice::getGapState(void) const
rgrover1 567:e4b38e43de7c 948 {
rgrover1 567:e4b38e43de7c 949 return transport->getGap().getState();
rgrover1 567:e4b38e43de7c 950 }
rgrover1 567:e4b38e43de7c 951
rgrover1 567:e4b38e43de7c 952 inline ble_error_t BLEDevice::readCharacteristicValue(GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP)
rgrover1 567:e4b38e43de7c 953 {
rgrover1 567:e4b38e43de7c 954 return transport->getGattServer().readValue(attributeHandle, buffer, lengthP);
rgrover1 567:e4b38e43de7c 955 }
rgrover1 567:e4b38e43de7c 956
rgrover1 567:e4b38e43de7c 957 inline ble_error_t BLEDevice::readCharacteristicValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP)
rgrover1 567:e4b38e43de7c 958 {
rgrover1 567:e4b38e43de7c 959 return transport->getGattServer().readValue(connectionHandle, attributeHandle, buffer, lengthP);
rgrover1 567:e4b38e43de7c 960 }
rgrover1 567:e4b38e43de7c 961
rgrover1 567:e4b38e43de7c 962 inline ble_error_t
rgrover1 567:e4b38e43de7c 963 BLEDevice::updateCharacteristicValue(GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly)
rgrover1 567:e4b38e43de7c 964 {
rgrover1 567:e4b38e43de7c 965 return transport->getGattServer().updateValue(attributeHandle, const_cast<uint8_t *>(value), size, localOnly);
rgrover1 567:e4b38e43de7c 966 }
rgrover1 567:e4b38e43de7c 967
rgrover1 567:e4b38e43de7c 968 inline ble_error_t
rgrover1 567:e4b38e43de7c 969 BLEDevice::updateCharacteristicValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly)
rgrover1 567:e4b38e43de7c 970 {
rgrover1 567:e4b38e43de7c 971 return transport->getGattServer().updateValue(connectionHandle, attributeHandle, const_cast<uint8_t *>(value), size, localOnly);
rgrover1 567:e4b38e43de7c 972 }
rgrover1 567:e4b38e43de7c 973
rgrover1 567:e4b38e43de7c 974 inline void
rgrover1 567:e4b38e43de7c 975 BLEDevice::waitForEvent(void)
rgrover1 567:e4b38e43de7c 976 {
rgrover1 567:e4b38e43de7c 977 transport->waitForEvent();
rgrover1 567:e4b38e43de7c 978 }
rgrover1 567:e4b38e43de7c 979
rgrover1 567:e4b38e43de7c 980 inline ble_error_t
rgrover1 567:e4b38e43de7c 981 BLEDevice::getPreferredConnectionParams(Gap::ConnectionParams_t *params)
rgrover1 567:e4b38e43de7c 982 {
rgrover1 567:e4b38e43de7c 983 return transport->getGap().getPreferredConnectionParams(params);
rgrover1 567:e4b38e43de7c 984 }
rgrover1 567:e4b38e43de7c 985
rgrover1 567:e4b38e43de7c 986 inline ble_error_t
rgrover1 567:e4b38e43de7c 987 BLEDevice::setPreferredConnectionParams(const Gap::ConnectionParams_t *params)
rgrover1 567:e4b38e43de7c 988 {
rgrover1 567:e4b38e43de7c 989 return transport->getGap().setPreferredConnectionParams(params);
rgrover1 567:e4b38e43de7c 990 }
rgrover1 567:e4b38e43de7c 991
rgrover1 567:e4b38e43de7c 992 inline ble_error_t
rgrover1 567:e4b38e43de7c 993 BLEDevice::updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) {
rgrover1 567:e4b38e43de7c 994 return transport->getGap().updateConnectionParams(handle, params);
rgrover1 567:e4b38e43de7c 995 }
rgrover1 567:e4b38e43de7c 996
rgrover1 567:e4b38e43de7c 997 inline const char *
rgrover1 567:e4b38e43de7c 998 BLEDevice::getVersion(void)
rgrover1 567:e4b38e43de7c 999 {
rgrover1 567:e4b38e43de7c 1000 return transport->getVersion();
rgrover1 567:e4b38e43de7c 1001 }
rgrover1 567:e4b38e43de7c 1002
rgrover1 567:e4b38e43de7c 1003 inline ble_error_t
rgrover1 567:e4b38e43de7c 1004 BLEDevice::setDeviceName(const uint8_t *deviceName)
rgrover1 567:e4b38e43de7c 1005 {
rgrover1 567:e4b38e43de7c 1006 return transport->getGap().setDeviceName(deviceName);
rgrover1 567:e4b38e43de7c 1007 }
rgrover1 567:e4b38e43de7c 1008
rgrover1 567:e4b38e43de7c 1009 inline ble_error_t
rgrover1 567:e4b38e43de7c 1010 BLEDevice::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
rgrover1 567:e4b38e43de7c 1011 {
rgrover1 567:e4b38e43de7c 1012 return transport->getGap().getDeviceName(deviceName, lengthP);
rgrover1 567:e4b38e43de7c 1013 }
rgrover1 567:e4b38e43de7c 1014
rgrover1 567:e4b38e43de7c 1015 inline ble_error_t
rgrover1 567:e4b38e43de7c 1016 BLEDevice::setAppearance(uint16_t appearance)
rgrover1 567:e4b38e43de7c 1017 {
rgrover1 567:e4b38e43de7c 1018 return transport->getGap().setAppearance(appearance);
rgrover1 567:e4b38e43de7c 1019 }
rgrover1 567:e4b38e43de7c 1020
rgrover1 567:e4b38e43de7c 1021 inline ble_error_t
rgrover1 567:e4b38e43de7c 1022 BLEDevice::getAppearance(uint16_t *appearanceP)
rgrover1 567:e4b38e43de7c 1023 {
rgrover1 567:e4b38e43de7c 1024 return transport->getGap().getAppearance(appearanceP);
rgrover1 567:e4b38e43de7c 1025 }
rgrover1 567:e4b38e43de7c 1026
rgrover1 567:e4b38e43de7c 1027 inline ble_error_t
rgrover1 567:e4b38e43de7c 1028 BLEDevice::setTxPower(int8_t txPower)
rgrover1 567:e4b38e43de7c 1029 {
rgrover1 567:e4b38e43de7c 1030 return transport->setTxPower(txPower);
rgrover1 567:e4b38e43de7c 1031 }
rgrover1 567:e4b38e43de7c 1032
rgrover1 567:e4b38e43de7c 1033 inline void
rgrover1 567:e4b38e43de7c 1034 BLEDevice::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP)
rgrover1 567:e4b38e43de7c 1035 {
rgrover1 567:e4b38e43de7c 1036 transport->getPermittedTxPowerValues(valueArrayPP, countP);
rgrover1 567:e4b38e43de7c 1037 }
rgrover1 567:e4b38e43de7c 1038
rgrover1 567:e4b38e43de7c 1039 inline ble_error_t
rgrover1 567:e4b38e43de7c 1040 BLEDevice::initializeSecurity(bool enableBonding,
rgrover1 567:e4b38e43de7c 1041 bool requireMITM,
rgrover1 567:e4b38e43de7c 1042 Gap::SecurityIOCapabilities_t iocaps,
rgrover1 567:e4b38e43de7c 1043 const Gap::Passkey_t passkey)
rgrover1 567:e4b38e43de7c 1044 {
rgrover1 567:e4b38e43de7c 1045 return transport->initializeSecurity(enableBonding, requireMITM, iocaps, passkey);
rgrover1 567:e4b38e43de7c 1046 }
rgrover1 567:e4b38e43de7c 1047
rgrover1 567:e4b38e43de7c 1048 inline void
rgrover1 567:e4b38e43de7c 1049 BLEDevice::onSecuritySetupInitiated(Gap::SecuritySetupInitiatedCallback_t callback)
rgrover1 567:e4b38e43de7c 1050 {
rgrover1 567:e4b38e43de7c 1051 transport->getGap().setOnSecuritySetupInitiated(callback);
rgrover1 567:e4b38e43de7c 1052 }
rgrover1 567:e4b38e43de7c 1053
rgrover1 567:e4b38e43de7c 1054 inline void
rgrover1 567:e4b38e43de7c 1055 BLEDevice::onSecuritySetupCompleted(Gap::SecuritySetupCompletedCallback_t callback)
rgrover1 567:e4b38e43de7c 1056 {
rgrover1 567:e4b38e43de7c 1057 transport->getGap().setOnSecuritySetupCompleted(callback);
rgrover1 567:e4b38e43de7c 1058 }
rgrover1 567:e4b38e43de7c 1059
rgrover1 567:e4b38e43de7c 1060 inline void
rgrover1 567:e4b38e43de7c 1061 BLEDevice::onLinkSecured(Gap::LinkSecuredCallback_t callback)
rgrover1 567:e4b38e43de7c 1062 {
rgrover1 567:e4b38e43de7c 1063 transport->getGap().setOnLinkSecured(callback);
rgrover1 567:e4b38e43de7c 1064 }
rgrover1 567:e4b38e43de7c 1065
rgrover1 567:e4b38e43de7c 1066 inline void
rgrover1 567:e4b38e43de7c 1067 BLEDevice::onSecurityContextStored(Gap::HandleSpecificEvent_t callback)
rgrover1 567:e4b38e43de7c 1068 {
rgrover1 567:e4b38e43de7c 1069 transport->getGap().setOnSecurityContextStored(callback);
rgrover1 567:e4b38e43de7c 1070 }
rgrover1 567:e4b38e43de7c 1071
rgrover1 567:e4b38e43de7c 1072 inline void
rgrover1 567:e4b38e43de7c 1073 BLEDevice::onPasskeyDisplay(Gap::PasskeyDisplayCallback_t callback)
rgrover1 567:e4b38e43de7c 1074 {
rgrover1 567:e4b38e43de7c 1075 return transport->getGap().setOnPasskeyDisplay(callback);
rgrover1 567:e4b38e43de7c 1076 }
rgrover1 567:e4b38e43de7c 1077
rgrover1 567:e4b38e43de7c 1078 inline ble_error_t
rgrover1 567:e4b38e43de7c 1079 BLEDevice::getLinkSecurity(Gap::Handle_t connectionHandle, Gap::LinkSecurityStatus_t *securityStatusP)
rgrover1 567:e4b38e43de7c 1080 {
rgrover1 567:e4b38e43de7c 1081 return transport->getGap().getLinkSecurity(connectionHandle, securityStatusP);
rgrover1 567:e4b38e43de7c 1082 }
rgrover1 567:e4b38e43de7c 1083
rgrover1 567:e4b38e43de7c 1084 inline ble_error_t
rgrover1 567:e4b38e43de7c 1085 BLEDevice::purgeAllBondingState(void)
rgrover1 567:e4b38e43de7c 1086 {
rgrover1 567:e4b38e43de7c 1087 return transport->getGap().purgeAllBondingState();
rgrover1 567:e4b38e43de7c 1088 }
rgrover1 567:e4b38e43de7c 1089
rgrover1 567:e4b38e43de7c 1090 #endif // ifndef __BLE_DEVICE__