Lightly modified version of the BLE stack, that doesn't bring up a DFUService by default... as we have our own.

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Mon Mar 02 11:50:48 2015 +0000
Revision:
305:71367f7cd078
Parent:
300:d9a39f759a6a
Child:
325:501ad8b8bbe5
Synchronized with git rev f557237f
Author: Rohit Grover
Release 0.2.13
==============

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

* Add support for onDataRead(); which is optionally implemented for stacks
where an event is generated in response to a read on a characteristic. This
feature is not implemented by any of the presently supported stacks.

* Update UUID class to get length and pointer. Added UUID comparison operator.

* BLEDevice::readCharacteristic() and BLEDevice::upateCharacteristic() should
take GattAttribute::Handle_t instead of uint16_t.

* fix documentation for setAdvertisingType() for ADV_SCANNABLE_UNDIRECTED.

* Extend GattAttribute to export a pointer to the attribute's length.

Bugfixes
~~~~~~~~

* Initialize the min/max length values correctly in the constructor for
URIDataChar. Previously, the minLength value was always set to URI_DATA_MAX,
whereas maxLen got initialized by the values stored persistently. Except for
the case of default initialization, the value of maxLength would be fetched at
initialization from persistent storage, and would always be less than the
minLength, potentially causing incorrect setup in the underlying stack.

Compatibility
~~~~~~~~~~~~~

This release is API compatible with 0.2.4.

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