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:
716:11b41f651697
Parent:
710:b2e1a2660ec2
Child:
725:f4a355b35cf8
Synchronized with git rev d80fec88
Author: Rohit Grover
Release 0.4.0
=============

This is a major release which introduces the GATT Client functionality. It
also aligns BLE_API with builds using our new package manager: yotta
(https://github.com/armmbed/yotta).

Many APIs have seen some redesign. We encourage our users to pay attention to
the changes and migrate appropriately over time. We've also taken care to
ensure that existing code continues to work the same way. There's more
documentation in the form of comment headers for APIs to explain proper usage;
in many cases comment headers suggest alternative use of APIs.

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

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

* Most APIs in the abstract base classes like Gap and GattServer return
BLE_ERROR_NOT_IMPLEMENTED. Previously many APIs were pure-virtual, which did
not permit partial ports to compile.

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

* BLEDevice has been renamed as BLE. A deprecated alias for BLEDevice is
available to support existing code.

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

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

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

* The callback for BLE.onTimeout() now receives a TimeoutSource_t to indicate
the cause of the timeout. This is perhaps the only breaking API change. We
expect it to have very little disruptive effect.

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

Bugfixes
~~~~~~~~

* None.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 710:b2e1a2660ec2 1 /* mbed Microcontroller Library
rgrover1 710:b2e1a2660ec2 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 710:b2e1a2660ec2 3 *
rgrover1 710:b2e1a2660ec2 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 710:b2e1a2660ec2 5 * you may not use this file except in compliance with the License.
rgrover1 710:b2e1a2660ec2 6 * You may obtain a copy of the License at
rgrover1 710:b2e1a2660ec2 7 *
rgrover1 710:b2e1a2660ec2 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 710:b2e1a2660ec2 9 *
rgrover1 710:b2e1a2660ec2 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 710:b2e1a2660ec2 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 710:b2e1a2660ec2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 710:b2e1a2660ec2 13 * See the License for the specific language governing permissions and
rgrover1 710:b2e1a2660ec2 14 * limitations under the License.
rgrover1 710:b2e1a2660ec2 15 */
rgrover1 710:b2e1a2660ec2 16
rgrover1 710:b2e1a2660ec2 17 #ifndef __GAP_H__
rgrover1 710:b2e1a2660ec2 18 #define __GAP_H__
rgrover1 710:b2e1a2660ec2 19
rgrover1 710:b2e1a2660ec2 20 #include "GapAdvertisingData.h"
rgrover1 710:b2e1a2660ec2 21 #include "GapAdvertisingParams.h"
rgrover1 710:b2e1a2660ec2 22 #include "GapScanningParams.h"
rgrover1 710:b2e1a2660ec2 23 #include "GapEvents.h"
rgrover1 710:b2e1a2660ec2 24 #include "CallChain.h"
rgrover1 710:b2e1a2660ec2 25 #include "FunctionPointerWithContext.h"
rgrover1 710:b2e1a2660ec2 26
rgrover1 710:b2e1a2660ec2 27 using namespace mbed;
rgrover1 710:b2e1a2660ec2 28
rgrover1 710:b2e1a2660ec2 29 /* Forward declarations for classes which will only be used for pointers or references in the following. */
rgrover1 710:b2e1a2660ec2 30 class GapAdvertisingParams;
rgrover1 710:b2e1a2660ec2 31 class GapScanningParams;
rgrover1 710:b2e1a2660ec2 32 class GapAdvertisingData;
rgrover1 710:b2e1a2660ec2 33
rgrover1 710:b2e1a2660ec2 34 class Gap {
rgrover1 710:b2e1a2660ec2 35 public:
rgrover1 710:b2e1a2660ec2 36 enum AddressType_t {
rgrover1 710:b2e1a2660ec2 37 ADDR_TYPE_PUBLIC = 0,
rgrover1 710:b2e1a2660ec2 38 ADDR_TYPE_RANDOM_STATIC,
rgrover1 710:b2e1a2660ec2 39 ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
rgrover1 710:b2e1a2660ec2 40 ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
rgrover1 710:b2e1a2660ec2 41 };
rgrover1 710:b2e1a2660ec2 42 typedef enum AddressType_t addr_type_t; /* @Note: deprecated. Use AddressType_t instead. */
rgrover1 710:b2e1a2660ec2 43
rgrover1 710:b2e1a2660ec2 44 static const unsigned ADDR_LEN = 6;
rgrover1 710:b2e1a2660ec2 45 typedef uint8_t Address_t[ADDR_LEN]; /* 48-bit address, LSB format. */
rgrover1 710:b2e1a2660ec2 46 typedef Address_t address_t; /* @Note: deprecated. Use Address_t instead. */
rgrover1 710:b2e1a2660ec2 47
rgrover1 710:b2e1a2660ec2 48 enum TimeoutSource_t {
rgrover1 710:b2e1a2660ec2 49 TIMEOUT_SRC_ADVERTISING = 0x00, /**< Advertising timeout. */
rgrover1 710:b2e1a2660ec2 50 TIMEOUT_SRC_SECURITY_REQUEST = 0x01, /**< Security request timeout. */
rgrover1 710:b2e1a2660ec2 51 TIMEOUT_SRC_SCAN = 0x02, /**< Scanning timeout. */
rgrover1 710:b2e1a2660ec2 52 TIMEOUT_SRC_CONN = 0x03, /**< Connection timeout. */
rgrover1 710:b2e1a2660ec2 53 };
rgrover1 710:b2e1a2660ec2 54
rgrover1 710:b2e1a2660ec2 55 /**
rgrover1 710:b2e1a2660ec2 56 * Enumeration for disconnection reasons. The values for these reasons are
rgrover1 710:b2e1a2660ec2 57 * derived from Nordic's implementation; but the reasons are meant to be
rgrover1 710:b2e1a2660ec2 58 * independent of the transport. If you are returned a reason which is not
rgrover1 710:b2e1a2660ec2 59 * covered by this enumeration, then please refer to the underlying
rgrover1 710:b2e1a2660ec2 60 * transport library.
rgrover1 710:b2e1a2660ec2 61 */
rgrover1 710:b2e1a2660ec2 62 enum DisconnectionReason_t {
rgrover1 710:b2e1a2660ec2 63 CONNECTION_TIMEOUT = 0x08,
rgrover1 710:b2e1a2660ec2 64 REMOTE_USER_TERMINATED_CONNECTION = 0x13,
rgrover1 710:b2e1a2660ec2 65 REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote Device Terminated Connection due to low resources.*/
rgrover1 710:b2e1a2660ec2 66 REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote Device Terminated Connection due to power off. */
rgrover1 710:b2e1a2660ec2 67 LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
rgrover1 710:b2e1a2660ec2 68 CONN_INTERVAL_UNACCEPTABLE = 0x3B,
rgrover1 710:b2e1a2660ec2 69 };
rgrover1 710:b2e1a2660ec2 70
rgrover1 710:b2e1a2660ec2 71 /* Describes the current state of the device (more than one bit can be set) */
rgrover1 710:b2e1a2660ec2 72 struct GapState_t {
rgrover1 710:b2e1a2660ec2 73 unsigned advertising : 1; /**< peripheral is currently advertising */
rgrover1 710:b2e1a2660ec2 74 unsigned connected : 1; /**< peripheral is connected to a central */
rgrover1 710:b2e1a2660ec2 75 };
rgrover1 710:b2e1a2660ec2 76
rgrover1 710:b2e1a2660ec2 77 typedef uint16_t Handle_t; /* Type for connection handle. */
rgrover1 710:b2e1a2660ec2 78
rgrover1 710:b2e1a2660ec2 79 typedef struct {
rgrover1 710:b2e1a2660ec2 80 uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 81 uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 82 uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 83 uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 710:b2e1a2660ec2 84 } ConnectionParams_t;
rgrover1 710:b2e1a2660ec2 85
rgrover1 710:b2e1a2660ec2 86 enum Role_t {
rgrover1 710:b2e1a2660ec2 87 PERIPHERAL = 0x1, /**< Peripheral Role. */
rgrover1 710:b2e1a2660ec2 88 CENTRAL = 0x2, /**< Central Role. */
rgrover1 710:b2e1a2660ec2 89 };
rgrover1 710:b2e1a2660ec2 90
rgrover1 710:b2e1a2660ec2 91 struct AdvertisementCallbackParams_t {
rgrover1 710:b2e1a2660ec2 92 Address_t peerAddr;
rgrover1 710:b2e1a2660ec2 93 int8_t rssi;
rgrover1 710:b2e1a2660ec2 94 bool isScanResponse;
rgrover1 710:b2e1a2660ec2 95 GapAdvertisingParams::AdvertisingType_t type;
rgrover1 710:b2e1a2660ec2 96 uint8_t advertisingDataLen;
rgrover1 710:b2e1a2660ec2 97 const uint8_t *advertisingData;
rgrover1 710:b2e1a2660ec2 98 };
rgrover1 710:b2e1a2660ec2 99 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
rgrover1 710:b2e1a2660ec2 100
rgrover1 710:b2e1a2660ec2 101 struct ConnectionCallbackParams_t {
rgrover1 710:b2e1a2660ec2 102 Handle_t handle;
rgrover1 710:b2e1a2660ec2 103 Role_t role;
rgrover1 710:b2e1a2660ec2 104 AddressType_t peerAddrType;
rgrover1 710:b2e1a2660ec2 105 Address_t peerAddr;
rgrover1 710:b2e1a2660ec2 106 AddressType_t ownAddrType;
rgrover1 710:b2e1a2660ec2 107 Address_t ownAddr;
rgrover1 710:b2e1a2660ec2 108 const ConnectionParams_t *connectionParams;
rgrover1 710:b2e1a2660ec2 109
rgrover1 710:b2e1a2660ec2 110 ConnectionCallbackParams_t(Handle_t handleIn,
rgrover1 710:b2e1a2660ec2 111 Role_t roleIn,
rgrover1 710:b2e1a2660ec2 112 AddressType_t peerAddrTypeIn,
rgrover1 710:b2e1a2660ec2 113 const uint8_t *peerAddrIn,
rgrover1 710:b2e1a2660ec2 114 AddressType_t ownAddrTypeIn,
rgrover1 710:b2e1a2660ec2 115 const uint8_t *ownAddrIn,
rgrover1 710:b2e1a2660ec2 116 const ConnectionParams_t *connectionParamsIn) :
rgrover1 710:b2e1a2660ec2 117 handle(handleIn),
rgrover1 710:b2e1a2660ec2 118 role(roleIn),
rgrover1 710:b2e1a2660ec2 119 peerAddrType(peerAddrTypeIn),
rgrover1 710:b2e1a2660ec2 120 peerAddr(),
rgrover1 710:b2e1a2660ec2 121 ownAddrType(ownAddrTypeIn),
rgrover1 710:b2e1a2660ec2 122 ownAddr(),
rgrover1 710:b2e1a2660ec2 123 connectionParams(connectionParamsIn) {
rgrover1 710:b2e1a2660ec2 124 memcpy(peerAddr, peerAddrIn, ADDR_LEN);
rgrover1 710:b2e1a2660ec2 125 memcpy(ownAddr, ownAddrIn, ADDR_LEN);
rgrover1 710:b2e1a2660ec2 126 }
rgrover1 710:b2e1a2660ec2 127 };
rgrover1 710:b2e1a2660ec2 128
rgrover1 710:b2e1a2660ec2 129 static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
rgrover1 710:b2e1a2660ec2 130 static const uint16_t UNIT_0_625_MS = 625; /**< Number of microseconds in 0.625 milliseconds. */
rgrover1 710:b2e1a2660ec2 131 static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 710:b2e1a2660ec2 132 return (durationInMillis * 1000) / UNIT_1_25_MS;
rgrover1 710:b2e1a2660ec2 133 }
rgrover1 710:b2e1a2660ec2 134 static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 710:b2e1a2660ec2 135 return (durationInMillis * 1000) / UNIT_0_625_MS;
rgrover1 710:b2e1a2660ec2 136 }
rgrover1 710:b2e1a2660ec2 137 static uint16_t ADVERTISEMENT_DURATION_UNITS_TO_MS(uint16_t gapUnits) {
rgrover1 710:b2e1a2660ec2 138 return (gapUnits * UNIT_0_625_MS) / 1000;
rgrover1 710:b2e1a2660ec2 139 }
rgrover1 710:b2e1a2660ec2 140
rgrover1 710:b2e1a2660ec2 141 typedef void (*TimeoutEventCallback_t)(TimeoutSource_t source);
rgrover1 710:b2e1a2660ec2 142 typedef void (*ConnectionEventCallback_t)(const ConnectionCallbackParams_t *params);
rgrover1 710:b2e1a2660ec2 143 typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
rgrover1 710:b2e1a2660ec2 144 typedef void (*RadioNotificationEventCallback_t)(bool radio_active); /* gets passed true for ACTIVE; false for INACTIVE. */
rgrover1 710:b2e1a2660ec2 145
rgrover1 710:b2e1a2660ec2 146 /*
rgrover1 710:b2e1a2660ec2 147 * The following functions are meant to be overridden in the platform-specific sub-class.
rgrover1 710:b2e1a2660ec2 148 */
rgrover1 710:b2e1a2660ec2 149 public:
rgrover1 710:b2e1a2660ec2 150 /**
rgrover1 710:b2e1a2660ec2 151 * Set the BTLE MAC address and type. Please note that the address format is
rgrover1 710:b2e1a2660ec2 152 * LSB (least significant byte first). Please refer to Address_t.
rgrover1 710:b2e1a2660ec2 153 *
rgrover1 710:b2e1a2660ec2 154 * @return BLE_ERROR_NONE on success.
rgrover1 710:b2e1a2660ec2 155 */
rgrover1 710:b2e1a2660ec2 156 virtual ble_error_t setAddress(AddressType_t type, const Address_t address) {
rgrover1 710:b2e1a2660ec2 157 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 158 }
rgrover1 710:b2e1a2660ec2 159
rgrover1 710:b2e1a2660ec2 160 /**
rgrover1 710:b2e1a2660ec2 161 * Fetch the BTLE MAC address and type.
rgrover1 710:b2e1a2660ec2 162 *
rgrover1 710:b2e1a2660ec2 163 * @return BLE_ERROR_NONE on success.
rgrover1 710:b2e1a2660ec2 164 */
rgrover1 710:b2e1a2660ec2 165 virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) {
rgrover1 710:b2e1a2660ec2 166 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 167 }
rgrover1 710:b2e1a2660ec2 168
rgrover1 710:b2e1a2660ec2 169 /**
rgrover1 710:b2e1a2660ec2 170 * @return Minimum Advertising interval in milliseconds.
rgrover1 710:b2e1a2660ec2 171 */
rgrover1 710:b2e1a2660ec2 172 virtual uint16_t getMinAdvertisingInterval(void) const {
rgrover1 710:b2e1a2660ec2 173 return 0; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 174 }
rgrover1 710:b2e1a2660ec2 175
rgrover1 710:b2e1a2660ec2 176 /**
rgrover1 710:b2e1a2660ec2 177 * @return Minimum Advertising interval in milliseconds for non-connectible mode.
rgrover1 710:b2e1a2660ec2 178 */
rgrover1 710:b2e1a2660ec2 179 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const {
rgrover1 710:b2e1a2660ec2 180 return 0; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 181 }
rgrover1 710:b2e1a2660ec2 182
rgrover1 710:b2e1a2660ec2 183 /**
rgrover1 710:b2e1a2660ec2 184 * @return Maximum Advertising interval in milliseconds.
rgrover1 710:b2e1a2660ec2 185 */
rgrover1 710:b2e1a2660ec2 186 virtual uint16_t getMaxAdvertisingInterval(void) const {
rgrover1 710:b2e1a2660ec2 187 return 0xFFFF; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 188 }
rgrover1 710:b2e1a2660ec2 189
rgrover1 710:b2e1a2660ec2 190 virtual ble_error_t stopAdvertising(void) {
rgrover1 710:b2e1a2660ec2 191 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 192 }
rgrover1 710:b2e1a2660ec2 193
rgrover1 710:b2e1a2660ec2 194 /**
rgrover1 710:b2e1a2660ec2 195 * Stop scanning. The current scanning parameters remain in effect.
rgrover1 710:b2e1a2660ec2 196 *
rgrover1 710:b2e1a2660ec2 197 * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
rgrover1 710:b2e1a2660ec2 198 */
rgrover1 710:b2e1a2660ec2 199 virtual ble_error_t stopScan() {
rgrover1 710:b2e1a2660ec2 200 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 201 }
rgrover1 710:b2e1a2660ec2 202
rgrover1 710:b2e1a2660ec2 203 /**
rgrover1 710:b2e1a2660ec2 204 * Create a connection (GAP Link Establishment).
rgrover1 710:b2e1a2660ec2 205 *
rgrover1 710:b2e1a2660ec2 206 * @param peerAddr
rgrover1 710:b2e1a2660ec2 207 * 48-bit address, LSB format.
rgrover1 710:b2e1a2660ec2 208 * @param peerAddrType
rgrover1 710:b2e1a2660ec2 209 * Address type of the peer.
rgrover1 710:b2e1a2660ec2 210 * @param connectionParams
rgrover1 710:b2e1a2660ec2 211 * Connection parameters.
rgrover1 710:b2e1a2660ec2 212 * @param scanParams
rgrover1 710:b2e1a2660ec2 213 * Paramters to be used while scanning for the peer.
rgrover1 710:b2e1a2660ec2 214 * @return BLE_ERROR_NONE if connection establishment procedure is started
rgrover1 710:b2e1a2660ec2 215 * successfully. The connectionCallback (if set) will be invoked upon
rgrover1 710:b2e1a2660ec2 216 * a connection event.
rgrover1 710:b2e1a2660ec2 217 */
rgrover1 710:b2e1a2660ec2 218 virtual ble_error_t connect(const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 219 Gap::AddressType_t peerAddrType,
rgrover1 710:b2e1a2660ec2 220 const ConnectionParams_t *connectionParams,
rgrover1 710:b2e1a2660ec2 221 const GapScanningParams *scanParams) {
rgrover1 710:b2e1a2660ec2 222 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 223 }
rgrover1 710:b2e1a2660ec2 224
rgrover1 710:b2e1a2660ec2 225 /**
rgrover1 710:b2e1a2660ec2 226 * This call initiates the disconnection procedure, and its completion will
rgrover1 710:b2e1a2660ec2 227 * be communicated to the application with an invocation of the
rgrover1 710:b2e1a2660ec2 228 * disconnectionCallback.
rgrover1 710:b2e1a2660ec2 229 *
rgrover1 710:b2e1a2660ec2 230 * @param reason
rgrover1 710:b2e1a2660ec2 231 * The reason for disconnection to be sent back to the peer.
rgrover1 710:b2e1a2660ec2 232 */
rgrover1 710:b2e1a2660ec2 233 virtual ble_error_t disconnect(Handle_t connectionHandle, DisconnectionReason_t reason) {
rgrover1 710:b2e1a2660ec2 234 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 235 }
rgrover1 710:b2e1a2660ec2 236
rgrover1 710:b2e1a2660ec2 237 /**
rgrover1 710:b2e1a2660ec2 238 * This call initiates the disconnection procedure, and its completion will
rgrover1 710:b2e1a2660ec2 239 * be communicated to the application with an invocation of the
rgrover1 710:b2e1a2660ec2 240 * disconnectionCallback.
rgrover1 710:b2e1a2660ec2 241 *
rgrover1 710:b2e1a2660ec2 242 * @param reason
rgrover1 710:b2e1a2660ec2 243 * The reason for disconnection to be sent back to the peer.
rgrover1 710:b2e1a2660ec2 244 *
rgrover1 710:b2e1a2660ec2 245 * @note: this version of disconnect() doesn't take a connection handle. It
rgrover1 710:b2e1a2660ec2 246 * will work reliably only for stacks which are limited to a single
rgrover1 710:b2e1a2660ec2 247 * connection. This API should be considered *deprecated* in favour of the
rgrover1 710:b2e1a2660ec2 248 * altertive which takes a connection handle. It will be dropped in the future.
rgrover1 710:b2e1a2660ec2 249 */
rgrover1 710:b2e1a2660ec2 250 virtual ble_error_t disconnect(DisconnectionReason_t reason) {
rgrover1 710:b2e1a2660ec2 251 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 252 }
rgrover1 710:b2e1a2660ec2 253
rgrover1 710:b2e1a2660ec2 254 /**
rgrover1 710:b2e1a2660ec2 255 * Get the GAP peripheral preferred connection parameters. These are the
rgrover1 710:b2e1a2660ec2 256 * defaults that the peripheral would like to have in a connection. The
rgrover1 710:b2e1a2660ec2 257 * choice of the connection parameters is eventually up to the central.
rgrover1 710:b2e1a2660ec2 258 *
rgrover1 710:b2e1a2660ec2 259 * @param[out] params
rgrover1 710:b2e1a2660ec2 260 * The structure where the parameters will be stored. Memory
rgrover1 710:b2e1a2660ec2 261 * for this is owned by the caller.
rgrover1 710:b2e1a2660ec2 262 *
rgrover1 710:b2e1a2660ec2 263 * @return BLE_ERROR_NONE if the parameters were successfully filled into
rgrover1 710:b2e1a2660ec2 264 * the given structure pointed to by params.
rgrover1 710:b2e1a2660ec2 265 */
rgrover1 710:b2e1a2660ec2 266 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) {
rgrover1 710:b2e1a2660ec2 267 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 268 }
rgrover1 710:b2e1a2660ec2 269
rgrover1 710:b2e1a2660ec2 270 /**
rgrover1 710:b2e1a2660ec2 271 * Set the GAP peripheral preferred connection parameters. These are the
rgrover1 710:b2e1a2660ec2 272 * defaults that the peripheral would like to have in a connection. The
rgrover1 710:b2e1a2660ec2 273 * choice of the connection parameters is eventually up to the central.
rgrover1 710:b2e1a2660ec2 274 *
rgrover1 710:b2e1a2660ec2 275 * @param[in] params
rgrover1 710:b2e1a2660ec2 276 * The structure containing the desired parameters.
rgrover1 710:b2e1a2660ec2 277 */
rgrover1 710:b2e1a2660ec2 278 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) {
rgrover1 710:b2e1a2660ec2 279 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 280 }
rgrover1 710:b2e1a2660ec2 281
rgrover1 710:b2e1a2660ec2 282 /**
rgrover1 710:b2e1a2660ec2 283 * Update connection parameters while in the peripheral role.
rgrover1 710:b2e1a2660ec2 284 * @details In the peripheral role, this will send the corresponding L2CAP request to the connected peer and wait for
rgrover1 710:b2e1a2660ec2 285 * the central to perform the procedure.
rgrover1 710:b2e1a2660ec2 286 * @param[in] handle
rgrover1 710:b2e1a2660ec2 287 * Connection Handle
rgrover1 710:b2e1a2660ec2 288 * @param[in] params
rgrover1 710:b2e1a2660ec2 289 * Pointer to desired connection parameters. If NULL is provided on a peripheral role,
rgrover1 710:b2e1a2660ec2 290 * the parameters in the PPCP characteristic of the GAP service will be used instead.
rgrover1 710:b2e1a2660ec2 291 */
rgrover1 710:b2e1a2660ec2 292 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) {
rgrover1 710:b2e1a2660ec2 293 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 294 }
rgrover1 710:b2e1a2660ec2 295
rgrover1 710:b2e1a2660ec2 296 /**
rgrover1 710:b2e1a2660ec2 297 * Set the device name characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 298 * @param[in] deviceName
rgrover1 710:b2e1a2660ec2 299 * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
rgrover1 710:b2e1a2660ec2 300 */
rgrover1 710:b2e1a2660ec2 301 virtual ble_error_t setDeviceName(const uint8_t *deviceName) {
rgrover1 710:b2e1a2660ec2 302 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 303 }
rgrover1 710:b2e1a2660ec2 304
rgrover1 710:b2e1a2660ec2 305 /**
rgrover1 710:b2e1a2660ec2 306 * Get the value of the device name characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 307 * @param[out] deviceName
rgrover1 710:b2e1a2660ec2 308 * Pointer to an empty buffer where the UTF-8 *non NULL-
rgrover1 710:b2e1a2660ec2 309 * terminated* string will be placed. Set this
rgrover1 710:b2e1a2660ec2 310 * value to NULL in order to obtain the deviceName-length
rgrover1 710:b2e1a2660ec2 311 * from the 'length' parameter.
rgrover1 710:b2e1a2660ec2 312 *
rgrover1 710:b2e1a2660ec2 313 * @param[in/out] lengthP
rgrover1 710:b2e1a2660ec2 314 * (on input) Length of the buffer pointed to by deviceName;
rgrover1 710:b2e1a2660ec2 315 * (on output) the complete device name length (without the
rgrover1 710:b2e1a2660ec2 316 * null terminator).
rgrover1 710:b2e1a2660ec2 317 *
rgrover1 710:b2e1a2660ec2 318 * @note If the device name is longer than the size of the supplied buffer,
rgrover1 710:b2e1a2660ec2 319 * length will return the complete device name length, and not the
rgrover1 710:b2e1a2660ec2 320 * number of bytes actually returned in deviceName. The application may
rgrover1 710:b2e1a2660ec2 321 * use this information to retry with a suitable buffer size.
rgrover1 710:b2e1a2660ec2 322 */
rgrover1 710:b2e1a2660ec2 323 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) {
rgrover1 710:b2e1a2660ec2 324 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 325 }
rgrover1 710:b2e1a2660ec2 326
rgrover1 710:b2e1a2660ec2 327 /**
rgrover1 710:b2e1a2660ec2 328 * Set the appearance characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 329 * @param[in] appearance
rgrover1 710:b2e1a2660ec2 330 * The new value for the device-appearance.
rgrover1 710:b2e1a2660ec2 331 */
rgrover1 710:b2e1a2660ec2 332 virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) {
rgrover1 710:b2e1a2660ec2 333 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 334 }
rgrover1 710:b2e1a2660ec2 335
rgrover1 710:b2e1a2660ec2 336 /**
rgrover1 710:b2e1a2660ec2 337 * Get the appearance characteristic in the GAP service.
rgrover1 710:b2e1a2660ec2 338 * @param[out] appearance
rgrover1 710:b2e1a2660ec2 339 * The new value for the device-appearance.
rgrover1 710:b2e1a2660ec2 340 */
rgrover1 710:b2e1a2660ec2 341 virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) {
rgrover1 710:b2e1a2660ec2 342 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 343 }
rgrover1 710:b2e1a2660ec2 344
rgrover1 710:b2e1a2660ec2 345 /**
rgrover1 710:b2e1a2660ec2 346 * Set the radio's transmit power.
rgrover1 710:b2e1a2660ec2 347 * @param[in] txPower Radio transmit power in dBm.
rgrover1 710:b2e1a2660ec2 348 */
rgrover1 710:b2e1a2660ec2 349 virtual ble_error_t setTxPower(int8_t txPower) {
rgrover1 710:b2e1a2660ec2 350 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 351 }
rgrover1 710:b2e1a2660ec2 352
rgrover1 710:b2e1a2660ec2 353 /**
rgrover1 710:b2e1a2660ec2 354 * Query the underlying stack for permitted arguments for setTxPower().
rgrover1 710:b2e1a2660ec2 355 *
rgrover1 710:b2e1a2660ec2 356 * @param[out] valueArrayPP
rgrover1 710:b2e1a2660ec2 357 * Out parameter to receive the immutable array of Tx values.
rgrover1 710:b2e1a2660ec2 358 * @param[out] countP
rgrover1 710:b2e1a2660ec2 359 * Out parameter to receive the array's size.
rgrover1 710:b2e1a2660ec2 360 */
rgrover1 710:b2e1a2660ec2 361 virtual void getPermittedTxPowerValues(const int8_t **valueArrayPP, size_t *countP) {
rgrover1 710:b2e1a2660ec2 362 *countP = 0; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 363 }
rgrover1 710:b2e1a2660ec2 364
rgrover1 710:b2e1a2660ec2 365 protected:
rgrover1 710:b2e1a2660ec2 366 /* Override the following in the underlying adaptation layer to provide the functionality of scanning. */
rgrover1 710:b2e1a2660ec2 367 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) {
rgrover1 710:b2e1a2660ec2 368 return BLE_ERROR_NOT_IMPLEMENTED; /* default implementation; override this API if this capability is supported. */
rgrover1 710:b2e1a2660ec2 369 }
rgrover1 710:b2e1a2660ec2 370
rgrover1 710:b2e1a2660ec2 371 /*
rgrover1 710:b2e1a2660ec2 372 * APIs with non-virtual implementations.
rgrover1 710:b2e1a2660ec2 373 */
rgrover1 710:b2e1a2660ec2 374 public:
rgrover1 710:b2e1a2660ec2 375 /**
rgrover1 710:b2e1a2660ec2 376 * Returns the current GAP state of the device using a bitmask which
rgrover1 710:b2e1a2660ec2 377 * describes whether the device is advertising and/or connected.
rgrover1 710:b2e1a2660ec2 378 */
rgrover1 710:b2e1a2660ec2 379 GapState_t getState(void) const {
rgrover1 710:b2e1a2660ec2 380 return state;
rgrover1 710:b2e1a2660ec2 381 }
rgrover1 710:b2e1a2660ec2 382
rgrover1 710:b2e1a2660ec2 383 /**
rgrover1 710:b2e1a2660ec2 384 * Set the GAP advertising mode to use for this device.
rgrover1 710:b2e1a2660ec2 385 */
rgrover1 710:b2e1a2660ec2 386 void setAdvertisingType(GapAdvertisingParams::AdvertisingType_t advType) {
rgrover1 710:b2e1a2660ec2 387 _advParams.setAdvertisingType(advType);
rgrover1 710:b2e1a2660ec2 388 }
rgrover1 710:b2e1a2660ec2 389
rgrover1 710:b2e1a2660ec2 390 /**
rgrover1 710:b2e1a2660ec2 391 * @param[in] interval
rgrover1 710:b2e1a2660ec2 392 * Advertising interval in units of milliseconds. Advertising
rgrover1 710:b2e1a2660ec2 393 * is disabled if interval is 0. If interval is smaller than
rgrover1 710:b2e1a2660ec2 394 * the minimum supported value, then the minimum supported
rgrover1 710:b2e1a2660ec2 395 * value is used instead. This minimum value can be discovered
rgrover1 710:b2e1a2660ec2 396 * using getMinAdvertisingInterval().
rgrover1 710:b2e1a2660ec2 397 *
rgrover1 710:b2e1a2660ec2 398 * This field must be set to 0 if connectionMode is equal
rgrover1 710:b2e1a2660ec2 399 * to ADV_CONNECTABLE_DIRECTED.
rgrover1 710:b2e1a2660ec2 400 *
rgrover1 710:b2e1a2660ec2 401 * @note: Decreasing this value will allow central devices to detect a
rgrover1 710:b2e1a2660ec2 402 * peripheral faster at the expense of more power being used by the radio
rgrover1 710:b2e1a2660ec2 403 * due to the higher data transmit rate.
rgrover1 710:b2e1a2660ec2 404 *
rgrover1 710:b2e1a2660ec2 405 * @note: This API is now *deprecated* and will be dropped in the future.
rgrover1 710:b2e1a2660ec2 406 * You should use the parallel API from Gap directly. A former call to
rgrover1 710:b2e1a2660ec2 407 * ble.setAdvertisingInterval(...) should now be achieved using
rgrover1 710:b2e1a2660ec2 408 * ble.gap().setAdvertisingInterval(...).
rgrover1 710:b2e1a2660ec2 409 *
rgrover1 710:b2e1a2660ec2 410 * @Note: [WARNING] This API previously used 0.625ms as the unit for its
rgrover1 710:b2e1a2660ec2 411 * 'interval' argument. That required an explicit conversion from
rgrover1 710:b2e1a2660ec2 412 * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is
rgrover1 710:b2e1a2660ec2 413 * no longer required as the new units are milliseconds. Any application
rgrover1 710:b2e1a2660ec2 414 * code depending on the old semantics would need to be updated accordingly.
rgrover1 710:b2e1a2660ec2 415 */
rgrover1 710:b2e1a2660ec2 416 void setAdvertisingInterval(uint16_t interval) {
rgrover1 710:b2e1a2660ec2 417 if (interval == 0) {
rgrover1 710:b2e1a2660ec2 418 stopAdvertising();
rgrover1 710:b2e1a2660ec2 419 } else if (interval < getMinAdvertisingInterval()) {
rgrover1 710:b2e1a2660ec2 420 interval = getMinAdvertisingInterval();
rgrover1 710:b2e1a2660ec2 421 }
rgrover1 710:b2e1a2660ec2 422 _advParams.setInterval(MSEC_TO_ADVERTISEMENT_DURATION_UNITS(interval));
rgrover1 710:b2e1a2660ec2 423 }
rgrover1 710:b2e1a2660ec2 424
rgrover1 710:b2e1a2660ec2 425 /**
rgrover1 710:b2e1a2660ec2 426 * @param[in] timeout
rgrover1 710:b2e1a2660ec2 427 * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1
rgrover1 710:b2e1a2660ec2 428 * and 16383). Use 0 to disable the advertising timeout.
rgrover1 710:b2e1a2660ec2 429 */
rgrover1 710:b2e1a2660ec2 430 void setAdvertisingTimeout(uint16_t timeout) {
rgrover1 710:b2e1a2660ec2 431 _advParams.setTimeout(timeout);
rgrover1 710:b2e1a2660ec2 432 }
rgrover1 710:b2e1a2660ec2 433
rgrover1 710:b2e1a2660ec2 434 /**
rgrover1 710:b2e1a2660ec2 435 * Start advertising.
rgrover1 710:b2e1a2660ec2 436 */
rgrover1 710:b2e1a2660ec2 437 ble_error_t startAdvertising(void) {
rgrover1 710:b2e1a2660ec2 438 setAdvertisingData(); /* update the underlying stack */
rgrover1 710:b2e1a2660ec2 439 return startAdvertising(_advParams);
rgrover1 710:b2e1a2660ec2 440 }
rgrover1 710:b2e1a2660ec2 441
rgrover1 710:b2e1a2660ec2 442 /**
rgrover1 710:b2e1a2660ec2 443 * Reset any advertising payload prepared from prior calls to
rgrover1 710:b2e1a2660ec2 444 * accumulateAdvertisingPayload(). This automatically propagates the re-
rgrover1 710:b2e1a2660ec2 445 * initialized adv payload to the underlying stack.
rgrover1 710:b2e1a2660ec2 446 *
rgrover1 710:b2e1a2660ec2 447 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 710:b2e1a2660ec2 448 * startAdvertising() before the update takes effect.
rgrover1 710:b2e1a2660ec2 449 */
rgrover1 710:b2e1a2660ec2 450 void clearAdvertisingPayload(void) {
rgrover1 710:b2e1a2660ec2 451 _advPayload.clear();
rgrover1 710:b2e1a2660ec2 452 setAdvertisingData();
rgrover1 710:b2e1a2660ec2 453 }
rgrover1 710:b2e1a2660ec2 454
rgrover1 710:b2e1a2660ec2 455 /**
rgrover1 710:b2e1a2660ec2 456 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 710:b2e1a2660ec2 457 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 710:b2e1a2660ec2 458 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 710:b2e1a2660ec2 459 * small.
rgrover1 710:b2e1a2660ec2 460 *
rgrover1 710:b2e1a2660ec2 461 * @param[in] flags
rgrover1 710:b2e1a2660ec2 462 * The flags to be added. Please refer to
rgrover1 710:b2e1a2660ec2 463 * GapAdvertisingData::Flags for valid flags. Multiple
rgrover1 710:b2e1a2660ec2 464 * flags may be specified in combination.
rgrover1 710:b2e1a2660ec2 465 */
rgrover1 710:b2e1a2660ec2 466 ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
rgrover1 710:b2e1a2660ec2 467 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 468 if ((rc = _advPayload.addFlags(flags)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 469 return rc;
rgrover1 710:b2e1a2660ec2 470 }
rgrover1 710:b2e1a2660ec2 471
rgrover1 710:b2e1a2660ec2 472 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 473 }
rgrover1 710:b2e1a2660ec2 474
rgrover1 710:b2e1a2660ec2 475 /**
rgrover1 710:b2e1a2660ec2 476 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 710:b2e1a2660ec2 477 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 710:b2e1a2660ec2 478 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 710:b2e1a2660ec2 479 * small.
rgrover1 710:b2e1a2660ec2 480 *
rgrover1 710:b2e1a2660ec2 481 * @param app
rgrover1 710:b2e1a2660ec2 482 * The appearance of the peripheral.
rgrover1 710:b2e1a2660ec2 483 */
rgrover1 710:b2e1a2660ec2 484 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
rgrover1 710:b2e1a2660ec2 485 setAppearance(app);
rgrover1 710:b2e1a2660ec2 486
rgrover1 710:b2e1a2660ec2 487 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 488 if ((rc = _advPayload.addAppearance(app)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 489 return rc;
rgrover1 710:b2e1a2660ec2 490 }
rgrover1 710:b2e1a2660ec2 491
rgrover1 710:b2e1a2660ec2 492 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 493 }
rgrover1 710:b2e1a2660ec2 494
rgrover1 710:b2e1a2660ec2 495 /**
rgrover1 710:b2e1a2660ec2 496 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 710:b2e1a2660ec2 497 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 710:b2e1a2660ec2 498 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 710:b2e1a2660ec2 499 * small.
rgrover1 710:b2e1a2660ec2 500 *
rgrover1 710:b2e1a2660ec2 501 * @param app
rgrover1 710:b2e1a2660ec2 502 * The max transmit power to be used by the controller. This is
rgrover1 710:b2e1a2660ec2 503 * only a hint.
rgrover1 710:b2e1a2660ec2 504 */
rgrover1 710:b2e1a2660ec2 505 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
rgrover1 710:b2e1a2660ec2 506 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 507 if ((rc = _advPayload.addTxPower(power)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 508 return rc;
rgrover1 710:b2e1a2660ec2 509 }
rgrover1 710:b2e1a2660ec2 510
rgrover1 710:b2e1a2660ec2 511 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 512 }
rgrover1 710:b2e1a2660ec2 513
rgrover1 710:b2e1a2660ec2 514 /**
rgrover1 710:b2e1a2660ec2 515 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 710:b2e1a2660ec2 516 * advertising payload. Please note that the payload is limited to 31 bytes.
rgrover1 710:b2e1a2660ec2 517 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
rgrover1 710:b2e1a2660ec2 518 * advertising payload proves to be too small.
rgrover1 710:b2e1a2660ec2 519 *
rgrover1 710:b2e1a2660ec2 520 * @param type The type which describes the variable length data.
rgrover1 710:b2e1a2660ec2 521 * @param data data bytes.
rgrover1 710:b2e1a2660ec2 522 * @param len length of data.
rgrover1 710:b2e1a2660ec2 523 */
rgrover1 710:b2e1a2660ec2 524 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 710:b2e1a2660ec2 525 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
rgrover1 710:b2e1a2660ec2 526 setDeviceName(data);
rgrover1 710:b2e1a2660ec2 527 }
rgrover1 710:b2e1a2660ec2 528
rgrover1 710:b2e1a2660ec2 529 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 530 if ((rc = _advPayload.addData(type, data, len)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 531 return rc;
rgrover1 710:b2e1a2660ec2 532 }
rgrover1 710:b2e1a2660ec2 533
rgrover1 710:b2e1a2660ec2 534 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 535 }
rgrover1 710:b2e1a2660ec2 536
rgrover1 710:b2e1a2660ec2 537 /**
rgrover1 710:b2e1a2660ec2 538 * Setup a particular, user-constructed advertisement payload for the
rgrover1 710:b2e1a2660ec2 539 * underlying stack. It would be uncommon for this API to be used directly;
rgrover1 710:b2e1a2660ec2 540 * there are other APIs to build an advertisement payload (see above).
rgrover1 710:b2e1a2660ec2 541 */
rgrover1 710:b2e1a2660ec2 542 ble_error_t setAdvertisingPayload(const GapAdvertisingData &payload) {
rgrover1 710:b2e1a2660ec2 543 _advPayload = payload;
rgrover1 710:b2e1a2660ec2 544 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 545 }
rgrover1 710:b2e1a2660ec2 546
rgrover1 710:b2e1a2660ec2 547 /**
rgrover1 710:b2e1a2660ec2 548 * @return Read back advertising data. Useful for storing and
rgrover1 710:b2e1a2660ec2 549 * restoring payload.
rgrover1 710:b2e1a2660ec2 550 */
rgrover1 710:b2e1a2660ec2 551 const GapAdvertisingData &getAdvertisingPayload(void) const {
rgrover1 710:b2e1a2660ec2 552 return _advPayload;
rgrover1 710:b2e1a2660ec2 553 }
rgrover1 710:b2e1a2660ec2 554
rgrover1 710:b2e1a2660ec2 555 /**
rgrover1 710:b2e1a2660ec2 556 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 710:b2e1a2660ec2 557 * scanResponse payload.
rgrover1 710:b2e1a2660ec2 558 *
rgrover1 710:b2e1a2660ec2 559 * @param[in] type The type which describes the variable length data.
rgrover1 710:b2e1a2660ec2 560 * @param[in] data data bytes.
rgrover1 710:b2e1a2660ec2 561 * @param[in] len length of data.
rgrover1 710:b2e1a2660ec2 562 */
rgrover1 710:b2e1a2660ec2 563 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 710:b2e1a2660ec2 564 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 565 if ((rc = _scanResponse.addData(type, data, len)) != BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 566 return rc;
rgrover1 710:b2e1a2660ec2 567 }
rgrover1 710:b2e1a2660ec2 568
rgrover1 710:b2e1a2660ec2 569 return setAdvertisingData();
rgrover1 710:b2e1a2660ec2 570 }
rgrover1 710:b2e1a2660ec2 571
rgrover1 710:b2e1a2660ec2 572 /**
rgrover1 710:b2e1a2660ec2 573 * Reset any scan response prepared from prior calls to
rgrover1 710:b2e1a2660ec2 574 * accumulateScanResponse().
rgrover1 710:b2e1a2660ec2 575 *
rgrover1 710:b2e1a2660ec2 576 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 710:b2e1a2660ec2 577 * startAdvertising() before the update takes effect.
rgrover1 710:b2e1a2660ec2 578 */
rgrover1 710:b2e1a2660ec2 579 void clearScanResponse(void) {
rgrover1 710:b2e1a2660ec2 580 _scanResponse.clear();
rgrover1 710:b2e1a2660ec2 581 setAdvertisingData();
rgrover1 710:b2e1a2660ec2 582 }
rgrover1 710:b2e1a2660ec2 583
rgrover1 710:b2e1a2660ec2 584 /**
rgrover1 710:b2e1a2660ec2 585 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 586 * @param[in] interval
rgrover1 710:b2e1a2660ec2 587 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 588 * @param[in] window
rgrover1 710:b2e1a2660ec2 589 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 590 * @param[in] timeout
rgrover1 710:b2e1a2660ec2 591 * Scan timeout (in seconds) between 0x0001 and 0xFFFF, 0x0000 disables timeout.
rgrover1 710:b2e1a2660ec2 592 * @param[in] activeScanning
rgrover1 710:b2e1a2660ec2 593 * Set to True if active-scanning is required. This is used to fetch the
rgrover1 710:b2e1a2660ec2 594 * scan response from a peer if possible.
rgrover1 710:b2e1a2660ec2 595 *
rgrover1 710:b2e1a2660ec2 596 * The scanning window divided by the interval determines the duty cycle for
rgrover1 710:b2e1a2660ec2 597 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 710:b2e1a2660ec2 598 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 710:b2e1a2660ec2 599 * to have the interval and window set to the same value. In this case,
rgrover1 710:b2e1a2660ec2 600 * scanning is continuous, with a change of scanning frequency once every
rgrover1 710:b2e1a2660ec2 601 * interval.
rgrover1 710:b2e1a2660ec2 602 *
rgrover1 710:b2e1a2660ec2 603 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 604 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 605 *
rgrover1 710:b2e1a2660ec2 606 * @Note: The scan interval and window are recommendations to the BLE stack.
rgrover1 710:b2e1a2660ec2 607 */
rgrover1 710:b2e1a2660ec2 608 ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
rgrover1 710:b2e1a2660ec2 609 uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
rgrover1 710:b2e1a2660ec2 610 uint16_t timeout = 0,
rgrover1 710:b2e1a2660ec2 611 bool activeScanning = false) {
rgrover1 710:b2e1a2660ec2 612 ble_error_t rc;
rgrover1 710:b2e1a2660ec2 613 if (((rc = _scanningParams.setInterval(interval)) == BLE_ERROR_NONE) &&
rgrover1 710:b2e1a2660ec2 614 ((rc = _scanningParams.setWindow(window)) == BLE_ERROR_NONE) &&
rgrover1 710:b2e1a2660ec2 615 ((rc = _scanningParams.setTimeout(timeout)) == BLE_ERROR_NONE)) {
rgrover1 710:b2e1a2660ec2 616 _scanningParams.setActiveScanning(activeScanning);
rgrover1 710:b2e1a2660ec2 617 return BLE_ERROR_NONE;
rgrover1 710:b2e1a2660ec2 618 }
rgrover1 710:b2e1a2660ec2 619
rgrover1 710:b2e1a2660ec2 620 return rc;
rgrover1 710:b2e1a2660ec2 621 }
rgrover1 710:b2e1a2660ec2 622
rgrover1 710:b2e1a2660ec2 623 /**
rgrover1 710:b2e1a2660ec2 624 * Setup the scanInterval parameter for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 625 * @param[in] interval
rgrover1 710:b2e1a2660ec2 626 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 627 *
rgrover1 710:b2e1a2660ec2 628 * The scanning window divided by the interval determines the duty cycle for
rgrover1 710:b2e1a2660ec2 629 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 710:b2e1a2660ec2 630 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 710:b2e1a2660ec2 631 * to have the interval and window set to the same value. In this case,
rgrover1 710:b2e1a2660ec2 632 * scanning is continuous, with a change of scanning frequency once every
rgrover1 710:b2e1a2660ec2 633 * interval.
rgrover1 710:b2e1a2660ec2 634 *
rgrover1 710:b2e1a2660ec2 635 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 636 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 637 */
rgrover1 710:b2e1a2660ec2 638 ble_error_t setScanInterval(uint16_t interval) {
rgrover1 710:b2e1a2660ec2 639 return _scanningParams.setInterval(interval);
rgrover1 710:b2e1a2660ec2 640 }
rgrover1 710:b2e1a2660ec2 641
rgrover1 710:b2e1a2660ec2 642 /**
rgrover1 710:b2e1a2660ec2 643 * Setup the scanWindow parameter for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 644 * @param[in] window
rgrover1 710:b2e1a2660ec2 645 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 710:b2e1a2660ec2 646 *
rgrover1 710:b2e1a2660ec2 647 * The scanning window divided by the interval determines the duty cycle for
rgrover1 710:b2e1a2660ec2 648 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 710:b2e1a2660ec2 649 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 710:b2e1a2660ec2 650 * to have the interval and window set to the same value. In this case,
rgrover1 710:b2e1a2660ec2 651 * scanning is continuous, with a change of scanning frequency once every
rgrover1 710:b2e1a2660ec2 652 * interval.
rgrover1 710:b2e1a2660ec2 653 *
rgrover1 710:b2e1a2660ec2 654 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 655 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 656 */
rgrover1 710:b2e1a2660ec2 657 ble_error_t setScanWindow(uint16_t window) {
rgrover1 710:b2e1a2660ec2 658 return _scanningParams.setWindow(window);
rgrover1 710:b2e1a2660ec2 659 }
rgrover1 710:b2e1a2660ec2 660
rgrover1 710:b2e1a2660ec2 661 /**
rgrover1 710:b2e1a2660ec2 662 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 663 * @param[in] timeout
rgrover1 710:b2e1a2660ec2 664 * Scan timeout (in seconds) between 0x0001 and 0xFFFF, 0x0000 disables timeout.
rgrover1 710:b2e1a2660ec2 665 *
rgrover1 710:b2e1a2660ec2 666 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 667 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 668 */
rgrover1 710:b2e1a2660ec2 669 ble_error_t setScanTimeout(uint16_t timeout) {
rgrover1 710:b2e1a2660ec2 670 return _scanningParams.setTimeout(timeout);
rgrover1 710:b2e1a2660ec2 671 }
rgrover1 710:b2e1a2660ec2 672
rgrover1 710:b2e1a2660ec2 673 /**
rgrover1 710:b2e1a2660ec2 674 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 710:b2e1a2660ec2 675 * @param[in] activeScanning
rgrover1 710:b2e1a2660ec2 676 * Set to True if active-scanning is required. This is used to fetch the
rgrover1 710:b2e1a2660ec2 677 * scan response from a peer if possible.
rgrover1 710:b2e1a2660ec2 678 *
rgrover1 710:b2e1a2660ec2 679 * Once the scanning parameters have been configured, scanning can be
rgrover1 710:b2e1a2660ec2 680 * enabled by using startScan().
rgrover1 710:b2e1a2660ec2 681 */
rgrover1 710:b2e1a2660ec2 682 void setActiveScanning(bool activeScanning) {
rgrover1 710:b2e1a2660ec2 683 _scanningParams.setActiveScanning(activeScanning);
rgrover1 710:b2e1a2660ec2 684 }
rgrover1 710:b2e1a2660ec2 685
rgrover1 710:b2e1a2660ec2 686 /**
rgrover1 710:b2e1a2660ec2 687 * Start scanning (Observer Procedure) based on the parameters currently in
rgrover1 710:b2e1a2660ec2 688 * effect.
rgrover1 710:b2e1a2660ec2 689 *
rgrover1 710:b2e1a2660ec2 690 * @param[in] callback
rgrover1 710:b2e1a2660ec2 691 * The application specific callback to be invoked upon
rgrover1 710:b2e1a2660ec2 692 * receiving every advertisement report. This can be passed in
rgrover1 710:b2e1a2660ec2 693 * as NULL, in which case scanning may not be enabled at all.
rgrover1 710:b2e1a2660ec2 694 */
rgrover1 710:b2e1a2660ec2 695 ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) {
rgrover1 710:b2e1a2660ec2 696 ble_error_t err = BLE_ERROR_NONE;
rgrover1 710:b2e1a2660ec2 697 if (callback) {
rgrover1 710:b2e1a2660ec2 698 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 699 onAdvertisementReport.attach(callback);
rgrover1 710:b2e1a2660ec2 700 }
rgrover1 710:b2e1a2660ec2 701 }
rgrover1 710:b2e1a2660ec2 702
rgrover1 710:b2e1a2660ec2 703 return err;
rgrover1 710:b2e1a2660ec2 704 }
rgrover1 710:b2e1a2660ec2 705
rgrover1 710:b2e1a2660ec2 706 /**
rgrover1 710:b2e1a2660ec2 707 * Same as above, but this takes an (object, method) pair for a callback.
rgrover1 710:b2e1a2660ec2 708 */
rgrover1 710:b2e1a2660ec2 709 template<typename T>
rgrover1 710:b2e1a2660ec2 710 ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
rgrover1 710:b2e1a2660ec2 711 ble_error_t err = BLE_ERROR_NONE;
rgrover1 710:b2e1a2660ec2 712 if (object && callbackMember) {
rgrover1 710:b2e1a2660ec2 713 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 710:b2e1a2660ec2 714 onAdvertisementReport.attach(object, callbackMember);
rgrover1 710:b2e1a2660ec2 715 }
rgrover1 710:b2e1a2660ec2 716 }
rgrover1 710:b2e1a2660ec2 717
rgrover1 710:b2e1a2660ec2 718 return err;
rgrover1 710:b2e1a2660ec2 719 }
rgrover1 710:b2e1a2660ec2 720
rgrover1 710:b2e1a2660ec2 721 private:
rgrover1 710:b2e1a2660ec2 722 ble_error_t setAdvertisingData(void) {
rgrover1 710:b2e1a2660ec2 723 return setAdvertisingData(_advPayload, _scanResponse);
rgrover1 710:b2e1a2660ec2 724 }
rgrover1 710:b2e1a2660ec2 725
rgrover1 710:b2e1a2660ec2 726 private:
rgrover1 710:b2e1a2660ec2 727 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
rgrover1 710:b2e1a2660ec2 728 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
rgrover1 710:b2e1a2660ec2 729
rgrover1 710:b2e1a2660ec2 730 public:
rgrover1 710:b2e1a2660ec2 731 /**
rgrover1 710:b2e1a2660ec2 732 * Accessors to read back currently active advertising params.
rgrover1 710:b2e1a2660ec2 733 */
rgrover1 710:b2e1a2660ec2 734 GapAdvertisingParams &getAdvertisingParams(void) {
rgrover1 710:b2e1a2660ec2 735 return _advParams;
rgrover1 710:b2e1a2660ec2 736 }
rgrover1 710:b2e1a2660ec2 737 const GapAdvertisingParams &getAdvertisingParams(void) const {
rgrover1 710:b2e1a2660ec2 738 return _advParams;
rgrover1 710:b2e1a2660ec2 739 }
rgrover1 710:b2e1a2660ec2 740
rgrover1 710:b2e1a2660ec2 741 /**
rgrover1 710:b2e1a2660ec2 742 * Setup a particular, user-constructed set of advertisement parameters for
rgrover1 710:b2e1a2660ec2 743 * the underlying stack. It would be uncommon for this API to be used
rgrover1 710:b2e1a2660ec2 744 * directly; there are other APIs to tweak advertisement parameters
rgrover1 710:b2e1a2660ec2 745 * individually.
rgrover1 710:b2e1a2660ec2 746 */
rgrover1 710:b2e1a2660ec2 747 void setAdvertisingParams(const GapAdvertisingParams &newParams) {
rgrover1 710:b2e1a2660ec2 748 _advParams = newParams;
rgrover1 710:b2e1a2660ec2 749 }
rgrover1 710:b2e1a2660ec2 750
rgrover1 710:b2e1a2660ec2 751 /* Event callback handlers. */
rgrover1 710:b2e1a2660ec2 752 public:
rgrover1 710:b2e1a2660ec2 753 /**
rgrover1 710:b2e1a2660ec2 754 * Setup a callback for timeout events. Refer to TimeoutSource_t for
rgrover1 710:b2e1a2660ec2 755 * possible event types.
rgrover1 710:b2e1a2660ec2 756 */
rgrover1 710:b2e1a2660ec2 757 void onTimeout(TimeoutEventCallback_t callback) {timeoutCallback = callback;}
rgrover1 710:b2e1a2660ec2 758
rgrover1 710:b2e1a2660ec2 759 /**
rgrover1 710:b2e1a2660ec2 760 * Setup a callback for connection events. Refer to ConnectionEventCallback_t.
rgrover1 710:b2e1a2660ec2 761 */
rgrover1 710:b2e1a2660ec2 762 void onConnection(ConnectionEventCallback_t callback) {connectionCallback = callback;}
rgrover1 710:b2e1a2660ec2 763
rgrover1 710:b2e1a2660ec2 764 /**
rgrover1 710:b2e1a2660ec2 765 * Set the application callback for disconnection events.
rgrover1 710:b2e1a2660ec2 766 * @param callback
rgrover1 710:b2e1a2660ec2 767 * Pointer to the unique callback.
rgrover1 710:b2e1a2660ec2 768 */
rgrover1 710:b2e1a2660ec2 769 void onDisconnection(DisconnectionEventCallback_t callback) {disconnectionCallback = callback;}
rgrover1 710:b2e1a2660ec2 770
rgrover1 710:b2e1a2660ec2 771 /**
rgrover1 710:b2e1a2660ec2 772 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 710:b2e1a2660ec2 773 * callbacks receive no context and are therefore different from the
rgrover1 710:b2e1a2660ec2 774 * disconnectionCallback callback.
rgrover1 710:b2e1a2660ec2 775 * @param callback
rgrover1 710:b2e1a2660ec2 776 * function pointer to be invoked upon disconnection; receives no context.
rgrover1 710:b2e1a2660ec2 777 */
rgrover1 710:b2e1a2660ec2 778 template<typename T>
rgrover1 710:b2e1a2660ec2 779 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
rgrover1 710:b2e1a2660ec2 780
rgrover1 710:b2e1a2660ec2 781 /**
rgrover1 710:b2e1a2660ec2 782 * Set the application callback for radio-notification events.
rgrover1 710:b2e1a2660ec2 783 *
rgrover1 710:b2e1a2660ec2 784 * Radio Notification is a feature that enables ACTIVE and INACTIVE
rgrover1 710:b2e1a2660ec2 785 * (nACTIVE) signals from the stack that notify the application when the
rgrover1 710:b2e1a2660ec2 786 * radio is in use. The signal is sent using software interrupt.
rgrover1 710:b2e1a2660ec2 787 *
rgrover1 710:b2e1a2660ec2 788 * The ACTIVE signal is sent before the Radio Event starts. The nACTIVE
rgrover1 710:b2e1a2660ec2 789 * signal is sent at the end of the Radio Event. These signals can be used
rgrover1 710:b2e1a2660ec2 790 * by the application programmer to synchronize application logic with radio
rgrover1 710:b2e1a2660ec2 791 * activity. For example, the ACTIVE signal can be used to shut off external
rgrover1 710:b2e1a2660ec2 792 * devices to manage peak current drawn during periods when the radio is on,
rgrover1 710:b2e1a2660ec2 793 * or to trigger sensor data collection for transmission in the Radio Event.
rgrover1 710:b2e1a2660ec2 794 *
rgrover1 710:b2e1a2660ec2 795 * @param callback
rgrover1 710:b2e1a2660ec2 796 * The application handler to be invoked in response to a radio
rgrover1 710:b2e1a2660ec2 797 * ACTIVE/INACTIVE event.
rgrover1 710:b2e1a2660ec2 798 */
rgrover1 710:b2e1a2660ec2 799 virtual void onRadioNotification(RadioNotificationEventCallback_t callback) {radioNotificationCallback = callback;}
rgrover1 710:b2e1a2660ec2 800
rgrover1 710:b2e1a2660ec2 801 protected:
rgrover1 710:b2e1a2660ec2 802 Gap() :
rgrover1 710:b2e1a2660ec2 803 _advParams(),
rgrover1 710:b2e1a2660ec2 804 _advPayload(),
rgrover1 710:b2e1a2660ec2 805 _scanningParams(),
rgrover1 710:b2e1a2660ec2 806 _scanResponse(),
rgrover1 710:b2e1a2660ec2 807 state(),
rgrover1 710:b2e1a2660ec2 808 timeoutCallback(NULL),
rgrover1 710:b2e1a2660ec2 809 connectionCallback(NULL),
rgrover1 710:b2e1a2660ec2 810 disconnectionCallback(NULL),
rgrover1 710:b2e1a2660ec2 811 radioNotificationCallback(),
rgrover1 710:b2e1a2660ec2 812 onAdvertisementReport(),
rgrover1 710:b2e1a2660ec2 813 disconnectionCallChain() {
rgrover1 710:b2e1a2660ec2 814 _advPayload.clear();
rgrover1 710:b2e1a2660ec2 815 _scanResponse.clear();
rgrover1 710:b2e1a2660ec2 816 }
rgrover1 710:b2e1a2660ec2 817
rgrover1 710:b2e1a2660ec2 818 /* Entry points for the underlying stack to report events back to the user. */
rgrover1 710:b2e1a2660ec2 819 public:
rgrover1 710:b2e1a2660ec2 820 void processConnectionEvent(Handle_t handle,
rgrover1 710:b2e1a2660ec2 821 Role_t role,
rgrover1 710:b2e1a2660ec2 822 AddressType_t peerAddrType,
rgrover1 710:b2e1a2660ec2 823 const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 824 AddressType_t ownAddrType,
rgrover1 710:b2e1a2660ec2 825 const Address_t ownAddr,
rgrover1 710:b2e1a2660ec2 826 const ConnectionParams_t *connectionParams) {
rgrover1 710:b2e1a2660ec2 827 state.connected = 1;
rgrover1 710:b2e1a2660ec2 828 if (connectionCallback) {
rgrover1 710:b2e1a2660ec2 829 ConnectionCallbackParams_t callbackParams(handle, role, peerAddrType, peerAddr, ownAddrType, ownAddr, connectionParams);
rgrover1 710:b2e1a2660ec2 830 connectionCallback(&callbackParams);
rgrover1 710:b2e1a2660ec2 831 }
rgrover1 710:b2e1a2660ec2 832 }
rgrover1 710:b2e1a2660ec2 833
rgrover1 710:b2e1a2660ec2 834 void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
rgrover1 710:b2e1a2660ec2 835 state.connected = 0;
rgrover1 710:b2e1a2660ec2 836 if (disconnectionCallback) {
rgrover1 710:b2e1a2660ec2 837 disconnectionCallback(handle, reason);
rgrover1 710:b2e1a2660ec2 838 }
rgrover1 710:b2e1a2660ec2 839 disconnectionCallChain.call();
rgrover1 710:b2e1a2660ec2 840 }
rgrover1 710:b2e1a2660ec2 841
rgrover1 710:b2e1a2660ec2 842 void processAdvertisementReport(const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 843 int8_t rssi,
rgrover1 710:b2e1a2660ec2 844 bool isScanResponse,
rgrover1 710:b2e1a2660ec2 845 GapAdvertisingParams::AdvertisingType_t type,
rgrover1 710:b2e1a2660ec2 846 uint8_t advertisingDataLen,
rgrover1 710:b2e1a2660ec2 847 const uint8_t *advertisingData) {
rgrover1 710:b2e1a2660ec2 848 AdvertisementCallbackParams_t params;
rgrover1 710:b2e1a2660ec2 849 memcpy(params.peerAddr, peerAddr, ADDR_LEN);
rgrover1 710:b2e1a2660ec2 850 params.rssi = rssi;
rgrover1 710:b2e1a2660ec2 851 params.isScanResponse = isScanResponse;
rgrover1 710:b2e1a2660ec2 852 params.type = type;
rgrover1 710:b2e1a2660ec2 853 params.advertisingDataLen = advertisingDataLen;
rgrover1 710:b2e1a2660ec2 854 params.advertisingData = advertisingData;
rgrover1 710:b2e1a2660ec2 855 onAdvertisementReport.call(&params);
rgrover1 710:b2e1a2660ec2 856 }
rgrover1 710:b2e1a2660ec2 857
rgrover1 710:b2e1a2660ec2 858 void processTimeoutEvent(TimeoutSource_t source) {
rgrover1 710:b2e1a2660ec2 859 if (timeoutCallback) {
rgrover1 710:b2e1a2660ec2 860 timeoutCallback(source);
rgrover1 710:b2e1a2660ec2 861 }
rgrover1 710:b2e1a2660ec2 862 }
rgrover1 710:b2e1a2660ec2 863
rgrover1 710:b2e1a2660ec2 864 protected:
rgrover1 710:b2e1a2660ec2 865 GapAdvertisingParams _advParams;
rgrover1 710:b2e1a2660ec2 866 GapAdvertisingData _advPayload;
rgrover1 710:b2e1a2660ec2 867 GapScanningParams _scanningParams;
rgrover1 710:b2e1a2660ec2 868 GapAdvertisingData _scanResponse;
rgrover1 710:b2e1a2660ec2 869
rgrover1 710:b2e1a2660ec2 870 GapState_t state;
rgrover1 710:b2e1a2660ec2 871
rgrover1 710:b2e1a2660ec2 872 protected:
rgrover1 710:b2e1a2660ec2 873 TimeoutEventCallback_t timeoutCallback;
rgrover1 710:b2e1a2660ec2 874 ConnectionEventCallback_t connectionCallback;
rgrover1 710:b2e1a2660ec2 875 DisconnectionEventCallback_t disconnectionCallback;
rgrover1 710:b2e1a2660ec2 876 RadioNotificationEventCallback_t radioNotificationCallback;
rgrover1 710:b2e1a2660ec2 877 AdvertisementReportCallback_t onAdvertisementReport;
rgrover1 710:b2e1a2660ec2 878 CallChain disconnectionCallChain;
rgrover1 710:b2e1a2660ec2 879
rgrover1 710:b2e1a2660ec2 880 private:
rgrover1 710:b2e1a2660ec2 881 /* disallow copy and assignment */
rgrover1 710:b2e1a2660ec2 882 Gap(const Gap &);
rgrover1 710:b2e1a2660ec2 883 Gap& operator=(const Gap &);
rgrover1 710:b2e1a2660ec2 884 };
rgrover1 710:b2e1a2660ec2 885
rgrover1 710:b2e1a2660ec2 886 #endif // ifndef __GAP_H__