BLE_API_Tiny_BLE

Dependents:   CSSE4011_BLE_IMU

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Mon Mar 23 16:28:09 2015 +0000
Revision:
325:501ad8b8bbe5
Parent:
305:71367f7cd078
Child:
328:1fd12f67ed7a
Synchronized with git rev c7a2b9bb
Author: Rohit Grover
Release 0.3.0
==============

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

* BLEDevice::setAdvertisingInterval() uses milliseconds as the unit for its
argument. If advertising interval is set to 0, advertising is stopped. If
advertising interval is smaller than the minimum value supported, then the
minimum value is used instead.

* Add an enumeration called GattCharacteristicAuthCBReply_t to capture a
status code from read/write authorization callback. Previously it used to
return only a bool.

* Add APIs for getMinAdvertisingInterval() and variants.

Bugfixes
~~~~~~~~

* URIBeaconConfigService uses better write-authorization filters. It now
passes tests defined in Google's validator app.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 257:7a50601356cc 1 /* mbed Microcontroller Library
rgrover1 257:7a50601356cc 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 257:7a50601356cc 3 *
rgrover1 257:7a50601356cc 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 257:7a50601356cc 5 * you may not use this file except in compliance with the License.
rgrover1 257:7a50601356cc 6 * You may obtain a copy of the License at
rgrover1 257:7a50601356cc 7 *
rgrover1 257:7a50601356cc 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 257:7a50601356cc 9 *
rgrover1 257:7a50601356cc 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 257:7a50601356cc 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 257:7a50601356cc 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 257:7a50601356cc 13 * See the License for the specific language governing permissions and
rgrover1 257:7a50601356cc 14 * limitations under the License.
rgrover1 257:7a50601356cc 15 */
rgrover1 257:7a50601356cc 16
rgrover1 257:7a50601356cc 17 #ifndef __BLE_DEVICE__
rgrover1 257:7a50601356cc 18 #define __BLE_DEVICE__
rgrover1 257:7a50601356cc 19
rgrover1 257:7a50601356cc 20 #include "blecommon.h"
rgrover1 257:7a50601356cc 21 #include "Gap.h"
rgrover1 257:7a50601356cc 22 #include "GattServer.h"
rgrover1 257:7a50601356cc 23 #include "BLEDeviceInstanceBase.h"
rgrover1 257:7a50601356cc 24
rgrover1 257:7a50601356cc 25 /**
rgrover1 257:7a50601356cc 26 * The base class used to abstract away BLE capable radio transceivers or SOCs,
rgrover1 257:7a50601356cc 27 * to enable this BLE API to work with any radio transparently.
rgrover1 257:7a50601356cc 28 */
rgrover1 257:7a50601356cc 29 class BLEDevice
rgrover1 257:7a50601356cc 30 {
rgrover1 257:7a50601356cc 31 public:
rgrover1 257:7a50601356cc 32 /**
rgrover1 257:7a50601356cc 33 * Initialize the BLE controller. This should be called before using
rgrover1 257:7a50601356cc 34 * anything else in the BLE_API.
rgrover1 257:7a50601356cc 35 */
rgrover1 257:7a50601356cc 36 ble_error_t init();
rgrover1 257:7a50601356cc 37 ble_error_t reset(void);
rgrover1 257:7a50601356cc 38
rgrover1 257:7a50601356cc 39 /**
rgrover1 257:7a50601356cc 40 * Purge the BLE stack of GATT and GAP state. init() must be called afterwards to re-instate services and GAP state.
rgrover1 257:7a50601356cc 41 */
rgrover1 257:7a50601356cc 42 ble_error_t shutdown(void);
rgrover1 257:7a50601356cc 43
rgrover1 257:7a50601356cc 44 /* GAP specific APIs */
rgrover1 257:7a50601356cc 45 public:
rgrover1 257:7a50601356cc 46 /**
rgrover1 257:7a50601356cc 47 * Set the BTLE MAC address and type.
rgrover1 257:7a50601356cc 48 * @return BLE_ERROR_NONE on success.
rgrover1 257:7a50601356cc 49 */
rgrover1 257:7a50601356cc 50 ble_error_t setAddress(Gap::addr_type_t type, const Gap::address_t address);
rgrover1 257:7a50601356cc 51
rgrover1 257:7a50601356cc 52 /**
rgrover1 257:7a50601356cc 53 * Fetch the BTLE MAC address and type.
rgrover1 257:7a50601356cc 54 * @return BLE_ERROR_NONE on success.
rgrover1 257:7a50601356cc 55 */
rgrover1 257:7a50601356cc 56 ble_error_t getAddress(Gap::addr_type_t *typeP, Gap::address_t address);
rgrover1 257:7a50601356cc 57
rgrover1 257:7a50601356cc 58 /**
rgrover1 257:7a50601356cc 59 * @param[in] advType
rgrover1 257:7a50601356cc 60 * The GAP advertising mode to use for this device. Valid
rgrover1 257:7a50601356cc 61 * values are defined in AdvertisingType:
rgrover1 257:7a50601356cc 62 *
rgrover1 257:7a50601356cc 63 * \par ADV_NON_CONNECTABLE_UNDIRECTED
rgrover1 257:7a50601356cc 64 * All connections to the peripheral device will be refused.
rgrover1 257:7a50601356cc 65 *
rgrover1 257:7a50601356cc 66 * \par ADV_CONNECTABLE_DIRECTED
rgrover1 257:7a50601356cc 67 * Only connections from a pre-defined central device will be
rgrover1 257:7a50601356cc 68 * accepted.
rgrover1 257:7a50601356cc 69 *
rgrover1 257:7a50601356cc 70 * \par ADV_CONNECTABLE_UNDIRECTED
rgrover1 257:7a50601356cc 71 * Any central device can connect to this peripheral.
rgrover1 257:7a50601356cc 72 *
rgrover1 257:7a50601356cc 73 * \par ADV_SCANNABLE_UNDIRECTED
rgrover1 300:d9a39f759a6a 74 * Include support for Scan Response payloads.
rgrover1 257:7a50601356cc 75 *
rgrover1 257:7a50601356cc 76 * \par
rgrover1 257:7a50601356cc 77 * See Bluetooth Core Specification 4.0 (Vol. 3), Part C,
rgrover1 257:7a50601356cc 78 * Section 9.3 and Core Specification 4.0 (Vol. 6), Part B,
rgrover1 257:7a50601356cc 79 * Section 2.3.1 for further information on GAP connection
rgrover1 257:7a50601356cc 80 * modes
rgrover1 257:7a50601356cc 81 */
rgrover1 257:7a50601356cc 82 void setAdvertisingType(GapAdvertisingParams::AdvertisingType);
rgrover1 257:7a50601356cc 83
rgrover1 257:7a50601356cc 84 /**
rgrover1 257:7a50601356cc 85 * @param[in] interval
rgrover1 325:501ad8b8bbe5 86 * Advertising interval in units of milliseconds. Advertising
rgrover1 325:501ad8b8bbe5 87 * is disabled if interval is 0. If interval is smaller than
rgrover1 325:501ad8b8bbe5 88 * the minimum supported value, then the minimum supported
rgrover1 325:501ad8b8bbe5 89 * value is used instead.
rgrover1 257:7a50601356cc 90 *
rgrover1 257:7a50601356cc 91 * \par
rgrover1 257:7a50601356cc 92 * Decreasing this value will allow central devices to detect
rgrover1 257:7a50601356cc 93 * your peripheral faster at the expense of more power being
rgrover1 257:7a50601356cc 94 * used by the radio due to the higher data transmit rate.
rgrover1 257:7a50601356cc 95 *
rgrover1 257:7a50601356cc 96 * \par
rgrover1 257:7a50601356cc 97 * This field must be set to 0 if connectionMode is equal
rgrover1 257:7a50601356cc 98 * to ADV_CONNECTABLE_DIRECTED
rgrover1 257:7a50601356cc 99 *
rgrover1 257:7a50601356cc 100 * \par
rgrover1 257:7a50601356cc 101 * See Bluetooth Core Specification, Vol 3., Part C,
rgrover1 257:7a50601356cc 102 * Appendix A for suggested advertising intervals.
rgrover1 257:7a50601356cc 103 */
rgrover1 257:7a50601356cc 104 void setAdvertisingInterval(uint16_t interval);
rgrover1 257:7a50601356cc 105
rgrover1 257:7a50601356cc 106 /**
rgrover1 325:501ad8b8bbe5 107 * @return Minimum Advertising interval in milliseconds.
rgrover1 325:501ad8b8bbe5 108 */
rgrover1 325:501ad8b8bbe5 109 uint16_t getMinAdvertisingInterval(void) const;
rgrover1 325:501ad8b8bbe5 110 /**
rgrover1 325:501ad8b8bbe5 111 * @return Minimum Advertising interval in milliseconds for non connectible mode.
rgrover1 325:501ad8b8bbe5 112 */
rgrover1 325:501ad8b8bbe5 113 uint16_t getMinNonConnectableAdvertisingInterval(void) const;
rgrover1 325:501ad8b8bbe5 114 /**
rgrover1 325:501ad8b8bbe5 115 * @return Maximum Advertising interval in milliseconds.
rgrover1 325:501ad8b8bbe5 116 */
rgrover1 325:501ad8b8bbe5 117 uint16_t getMaxAdvertisingInterval(void) const;
rgrover1 325:501ad8b8bbe5 118
rgrover1 325:501ad8b8bbe5 119 /**
rgrover1 257:7a50601356cc 120 * @param[in] timeout
rgrover1 257:7a50601356cc 121 * Advertising timeout between 0x1 and 0x3FFF (1 and 16383)
rgrover1 257:7a50601356cc 122 * in seconds. Enter 0 to disable the advertising timeout.
rgrover1 257:7a50601356cc 123 */
rgrover1 257:7a50601356cc 124 void setAdvertisingTimeout(uint16_t timeout);
rgrover1 257:7a50601356cc 125
rgrover1 257:7a50601356cc 126 /**
rgrover1 257:7a50601356cc 127 * Please refer to the APIs above.
rgrover1 257:7a50601356cc 128 */
rgrover1 257:7a50601356cc 129 void setAdvertisingParams(const GapAdvertisingParams &advParams);
rgrover1 257:7a50601356cc 130
rgrover1 257:7a50601356cc 131 /**
rgrover1 257:7a50601356cc 132 * This API is typically used as an internal helper to udpate the transport
rgrover1 257:7a50601356cc 133 * backend with advertising data before starting to advertise. It may also
rgrover1 257:7a50601356cc 134 * be explicity used to dynamically reset the accumulated advertising
rgrover1 257:7a50601356cc 135 * payload and scanResponse; to do this, the application can clear and re-
rgrover1 257:7a50601356cc 136 * accumulate a new advertising payload (and scanResponse) before using this
rgrover1 257:7a50601356cc 137 * API.
rgrover1 257:7a50601356cc 138 */
rgrover1 257:7a50601356cc 139 ble_error_t setAdvertisingPayload(void);
rgrover1 257:7a50601356cc 140
rgrover1 257:7a50601356cc 141 /**
rgrover1 257:7a50601356cc 142 * Reset any advertising payload prepared from prior calls to
rgrover1 257:7a50601356cc 143 * accumulateAdvertisingPayload().
rgrover1 257:7a50601356cc 144 */
rgrover1 257:7a50601356cc 145 void clearAdvertisingPayload(void);
rgrover1 257:7a50601356cc 146
rgrover1 257:7a50601356cc 147 /**
rgrover1 257:7a50601356cc 148 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 257:7a50601356cc 149 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 257:7a50601356cc 150 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 257:7a50601356cc 151 * small.
rgrover1 257:7a50601356cc 152 *
rgrover1 257:7a50601356cc 153 * @param flags
rgrover1 257:7a50601356cc 154 * The flags to be added. Multiple flags may be specified in
rgrover1 257:7a50601356cc 155 * combination.
rgrover1 257:7a50601356cc 156 */
rgrover1 257:7a50601356cc 157 ble_error_t accumulateAdvertisingPayload(uint8_t flags);
rgrover1 257:7a50601356cc 158
rgrover1 257:7a50601356cc 159 /**
rgrover1 257:7a50601356cc 160 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 257:7a50601356cc 161 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 257:7a50601356cc 162 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 257:7a50601356cc 163 * small.
rgrover1 257:7a50601356cc 164 *
rgrover1 257:7a50601356cc 165 * @param app
rgrover1 257:7a50601356cc 166 * The appearance of the peripheral.
rgrover1 257:7a50601356cc 167 */
rgrover1 257:7a50601356cc 168 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app);
rgrover1 257:7a50601356cc 169
rgrover1 257:7a50601356cc 170 /**
rgrover1 257:7a50601356cc 171 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 257:7a50601356cc 172 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 257:7a50601356cc 173 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 257:7a50601356cc 174 * small.
rgrover1 257:7a50601356cc 175 *
rgrover1 257:7a50601356cc 176 * @param app
rgrover1 257:7a50601356cc 177 * The max transmit power to be used by the controller. This is
rgrover1 257:7a50601356cc 178 * only a hint.
rgrover1 257:7a50601356cc 179 */
rgrover1 257:7a50601356cc 180 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power);
rgrover1 257:7a50601356cc 181
rgrover1 257:7a50601356cc 182 /**
rgrover1 257:7a50601356cc 183 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 257:7a50601356cc 184 * advertising payload. Please note that the payload is limited to 31 bytes.
rgrover1 257:7a50601356cc 185 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
rgrover1 257:7a50601356cc 186 * advertising payload proves to be too small.
rgrover1 257:7a50601356cc 187 *
rgrover1 257:7a50601356cc 188 * @param type The type which describes the variable length data.
rgrover1 257:7a50601356cc 189 * @param data data bytes.
rgrover1 257:7a50601356cc 190 * @param len length of data.
rgrover1 257:7a50601356cc 191 */
rgrover1 257:7a50601356cc 192 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len);
rgrover1 257:7a50601356cc 193
rgrover1 257:7a50601356cc 194 /**
rgrover1 257:7a50601356cc 195 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 257:7a50601356cc 196 * scanResponse payload.
rgrover1 257:7a50601356cc 197 *
rgrover1 257:7a50601356cc 198 * @param type The type which describes the variable length data.
rgrover1 257:7a50601356cc 199 * @param data data bytes.
rgrover1 257:7a50601356cc 200 * @param len length of data.
rgrover1 257:7a50601356cc 201 */
rgrover1 257:7a50601356cc 202 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len);
rgrover1 257:7a50601356cc 203
rgrover1 257:7a50601356cc 204 /**
rgrover1 257:7a50601356cc 205 * Start advertising (GAP Discoverable, Connectable modes, Broadcast
rgrover1 257:7a50601356cc 206 * Procedure).
rgrover1 257:7a50601356cc 207 */
rgrover1 257:7a50601356cc 208 ble_error_t startAdvertising(void);
rgrover1 257:7a50601356cc 209
rgrover1 257:7a50601356cc 210 /**
rgrover1 257:7a50601356cc 211 * Stop advertising (GAP Discoverable, Connectable modes, Broadcast
rgrover1 257:7a50601356cc 212 * Procedure).
rgrover1 257:7a50601356cc 213 */
rgrover1 257:7a50601356cc 214 ble_error_t stopAdvertising(void);
rgrover1 257:7a50601356cc 215
rgrover1 257:7a50601356cc 216 ble_error_t disconnect(Gap::DisconnectionReason_t reason);
rgrover1 257:7a50601356cc 217
rgrover1 257:7a50601356cc 218 /* APIs to set GAP callbacks. */
rgrover1 257:7a50601356cc 219 void onTimeout(Gap::EventCallback_t timeoutCallback);
rgrover1 257:7a50601356cc 220
rgrover1 257:7a50601356cc 221 void onConnection(Gap::ConnectionEventCallback_t connectionCallback);
rgrover1 257:7a50601356cc 222 /**
rgrover1 257:7a50601356cc 223 * Used to setup a callback for GAP disconnection.
rgrover1 257:7a50601356cc 224 */
rgrover1 257:7a50601356cc 225 void onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback);
rgrover1 257:7a50601356cc 226
rgrover1 257:7a50601356cc 227 /**
rgrover1 257:7a50601356cc 228 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 257:7a50601356cc 229 * callbacks receive no context and are therefore different from the
rgrover1 257:7a50601356cc 230 * onDisconnection callback.
rgrover1 257:7a50601356cc 231 */
rgrover1 257:7a50601356cc 232 template<typename T>
rgrover1 257:7a50601356cc 233 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void));
rgrover1 257:7a50601356cc 234
rgrover1 257:7a50601356cc 235 /**
rgrover1 261:b275bfc773b9 236 * Add a callback for the GATT event DATA_SENT (which is triggered when
rgrover1 261:b275bfc773b9 237 * updates are sent out by GATT in the form of notifications).
rgrover1 259:a95264ad705c 238 *
rgrover1 259:a95264ad705c 239 * @Note: it is possible to chain together multiple onDataSent callbacks
rgrover1 259:a95264ad705c 240 * (potentially from different modules of an application) to receive updates
rgrover1 260:ea7f9f14cc15 241 * to characteristics.
rgrover1 259:a95264ad705c 242 *
rgrover1 259:a95264ad705c 243 * @Note: it is also possible to setup a callback into a member function of
rgrover1 259:a95264ad705c 244 * some object.
rgrover1 257:7a50601356cc 245 */
rgrover1 259:a95264ad705c 246 void onDataSent(void (*callback)(unsigned count));
rgrover1 259:a95264ad705c 247 template <typename T> void onDataSent(T * objPtr, void (T::*memberPtr)(unsigned count));
rgrover1 257:7a50601356cc 248
rgrover1 257:7a50601356cc 249 /**
rgrover1 257:7a50601356cc 250 * Setup a callback for when a characteristic has its value updated by a
rgrover1 257:7a50601356cc 251 * client.
rgrover1 257:7a50601356cc 252 *
rgrover1 257:7a50601356cc 253 * @Note: it is possible to chain together multiple onDataWritten callbacks
rgrover1 257:7a50601356cc 254 * (potentially from different modules of an application) to receive updates
rgrover1 257:7a50601356cc 255 * to characteristics. Many services, such as DFU and UART add their own
rgrover1 257:7a50601356cc 256 * onDataWritten callbacks behind the scenes to trap interesting events.
rgrover1 257:7a50601356cc 257 *
rgrover1 257:7a50601356cc 258 * @Note: it is also possible to setup a callback into a member function of
rgrover1 257:7a50601356cc 259 * some object.
rgrover1 257:7a50601356cc 260 */
rgrover1 257:7a50601356cc 261 void onDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP));
rgrover1 257:7a50601356cc 262 template <typename T> void onDataWritten(T * objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context));
rgrover1 257:7a50601356cc 263
rgrover1 300:d9a39f759a6a 264 /**
rgrover1 300:d9a39f759a6a 265 * Setup a callback for when a characteristic is being read by a client.
rgrover1 300:d9a39f759a6a 266 *
rgrover1 300:d9a39f759a6a 267 * @Note: this functionality may not be available on all underlying stacks.
rgrover1 300:d9a39f759a6a 268 * You could use GattCharacteristic::setReadAuthorizationCallback() as an
rgrover1 300:d9a39f759a6a 269 * alternative.
rgrover1 300:d9a39f759a6a 270 *
rgrover1 300:d9a39f759a6a 271 * @Note: it is possible to chain together multiple onDataRead callbacks
rgrover1 300:d9a39f759a6a 272 * (potentially from different modules of an application) to receive updates
rgrover1 300:d9a39f759a6a 273 * to characteristics. Services may add their own onDataRead callbacks
rgrover1 300:d9a39f759a6a 274 * behind the scenes to trap interesting events.
rgrover1 300:d9a39f759a6a 275 *
rgrover1 300:d9a39f759a6a 276 * @Note: it is also possible to setup a callback into a member function of
rgrover1 300:d9a39f759a6a 277 * some object.
rgrover1 300:d9a39f759a6a 278 *
rgrover1 300:d9a39f759a6a 279 * @return BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available;
rgrover1 300:d9a39f759a6a 280 * else BLE_ERROR_NONE.
rgrover1 300:d9a39f759a6a 281 */
rgrover1 300:d9a39f759a6a 282 ble_error_t onDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP));
rgrover1 300:d9a39f759a6a 283 template <typename T> ble_error_t onDataRead(T * objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context));
rgrover1 300:d9a39f759a6a 284
rgrover1 257:7a50601356cc 285 void onUpdatesEnabled(GattServer::EventCallback_t callback);
rgrover1 257:7a50601356cc 286 void onUpdatesDisabled(GattServer::EventCallback_t callback);
rgrover1 257:7a50601356cc 287 void onConfirmationReceived(GattServer::EventCallback_t callback);
rgrover1 257:7a50601356cc 288
rgrover1 257:7a50601356cc 289 /**
rgrover1 257:7a50601356cc 290 * Add a service declaration to the local server ATT table. Also add the
rgrover1 257:7a50601356cc 291 * characteristics contained within.
rgrover1 257:7a50601356cc 292 */
rgrover1 257:7a50601356cc 293 ble_error_t addService(GattService &service);
rgrover1 257:7a50601356cc 294
rgrover1 257:7a50601356cc 295 Gap::GapState_t getGapState(void) const;
rgrover1 257:7a50601356cc 296
rgrover1 257:7a50601356cc 297 /**
rgrover1 257:7a50601356cc 298 * @param[in/out] lengthP
rgrover1 257:7a50601356cc 299 * input: Length in bytes to be read,
rgrover1 257:7a50601356cc 300 * output: Total length of attribute value upon successful return.
rgrover1 257:7a50601356cc 301 */
rgrover1 300:d9a39f759a6a 302 ble_error_t readCharacteristicValue(GattAttribute::Handle_t handle, uint8_t *const buffer, uint16_t *const lengthP);
rgrover1 257:7a50601356cc 303
rgrover1 257:7a50601356cc 304 /**
rgrover1 257:7a50601356cc 305 * @param localOnly
rgrover1 257:7a50601356cc 306 * Only update the characteristic locally regardless of notify/indicate flags in the CCCD.
rgrover1 257:7a50601356cc 307 */
rgrover1 300:d9a39f759a6a 308 ble_error_t updateCharacteristicValue(GattAttribute::Handle_t handle, const uint8_t *value, uint16_t size, bool localOnly = false);
rgrover1 257:7a50601356cc 309
rgrover1 257:7a50601356cc 310 /**
rgrover1 257:7a50601356cc 311 * Yield control to the BLE stack or to other tasks waiting for events. This
rgrover1 257:7a50601356cc 312 * is a sleep function which will return when there is an application
rgrover1 257:7a50601356cc 313 * specific interrupt, but the MCU might wake up several times before
rgrover1 257:7a50601356cc 314 * returning (to service the stack). This is not always interchangeable with
rgrover1 257:7a50601356cc 315 * WFE().
rgrover1 257:7a50601356cc 316 */
rgrover1 257:7a50601356cc 317 void waitForEvent(void);
rgrover1 257:7a50601356cc 318
rgrover1 257:7a50601356cc 319 ble_error_t getPreferredConnectionParams(Gap::ConnectionParams_t *params);
rgrover1 257:7a50601356cc 320 ble_error_t setPreferredConnectionParams(const Gap::ConnectionParams_t *params);
rgrover1 257:7a50601356cc 321 ble_error_t updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params);
rgrover1 257:7a50601356cc 322
rgrover1 257:7a50601356cc 323 /**
rgrover1 257:7a50601356cc 324 * This call allows the application to get the BLE stack version information.
rgrover1 257:7a50601356cc 325 *
rgrover1 257:7a50601356cc 326 * @return A pointer to a const string representing the version.
rgrover1 257:7a50601356cc 327 * Note: The string is owned by the BLE_API.
rgrover1 257:7a50601356cc 328 */
rgrover1 257:7a50601356cc 329 const char *getVersion(void);
rgrover1 257:7a50601356cc 330
rgrover1 257:7a50601356cc 331 /**
rgrover1 257:7a50601356cc 332 * Set the device name characteristic in the GAP service.
rgrover1 257:7a50601356cc 333 * @param deviceName The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
rgrover1 257:7a50601356cc 334 */
rgrover1 257:7a50601356cc 335 ble_error_t setDeviceName(const uint8_t *deviceName);
rgrover1 257:7a50601356cc 336
rgrover1 257:7a50601356cc 337 /**
rgrover1 257:7a50601356cc 338 * Get the value of the device name characteristic in the GAP service.
rgrover1 257:7a50601356cc 339 * @param[out] deviceName Pointer to an empty buffer where the UTF-8 *non NULL-
rgrover1 257:7a50601356cc 340 * terminated* string will be placed. Set this
rgrover1 257:7a50601356cc 341 * value to NULL in order to obtain the deviceName-length
rgrover1 257:7a50601356cc 342 * from the 'length' parameter.
rgrover1 257:7a50601356cc 343 *
rgrover1 257:7a50601356cc 344 * @param[in/out] lengthP (on input) Length of the buffer pointed to by deviceName;
rgrover1 257:7a50601356cc 345 * (on output) the complete device name length (without the
rgrover1 257:7a50601356cc 346 * null terminator).
rgrover1 257:7a50601356cc 347 *
rgrover1 257:7a50601356cc 348 * @note If the device name is longer than the size of the supplied buffer,
rgrover1 257:7a50601356cc 349 * length will return the complete device name length,
rgrover1 257:7a50601356cc 350 * and not the number of bytes actually returned in deviceName.
rgrover1 257:7a50601356cc 351 * The application may use this information to retry with a suitable buffer size.
rgrover1 257:7a50601356cc 352 *
rgrover1 257:7a50601356cc 353 * Sample use:
rgrover1 257:7a50601356cc 354 * uint8_t deviceName[20];
rgrover1 257:7a50601356cc 355 * unsigned length = sizeof(deviceName);
rgrover1 257:7a50601356cc 356 * ble.getDeviceName(deviceName, &length);
rgrover1 257:7a50601356cc 357 * if (length < sizeof(deviceName)) {
rgrover1 257:7a50601356cc 358 * deviceName[length] = 0;
rgrover1 257:7a50601356cc 359 * }
rgrover1 257:7a50601356cc 360 * DEBUG("length: %u, deviceName: %s\r\n", length, deviceName);
rgrover1 257:7a50601356cc 361 */
rgrover1 257:7a50601356cc 362 ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP);
rgrover1 257:7a50601356cc 363
rgrover1 257:7a50601356cc 364 /**
rgrover1 257:7a50601356cc 365 * Set the appearance characteristic in the GAP service.
rgrover1 257:7a50601356cc 366 * @param[in] appearance The new value for the device-appearance.
rgrover1 257:7a50601356cc 367 */
rgrover1 257:7a50601356cc 368 ble_error_t setAppearance(uint16_t appearance);
rgrover1 257:7a50601356cc 369
rgrover1 257:7a50601356cc 370 /**
rgrover1 257:7a50601356cc 371 * Set the appearance characteristic in the GAP service.
rgrover1 257:7a50601356cc 372 * @param[out] appearance The new value for the device-appearance.
rgrover1 257:7a50601356cc 373 */
rgrover1 257:7a50601356cc 374 ble_error_t getAppearance(uint16_t *appearanceP);
rgrover1 257:7a50601356cc 375
rgrover1 257:7a50601356cc 376 /**
rgrover1 257:7a50601356cc 377 * Set the radio's transmit power.
rgrover1 257:7a50601356cc 378 * @param[in] txPower Radio transmit power in dBm.
rgrover1 257:7a50601356cc 379 */
rgrover1 257:7a50601356cc 380 ble_error_t setTxPower(int8_t txPower);
rgrover1 257:7a50601356cc 381
rgrover1 305:71367f7cd078 382 /**
rgrover1 305:71367f7cd078 383 * Query the underlying stack for permitted arguments for setTxPower().
rgrover1 305:71367f7cd078 384 *
rgrover1 305:71367f7cd078 385 * @param[out] valueArrayPP
rgrover1 305:71367f7cd078 386 * Out parameter to receive the immutable array of Tx values.
rgrover1 305:71367f7cd078 387 * @param[out] countP
rgrover1 305:71367f7cd078 388 * Out parameter to receive the array's size.
rgrover1 305:71367f7cd078 389 */
rgrover1 305:71367f7cd078 390 void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP);
rgrover1 305:71367f7cd078 391
rgrover1 257:7a50601356cc 392 public:
rgrover1 257:7a50601356cc 393 BLEDevice() : transport(createBLEDeviceInstance()), advParams(), advPayload(), scanResponse(), needToSetAdvPayload(true) {
rgrover1 257:7a50601356cc 394 advPayload.clear();
rgrover1 257:7a50601356cc 395 scanResponse.clear();
rgrover1 257:7a50601356cc 396 }
rgrover1 257:7a50601356cc 397
rgrover1 257:7a50601356cc 398 private:
rgrover1 257:7a50601356cc 399 BLEDeviceInstanceBase *const transport; /* the device specific backend */
rgrover1 257:7a50601356cc 400
rgrover1 257:7a50601356cc 401 GapAdvertisingParams advParams;
rgrover1 257:7a50601356cc 402 GapAdvertisingData advPayload;
rgrover1 257:7a50601356cc 403 GapAdvertisingData scanResponse;
rgrover1 257:7a50601356cc 404
rgrover1 257:7a50601356cc 405 /* Accumulation of AD structures in the advertisement payload should
rgrover1 257:7a50601356cc 406 * eventually result in a call to the target's setAdvertisingData() before
rgrover1 257:7a50601356cc 407 * the server begins advertising. This flag marks the status of the pending update.*/
rgrover1 257:7a50601356cc 408 bool needToSetAdvPayload;
rgrover1 257:7a50601356cc 409
rgrover1 257:7a50601356cc 410 /**
rgrover1 257:7a50601356cc 411 * DEPRECATED
rgrover1 257:7a50601356cc 412 */
rgrover1 257:7a50601356cc 413 public:
rgrover1 257:7a50601356cc 414 ble_error_t setAdvertisingData(const GapAdvertisingData &ADStructures, const GapAdvertisingData &scanResponse);
rgrover1 257:7a50601356cc 415 ble_error_t setAdvertisingData(const GapAdvertisingData &ADStructures);
rgrover1 257:7a50601356cc 416
rgrover1 257:7a50601356cc 417 ble_error_t startAdvertising(const GapAdvertisingParams &advParams);
rgrover1 257:7a50601356cc 418 };
rgrover1 257:7a50601356cc 419
rgrover1 257:7a50601356cc 420 /* BLEDevice methods. Most of these simply forward the calls to the underlying
rgrover1 257:7a50601356cc 421 * transport.*/
rgrover1 257:7a50601356cc 422
rgrover1 257:7a50601356cc 423 inline ble_error_t
rgrover1 257:7a50601356cc 424 BLEDevice::reset(void)
rgrover1 257:7a50601356cc 425 {
rgrover1 257:7a50601356cc 426 return transport->reset();
rgrover1 257:7a50601356cc 427 }
rgrover1 257:7a50601356cc 428
rgrover1 257:7a50601356cc 429 inline ble_error_t
rgrover1 257:7a50601356cc 430 BLEDevice::shutdown(void)
rgrover1 257:7a50601356cc 431 {
rgrover1 257:7a50601356cc 432 clearAdvertisingPayload();
rgrover1 257:7a50601356cc 433 return transport->shutdown();
rgrover1 257:7a50601356cc 434 }
rgrover1 257:7a50601356cc 435
rgrover1 257:7a50601356cc 436 inline ble_error_t
rgrover1 257:7a50601356cc 437 BLEDevice::setAddress(Gap::addr_type_t type, const Gap::address_t address)
rgrover1 257:7a50601356cc 438 {
rgrover1 257:7a50601356cc 439 return transport->getGap().setAddress(type, address);
rgrover1 257:7a50601356cc 440 }
rgrover1 257:7a50601356cc 441
rgrover1 257:7a50601356cc 442 inline ble_error_t
rgrover1 257:7a50601356cc 443 BLEDevice::getAddress(Gap::addr_type_t *typeP, Gap::address_t address)
rgrover1 257:7a50601356cc 444 {
rgrover1 257:7a50601356cc 445 return transport->getGap().getAddress(typeP, address);
rgrover1 257:7a50601356cc 446 }
rgrover1 257:7a50601356cc 447
rgrover1 257:7a50601356cc 448 inline void
rgrover1 257:7a50601356cc 449 BLEDevice::setAdvertisingType(GapAdvertisingParams::AdvertisingType advType)
rgrover1 257:7a50601356cc 450 {
rgrover1 257:7a50601356cc 451 advParams.setAdvertisingType(advType);
rgrover1 257:7a50601356cc 452 }
rgrover1 257:7a50601356cc 453
rgrover1 257:7a50601356cc 454 inline void
rgrover1 257:7a50601356cc 455 BLEDevice::setAdvertisingInterval(uint16_t interval)
rgrover1 257:7a50601356cc 456 {
rgrover1 325:501ad8b8bbe5 457 if (interval == 0) {
rgrover1 325:501ad8b8bbe5 458 stopAdvertising();
rgrover1 325:501ad8b8bbe5 459 } else if (interval < getMinAdvertisingInterval()) {
rgrover1 325:501ad8b8bbe5 460 interval = getMinAdvertisingInterval();
rgrover1 325:501ad8b8bbe5 461 }
rgrover1 325:501ad8b8bbe5 462 advParams.setInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(interval));
rgrover1 325:501ad8b8bbe5 463 }
rgrover1 325:501ad8b8bbe5 464
rgrover1 325:501ad8b8bbe5 465 inline uint16_t
rgrover1 325:501ad8b8bbe5 466 BLEDevice::getMinAdvertisingInterval(void) const {
rgrover1 325:501ad8b8bbe5 467 return transport->getGap().getMinAdvertisingInterval();
rgrover1 325:501ad8b8bbe5 468 }
rgrover1 325:501ad8b8bbe5 469
rgrover1 325:501ad8b8bbe5 470 inline uint16_t
rgrover1 325:501ad8b8bbe5 471 BLEDevice::getMinNonConnectableAdvertisingInterval(void) const {
rgrover1 325:501ad8b8bbe5 472 return transport->getGap().getMinNonConnectableAdvertisingInterval();
rgrover1 325:501ad8b8bbe5 473 }
rgrover1 325:501ad8b8bbe5 474
rgrover1 325:501ad8b8bbe5 475 inline uint16_t
rgrover1 325:501ad8b8bbe5 476 BLEDevice::getMaxAdvertisingInterval(void) const {
rgrover1 325:501ad8b8bbe5 477 return transport->getGap().getMaxAdvertisingInterval();
rgrover1 257:7a50601356cc 478 }
rgrover1 257:7a50601356cc 479
rgrover1 257:7a50601356cc 480 inline void
rgrover1 257:7a50601356cc 481 BLEDevice::setAdvertisingTimeout(uint16_t timeout)
rgrover1 257:7a50601356cc 482 {
rgrover1 257:7a50601356cc 483 advParams.setTimeout(timeout);
rgrover1 257:7a50601356cc 484 }
rgrover1 257:7a50601356cc 485
rgrover1 257:7a50601356cc 486 inline void
rgrover1 257:7a50601356cc 487 BLEDevice::setAdvertisingParams(const GapAdvertisingParams &newAdvParams)
rgrover1 257:7a50601356cc 488 {
rgrover1 257:7a50601356cc 489 advParams = newAdvParams;
rgrover1 257:7a50601356cc 490 }
rgrover1 257:7a50601356cc 491
rgrover1 257:7a50601356cc 492 inline void
rgrover1 257:7a50601356cc 493 BLEDevice::clearAdvertisingPayload(void)
rgrover1 257:7a50601356cc 494 {
rgrover1 257:7a50601356cc 495 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 496 advPayload.clear();
rgrover1 257:7a50601356cc 497 }
rgrover1 257:7a50601356cc 498
rgrover1 257:7a50601356cc 499 inline ble_error_t
rgrover1 257:7a50601356cc 500 BLEDevice::accumulateAdvertisingPayload(uint8_t flags)
rgrover1 257:7a50601356cc 501 {
rgrover1 257:7a50601356cc 502 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 503 return advPayload.addFlags(flags);
rgrover1 257:7a50601356cc 504 }
rgrover1 257:7a50601356cc 505
rgrover1 257:7a50601356cc 506 inline ble_error_t
rgrover1 257:7a50601356cc 507 BLEDevice::accumulateAdvertisingPayload(GapAdvertisingData::Appearance app)
rgrover1 257:7a50601356cc 508 {
rgrover1 257:7a50601356cc 509 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 510 transport->getGap().setAppearance(app);
rgrover1 257:7a50601356cc 511 return advPayload.addAppearance(app);
rgrover1 257:7a50601356cc 512 }
rgrover1 257:7a50601356cc 513
rgrover1 257:7a50601356cc 514 inline ble_error_t
rgrover1 257:7a50601356cc 515 BLEDevice::accumulateAdvertisingPayloadTxPower(int8_t txPower)
rgrover1 257:7a50601356cc 516 {
rgrover1 257:7a50601356cc 517 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 518 return advPayload.addTxPower(txPower);
rgrover1 257:7a50601356cc 519 }
rgrover1 257:7a50601356cc 520
rgrover1 257:7a50601356cc 521 inline ble_error_t
rgrover1 257:7a50601356cc 522 BLEDevice::accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len)
rgrover1 257:7a50601356cc 523 {
rgrover1 257:7a50601356cc 524 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 525 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
rgrover1 257:7a50601356cc 526 transport->getGap().setDeviceName(data);
rgrover1 257:7a50601356cc 527 }
rgrover1 257:7a50601356cc 528 return advPayload.addData(type, data, len);
rgrover1 257:7a50601356cc 529 }
rgrover1 257:7a50601356cc 530
rgrover1 257:7a50601356cc 531 inline ble_error_t
rgrover1 257:7a50601356cc 532 BLEDevice::accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len)
rgrover1 257:7a50601356cc 533 {
rgrover1 257:7a50601356cc 534 needToSetAdvPayload = true;
rgrover1 257:7a50601356cc 535 return scanResponse.addData(type, data, len);
rgrover1 257:7a50601356cc 536 }
rgrover1 257:7a50601356cc 537
rgrover1 257:7a50601356cc 538 inline ble_error_t
rgrover1 257:7a50601356cc 539 BLEDevice::setAdvertisingPayload(void) {
rgrover1 257:7a50601356cc 540 needToSetAdvPayload = false;
rgrover1 257:7a50601356cc 541 return transport->getGap().setAdvertisingData(advPayload, scanResponse);
rgrover1 257:7a50601356cc 542 }
rgrover1 257:7a50601356cc 543
rgrover1 257:7a50601356cc 544 inline ble_error_t
rgrover1 257:7a50601356cc 545 BLEDevice::startAdvertising(void)
rgrover1 257:7a50601356cc 546 {
rgrover1 257:7a50601356cc 547 ble_error_t rc;
rgrover1 257:7a50601356cc 548 if ((rc = transport->getGattServer().initializeGATTDatabase()) != BLE_ERROR_NONE) {
rgrover1 257:7a50601356cc 549 return rc;
rgrover1 257:7a50601356cc 550 }
rgrover1 257:7a50601356cc 551 if (needToSetAdvPayload) {
rgrover1 257:7a50601356cc 552 if ((rc = setAdvertisingPayload()) != BLE_ERROR_NONE) {
rgrover1 257:7a50601356cc 553 return rc;
rgrover1 257:7a50601356cc 554 }
rgrover1 257:7a50601356cc 555 }
rgrover1 257:7a50601356cc 556
rgrover1 257:7a50601356cc 557 return transport->getGap().startAdvertising(advParams);
rgrover1 257:7a50601356cc 558 }
rgrover1 257:7a50601356cc 559
rgrover1 257:7a50601356cc 560 inline ble_error_t
rgrover1 257:7a50601356cc 561 BLEDevice::stopAdvertising(void)
rgrover1 257:7a50601356cc 562 {
rgrover1 257:7a50601356cc 563 return transport->getGap().stopAdvertising();
rgrover1 257:7a50601356cc 564 }
rgrover1 257:7a50601356cc 565
rgrover1 257:7a50601356cc 566 inline ble_error_t
rgrover1 257:7a50601356cc 567 BLEDevice::disconnect(Gap::DisconnectionReason_t reason)
rgrover1 257:7a50601356cc 568 {
rgrover1 257:7a50601356cc 569 return transport->getGap().disconnect(reason);
rgrover1 257:7a50601356cc 570 }
rgrover1 257:7a50601356cc 571
rgrover1 257:7a50601356cc 572 inline void
rgrover1 257:7a50601356cc 573 BLEDevice::onTimeout(Gap::EventCallback_t timeoutCallback)
rgrover1 257:7a50601356cc 574 {
rgrover1 257:7a50601356cc 575 transport->getGap().setOnTimeout(timeoutCallback);
rgrover1 257:7a50601356cc 576 }
rgrover1 257:7a50601356cc 577
rgrover1 257:7a50601356cc 578 inline void
rgrover1 257:7a50601356cc 579 BLEDevice::onConnection(Gap::ConnectionEventCallback_t connectionCallback)
rgrover1 257:7a50601356cc 580 {
rgrover1 257:7a50601356cc 581 transport->getGap().setOnConnection(connectionCallback);
rgrover1 257:7a50601356cc 582 }
rgrover1 257:7a50601356cc 583
rgrover1 257:7a50601356cc 584 inline void
rgrover1 257:7a50601356cc 585 BLEDevice::onDisconnection(Gap::DisconnectionEventCallback_t disconnectionCallback)
rgrover1 257:7a50601356cc 586 {
rgrover1 257:7a50601356cc 587 transport->getGap().setOnDisconnection(disconnectionCallback);
rgrover1 257:7a50601356cc 588 }
rgrover1 257:7a50601356cc 589
rgrover1 257:7a50601356cc 590 template<typename T>
rgrover1 257:7a50601356cc 591 inline void
rgrover1 257:7a50601356cc 592 BLEDevice::addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {
rgrover1 257:7a50601356cc 593 transport->getGap().addToDisconnectionCallChain(tptr, mptr);
rgrover1 257:7a50601356cc 594 }
rgrover1 257:7a50601356cc 595
rgrover1 257:7a50601356cc 596 inline void
rgrover1 259:a95264ad705c 597 BLEDevice::onDataSent(void (*callback)(unsigned count)) {
rgrover1 257:7a50601356cc 598 transport->getGattServer().setOnDataSent(callback);
rgrover1 257:7a50601356cc 599 }
rgrover1 257:7a50601356cc 600
rgrover1 259:a95264ad705c 601 template <typename T> inline void
rgrover1 259:a95264ad705c 602 BLEDevice::onDataSent(T *objPtr, void (T::*memberPtr)(unsigned count)) {
rgrover1 259:a95264ad705c 603 transport->getGattServer().setOnDataSent(objPtr, memberPtr);
rgrover1 259:a95264ad705c 604 }
rgrover1 259:a95264ad705c 605
rgrover1 257:7a50601356cc 606 inline void
rgrover1 257:7a50601356cc 607 BLEDevice::onDataWritten(void (*callback)(const GattCharacteristicWriteCBParams *eventDataP)) {
rgrover1 257:7a50601356cc 608 transport->getGattServer().setOnDataWritten(callback);
rgrover1 257:7a50601356cc 609 }
rgrover1 257:7a50601356cc 610
rgrover1 257:7a50601356cc 611 template <typename T> inline void
rgrover1 257:7a50601356cc 612 BLEDevice::onDataWritten(T *objPtr, void (T::*memberPtr)(const GattCharacteristicWriteCBParams *context)) {
rgrover1 257:7a50601356cc 613 transport->getGattServer().setOnDataWritten(objPtr, memberPtr);
rgrover1 257:7a50601356cc 614 }
rgrover1 257:7a50601356cc 615
rgrover1 300:d9a39f759a6a 616 inline ble_error_t
rgrover1 300:d9a39f759a6a 617 BLEDevice::onDataRead(void (*callback)(const GattCharacteristicReadCBParams *eventDataP)) {
rgrover1 300:d9a39f759a6a 618 return transport->getGattServer().setOnDataRead(callback);
rgrover1 300:d9a39f759a6a 619 }
rgrover1 300:d9a39f759a6a 620
rgrover1 300:d9a39f759a6a 621 template <typename T> inline ble_error_t
rgrover1 300:d9a39f759a6a 622 BLEDevice::onDataRead(T *objPtr, void (T::*memberPtr)(const GattCharacteristicReadCBParams *context)) {
rgrover1 300:d9a39f759a6a 623 return transport->getGattServer().setOnDataRead(objPtr, memberPtr);
rgrover1 300:d9a39f759a6a 624 }
rgrover1 300:d9a39f759a6a 625
rgrover1 257:7a50601356cc 626 inline void
rgrover1 257:7a50601356cc 627 BLEDevice::onUpdatesEnabled(GattServer::EventCallback_t callback)
rgrover1 257:7a50601356cc 628 {
rgrover1 257:7a50601356cc 629 transport->getGattServer().setOnUpdatesEnabled(callback);
rgrover1 257:7a50601356cc 630 }
rgrover1 257:7a50601356cc 631
rgrover1 257:7a50601356cc 632 inline void
rgrover1 257:7a50601356cc 633 BLEDevice::onUpdatesDisabled(GattServer::EventCallback_t callback)
rgrover1 257:7a50601356cc 634 {
rgrover1 257:7a50601356cc 635 transport->getGattServer().setOnUpdatesDisabled(callback);
rgrover1 257:7a50601356cc 636 }
rgrover1 257:7a50601356cc 637
rgrover1 257:7a50601356cc 638 inline void
rgrover1 257:7a50601356cc 639 BLEDevice::onConfirmationReceived(GattServer::EventCallback_t callback)
rgrover1 257:7a50601356cc 640 {
rgrover1 257:7a50601356cc 641 transport->getGattServer().setOnConfirmationReceived(callback);
rgrover1 257:7a50601356cc 642 }
rgrover1 257:7a50601356cc 643
rgrover1 257:7a50601356cc 644 inline ble_error_t
rgrover1 257:7a50601356cc 645 BLEDevice::addService(GattService &service)
rgrover1 257:7a50601356cc 646 {
rgrover1 257:7a50601356cc 647 return transport->getGattServer().addService(service);
rgrover1 257:7a50601356cc 648 }
rgrover1 257:7a50601356cc 649
rgrover1 257:7a50601356cc 650 inline Gap::GapState_t
rgrover1 257:7a50601356cc 651 BLEDevice::getGapState(void) const
rgrover1 257:7a50601356cc 652 {
rgrover1 257:7a50601356cc 653 return transport->getGap().getState();
rgrover1 257:7a50601356cc 654 }
rgrover1 257:7a50601356cc 655
rgrover1 300:d9a39f759a6a 656 inline ble_error_t BLEDevice::readCharacteristicValue(GattAttribute::Handle_t handle, uint8_t *const buffer, uint16_t *const lengthP)
rgrover1 257:7a50601356cc 657 {
rgrover1 257:7a50601356cc 658 return transport->getGattServer().readValue(handle, buffer, lengthP);
rgrover1 257:7a50601356cc 659 }
rgrover1 257:7a50601356cc 660
rgrover1 257:7a50601356cc 661 inline ble_error_t
rgrover1 300:d9a39f759a6a 662 BLEDevice::updateCharacteristicValue(GattAttribute::Handle_t handle, const uint8_t *value, uint16_t size, bool localOnly)
rgrover1 257:7a50601356cc 663 {
rgrover1 257:7a50601356cc 664 return transport->getGattServer().updateValue(handle, const_cast<uint8_t *>(value), size, localOnly);
rgrover1 257:7a50601356cc 665 }
rgrover1 257:7a50601356cc 666
rgrover1 257:7a50601356cc 667 inline void
rgrover1 257:7a50601356cc 668 BLEDevice::waitForEvent(void)
rgrover1 257:7a50601356cc 669 {
rgrover1 257:7a50601356cc 670 transport->waitForEvent();
rgrover1 257:7a50601356cc 671 }
rgrover1 257:7a50601356cc 672
rgrover1 257:7a50601356cc 673 inline ble_error_t
rgrover1 257:7a50601356cc 674 BLEDevice::getPreferredConnectionParams(Gap::ConnectionParams_t *params)
rgrover1 257:7a50601356cc 675 {
rgrover1 257:7a50601356cc 676 return transport->getGap().getPreferredConnectionParams(params);
rgrover1 257:7a50601356cc 677 }
rgrover1 257:7a50601356cc 678
rgrover1 257:7a50601356cc 679 inline ble_error_t
rgrover1 257:7a50601356cc 680 BLEDevice::setPreferredConnectionParams(const Gap::ConnectionParams_t *params)
rgrover1 257:7a50601356cc 681 {
rgrover1 257:7a50601356cc 682 return transport->getGap().setPreferredConnectionParams(params);
rgrover1 257:7a50601356cc 683 }
rgrover1 257:7a50601356cc 684
rgrover1 257:7a50601356cc 685 inline ble_error_t
rgrover1 257:7a50601356cc 686 BLEDevice::updateConnectionParams(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) {
rgrover1 257:7a50601356cc 687 return transport->getGap().updateConnectionParams(handle, params);
rgrover1 257:7a50601356cc 688 }
rgrover1 257:7a50601356cc 689
rgrover1 257:7a50601356cc 690 inline const char *
rgrover1 257:7a50601356cc 691 BLEDevice::getVersion(void)
rgrover1 257:7a50601356cc 692 {
rgrover1 257:7a50601356cc 693 return transport->getVersion();
rgrover1 257:7a50601356cc 694 }
rgrover1 257:7a50601356cc 695
rgrover1 257:7a50601356cc 696 inline ble_error_t
rgrover1 257:7a50601356cc 697 BLEDevice::setDeviceName(const uint8_t *deviceName)
rgrover1 257:7a50601356cc 698 {
rgrover1 257:7a50601356cc 699 return transport->getGap().setDeviceName(deviceName);
rgrover1 257:7a50601356cc 700 }
rgrover1 257:7a50601356cc 701
rgrover1 257:7a50601356cc 702 inline ble_error_t
rgrover1 257:7a50601356cc 703 BLEDevice::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
rgrover1 257:7a50601356cc 704 {
rgrover1 257:7a50601356cc 705 return transport->getGap().getDeviceName(deviceName, lengthP);
rgrover1 257:7a50601356cc 706 }
rgrover1 257:7a50601356cc 707
rgrover1 257:7a50601356cc 708 inline ble_error_t
rgrover1 257:7a50601356cc 709 BLEDevice::setAppearance(uint16_t appearance)
rgrover1 257:7a50601356cc 710 {
rgrover1 257:7a50601356cc 711 return transport->getGap().setAppearance(appearance);
rgrover1 257:7a50601356cc 712 }
rgrover1 257:7a50601356cc 713
rgrover1 257:7a50601356cc 714 inline ble_error_t
rgrover1 257:7a50601356cc 715 BLEDevice::getAppearance(uint16_t *appearanceP)
rgrover1 257:7a50601356cc 716 {
rgrover1 257:7a50601356cc 717 return transport->getGap().getAppearance(appearanceP);
rgrover1 257:7a50601356cc 718 }
rgrover1 257:7a50601356cc 719
rgrover1 257:7a50601356cc 720 inline ble_error_t
rgrover1 257:7a50601356cc 721 BLEDevice::setTxPower(int8_t txPower)
rgrover1 257:7a50601356cc 722 {
rgrover1 257:7a50601356cc 723 return transport->setTxPower(txPower);
rgrover1 257:7a50601356cc 724 }
rgrover1 257:7a50601356cc 725
rgrover1 305:71367f7cd078 726 inline void
rgrover1 305:71367f7cd078 727 BLEDevice::getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP)
rgrover1 305:71367f7cd078 728 {
rgrover1 305:71367f7cd078 729 transport->getPermittedTxPowerValues(valueArrayPP, countP);
rgrover1 305:71367f7cd078 730 }
rgrover1 305:71367f7cd078 731
rgrover1 257:7a50601356cc 732 /*
rgrover1 257:7a50601356cc 733 * ALL OF THE FOLLOWING METHODS ARE DEPRECATED
rgrover1 257:7a50601356cc 734 */
rgrover1 257:7a50601356cc 735
rgrover1 257:7a50601356cc 736 inline ble_error_t
rgrover1 257:7a50601356cc 737 BLEDevice::setAdvertisingData(const GapAdvertisingData &ADStructures, const GapAdvertisingData &scanResponse)
rgrover1 257:7a50601356cc 738 {
rgrover1 257:7a50601356cc 739 needToSetAdvPayload = false;
rgrover1 257:7a50601356cc 740 return transport->getGap().setAdvertisingData(ADStructures, scanResponse);
rgrover1 257:7a50601356cc 741 }
rgrover1 257:7a50601356cc 742
rgrover1 257:7a50601356cc 743 inline ble_error_t
rgrover1 257:7a50601356cc 744 BLEDevice::setAdvertisingData(const GapAdvertisingData &ADStructures)
rgrover1 257:7a50601356cc 745 {
rgrover1 257:7a50601356cc 746 GapAdvertisingData scanResponse;
rgrover1 257:7a50601356cc 747
rgrover1 257:7a50601356cc 748 needToSetAdvPayload = false;
rgrover1 257:7a50601356cc 749 return transport->getGap().setAdvertisingData(ADStructures, scanResponse);
rgrover1 257:7a50601356cc 750 }
rgrover1 257:7a50601356cc 751
rgrover1 257:7a50601356cc 752 inline ble_error_t
rgrover1 257:7a50601356cc 753 BLEDevice::startAdvertising(const GapAdvertisingParams &_advParams)
rgrover1 257:7a50601356cc 754 {
rgrover1 257:7a50601356cc 755 return transport->getGap().startAdvertising(_advParams);
rgrover1 257:7a50601356cc 756 }
rgrover1 257:7a50601356cc 757
rgrover1 257:7a50601356cc 758 #endif // ifndef __BLE_DEVICE__