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:
Fri Jun 19 15:52:08 2015 +0100
Revision:
534:754131484cf1
Parent:
533:c2aafeedaf8c
Child:
537:00d5affbb2b2
Synchronized with git rev 0e9fdf09
Author: Rohit Grover
copy over GAP APIs from BLE into GAP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 260:ea7f9f14cc15 1 /* mbed Microcontroller Library
rgrover1 260:ea7f9f14cc15 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 260:ea7f9f14cc15 3 *
rgrover1 260:ea7f9f14cc15 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 260:ea7f9f14cc15 5 * you may not use this file except in compliance with the License.
rgrover1 260:ea7f9f14cc15 6 * You may obtain a copy of the License at
rgrover1 260:ea7f9f14cc15 7 *
rgrover1 260:ea7f9f14cc15 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 260:ea7f9f14cc15 9 *
rgrover1 260:ea7f9f14cc15 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 260:ea7f9f14cc15 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 260:ea7f9f14cc15 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 260:ea7f9f14cc15 13 * See the License for the specific language governing permissions and
rgrover1 260:ea7f9f14cc15 14 * limitations under the License.
rgrover1 260:ea7f9f14cc15 15 */
rgrover1 260:ea7f9f14cc15 16
rgrover1 260:ea7f9f14cc15 17 #ifndef __GAP_H__
rgrover1 260:ea7f9f14cc15 18 #define __GAP_H__
rgrover1 260:ea7f9f14cc15 19
rgrover1 531:bdcd44b03974 20 #include "GapAdvertisingData.h"
rgrover1 531:bdcd44b03974 21 #include "GapAdvertisingParams.h"
rgrover1 531:bdcd44b03974 22 #include "GapScanningParams.h"
rgrover1 260:ea7f9f14cc15 23 #include "GapEvents.h"
rgrover1 260:ea7f9f14cc15 24 #include "CallChain.h"
rgrover1 406:cec6778acc66 25 #include "FunctionPointerWithContext.h"
rgrover1 260:ea7f9f14cc15 26
rgrover1 260:ea7f9f14cc15 27 using namespace mbed;
rgrover1 260:ea7f9f14cc15 28
rgrover1 527:493185cebc03 29 /* Forward declarations for classes which will only be used for pointers or references in the following. */
rgrover1 527:493185cebc03 30 class GapAdvertisingParams;
rgrover1 527:493185cebc03 31 class GapScanningParams;
rgrover1 527:493185cebc03 32 class GapAdvertisingData;
rgrover1 397:9f5bfae7ea50 33
rgrover1 260:ea7f9f14cc15 34 class Gap {
rgrover1 260:ea7f9f14cc15 35 public:
rgrover1 375:9cb0b006227e 36 enum AddressType_t {
rgrover1 260:ea7f9f14cc15 37 ADDR_TYPE_PUBLIC = 0,
rgrover1 260:ea7f9f14cc15 38 ADDR_TYPE_RANDOM_STATIC,
rgrover1 260:ea7f9f14cc15 39 ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
rgrover1 260:ea7f9f14cc15 40 ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
rgrover1 375:9cb0b006227e 41 };
rgrover1 402:0e714ad205b4 42 typedef enum AddressType_t addr_type_t; /* @Note: deprecated. Use AddressType_t instead. */
rgrover1 260:ea7f9f14cc15 43
rgrover1 260:ea7f9f14cc15 44 static const unsigned ADDR_LEN = 6;
rgrover1 375:9cb0b006227e 45 typedef uint8_t Address_t[ADDR_LEN]; /* 48-bit address, LSB format. */
rgrover1 402:0e714ad205b4 46 typedef Address_t address_t; /* @Note: deprecated. Use Address_t instead. */
rgrover1 260:ea7f9f14cc15 47
rgrover1 380:2109a08c311c 48 enum AdvertisementType_t {
rgrover1 380:2109a08c311c 49 ADV_IND = 0x00, /**< Connectable undirected. */
rgrover1 380:2109a08c311c 50 ADV_DIRECT_IND = 0x01, /**< Connectable directed. */
rgrover1 380:2109a08c311c 51 ADV_SCAN_IND = 0x02, /**< Scannable undirected. */
rgrover1 380:2109a08c311c 52 ADV_NONCONN_IND = 0x03, /**< Non connectable undirected. */
rgrover1 380:2109a08c311c 53 };
rgrover1 380:2109a08c311c 54
rgrover1 260:ea7f9f14cc15 55 /**
rgrover1 260:ea7f9f14cc15 56 * Enumeration for disconnection reasons. The values for these reasons are
rgrover1 260:ea7f9f14cc15 57 * derived from Nordic's implementation; but the reasons are meant to be
rgrover1 260:ea7f9f14cc15 58 * independent of the transport. If you are returned a reason which is not
rgrover1 260:ea7f9f14cc15 59 * covered by this enumeration, then please refer to the underlying
rgrover1 260:ea7f9f14cc15 60 * transport library.
rgrover1 260:ea7f9f14cc15 61 */
rgrover1 260:ea7f9f14cc15 62 enum DisconnectionReason_t {
rgrover1 526:caa67c3187a0 63 CONNECTION_TIMEOUT = 0x08,
rgrover1 526:caa67c3187a0 64 REMOTE_USER_TERMINATED_CONNECTION = 0x13,
rgrover1 526:caa67c3187a0 65 REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote Device Terminated Connection due to low resources.*/
rgrover1 526:caa67c3187a0 66 REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote Device Terminated Connection due to power off. */
rgrover1 526:caa67c3187a0 67 LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
rgrover1 526:caa67c3187a0 68 CONN_INTERVAL_UNACCEPTABLE = 0x3B,
rgrover1 260:ea7f9f14cc15 69 };
rgrover1 260:ea7f9f14cc15 70
rgrover1 260:ea7f9f14cc15 71 /* Describes the current state of the device (more than one bit can be set) */
rgrover1 413:4d5fb1522cfb 72 struct GapState_t {
rgrover1 260:ea7f9f14cc15 73 unsigned advertising : 1; /**< peripheral is currently advertising */
rgrover1 260:ea7f9f14cc15 74 unsigned connected : 1; /**< peripheral is connected to a central */
rgrover1 413:4d5fb1522cfb 75 };
rgrover1 260:ea7f9f14cc15 76
rgrover1 260:ea7f9f14cc15 77 typedef uint16_t Handle_t;
rgrover1 260:ea7f9f14cc15 78
rgrover1 260:ea7f9f14cc15 79 typedef struct {
rgrover1 260:ea7f9f14cc15 80 uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 81 uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 82 uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 83 uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 84 } ConnectionParams_t;
rgrover1 260:ea7f9f14cc15 85
rgrover1 527:493185cebc03 86 enum Role_t {
rgrover1 527:493185cebc03 87 PERIPHERAL = 0x1, /**< Peripheral Role. */
rgrover1 527:493185cebc03 88 CENTRAL = 0x2, /**< Central Role. */
rgrover1 527:493185cebc03 89 };
rgrover1 527:493185cebc03 90
rgrover1 527:493185cebc03 91 struct AdvertisementCallbackParams_t {
rgrover1 527:493185cebc03 92 Address_t peerAddr;
rgrover1 527:493185cebc03 93 int8_t rssi;
rgrover1 527:493185cebc03 94 bool isScanResponse;
rgrover1 527:493185cebc03 95 AdvertisementType_t type;
rgrover1 527:493185cebc03 96 uint8_t advertisingDataLen;
rgrover1 527:493185cebc03 97 const uint8_t *advertisingData;
rgrover1 527:493185cebc03 98 };
rgrover1 527:493185cebc03 99 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
rgrover1 527:493185cebc03 100
rgrover1 527:493185cebc03 101 struct ConnectionCallbackParams_t {
rgrover1 527:493185cebc03 102 Handle_t handle;
rgrover1 527:493185cebc03 103 Role_t role;
rgrover1 527:493185cebc03 104 AddressType_t peerAddrType;
rgrover1 527:493185cebc03 105 Address_t peerAddr;
rgrover1 527:493185cebc03 106 AddressType_t ownAddrType;
rgrover1 527:493185cebc03 107 Address_t ownAddr;
rgrover1 527:493185cebc03 108 const ConnectionParams_t *connectionParams;
rgrover1 527:493185cebc03 109
rgrover1 527:493185cebc03 110 ConnectionCallbackParams_t(Handle_t handleIn,
rgrover1 527:493185cebc03 111 Role_t roleIn,
rgrover1 527:493185cebc03 112 AddressType_t peerAddrTypeIn,
rgrover1 527:493185cebc03 113 const uint8_t *peerAddrIn,
rgrover1 527:493185cebc03 114 AddressType_t ownAddrTypeIn,
rgrover1 527:493185cebc03 115 const uint8_t *ownAddrIn,
rgrover1 527:493185cebc03 116 const ConnectionParams_t *connectionParamsIn) :
rgrover1 527:493185cebc03 117 handle(handleIn),
rgrover1 527:493185cebc03 118 role(roleIn),
rgrover1 527:493185cebc03 119 peerAddrType(peerAddrTypeIn),
rgrover1 527:493185cebc03 120 peerAddr(),
rgrover1 527:493185cebc03 121 ownAddrType(ownAddrTypeIn),
rgrover1 527:493185cebc03 122 ownAddr(),
rgrover1 527:493185cebc03 123 connectionParams(connectionParamsIn) {
rgrover1 527:493185cebc03 124 memcpy(peerAddr, peerAddrIn, ADDR_LEN);
rgrover1 527:493185cebc03 125 memcpy(ownAddr, ownAddrIn, ADDR_LEN);
rgrover1 527:493185cebc03 126 }
rgrover1 527:493185cebc03 127 };
rgrover1 527:493185cebc03 128
rgrover1 360:7d37e1adef33 129 enum SecurityMode_t {
rgrover1 361:9686f5c882fa 130 SECURITY_MODE_NO_ACCESS,
rgrover1 372:0db007a23f71 131 SECURITY_MODE_ENCRYPTION_OPEN_LINK, /**< require no protection, open link. */
rgrover1 372:0db007a23f71 132 SECURITY_MODE_ENCRYPTION_NO_MITM, /**< require encryption, but no MITM protection. */
rgrover1 372:0db007a23f71 133 SECURITY_MODE_ENCRYPTION_WITH_MITM, /**< require encryption and MITM protection. */
rgrover1 372:0db007a23f71 134 SECURITY_MODE_SIGNED_NO_MITM, /**< require signing or encryption, but no MITM protection. */
rgrover1 372:0db007a23f71 135 SECURITY_MODE_SIGNED_WITH_MITM, /**< require signing or encryption, and MITM protection. */
rgrover1 360:7d37e1adef33 136 };
rgrover1 360:7d37e1adef33 137
rgrover1 352:79d7cb60ae27 138 /**
rgrover1 352:79d7cb60ae27 139 * @brief Defines possible security status/states.
rgrover1 352:79d7cb60ae27 140 *
rgrover1 352:79d7cb60ae27 141 * @details Defines possible security status/states of a link when requested by getLinkSecurity().
rgrover1 352:79d7cb60ae27 142 */
rgrover1 352:79d7cb60ae27 143 enum LinkSecurityStatus_t {
rgrover1 352:79d7cb60ae27 144 NOT_ENCRYPTED, /**< The link is not secured. */
rgrover1 352:79d7cb60ae27 145 ENCRYPTION_IN_PROGRESS, /**< Link security is being established.*/
rgrover1 352:79d7cb60ae27 146 ENCRYPTED /**< The link is secure.*/
rgrover1 352:79d7cb60ae27 147 };
rgrover1 352:79d7cb60ae27 148
rgrover1 357:d4bb5d2b837a 149 enum SecurityIOCapabilities_t {
rgrover1 357:d4bb5d2b837a 150 IO_CAPS_DISPLAY_ONLY = 0x00, /**< Display Only. */
rgrover1 357:d4bb5d2b837a 151 IO_CAPS_DISPLAY_YESNO = 0x01, /**< Display and Yes/No entry. */
rgrover1 357:d4bb5d2b837a 152 IO_CAPS_KEYBOARD_ONLY = 0x02, /**< Keyboard Only. */
rgrover1 357:d4bb5d2b837a 153 IO_CAPS_NONE = 0x03, /**< No I/O capabilities. */
rgrover1 357:d4bb5d2b837a 154 IO_CAPS_KEYBOARD_DISPLAY = 0x04, /**< Keyboard and Display. */
rgrover1 357:d4bb5d2b837a 155 };
rgrover1 357:d4bb5d2b837a 156
rgrover1 359:611485c370f5 157 enum SecurityCompletionStatus_t {
rgrover1 359:611485c370f5 158 SEC_STATUS_SUCCESS = 0x00, /**< Procedure completed with success. */
rgrover1 359:611485c370f5 159 SEC_STATUS_TIMEOUT = 0x01, /**< Procedure timed out. */
rgrover1 359:611485c370f5 160 SEC_STATUS_PDU_INVALID = 0x02, /**< Invalid PDU received. */
rgrover1 367:c3f4ad55ed33 161 SEC_STATUS_PASSKEY_ENTRY_FAILED = 0x81, /**< Passkey entry failed (user canceled or other). */
rgrover1 359:611485c370f5 162 SEC_STATUS_OOB_NOT_AVAILABLE = 0x82, /**< Out of Band Key not available. */
rgrover1 359:611485c370f5 163 SEC_STATUS_AUTH_REQ = 0x83, /**< Authentication requirements not met. */
rgrover1 359:611485c370f5 164 SEC_STATUS_CONFIRM_VALUE = 0x84, /**< Confirm value failed. */
rgrover1 359:611485c370f5 165 SEC_STATUS_PAIRING_NOT_SUPP = 0x85, /**< Pairing not supported. */
rgrover1 359:611485c370f5 166 SEC_STATUS_ENC_KEY_SIZE = 0x86, /**< Encryption key size. */
rgrover1 359:611485c370f5 167 SEC_STATUS_SMP_CMD_UNSUPPORTED = 0x87, /**< Unsupported SMP command. */
rgrover1 359:611485c370f5 168 SEC_STATUS_UNSPECIFIED = 0x88, /**< Unspecified reason. */
rgrover1 359:611485c370f5 169 SEC_STATUS_REPEATED_ATTEMPTS = 0x89, /**< Too little time elapsed since last attempt. */
rgrover1 359:611485c370f5 170 SEC_STATUS_INVALID_PARAMS = 0x8A, /**< Invalid parameters. */
rgrover1 359:611485c370f5 171 };
rgrover1 359:611485c370f5 172
rgrover1 357:d4bb5d2b837a 173 /**
rgrover1 357:d4bb5d2b837a 174 * Declaration of type containing a passkey to be used during pairing. This
rgrover1 357:d4bb5d2b837a 175 * is passed into initializeSecurity() to specify a pre-programmed passkey
rgrover1 357:d4bb5d2b837a 176 * for authentication instead of generating a random one.
rgrover1 357:d4bb5d2b837a 177 */
rgrover1 357:d4bb5d2b837a 178 static const unsigned PASSKEY_LEN = 6;
rgrover1 357:d4bb5d2b837a 179 typedef uint8_t Passkey_t[PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */
rgrover1 357:d4bb5d2b837a 180
rgrover1 260:ea7f9f14cc15 181 static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
rgrover1 398:9d7666c2305f 182 static const uint16_t UNIT_0_625_MS = 625; /**< Number of microseconds in 0.625 milliseconds. */
rgrover1 260:ea7f9f14cc15 183 static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 184 return (durationInMillis * 1000) / UNIT_1_25_MS;
rgrover1 260:ea7f9f14cc15 185 }
rgrover1 260:ea7f9f14cc15 186 static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 187 return (durationInMillis * 1000) / UNIT_0_625_MS;
rgrover1 260:ea7f9f14cc15 188 }
rgrover1 399:1a69d53f00cc 189 static uint16_t ADVERTISEMENT_DURATION_UNITS_TO_MS(uint16_t gapUnits) {
rgrover1 325:501ad8b8bbe5 190 return (gapUnits * UNIT_0_625_MS) / 1000;
rgrover1 325:501ad8b8bbe5 191 }
rgrover1 260:ea7f9f14cc15 192
rgrover1 260:ea7f9f14cc15 193 typedef void (*EventCallback_t)(void);
rgrover1 527:493185cebc03 194 typedef void (*ConnectionEventCallback_t)(const ConnectionCallbackParams_t *params);
rgrover1 349:b8b2b3973c47 195 typedef void (*HandleSpecificEvent_t)(Handle_t handle);
rgrover1 260:ea7f9f14cc15 196 typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
rgrover1 341:8a104d9d80c1 197 typedef void (*RadioNotificationEventCallback_t) (bool radio_active); /* gets passed true for ACTIVE; false for INACTIVE. */
rgrover1 363:a3d59a6e5da0 198 typedef void (*SecuritySetupInitiatedCallback_t)(Handle_t, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps);
rgrover1 363:a3d59a6e5da0 199 typedef void (*SecuritySetupCompletedCallback_t)(Handle_t, SecurityCompletionStatus_t status);
rgrover1 362:3b1ff00ad8a4 200 typedef void (*LinkSecuredCallback_t)(Handle_t handle, SecurityMode_t securityMode);
rgrover1 369:9a76cc068644 201 typedef void (*PasskeyDisplayCallback_t)(Handle_t handle, const Passkey_t passkey);
rgrover1 260:ea7f9f14cc15 202
rgrover1 526:caa67c3187a0 203 public:
rgrover1 534:754131484cf1 204 /* These functions must be defined in the platform-specific sub-class */
rgrover1 531:bdcd44b03974 205 virtual ble_error_t setAddress(AddressType_t type, const Address_t address) = 0;
rgrover1 527:493185cebc03 206 virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) = 0;
rgrover1 260:ea7f9f14cc15 207 virtual ble_error_t stopAdvertising(void) = 0;
rgrover1 392:3201f029c2eb 208 virtual ble_error_t stopScan() = 0;
rgrover1 325:501ad8b8bbe5 209 virtual uint16_t getMinAdvertisingInterval(void) const = 0;
rgrover1 325:501ad8b8bbe5 210 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const = 0;
rgrover1 325:501ad8b8bbe5 211 virtual uint16_t getMaxAdvertisingInterval(void) const = 0;
rgrover1 527:493185cebc03 212 virtual ble_error_t connect(const Address_t peerAddr,
rgrover1 527:493185cebc03 213 Gap::AddressType_t peerAddrType,
rgrover1 527:493185cebc03 214 const ConnectionParams_t *connectionParams,
rgrover1 527:493185cebc03 215 const GapScanningParams *scanParams) = 0;
rgrover1 260:ea7f9f14cc15 216 virtual ble_error_t disconnect(DisconnectionReason_t reason) = 0;
rgrover1 260:ea7f9f14cc15 217 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) = 0;
rgrover1 260:ea7f9f14cc15 218 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) = 0;
rgrover1 260:ea7f9f14cc15 219 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) = 0;
rgrover1 260:ea7f9f14cc15 220
rgrover1 353:5ed63cda3038 221 virtual ble_error_t purgeAllBondingState(void) = 0;
rgrover1 352:79d7cb60ae27 222 virtual ble_error_t getLinkSecurity(Handle_t connectionHandle, LinkSecurityStatus_t *securityStatusP) = 0;
rgrover1 352:79d7cb60ae27 223
rgrover1 260:ea7f9f14cc15 224 virtual ble_error_t setDeviceName(const uint8_t *deviceName) = 0;
rgrover1 260:ea7f9f14cc15 225 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) = 0;
rgrover1 260:ea7f9f14cc15 226 virtual ble_error_t setAppearance(uint16_t appearance) = 0;
rgrover1 260:ea7f9f14cc15 227 virtual ble_error_t getAppearance(uint16_t *appearanceP) = 0;
rgrover1 260:ea7f9f14cc15 228
rgrover1 526:caa67c3187a0 229 virtual ble_error_t setTxPower(int8_t txPower) = 0;
rgrover1 526:caa67c3187a0 230 virtual void getPermittedTxPowerValues(const int8_t **, size_t *) = 0;
rgrover1 526:caa67c3187a0 231
rgrover1 534:754131484cf1 232 /*
rgrover1 534:754131484cf1 233 * APIs with local implementations
rgrover1 534:754131484cf1 234 */
rgrover1 534:754131484cf1 235 public:
rgrover1 534:754131484cf1 236 void setAdvertisingType(GapAdvertisingParams::AdvertisingType advType) {
rgrover1 534:754131484cf1 237 _advParams.setAdvertisingType(advType);
rgrover1 534:754131484cf1 238 }
rgrover1 534:754131484cf1 239
rgrover1 534:754131484cf1 240 void setAdvertisingInterval(uint16_t interval) {
rgrover1 534:754131484cf1 241 if (interval == 0) {
rgrover1 534:754131484cf1 242 stopAdvertising();
rgrover1 534:754131484cf1 243 } else if (interval < getMinAdvertisingInterval()) {
rgrover1 534:754131484cf1 244 interval = getMinAdvertisingInterval();
rgrover1 534:754131484cf1 245 }
rgrover1 534:754131484cf1 246 _advParams.setInterval(MSEC_TO_ADVERTISEMENT_DURATION_UNITS(interval));
rgrover1 534:754131484cf1 247 }
rgrover1 534:754131484cf1 248
rgrover1 531:bdcd44b03974 249 ble_error_t startAdvertising(void) {
rgrover1 534:754131484cf1 250 setAdvertisingData(); /* update the underlying stack */
rgrover1 532:a709cfc1500d 251 return startAdvertising(_advParams);
rgrover1 531:bdcd44b03974 252 }
rgrover1 531:bdcd44b03974 253
rgrover1 531:bdcd44b03974 254 ble_error_t setAdvertisingData(void) {
rgrover1 531:bdcd44b03974 255 if (needToSetAdvPayload) {
rgrover1 531:bdcd44b03974 256 needToSetAdvPayload = false;
rgrover1 532:a709cfc1500d 257 return setAdvertisingData(_advPayload, _scanResponse);
rgrover1 531:bdcd44b03974 258 }
rgrover1 531:bdcd44b03974 259
rgrover1 531:bdcd44b03974 260 return BLE_ERROR_NONE;
rgrover1 531:bdcd44b03974 261 }
rgrover1 531:bdcd44b03974 262
rgrover1 534:754131484cf1 263 /**
rgrover1 534:754131484cf1 264 * Reset any advertising payload prepared from prior calls to
rgrover1 534:754131484cf1 265 * accumulateAdvertisingPayload().
rgrover1 534:754131484cf1 266 *
rgrover1 534:754131484cf1 267 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 534:754131484cf1 268 * startAdvertising() before the update takes effect.
rgrover1 534:754131484cf1 269 */
rgrover1 534:754131484cf1 270 void clearAdvertisingPayload(void) {
rgrover1 534:754131484cf1 271 needToSetAdvPayload = true;
rgrover1 534:754131484cf1 272 _advPayload.clear();
rgrover1 534:754131484cf1 273 }
rgrover1 534:754131484cf1 274
rgrover1 534:754131484cf1 275 /**
rgrover1 534:754131484cf1 276 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 534:754131484cf1 277 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 534:754131484cf1 278 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 534:754131484cf1 279 * small.
rgrover1 534:754131484cf1 280 *
rgrover1 534:754131484cf1 281 * @param flags
rgrover1 534:754131484cf1 282 * The flags to be added. Multiple flags may be specified in
rgrover1 534:754131484cf1 283 * combination.
rgrover1 534:754131484cf1 284 */
rgrover1 534:754131484cf1 285 ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
rgrover1 534:754131484cf1 286 needToSetAdvPayload = true;
rgrover1 534:754131484cf1 287 return _advPayload.addFlags(flags);
rgrover1 534:754131484cf1 288 }
rgrover1 534:754131484cf1 289
rgrover1 534:754131484cf1 290 /**
rgrover1 534:754131484cf1 291 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 534:754131484cf1 292 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 534:754131484cf1 293 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 534:754131484cf1 294 * small.
rgrover1 534:754131484cf1 295 *
rgrover1 534:754131484cf1 296 * @param app
rgrover1 534:754131484cf1 297 * The appearance of the peripheral.
rgrover1 534:754131484cf1 298 */
rgrover1 534:754131484cf1 299 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
rgrover1 534:754131484cf1 300 needToSetAdvPayload = true;
rgrover1 534:754131484cf1 301 setAppearance(app);
rgrover1 534:754131484cf1 302 return _advPayload.addAppearance(app);
rgrover1 534:754131484cf1 303 }
rgrover1 534:754131484cf1 304
rgrover1 534:754131484cf1 305 /**
rgrover1 534:754131484cf1 306 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 534:754131484cf1 307 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 534:754131484cf1 308 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 534:754131484cf1 309 * small.
rgrover1 534:754131484cf1 310 *
rgrover1 534:754131484cf1 311 * @param app
rgrover1 534:754131484cf1 312 * The max transmit power to be used by the controller. This is
rgrover1 534:754131484cf1 313 * only a hint.
rgrover1 534:754131484cf1 314 */
rgrover1 534:754131484cf1 315 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
rgrover1 534:754131484cf1 316 needToSetAdvPayload = true;
rgrover1 534:754131484cf1 317 return _advPayload.addTxPower(power);
rgrover1 534:754131484cf1 318 }
rgrover1 534:754131484cf1 319
rgrover1 534:754131484cf1 320 /**
rgrover1 534:754131484cf1 321 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 534:754131484cf1 322 * advertising payload. Please note that the payload is limited to 31 bytes.
rgrover1 534:754131484cf1 323 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
rgrover1 534:754131484cf1 324 * advertising payload proves to be too small.
rgrover1 534:754131484cf1 325 *
rgrover1 534:754131484cf1 326 * @param type The type which describes the variable length data.
rgrover1 534:754131484cf1 327 * @param data data bytes.
rgrover1 534:754131484cf1 328 * @param len length of data.
rgrover1 534:754131484cf1 329 */
rgrover1 534:754131484cf1 330 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 534:754131484cf1 331 needToSetAdvPayload = true;
rgrover1 534:754131484cf1 332 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
rgrover1 534:754131484cf1 333 setDeviceName(data);
rgrover1 534:754131484cf1 334 }
rgrover1 534:754131484cf1 335 return _advPayload.addData(type, data, len);
rgrover1 534:754131484cf1 336 }
rgrover1 534:754131484cf1 337
rgrover1 534:754131484cf1 338 /**
rgrover1 534:754131484cf1 339 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 534:754131484cf1 340 * scanResponse payload.
rgrover1 534:754131484cf1 341 *
rgrover1 534:754131484cf1 342 * @param type The type which describes the variable length data.
rgrover1 534:754131484cf1 343 * @param data data bytes.
rgrover1 534:754131484cf1 344 * @param len length of data.
rgrover1 534:754131484cf1 345 */
rgrover1 534:754131484cf1 346 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 534:754131484cf1 347 needToSetAdvPayload = true;
rgrover1 534:754131484cf1 348 return _scanResponse.addData(type, data, len);
rgrover1 534:754131484cf1 349 }
rgrover1 534:754131484cf1 350
rgrover1 534:754131484cf1 351 /**
rgrover1 534:754131484cf1 352 * Reset any scan response prepared from prior calls to
rgrover1 534:754131484cf1 353 * accumulateScanResponse().
rgrover1 534:754131484cf1 354 *
rgrover1 534:754131484cf1 355 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 534:754131484cf1 356 * startAdvertising() before the update takes effect.
rgrover1 534:754131484cf1 357 */
rgrover1 534:754131484cf1 358 void clearScanResponse(void) {
rgrover1 534:754131484cf1 359 needToSetAdvPayload = true;
rgrover1 534:754131484cf1 360 _scanResponse.clear();
rgrover1 534:754131484cf1 361 }
rgrover1 534:754131484cf1 362
rgrover1 531:bdcd44b03974 363 private:
rgrover1 531:bdcd44b03974 364 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
rgrover1 531:bdcd44b03974 365 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
rgrover1 531:bdcd44b03974 366
rgrover1 531:bdcd44b03974 367 public:
rgrover1 531:bdcd44b03974 368 ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 369 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 370 if (callback) {
rgrover1 532:a709cfc1500d 371 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 372 onAdvertisementReport.attach(callback);
rgrover1 407:ca6b956b33d1 373 }
rgrover1 407:ca6b956b33d1 374 }
rgrover1 407:ca6b956b33d1 375
rgrover1 407:ca6b956b33d1 376 return err;
rgrover1 407:ca6b956b33d1 377 }
rgrover1 407:ca6b956b33d1 378
rgrover1 407:ca6b956b33d1 379 template<typename T>
rgrover1 531:bdcd44b03974 380 ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 381 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 382 if (object && callbackMember) {
rgrover1 532:a709cfc1500d 383 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 384 onAdvertisementReport.attach(object, callbackMember);
rgrover1 407:ca6b956b33d1 385 }
rgrover1 407:ca6b956b33d1 386 }
rgrover1 407:ca6b956b33d1 387
rgrover1 407:ca6b956b33d1 388 return err;
rgrover1 407:ca6b956b33d1 389 }
rgrover1 407:ca6b956b33d1 390
rgrover1 526:caa67c3187a0 391 public:
rgrover1 407:ca6b956b33d1 392 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) = 0;
rgrover1 407:ca6b956b33d1 393
rgrover1 260:ea7f9f14cc15 394 /* Event callback handlers */
rgrover1 260:ea7f9f14cc15 395 void setOnTimeout(EventCallback_t callback) {onTimeout = callback;}
rgrover1 260:ea7f9f14cc15 396 void setOnConnection(ConnectionEventCallback_t callback) {onConnection = callback;}
rgrover1 260:ea7f9f14cc15 397
rgrover1 260:ea7f9f14cc15 398 /**
rgrover1 260:ea7f9f14cc15 399 * Set the application callback for disconnection events.
rgrover1 260:ea7f9f14cc15 400 * @param callback
rgrover1 260:ea7f9f14cc15 401 * Pointer to the unique callback.
rgrover1 260:ea7f9f14cc15 402 */
rgrover1 260:ea7f9f14cc15 403 void setOnDisconnection(DisconnectionEventCallback_t callback) {onDisconnection = callback;}
rgrover1 260:ea7f9f14cc15 404
rgrover1 260:ea7f9f14cc15 405 /**
rgrover1 341:8a104d9d80c1 406 * Set the application callback for radio-notification events.
rgrover1 341:8a104d9d80c1 407 * @param callback
rgrover1 367:c3f4ad55ed33 408 * Handler to be executed in response to a radio notification event.
rgrover1 341:8a104d9d80c1 409 */
rgrover1 341:8a104d9d80c1 410 virtual void setOnRadioNotification(RadioNotificationEventCallback_t callback) {onRadioNotification = callback;}
rgrover1 341:8a104d9d80c1 411
rgrover1 341:8a104d9d80c1 412 /**
rgrover1 349:b8b2b3973c47 413 * To indicate that security procedure for link has started.
rgrover1 349:b8b2b3973c47 414 */
rgrover1 364:03a7a439a3bf 415 virtual void setOnSecuritySetupInitiated(SecuritySetupInitiatedCallback_t callback) {onSecuritySetupInitiated = callback;}
rgrover1 349:b8b2b3973c47 416
rgrover1 349:b8b2b3973c47 417 /**
rgrover1 349:b8b2b3973c47 418 * To indicate that security procedure for link has completed.
rgrover1 349:b8b2b3973c47 419 */
rgrover1 364:03a7a439a3bf 420 virtual void setOnSecuritySetupCompleted(SecuritySetupCompletedCallback_t callback) {onSecuritySetupCompleted = callback;}
rgrover1 349:b8b2b3973c47 421
rgrover1 349:b8b2b3973c47 422 /**
rgrover1 349:b8b2b3973c47 423 * To indicate that link with the peer is secured. For bonded devices,
rgrover1 367:c3f4ad55ed33 424 * subsequent re-connections with bonded peer will result only in this callback
rgrover1 349:b8b2b3973c47 425 * when the link is secured and setup procedures will not occur unless the
rgrover1 349:b8b2b3973c47 426 * bonding information is either lost or deleted on either or both sides.
rgrover1 349:b8b2b3973c47 427 */
rgrover1 362:3b1ff00ad8a4 428 virtual void setOnLinkSecured(LinkSecuredCallback_t callback) {onLinkSecured = callback;}
rgrover1 349:b8b2b3973c47 429
rgrover1 349:b8b2b3973c47 430 /**
rgrover1 349:b8b2b3973c47 431 * To indicate that device context is stored persistently.
rgrover1 349:b8b2b3973c47 432 */
rgrover1 349:b8b2b3973c47 433 virtual void setOnSecurityContextStored(HandleSpecificEvent_t callback) {onSecurityContextStored = callback;}
rgrover1 349:b8b2b3973c47 434
rgrover1 349:b8b2b3973c47 435 /**
rgrover1 369:9a76cc068644 436 * To set the callback for when the passkey needs to be displayed on a peripheral with DISPLAY capability.
rgrover1 369:9a76cc068644 437 */
rgrover1 369:9a76cc068644 438 virtual void setOnPasskeyDisplay(PasskeyDisplayCallback_t callback) {onPasskeyDisplay = callback;}
rgrover1 369:9a76cc068644 439
rgrover1 369:9a76cc068644 440 /**
rgrover1 260:ea7f9f14cc15 441 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 260:ea7f9f14cc15 442 * callbacks receive no context and are therefore different from the
rgrover1 260:ea7f9f14cc15 443 * onDisconnection callback.
rgrover1 260:ea7f9f14cc15 444 * @param callback
rgrover1 260:ea7f9f14cc15 445 * function pointer to be invoked upon disconnection; receives no context.
rgrover1 260:ea7f9f14cc15 446 *
rgrover1 260:ea7f9f14cc15 447 * @note the disconnection CallChain should have been merged with
rgrover1 260:ea7f9f14cc15 448 * onDisconnctionCallback; but this was not possible because
rgrover1 260:ea7f9f14cc15 449 * FunctionPointer (which is a building block for CallChain) doesn't
rgrover1 260:ea7f9f14cc15 450 * accept variadic templates.
rgrover1 260:ea7f9f14cc15 451 */
rgrover1 260:ea7f9f14cc15 452 template<typename T>
rgrover1 260:ea7f9f14cc15 453 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
rgrover1 260:ea7f9f14cc15 454
rgrover1 533:c2aafeedaf8c 455 GapAdvertisingParams &advParams(void) {
rgrover1 532:a709cfc1500d 456 return _advParams;
rgrover1 531:bdcd44b03974 457 }
rgrover1 533:c2aafeedaf8c 458 const GapAdvertisingParams &advParams(void) const {
rgrover1 532:a709cfc1500d 459 return _advParams;
rgrover1 531:bdcd44b03974 460 }
rgrover1 531:bdcd44b03974 461 void setAdvParams(const GapAdvertisingParams &newParams) {
rgrover1 532:a709cfc1500d 462 _advParams = newParams;
rgrover1 531:bdcd44b03974 463 }
rgrover1 531:bdcd44b03974 464
rgrover1 533:c2aafeedaf8c 465 GapAdvertisingData &advPayload(void) {
rgrover1 531:bdcd44b03974 466 needToSetAdvPayload = true;
rgrover1 532:a709cfc1500d 467 return _advPayload;
rgrover1 531:bdcd44b03974 468 }
rgrover1 533:c2aafeedaf8c 469 const GapAdvertisingData &advPayload(void) const {
rgrover1 532:a709cfc1500d 470 return _advPayload;
rgrover1 531:bdcd44b03974 471 }
rgrover1 531:bdcd44b03974 472
rgrover1 533:c2aafeedaf8c 473 GapAdvertisingData &scanResponse(void) {
rgrover1 531:bdcd44b03974 474 needToSetAdvPayload = true;
rgrover1 532:a709cfc1500d 475 return _scanResponse;
rgrover1 531:bdcd44b03974 476 }
rgrover1 533:c2aafeedaf8c 477 const GapAdvertisingData &scanResponse(void) const {
rgrover1 532:a709cfc1500d 478 return _scanResponse;
rgrover1 531:bdcd44b03974 479 }
rgrover1 531:bdcd44b03974 480
rgrover1 533:c2aafeedaf8c 481 GapScanningParams &scanningParams(void) {
rgrover1 532:a709cfc1500d 482 return _scanningParams;
rgrover1 531:bdcd44b03974 483 }
rgrover1 533:c2aafeedaf8c 484 const GapScanningParams &scanningParams(void) const {
rgrover1 532:a709cfc1500d 485 return _scanningParams;
rgrover1 531:bdcd44b03974 486 }
rgrover1 531:bdcd44b03974 487
rgrover1 526:caa67c3187a0 488 public:
rgrover1 260:ea7f9f14cc15 489 GapState_t getState(void) const {
rgrover1 260:ea7f9f14cc15 490 return state;
rgrover1 260:ea7f9f14cc15 491 }
rgrover1 260:ea7f9f14cc15 492
rgrover1 260:ea7f9f14cc15 493 protected:
rgrover1 349:b8b2b3973c47 494 Gap() :
rgrover1 532:a709cfc1500d 495 _advParams(),
rgrover1 532:a709cfc1500d 496 _advPayload(),
rgrover1 531:bdcd44b03974 497 needToSetAdvPayload(true),
rgrover1 532:a709cfc1500d 498 _scanningParams(),
rgrover1 532:a709cfc1500d 499 _scanResponse(),
rgrover1 349:b8b2b3973c47 500 state(),
rgrover1 349:b8b2b3973c47 501 onTimeout(NULL),
rgrover1 349:b8b2b3973c47 502 onConnection(NULL),
rgrover1 349:b8b2b3973c47 503 onDisconnection(NULL),
rgrover1 349:b8b2b3973c47 504 onRadioNotification(),
rgrover1 364:03a7a439a3bf 505 onSecuritySetupInitiated(),
rgrover1 364:03a7a439a3bf 506 onSecuritySetupCompleted(),
rgrover1 349:b8b2b3973c47 507 onLinkSecured(),
rgrover1 349:b8b2b3973c47 508 onSecurityContextStored(),
rgrover1 369:9a76cc068644 509 onPasskeyDisplay(),
rgrover1 382:dcd0428dadb0 510 onAdvertisementReport(),
rgrover1 349:b8b2b3973c47 511 disconnectionCallChain() {
rgrover1 532:a709cfc1500d 512 _advPayload.clear();
rgrover1 532:a709cfc1500d 513 _scanResponse.clear();
rgrover1 260:ea7f9f14cc15 514 }
rgrover1 260:ea7f9f14cc15 515
rgrover1 260:ea7f9f14cc15 516 public:
rgrover1 527:493185cebc03 517 void processConnectionEvent(Handle_t handle,
rgrover1 527:493185cebc03 518 Role_t role,
rgrover1 527:493185cebc03 519 AddressType_t peerAddrType,
rgrover1 527:493185cebc03 520 const Address_t peerAddr,
rgrover1 527:493185cebc03 521 AddressType_t ownAddrType,
rgrover1 527:493185cebc03 522 const Address_t ownAddr,
rgrover1 527:493185cebc03 523 const ConnectionParams_t *connectionParams) {
rgrover1 260:ea7f9f14cc15 524 state.connected = 1;
rgrover1 260:ea7f9f14cc15 525 if (onConnection) {
rgrover1 527:493185cebc03 526 ConnectionCallbackParams_t callbackParams(handle, role, peerAddrType, peerAddr, ownAddrType, ownAddr, connectionParams);
rgrover1 527:493185cebc03 527 onConnection(&callbackParams);
rgrover1 260:ea7f9f14cc15 528 }
rgrover1 260:ea7f9f14cc15 529 }
rgrover1 260:ea7f9f14cc15 530
rgrover1 260:ea7f9f14cc15 531 void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
rgrover1 260:ea7f9f14cc15 532 state.connected = 0;
rgrover1 260:ea7f9f14cc15 533 if (onDisconnection) {
rgrover1 260:ea7f9f14cc15 534 onDisconnection(handle, reason);
rgrover1 260:ea7f9f14cc15 535 }
rgrover1 260:ea7f9f14cc15 536 disconnectionCallChain.call();
rgrover1 260:ea7f9f14cc15 537 }
rgrover1 260:ea7f9f14cc15 538
rgrover1 363:a3d59a6e5da0 539 void processSecuritySetupInitiatedEvent(Handle_t handle, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps) {
rgrover1 364:03a7a439a3bf 540 if (onSecuritySetupInitiated) {
rgrover1 364:03a7a439a3bf 541 onSecuritySetupInitiated(handle, allowBonding, requireMITM, iocaps);
rgrover1 349:b8b2b3973c47 542 }
rgrover1 349:b8b2b3973c47 543 }
rgrover1 349:b8b2b3973c47 544
rgrover1 363:a3d59a6e5da0 545 void processSecuritySetupCompletedEvent(Handle_t handle, SecurityCompletionStatus_t status) {
rgrover1 364:03a7a439a3bf 546 if (onSecuritySetupCompleted) {
rgrover1 364:03a7a439a3bf 547 onSecuritySetupCompleted(handle, status);
rgrover1 349:b8b2b3973c47 548 }
rgrover1 349:b8b2b3973c47 549 }
rgrover1 349:b8b2b3973c47 550
rgrover1 362:3b1ff00ad8a4 551 void processLinkSecuredEvent(Handle_t handle, SecurityMode_t securityMode) {
rgrover1 349:b8b2b3973c47 552 if (onLinkSecured) {
rgrover1 362:3b1ff00ad8a4 553 onLinkSecured(handle, securityMode);
rgrover1 349:b8b2b3973c47 554 }
rgrover1 349:b8b2b3973c47 555 }
rgrover1 349:b8b2b3973c47 556
rgrover1 349:b8b2b3973c47 557 void processSecurityContextStoredEvent(Handle_t handle) {
rgrover1 349:b8b2b3973c47 558 if (onSecurityContextStored) {
rgrover1 349:b8b2b3973c47 559 onSecurityContextStored(handle);
rgrover1 349:b8b2b3973c47 560 }
rgrover1 349:b8b2b3973c47 561 }
rgrover1 349:b8b2b3973c47 562
rgrover1 369:9a76cc068644 563 void processPasskeyDisplayEvent(Handle_t handle, const Passkey_t passkey) {
rgrover1 369:9a76cc068644 564 if (onPasskeyDisplay) {
rgrover1 369:9a76cc068644 565 onPasskeyDisplay(handle, passkey);
rgrover1 369:9a76cc068644 566 }
rgrover1 369:9a76cc068644 567 }
rgrover1 369:9a76cc068644 568
rgrover1 405:8fc6e6855806 569 void processAdvertisementReport(const Address_t peerAddr,
rgrover1 382:dcd0428dadb0 570 int8_t rssi,
rgrover1 382:dcd0428dadb0 571 bool isScanResponse,
rgrover1 382:dcd0428dadb0 572 AdvertisementType_t type,
rgrover1 382:dcd0428dadb0 573 uint8_t advertisingDataLen,
rgrover1 382:dcd0428dadb0 574 const uint8_t *advertisingData) {
rgrover1 406:cec6778acc66 575 AdvertisementCallbackParams_t params;
rgrover1 406:cec6778acc66 576 memcpy(params.peerAddr, peerAddr, ADDR_LEN);
rgrover1 406:cec6778acc66 577 params.rssi = rssi;
rgrover1 406:cec6778acc66 578 params.isScanResponse = isScanResponse;
rgrover1 406:cec6778acc66 579 params.type = type;
rgrover1 406:cec6778acc66 580 params.advertisingDataLen = advertisingDataLen;
rgrover1 406:cec6778acc66 581 params.advertisingData = advertisingData;
rgrover1 406:cec6778acc66 582 onAdvertisementReport.call(&params);
rgrover1 382:dcd0428dadb0 583 }
rgrover1 382:dcd0428dadb0 584
rgrover1 260:ea7f9f14cc15 585 void processEvent(GapEvents::gapEvent_e type) {
rgrover1 260:ea7f9f14cc15 586 switch (type) {
rgrover1 260:ea7f9f14cc15 587 case GapEvents::GAP_EVENT_TIMEOUT:
rgrover1 260:ea7f9f14cc15 588 state.advertising = 0;
rgrover1 260:ea7f9f14cc15 589 if (onTimeout) {
rgrover1 260:ea7f9f14cc15 590 onTimeout();
rgrover1 260:ea7f9f14cc15 591 }
rgrover1 260:ea7f9f14cc15 592 break;
rgrover1 267:ad6f6f40eb24 593 default:
rgrover1 267:ad6f6f40eb24 594 break;
rgrover1 260:ea7f9f14cc15 595 }
rgrover1 260:ea7f9f14cc15 596 }
rgrover1 260:ea7f9f14cc15 597
rgrover1 260:ea7f9f14cc15 598 protected:
rgrover1 532:a709cfc1500d 599 GapAdvertisingParams _advParams;
rgrover1 532:a709cfc1500d 600 GapAdvertisingData _advPayload;
rgrover1 531:bdcd44b03974 601 /* Accumulation of AD structures in the advertisement payload should
rgrover1 531:bdcd44b03974 602 * eventually result in a call to the target's setAdvertisingData() before
rgrover1 531:bdcd44b03974 603 * the server begins advertising. This flag marks the status of the pending update.*/
rgrover1 531:bdcd44b03974 604 bool needToSetAdvPayload;
rgrover1 531:bdcd44b03974 605
rgrover1 532:a709cfc1500d 606 GapScanningParams _scanningParams;
rgrover1 532:a709cfc1500d 607 GapAdvertisingData _scanResponse;
rgrover1 531:bdcd44b03974 608
rgrover1 363:a3d59a6e5da0 609 GapState_t state;
rgrover1 260:ea7f9f14cc15 610
rgrover1 337:e7c2eb38f5cc 611 protected:
rgrover1 363:a3d59a6e5da0 612 EventCallback_t onTimeout;
rgrover1 363:a3d59a6e5da0 613 ConnectionEventCallback_t onConnection;
rgrover1 363:a3d59a6e5da0 614 DisconnectionEventCallback_t onDisconnection;
rgrover1 363:a3d59a6e5da0 615 RadioNotificationEventCallback_t onRadioNotification;
rgrover1 364:03a7a439a3bf 616 SecuritySetupInitiatedCallback_t onSecuritySetupInitiated;
rgrover1 364:03a7a439a3bf 617 SecuritySetupCompletedCallback_t onSecuritySetupCompleted;
rgrover1 363:a3d59a6e5da0 618 LinkSecuredCallback_t onLinkSecured;
rgrover1 363:a3d59a6e5da0 619 HandleSpecificEvent_t onSecurityContextStored;
rgrover1 369:9a76cc068644 620 PasskeyDisplayCallback_t onPasskeyDisplay;
rgrover1 385:6e66d1c6de00 621 AdvertisementReportCallback_t onAdvertisementReport;
rgrover1 363:a3d59a6e5da0 622 CallChain disconnectionCallChain;
rgrover1 260:ea7f9f14cc15 623
rgrover1 260:ea7f9f14cc15 624 private:
rgrover1 260:ea7f9f14cc15 625 /* disallow copy and assignment */
rgrover1 260:ea7f9f14cc15 626 Gap(const Gap &);
rgrover1 260:ea7f9f14cc15 627 Gap& operator=(const Gap &);
rgrover1 260:ea7f9f14cc15 628 };
rgrover1 260:ea7f9f14cc15 629
rgrover1 260:ea7f9f14cc15 630 #endif // ifndef __GAP_H__