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:53:02 2015 +0100
Revision:
680:dabce2969adf
Parent:
677:09070e7285e5
Child:
684:448cdd97e926
Synchronized with git rev 68683f1c
Author: Rohit Grover
deprecate all GAP APIs from within BLE;
add consistent comment headers.

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 674:923c47bd1547 20 #include "GapAdvertisingData.h"
rgrover1 674:923c47bd1547 21 #include "GapAdvertisingParams.h"
rgrover1 674:923c47bd1547 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 670:5e4aecd9af5b 29 /* Forward declarations for classes which will only be used for pointers or references in the following. */
rgrover1 670:5e4aecd9af5b 30 class GapAdvertisingParams;
rgrover1 670:5e4aecd9af5b 31 class GapScanningParams;
rgrover1 670:5e4aecd9af5b 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 260:ea7f9f14cc15 48 /**
rgrover1 260:ea7f9f14cc15 49 * Enumeration for disconnection reasons. The values for these reasons are
rgrover1 260:ea7f9f14cc15 50 * derived from Nordic's implementation; but the reasons are meant to be
rgrover1 260:ea7f9f14cc15 51 * independent of the transport. If you are returned a reason which is not
rgrover1 260:ea7f9f14cc15 52 * covered by this enumeration, then please refer to the underlying
rgrover1 260:ea7f9f14cc15 53 * transport library.
rgrover1 260:ea7f9f14cc15 54 */
rgrover1 260:ea7f9f14cc15 55 enum DisconnectionReason_t {
rgrover1 669:7179b4a5aa7d 56 CONNECTION_TIMEOUT = 0x08,
rgrover1 669:7179b4a5aa7d 57 REMOTE_USER_TERMINATED_CONNECTION = 0x13,
rgrover1 669:7179b4a5aa7d 58 REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES = 0x14, /**< Remote Device Terminated Connection due to low resources.*/
rgrover1 669:7179b4a5aa7d 59 REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF = 0x15, /**< Remote Device Terminated Connection due to power off. */
rgrover1 669:7179b4a5aa7d 60 LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
rgrover1 669:7179b4a5aa7d 61 CONN_INTERVAL_UNACCEPTABLE = 0x3B,
rgrover1 260:ea7f9f14cc15 62 };
rgrover1 260:ea7f9f14cc15 63
rgrover1 260:ea7f9f14cc15 64 /* Describes the current state of the device (more than one bit can be set) */
rgrover1 413:4d5fb1522cfb 65 struct GapState_t {
rgrover1 260:ea7f9f14cc15 66 unsigned advertising : 1; /**< peripheral is currently advertising */
rgrover1 260:ea7f9f14cc15 67 unsigned connected : 1; /**< peripheral is connected to a central */
rgrover1 413:4d5fb1522cfb 68 };
rgrover1 260:ea7f9f14cc15 69
rgrover1 567:e4b38e43de7c 70 typedef uint16_t Handle_t;
rgrover1 260:ea7f9f14cc15 71
rgrover1 260:ea7f9f14cc15 72 typedef struct {
rgrover1 260:ea7f9f14cc15 73 uint16_t minConnectionInterval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 74 uint16_t maxConnectionInterval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 75 uint16_t slaveLatency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 76 uint16_t connectionSupervisionTimeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/
rgrover1 260:ea7f9f14cc15 77 } ConnectionParams_t;
rgrover1 260:ea7f9f14cc15 78
rgrover1 670:5e4aecd9af5b 79 enum Role_t {
rgrover1 670:5e4aecd9af5b 80 PERIPHERAL = 0x1, /**< Peripheral Role. */
rgrover1 670:5e4aecd9af5b 81 CENTRAL = 0x2, /**< Central Role. */
rgrover1 670:5e4aecd9af5b 82 };
rgrover1 670:5e4aecd9af5b 83
rgrover1 670:5e4aecd9af5b 84 struct AdvertisementCallbackParams_t {
rgrover1 670:5e4aecd9af5b 85 Address_t peerAddr;
rgrover1 670:5e4aecd9af5b 86 int8_t rssi;
rgrover1 670:5e4aecd9af5b 87 bool isScanResponse;
rgrover1 680:dabce2969adf 88 GapAdvertisingParams::AdvertisingType_t type;
rgrover1 670:5e4aecd9af5b 89 uint8_t advertisingDataLen;
rgrover1 670:5e4aecd9af5b 90 const uint8_t *advertisingData;
rgrover1 670:5e4aecd9af5b 91 };
rgrover1 670:5e4aecd9af5b 92 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
rgrover1 670:5e4aecd9af5b 93
rgrover1 670:5e4aecd9af5b 94 struct ConnectionCallbackParams_t {
rgrover1 670:5e4aecd9af5b 95 Handle_t handle;
rgrover1 670:5e4aecd9af5b 96 Role_t role;
rgrover1 670:5e4aecd9af5b 97 AddressType_t peerAddrType;
rgrover1 670:5e4aecd9af5b 98 Address_t peerAddr;
rgrover1 670:5e4aecd9af5b 99 AddressType_t ownAddrType;
rgrover1 670:5e4aecd9af5b 100 Address_t ownAddr;
rgrover1 670:5e4aecd9af5b 101 const ConnectionParams_t *connectionParams;
rgrover1 670:5e4aecd9af5b 102
rgrover1 670:5e4aecd9af5b 103 ConnectionCallbackParams_t(Handle_t handleIn,
rgrover1 670:5e4aecd9af5b 104 Role_t roleIn,
rgrover1 670:5e4aecd9af5b 105 AddressType_t peerAddrTypeIn,
rgrover1 670:5e4aecd9af5b 106 const uint8_t *peerAddrIn,
rgrover1 670:5e4aecd9af5b 107 AddressType_t ownAddrTypeIn,
rgrover1 670:5e4aecd9af5b 108 const uint8_t *ownAddrIn,
rgrover1 670:5e4aecd9af5b 109 const ConnectionParams_t *connectionParamsIn) :
rgrover1 670:5e4aecd9af5b 110 handle(handleIn),
rgrover1 670:5e4aecd9af5b 111 role(roleIn),
rgrover1 670:5e4aecd9af5b 112 peerAddrType(peerAddrTypeIn),
rgrover1 670:5e4aecd9af5b 113 peerAddr(),
rgrover1 670:5e4aecd9af5b 114 ownAddrType(ownAddrTypeIn),
rgrover1 670:5e4aecd9af5b 115 ownAddr(),
rgrover1 670:5e4aecd9af5b 116 connectionParams(connectionParamsIn) {
rgrover1 670:5e4aecd9af5b 117 memcpy(peerAddr, peerAddrIn, ADDR_LEN);
rgrover1 670:5e4aecd9af5b 118 memcpy(ownAddr, ownAddrIn, ADDR_LEN);
rgrover1 670:5e4aecd9af5b 119 }
rgrover1 670:5e4aecd9af5b 120 };
rgrover1 670:5e4aecd9af5b 121
rgrover1 567:e4b38e43de7c 122 enum SecurityMode_t {
rgrover1 567:e4b38e43de7c 123 SECURITY_MODE_NO_ACCESS,
rgrover1 567:e4b38e43de7c 124 SECURITY_MODE_ENCRYPTION_OPEN_LINK, /**< require no protection, open link. */
rgrover1 567:e4b38e43de7c 125 SECURITY_MODE_ENCRYPTION_NO_MITM, /**< require encryption, but no MITM protection. */
rgrover1 567:e4b38e43de7c 126 SECURITY_MODE_ENCRYPTION_WITH_MITM, /**< require encryption and MITM protection. */
rgrover1 567:e4b38e43de7c 127 SECURITY_MODE_SIGNED_NO_MITM, /**< require signing or encryption, but no MITM protection. */
rgrover1 567:e4b38e43de7c 128 SECURITY_MODE_SIGNED_WITH_MITM, /**< require signing or encryption, and MITM protection. */
rgrover1 567:e4b38e43de7c 129 };
rgrover1 567:e4b38e43de7c 130
rgrover1 567:e4b38e43de7c 131 /**
rgrover1 567:e4b38e43de7c 132 * @brief Defines possible security status/states.
rgrover1 567:e4b38e43de7c 133 *
rgrover1 567:e4b38e43de7c 134 * @details Defines possible security status/states of a link when requested by getLinkSecurity().
rgrover1 567:e4b38e43de7c 135 */
rgrover1 567:e4b38e43de7c 136 enum LinkSecurityStatus_t {
rgrover1 567:e4b38e43de7c 137 NOT_ENCRYPTED, /**< The link is not secured. */
rgrover1 567:e4b38e43de7c 138 ENCRYPTION_IN_PROGRESS, /**< Link security is being established.*/
rgrover1 567:e4b38e43de7c 139 ENCRYPTED /**< The link is secure.*/
rgrover1 527:493185cebc03 140 };
rgrover1 527:493185cebc03 141
rgrover1 567:e4b38e43de7c 142 enum SecurityIOCapabilities_t {
rgrover1 567:e4b38e43de7c 143 IO_CAPS_DISPLAY_ONLY = 0x00, /**< Display Only. */
rgrover1 567:e4b38e43de7c 144 IO_CAPS_DISPLAY_YESNO = 0x01, /**< Display and Yes/No entry. */
rgrover1 567:e4b38e43de7c 145 IO_CAPS_KEYBOARD_ONLY = 0x02, /**< Keyboard Only. */
rgrover1 567:e4b38e43de7c 146 IO_CAPS_NONE = 0x03, /**< No I/O capabilities. */
rgrover1 567:e4b38e43de7c 147 IO_CAPS_KEYBOARD_DISPLAY = 0x04, /**< Keyboard and Display. */
rgrover1 527:493185cebc03 148 };
rgrover1 527:493185cebc03 149
rgrover1 567:e4b38e43de7c 150 enum SecurityCompletionStatus_t {
rgrover1 567:e4b38e43de7c 151 SEC_STATUS_SUCCESS = 0x00, /**< Procedure completed with success. */
rgrover1 567:e4b38e43de7c 152 SEC_STATUS_TIMEOUT = 0x01, /**< Procedure timed out. */
rgrover1 567:e4b38e43de7c 153 SEC_STATUS_PDU_INVALID = 0x02, /**< Invalid PDU received. */
rgrover1 567:e4b38e43de7c 154 SEC_STATUS_PASSKEY_ENTRY_FAILED = 0x81, /**< Passkey entry failed (user canceled or other). */
rgrover1 567:e4b38e43de7c 155 SEC_STATUS_OOB_NOT_AVAILABLE = 0x82, /**< Out of Band Key not available. */
rgrover1 567:e4b38e43de7c 156 SEC_STATUS_AUTH_REQ = 0x83, /**< Authentication requirements not met. */
rgrover1 567:e4b38e43de7c 157 SEC_STATUS_CONFIRM_VALUE = 0x84, /**< Confirm value failed. */
rgrover1 567:e4b38e43de7c 158 SEC_STATUS_PAIRING_NOT_SUPP = 0x85, /**< Pairing not supported. */
rgrover1 567:e4b38e43de7c 159 SEC_STATUS_ENC_KEY_SIZE = 0x86, /**< Encryption key size. */
rgrover1 567:e4b38e43de7c 160 SEC_STATUS_SMP_CMD_UNSUPPORTED = 0x87, /**< Unsupported SMP command. */
rgrover1 567:e4b38e43de7c 161 SEC_STATUS_UNSPECIFIED = 0x88, /**< Unspecified reason. */
rgrover1 567:e4b38e43de7c 162 SEC_STATUS_REPEATED_ATTEMPTS = 0x89, /**< Too little time elapsed since last attempt. */
rgrover1 567:e4b38e43de7c 163 SEC_STATUS_INVALID_PARAMS = 0x8A, /**< Invalid parameters. */
rgrover1 527:493185cebc03 164 };
rgrover1 527:493185cebc03 165
rgrover1 567:e4b38e43de7c 166 /**
rgrover1 567:e4b38e43de7c 167 * Declaration of type containing a passkey to be used during pairing. This
rgrover1 567:e4b38e43de7c 168 * is passed into initializeSecurity() to specify a pre-programmed passkey
rgrover1 567:e4b38e43de7c 169 * for authentication instead of generating a random one.
rgrover1 567:e4b38e43de7c 170 */
rgrover1 567:e4b38e43de7c 171 static const unsigned PASSKEY_LEN = 6;
rgrover1 567:e4b38e43de7c 172 typedef uint8_t Passkey_t[PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */
rgrover1 567:e4b38e43de7c 173
rgrover1 260:ea7f9f14cc15 174 static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
rgrover1 398:9d7666c2305f 175 static const uint16_t UNIT_0_625_MS = 625; /**< Number of microseconds in 0.625 milliseconds. */
rgrover1 260:ea7f9f14cc15 176 static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 177 return (durationInMillis * 1000) / UNIT_1_25_MS;
rgrover1 260:ea7f9f14cc15 178 }
rgrover1 260:ea7f9f14cc15 179 static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 180 return (durationInMillis * 1000) / UNIT_0_625_MS;
rgrover1 260:ea7f9f14cc15 181 }
rgrover1 399:1a69d53f00cc 182 static uint16_t ADVERTISEMENT_DURATION_UNITS_TO_MS(uint16_t gapUnits) {
rgrover1 325:501ad8b8bbe5 183 return (gapUnits * UNIT_0_625_MS) / 1000;
rgrover1 325:501ad8b8bbe5 184 }
rgrover1 260:ea7f9f14cc15 185
rgrover1 567:e4b38e43de7c 186 typedef void (*EventCallback_t)(void);
rgrover1 670:5e4aecd9af5b 187 typedef void (*ConnectionEventCallback_t)(const ConnectionCallbackParams_t *params);
rgrover1 567:e4b38e43de7c 188 typedef void (*HandleSpecificEvent_t)(Handle_t handle);
rgrover1 260:ea7f9f14cc15 189 typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
rgrover1 567:e4b38e43de7c 190 typedef void (*RadioNotificationEventCallback_t) (bool radio_active); /* gets passed true for ACTIVE; false for INACTIVE. */
rgrover1 567:e4b38e43de7c 191 typedef void (*SecuritySetupInitiatedCallback_t)(Handle_t, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps);
rgrover1 567:e4b38e43de7c 192 typedef void (*SecuritySetupCompletedCallback_t)(Handle_t, SecurityCompletionStatus_t status);
rgrover1 567:e4b38e43de7c 193 typedef void (*LinkSecuredCallback_t)(Handle_t handle, SecurityMode_t securityMode);
rgrover1 567:e4b38e43de7c 194 typedef void (*PasskeyDisplayCallback_t)(Handle_t handle, const Passkey_t passkey);
rgrover1 260:ea7f9f14cc15 195
rgrover1 680:dabce2969adf 196 /*
rgrover1 680:dabce2969adf 197 * These functions must be defined in the platform-specific sub-class.
rgrover1 680:dabce2969adf 198 */
rgrover1 669:7179b4a5aa7d 199 public:
rgrover1 680:dabce2969adf 200 /**
rgrover1 680:dabce2969adf 201 * Set the BTLE MAC address and type. Please note that the address format is
rgrover1 680:dabce2969adf 202 * LSB (least significant byte first). Please refer to Address_t.
rgrover1 680:dabce2969adf 203 *
rgrover1 680:dabce2969adf 204 * @return BLE_ERROR_NONE on success.
rgrover1 680:dabce2969adf 205 */
rgrover1 680:dabce2969adf 206 virtual ble_error_t setAddress(AddressType_t type, const Address_t address) = 0;
rgrover1 680:dabce2969adf 207
rgrover1 680:dabce2969adf 208 /**
rgrover1 680:dabce2969adf 209 * Fetch the BTLE MAC address and type.
rgrover1 680:dabce2969adf 210 *
rgrover1 680:dabce2969adf 211 * @return BLE_ERROR_NONE on success.
rgrover1 680:dabce2969adf 212 */
rgrover1 680:dabce2969adf 213 virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) = 0;
rgrover1 680:dabce2969adf 214
rgrover1 680:dabce2969adf 215 /**
rgrover1 680:dabce2969adf 216 * @return Minimum Advertising interval in milliseconds.
rgrover1 680:dabce2969adf 217 */
rgrover1 680:dabce2969adf 218 virtual uint16_t getMinAdvertisingInterval(void) const = 0;
rgrover1 680:dabce2969adf 219
rgrover1 680:dabce2969adf 220 /**
rgrover1 680:dabce2969adf 221 * @return Minimum Advertising interval in milliseconds for non-connectible mode.
rgrover1 680:dabce2969adf 222 */
rgrover1 680:dabce2969adf 223 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const = 0;
rgrover1 680:dabce2969adf 224
rgrover1 680:dabce2969adf 225 /**
rgrover1 680:dabce2969adf 226 * @return Maximum Advertising interval in milliseconds.
rgrover1 680:dabce2969adf 227 */
rgrover1 680:dabce2969adf 228 virtual uint16_t getMaxAdvertisingInterval(void) const = 0;
rgrover1 680:dabce2969adf 229
rgrover1 680:dabce2969adf 230 virtual ble_error_t stopAdvertising(void) = 0;
rgrover1 680:dabce2969adf 231
rgrover1 680:dabce2969adf 232 /**
rgrover1 680:dabce2969adf 233 * Stop scanning. The current scanning parameters remain in effect.
rgrover1 680:dabce2969adf 234 *
rgrover1 680:dabce2969adf 235 * @retval BLE_ERROR_NONE if successfully stopped scanning procedure.
rgrover1 680:dabce2969adf 236 */
rgrover1 680:dabce2969adf 237 virtual ble_error_t stopScan() = 0;
rgrover1 680:dabce2969adf 238
rgrover1 680:dabce2969adf 239 /**
rgrover1 680:dabce2969adf 240 * Create a connection (GAP Link Establishment).
rgrover1 680:dabce2969adf 241 *
rgrover1 680:dabce2969adf 242 * @param peerAddr
rgrover1 680:dabce2969adf 243 * 48-bit address, LSB format.
rgrover1 680:dabce2969adf 244 * @param peerAddrType
rgrover1 680:dabce2969adf 245 * Address type of the peer.
rgrover1 680:dabce2969adf 246 * @param connectionParams
rgrover1 680:dabce2969adf 247 * Connection parameters.
rgrover1 680:dabce2969adf 248 * @param scanParams
rgrover1 680:dabce2969adf 249 * Paramters to be used while scanning for the peer.
rgrover1 680:dabce2969adf 250 * @return BLE_ERROR_NONE if connection establishment procedure is started
rgrover1 680:dabce2969adf 251 * successfully. The onConnection callback (if set) will be invoked upon
rgrover1 680:dabce2969adf 252 * a connection event.
rgrover1 680:dabce2969adf 253 */
rgrover1 670:5e4aecd9af5b 254 virtual ble_error_t connect(const Address_t peerAddr,
rgrover1 670:5e4aecd9af5b 255 Gap::AddressType_t peerAddrType,
rgrover1 670:5e4aecd9af5b 256 const ConnectionParams_t *connectionParams,
rgrover1 670:5e4aecd9af5b 257 const GapScanningParams *scanParams) = 0;
rgrover1 680:dabce2969adf 258
rgrover1 680:dabce2969adf 259 /**
rgrover1 680:dabce2969adf 260 * This call initiates the disconnection procedure, and its completion will
rgrover1 680:dabce2969adf 261 * be communicated to the application with an invocation of the
rgrover1 680:dabce2969adf 262 * onDisconnection callback.
rgrover1 680:dabce2969adf 263 *
rgrover1 680:dabce2969adf 264 * @param reason
rgrover1 680:dabce2969adf 265 * The reason for disconnection to be sent back to the peer.
rgrover1 680:dabce2969adf 266 */
rgrover1 680:dabce2969adf 267 virtual ble_error_t disconnect(DisconnectionReason_t reason) = 0;
rgrover1 537:00d5affbb2b2 268
rgrover1 680:dabce2969adf 269 /**
rgrover1 680:dabce2969adf 270 * Get the GAP peripheral preferred connection parameters. These are the
rgrover1 680:dabce2969adf 271 * defaults that the peripheral would like to have in a connection. The
rgrover1 680:dabce2969adf 272 * choice of the connection parameters is eventually up to the central.
rgrover1 680:dabce2969adf 273 *
rgrover1 680:dabce2969adf 274 * @param[out] params
rgrover1 680:dabce2969adf 275 * The structure where the parameters will be stored. Memory
rgrover1 680:dabce2969adf 276 * for this is owned by the caller.
rgrover1 680:dabce2969adf 277 *
rgrover1 680:dabce2969adf 278 * @return BLE_ERROR_NONE if the parameters were successfully filled into
rgrover1 680:dabce2969adf 279 * the given structure pointed to by params.
rgrover1 680:dabce2969adf 280 */
rgrover1 680:dabce2969adf 281 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) = 0;
rgrover1 680:dabce2969adf 282
rgrover1 680:dabce2969adf 283 /**
rgrover1 680:dabce2969adf 284 * Set the GAP peripheral preferred connection parameters. These are the
rgrover1 680:dabce2969adf 285 * defaults that the peripheral would like to have in a connection. The
rgrover1 680:dabce2969adf 286 * choice of the connection parameters is eventually up to the central.
rgrover1 680:dabce2969adf 287 *
rgrover1 680:dabce2969adf 288 * @param[in] params
rgrover1 680:dabce2969adf 289 * The structure containing the desired parameters.
rgrover1 680:dabce2969adf 290 */
rgrover1 680:dabce2969adf 291 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) = 0;
rgrover1 680:dabce2969adf 292
rgrover1 680:dabce2969adf 293 /**
rgrover1 680:dabce2969adf 294 * Update connection parameters while in the peripheral role.
rgrover1 680:dabce2969adf 295 * @details In the peripheral role, this will send the corresponding L2CAP request to the connected peer and wait for
rgrover1 680:dabce2969adf 296 * the central to perform the procedure.
rgrover1 680:dabce2969adf 297 * @param[in] handle
rgrover1 680:dabce2969adf 298 * Connection Handle
rgrover1 680:dabce2969adf 299 * @param[in] params
rgrover1 680:dabce2969adf 300 * Pointer to desired connection parameters. If NULL is provided on a peripheral role,
rgrover1 680:dabce2969adf 301 * the parameters in the PPCP characteristic of the GAP service will be used instead.
rgrover1 680:dabce2969adf 302 */
rgrover1 680:dabce2969adf 303 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) = 0;
rgrover1 680:dabce2969adf 304
rgrover1 680:dabce2969adf 305 virtual ble_error_t purgeAllBondingState(void) = 0;
rgrover1 567:e4b38e43de7c 306 virtual ble_error_t getLinkSecurity(Handle_t connectionHandle, LinkSecurityStatus_t *securityStatusP) = 0;
rgrover1 537:00d5affbb2b2 307
rgrover1 680:dabce2969adf 308 /**
rgrover1 680:dabce2969adf 309 * Set the device name characteristic in the GAP service.
rgrover1 680:dabce2969adf 310 * @param[in] deviceName
rgrover1 680:dabce2969adf 311 * The new value for the device-name. This is a UTF-8 encoded, <b>NULL-terminated</b> string.
rgrover1 680:dabce2969adf 312 */
rgrover1 680:dabce2969adf 313 virtual ble_error_t setDeviceName(const uint8_t *deviceName) = 0;
rgrover1 680:dabce2969adf 314
rgrover1 680:dabce2969adf 315 /**
rgrover1 680:dabce2969adf 316 * Get the value of the device name characteristic in the GAP service.
rgrover1 680:dabce2969adf 317 * @param[out] deviceName
rgrover1 680:dabce2969adf 318 * Pointer to an empty buffer where the UTF-8 *non NULL-
rgrover1 680:dabce2969adf 319 * terminated* string will be placed. Set this
rgrover1 680:dabce2969adf 320 * value to NULL in order to obtain the deviceName-length
rgrover1 680:dabce2969adf 321 * from the 'length' parameter.
rgrover1 680:dabce2969adf 322 *
rgrover1 680:dabce2969adf 323 * @param[in/out] lengthP
rgrover1 680:dabce2969adf 324 * (on input) Length of the buffer pointed to by deviceName;
rgrover1 680:dabce2969adf 325 * (on output) the complete device name length (without the
rgrover1 680:dabce2969adf 326 * null terminator).
rgrover1 680:dabce2969adf 327 *
rgrover1 680:dabce2969adf 328 * @note If the device name is longer than the size of the supplied buffer,
rgrover1 680:dabce2969adf 329 * length will return the complete device name length, and not the
rgrover1 680:dabce2969adf 330 * number of bytes actually returned in deviceName. The application may
rgrover1 680:dabce2969adf 331 * use this information to retry with a suitable buffer size.
rgrover1 680:dabce2969adf 332 */
rgrover1 567:e4b38e43de7c 333 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) = 0;
rgrover1 680:dabce2969adf 334
rgrover1 680:dabce2969adf 335 /**
rgrover1 680:dabce2969adf 336 * Set the appearance characteristic in the GAP service.
rgrover1 680:dabce2969adf 337 * @param[in] appearance
rgrover1 680:dabce2969adf 338 * The new value for the device-appearance.
rgrover1 680:dabce2969adf 339 */
rgrover1 680:dabce2969adf 340 virtual ble_error_t setAppearance(GapAdvertisingData::Appearance appearance) = 0;
rgrover1 680:dabce2969adf 341
rgrover1 680:dabce2969adf 342 /**
rgrover1 680:dabce2969adf 343 * Get the appearance characteristic in the GAP service.
rgrover1 680:dabce2969adf 344 * @param[out] appearance
rgrover1 680:dabce2969adf 345 * The new value for the device-appearance.
rgrover1 680:dabce2969adf 346 */
rgrover1 680:dabce2969adf 347 virtual ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP) = 0;
rgrover1 534:754131484cf1 348
rgrover1 680:dabce2969adf 349 /**
rgrover1 680:dabce2969adf 350 * Set the radio's transmit power.
rgrover1 680:dabce2969adf 351 * @param[in] txPower Radio transmit power in dBm.
rgrover1 680:dabce2969adf 352 */
rgrover1 680:dabce2969adf 353 virtual ble_error_t setTxPower(int8_t txPower) = 0;
rgrover1 680:dabce2969adf 354
rgrover1 680:dabce2969adf 355 /**
rgrover1 680:dabce2969adf 356 * Query the underlying stack for permitted arguments for setTxPower().
rgrover1 680:dabce2969adf 357 *
rgrover1 680:dabce2969adf 358 * @param[out] valueArrayPP
rgrover1 680:dabce2969adf 359 * Out parameter to receive the immutable array of Tx values.
rgrover1 680:dabce2969adf 360 * @param[out] countP
rgrover1 680:dabce2969adf 361 * Out parameter to receive the array's size.
rgrover1 680:dabce2969adf 362 */
rgrover1 680:dabce2969adf 363 virtual void getPermittedTxPowerValues(const int8_t **, size_t *) = 0;
rgrover1 669:7179b4a5aa7d 364
rgrover1 677:09070e7285e5 365 /*
rgrover1 680:dabce2969adf 366 * APIs with non-virtual implementations.
rgrover1 677:09070e7285e5 367 */
rgrover1 677:09070e7285e5 368 public:
rgrover1 680:dabce2969adf 369 /**
rgrover1 680:dabce2969adf 370 * Returns the current GAP state of the device using a bitmask which
rgrover1 680:dabce2969adf 371 * describes whether the device is advertising and/or connected.
rgrover1 680:dabce2969adf 372 */
rgrover1 680:dabce2969adf 373 GapState_t getState(void) const {
rgrover1 680:dabce2969adf 374 return state;
rgrover1 680:dabce2969adf 375 }
rgrover1 680:dabce2969adf 376
rgrover1 680:dabce2969adf 377 /**
rgrover1 680:dabce2969adf 378 * Set the GAP advertising mode to use for this device.
rgrover1 680:dabce2969adf 379 */
rgrover1 680:dabce2969adf 380 void setAdvertisingType(GapAdvertisingParams::AdvertisingType_t advType) {
rgrover1 677:09070e7285e5 381 _advParams.setAdvertisingType(advType);
rgrover1 677:09070e7285e5 382 }
rgrover1 677:09070e7285e5 383
rgrover1 680:dabce2969adf 384 /**
rgrover1 680:dabce2969adf 385 * @param[in] interval
rgrover1 680:dabce2969adf 386 * Advertising interval in units of milliseconds. Advertising
rgrover1 680:dabce2969adf 387 * is disabled if interval is 0. If interval is smaller than
rgrover1 680:dabce2969adf 388 * the minimum supported value, then the minimum supported
rgrover1 680:dabce2969adf 389 * value is used instead. This minimum value can be discovered
rgrover1 680:dabce2969adf 390 * using getMinAdvertisingInterval().
rgrover1 680:dabce2969adf 391 *
rgrover1 680:dabce2969adf 392 * This field must be set to 0 if connectionMode is equal
rgrover1 680:dabce2969adf 393 * to ADV_CONNECTABLE_DIRECTED.
rgrover1 680:dabce2969adf 394 *
rgrover1 680:dabce2969adf 395 * @note: Decreasing this value will allow central devices to detect a
rgrover1 680:dabce2969adf 396 * peripheral faster at the expense of more power being used by the radio
rgrover1 680:dabce2969adf 397 * due to the higher data transmit rate.
rgrover1 680:dabce2969adf 398 *
rgrover1 680:dabce2969adf 399 * @note: This API is now *deprecated* and will be dropped in the future.
rgrover1 680:dabce2969adf 400 * You should use the parallel API from Gap directly. A former call to
rgrover1 680:dabce2969adf 401 * ble.setAdvertisingInterval(...) should now be achieved using
rgrover1 680:dabce2969adf 402 * ble.gap().setAdvertisingInterval(...).
rgrover1 680:dabce2969adf 403 *
rgrover1 680:dabce2969adf 404 * @Note: [WARNING] This API previously used 0.625ms as the unit for its
rgrover1 680:dabce2969adf 405 * 'interval' argument. That required an explicit conversion from
rgrover1 680:dabce2969adf 406 * milliseconds using Gap::MSEC_TO_GAP_DURATION_UNITS(). This conversion is
rgrover1 680:dabce2969adf 407 * no longer required as the new units are milliseconds. Any application
rgrover1 680:dabce2969adf 408 * code depending on the old semantics would need to be updated accordingly.
rgrover1 680:dabce2969adf 409 */
rgrover1 677:09070e7285e5 410 void setAdvertisingInterval(uint16_t interval) {
rgrover1 677:09070e7285e5 411 if (interval == 0) {
rgrover1 677:09070e7285e5 412 stopAdvertising();
rgrover1 677:09070e7285e5 413 } else if (interval < getMinAdvertisingInterval()) {
rgrover1 677:09070e7285e5 414 interval = getMinAdvertisingInterval();
rgrover1 677:09070e7285e5 415 }
rgrover1 677:09070e7285e5 416 _advParams.setInterval(MSEC_TO_ADVERTISEMENT_DURATION_UNITS(interval));
rgrover1 677:09070e7285e5 417 }
rgrover1 677:09070e7285e5 418
rgrover1 680:dabce2969adf 419 /**
rgrover1 680:dabce2969adf 420 * @param[in] timeout
rgrover1 680:dabce2969adf 421 * Advertising timeout (in seconds) between 0x1 and 0x3FFF (1
rgrover1 680:dabce2969adf 422 * and 16383). Use 0 to disable the advertising timeout.
rgrover1 680:dabce2969adf 423 */
rgrover1 680:dabce2969adf 424 void setAdvertisingTimeout(uint16_t timeout) {
rgrover1 680:dabce2969adf 425 _advParams.setTimeout(timeout);
rgrover1 680:dabce2969adf 426 }
rgrover1 680:dabce2969adf 427
rgrover1 680:dabce2969adf 428 /**
rgrover1 680:dabce2969adf 429 * Start advertising.
rgrover1 680:dabce2969adf 430 */
rgrover1 674:923c47bd1547 431 ble_error_t startAdvertising(void) {
rgrover1 677:09070e7285e5 432 setAdvertisingData(); /* update the underlying stack */
rgrover1 675:30aab0f789f6 433 return startAdvertising(_advParams);
rgrover1 674:923c47bd1547 434 }
rgrover1 674:923c47bd1547 435
rgrover1 677:09070e7285e5 436 /**
rgrover1 677:09070e7285e5 437 * Reset any advertising payload prepared from prior calls to
rgrover1 680:dabce2969adf 438 * accumulateAdvertisingPayload(). This automatically propagates the re-
rgrover1 680:dabce2969adf 439 * initialized adv payload to the underlying stack.
rgrover1 677:09070e7285e5 440 *
rgrover1 677:09070e7285e5 441 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 677:09070e7285e5 442 * startAdvertising() before the update takes effect.
rgrover1 677:09070e7285e5 443 */
rgrover1 677:09070e7285e5 444 void clearAdvertisingPayload(void) {
rgrover1 677:09070e7285e5 445 _advPayload.clear();
rgrover1 680:dabce2969adf 446 setAdvertisingData();
rgrover1 677:09070e7285e5 447 }
rgrover1 677:09070e7285e5 448
rgrover1 677:09070e7285e5 449 /**
rgrover1 677:09070e7285e5 450 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 677:09070e7285e5 451 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 677:09070e7285e5 452 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 677:09070e7285e5 453 * small.
rgrover1 677:09070e7285e5 454 *
rgrover1 680:dabce2969adf 455 * @param[in] flags
rgrover1 680:dabce2969adf 456 * The flags to be added. Please refer to
rgrover1 680:dabce2969adf 457 * GapAdvertisingData::Flags for valid flags. Multiple
rgrover1 680:dabce2969adf 458 * flags may be specified in combination.
rgrover1 677:09070e7285e5 459 */
rgrover1 677:09070e7285e5 460 ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
rgrover1 680:dabce2969adf 461 ble_error_t rc;
rgrover1 680:dabce2969adf 462 if ((rc = _advPayload.addFlags(flags)) != BLE_ERROR_NONE) {
rgrover1 680:dabce2969adf 463 return rc;
rgrover1 680:dabce2969adf 464 }
rgrover1 680:dabce2969adf 465
rgrover1 680:dabce2969adf 466 return setAdvertisingData();
rgrover1 677:09070e7285e5 467 }
rgrover1 677:09070e7285e5 468
rgrover1 677:09070e7285e5 469 /**
rgrover1 677:09070e7285e5 470 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 677:09070e7285e5 471 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 677:09070e7285e5 472 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 677:09070e7285e5 473 * small.
rgrover1 677:09070e7285e5 474 *
rgrover1 677:09070e7285e5 475 * @param app
rgrover1 677:09070e7285e5 476 * The appearance of the peripheral.
rgrover1 677:09070e7285e5 477 */
rgrover1 677:09070e7285e5 478 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
rgrover1 677:09070e7285e5 479 setAppearance(app);
rgrover1 680:dabce2969adf 480
rgrover1 680:dabce2969adf 481 ble_error_t rc;
rgrover1 680:dabce2969adf 482 if ((rc = _advPayload.addAppearance(app)) != BLE_ERROR_NONE) {
rgrover1 680:dabce2969adf 483 return rc;
rgrover1 680:dabce2969adf 484 }
rgrover1 680:dabce2969adf 485
rgrover1 680:dabce2969adf 486 return setAdvertisingData();
rgrover1 677:09070e7285e5 487 }
rgrover1 677:09070e7285e5 488
rgrover1 677:09070e7285e5 489 /**
rgrover1 677:09070e7285e5 490 * Accumulate an AD structure in the advertising payload. Please note that
rgrover1 677:09070e7285e5 491 * the payload is limited to 31 bytes. The SCAN_RESPONSE message may be used
rgrover1 677:09070e7285e5 492 * as an additional 31 bytes if the advertising payload proves to be too
rgrover1 677:09070e7285e5 493 * small.
rgrover1 677:09070e7285e5 494 *
rgrover1 677:09070e7285e5 495 * @param app
rgrover1 677:09070e7285e5 496 * The max transmit power to be used by the controller. This is
rgrover1 677:09070e7285e5 497 * only a hint.
rgrover1 677:09070e7285e5 498 */
rgrover1 677:09070e7285e5 499 ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
rgrover1 680:dabce2969adf 500 ble_error_t rc;
rgrover1 680:dabce2969adf 501 if ((rc = _advPayload.addTxPower(power)) != BLE_ERROR_NONE) {
rgrover1 680:dabce2969adf 502 return rc;
rgrover1 680:dabce2969adf 503 }
rgrover1 680:dabce2969adf 504
rgrover1 680:dabce2969adf 505 return setAdvertisingData();
rgrover1 677:09070e7285e5 506 }
rgrover1 677:09070e7285e5 507
rgrover1 677:09070e7285e5 508 /**
rgrover1 677:09070e7285e5 509 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 677:09070e7285e5 510 * advertising payload. Please note that the payload is limited to 31 bytes.
rgrover1 677:09070e7285e5 511 * The SCAN_RESPONSE message may be used as an additional 31 bytes if the
rgrover1 677:09070e7285e5 512 * advertising payload proves to be too small.
rgrover1 677:09070e7285e5 513 *
rgrover1 677:09070e7285e5 514 * @param type The type which describes the variable length data.
rgrover1 677:09070e7285e5 515 * @param data data bytes.
rgrover1 677:09070e7285e5 516 * @param len length of data.
rgrover1 677:09070e7285e5 517 */
rgrover1 677:09070e7285e5 518 ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 677:09070e7285e5 519 if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
rgrover1 677:09070e7285e5 520 setDeviceName(data);
rgrover1 677:09070e7285e5 521 }
rgrover1 680:dabce2969adf 522
rgrover1 680:dabce2969adf 523 ble_error_t rc;
rgrover1 680:dabce2969adf 524 if ((rc = _advPayload.addData(type, data, len)) != BLE_ERROR_NONE) {
rgrover1 680:dabce2969adf 525 return rc;
rgrover1 680:dabce2969adf 526 }
rgrover1 680:dabce2969adf 527
rgrover1 680:dabce2969adf 528 return setAdvertisingData();
rgrover1 680:dabce2969adf 529 }
rgrover1 680:dabce2969adf 530
rgrover1 680:dabce2969adf 531 /**
rgrover1 680:dabce2969adf 532 * Setup a particular, user-constructed advertisement payload for the
rgrover1 680:dabce2969adf 533 * underlying stack. It would be uncommon for this API to be used directly;
rgrover1 680:dabce2969adf 534 * there are other APIs to build an advertisement payload (see above).
rgrover1 680:dabce2969adf 535 */
rgrover1 680:dabce2969adf 536 ble_error_t setAdvertisingPayload(const GapAdvertisingData &payload) {
rgrover1 680:dabce2969adf 537 _advPayload = payload;
rgrover1 680:dabce2969adf 538 return setAdvertisingData();
rgrover1 680:dabce2969adf 539 }
rgrover1 680:dabce2969adf 540
rgrover1 680:dabce2969adf 541 /**
rgrover1 680:dabce2969adf 542 * @return Read back advertising data. Useful for storing and
rgrover1 680:dabce2969adf 543 * restoring payload.
rgrover1 680:dabce2969adf 544 */
rgrover1 680:dabce2969adf 545 const GapAdvertisingData &getAdvertisingPayload(void) const {
rgrover1 680:dabce2969adf 546 return _advPayload;
rgrover1 677:09070e7285e5 547 }
rgrover1 677:09070e7285e5 548
rgrover1 677:09070e7285e5 549 /**
rgrover1 677:09070e7285e5 550 * Accumulate a variable length byte-stream as an AD structure in the
rgrover1 677:09070e7285e5 551 * scanResponse payload.
rgrover1 677:09070e7285e5 552 *
rgrover1 680:dabce2969adf 553 * @param[in] type The type which describes the variable length data.
rgrover1 680:dabce2969adf 554 * @param[in] data data bytes.
rgrover1 680:dabce2969adf 555 * @param[in] len length of data.
rgrover1 677:09070e7285e5 556 */
rgrover1 677:09070e7285e5 557 ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
rgrover1 680:dabce2969adf 558 ble_error_t rc;
rgrover1 680:dabce2969adf 559 if ((rc = _scanResponse.addData(type, data, len)) != BLE_ERROR_NONE) {
rgrover1 680:dabce2969adf 560 return rc;
rgrover1 680:dabce2969adf 561 }
rgrover1 680:dabce2969adf 562
rgrover1 680:dabce2969adf 563 return setAdvertisingData();
rgrover1 677:09070e7285e5 564 }
rgrover1 677:09070e7285e5 565
rgrover1 677:09070e7285e5 566 /**
rgrover1 677:09070e7285e5 567 * Reset any scan response prepared from prior calls to
rgrover1 677:09070e7285e5 568 * accumulateScanResponse().
rgrover1 677:09070e7285e5 569 *
rgrover1 677:09070e7285e5 570 * Note: This should be followed by a call to setAdvertisingPayload() or
rgrover1 677:09070e7285e5 571 * startAdvertising() before the update takes effect.
rgrover1 677:09070e7285e5 572 */
rgrover1 677:09070e7285e5 573 void clearScanResponse(void) {
rgrover1 677:09070e7285e5 574 _scanResponse.clear();
rgrover1 680:dabce2969adf 575 setAdvertisingData();
rgrover1 680:dabce2969adf 576 }
rgrover1 680:dabce2969adf 577
rgrover1 680:dabce2969adf 578 /**
rgrover1 680:dabce2969adf 579 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 680:dabce2969adf 580 * @param[in] interval
rgrover1 680:dabce2969adf 581 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 680:dabce2969adf 582 * @param[in] window
rgrover1 680:dabce2969adf 583 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 680:dabce2969adf 584 * @param[in] timeout
rgrover1 680:dabce2969adf 585 * Scan timeout (in seconds) between 0x0001 and 0xFFFF, 0x0000 disables timeout.
rgrover1 680:dabce2969adf 586 * @param[in] activeScanning
rgrover1 680:dabce2969adf 587 * Set to True if active-scanning is required. This is used to fetch the
rgrover1 680:dabce2969adf 588 * scan response from a peer if possible.
rgrover1 680:dabce2969adf 589 *
rgrover1 680:dabce2969adf 590 * The scanning window divided by the interval determines the duty cycle for
rgrover1 680:dabce2969adf 591 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 680:dabce2969adf 592 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 680:dabce2969adf 593 * to have the interval and window set to the same value. In this case,
rgrover1 680:dabce2969adf 594 * scanning is continuous, with a change of scanning frequency once every
rgrover1 680:dabce2969adf 595 * interval.
rgrover1 680:dabce2969adf 596 *
rgrover1 680:dabce2969adf 597 * Once the scanning parameters have been configured, scanning can be
rgrover1 680:dabce2969adf 598 * enabled by using startScan().
rgrover1 680:dabce2969adf 599 *
rgrover1 680:dabce2969adf 600 * @Note: The scan interval and window are recommendations to the BLE stack.
rgrover1 680:dabce2969adf 601 */
rgrover1 680:dabce2969adf 602 ble_error_t setScanParams(uint16_t interval = GapScanningParams::SCAN_INTERVAL_MAX,
rgrover1 680:dabce2969adf 603 uint16_t window = GapScanningParams::SCAN_WINDOW_MAX,
rgrover1 680:dabce2969adf 604 uint16_t timeout = 0,
rgrover1 680:dabce2969adf 605 bool activeScanning = false) {
rgrover1 680:dabce2969adf 606 ble_error_t rc;
rgrover1 680:dabce2969adf 607 if (((rc = _scanningParams.setInterval(interval)) == BLE_ERROR_NONE) &&
rgrover1 680:dabce2969adf 608 ((rc = _scanningParams.setWindow(window)) == BLE_ERROR_NONE) &&
rgrover1 680:dabce2969adf 609 ((rc = _scanningParams.setTimeout(timeout)) == BLE_ERROR_NONE)) {
rgrover1 680:dabce2969adf 610 _scanningParams.setActiveScanning(activeScanning);
rgrover1 680:dabce2969adf 611 return BLE_ERROR_NONE;
rgrover1 680:dabce2969adf 612 }
rgrover1 680:dabce2969adf 613
rgrover1 680:dabce2969adf 614 return rc;
rgrover1 677:09070e7285e5 615 }
rgrover1 677:09070e7285e5 616
rgrover1 680:dabce2969adf 617 /**
rgrover1 680:dabce2969adf 618 * Setup the scanInterval parameter for GAP scanning--i.e. observer mode.
rgrover1 680:dabce2969adf 619 * @param[in] interval
rgrover1 680:dabce2969adf 620 * Scan interval (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 680:dabce2969adf 621 *
rgrover1 680:dabce2969adf 622 * The scanning window divided by the interval determines the duty cycle for
rgrover1 680:dabce2969adf 623 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 680:dabce2969adf 624 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 680:dabce2969adf 625 * to have the interval and window set to the same value. In this case,
rgrover1 680:dabce2969adf 626 * scanning is continuous, with a change of scanning frequency once every
rgrover1 680:dabce2969adf 627 * interval.
rgrover1 680:dabce2969adf 628 *
rgrover1 680:dabce2969adf 629 * Once the scanning parameters have been configured, scanning can be
rgrover1 680:dabce2969adf 630 * enabled by using startScan().
rgrover1 680:dabce2969adf 631 */
rgrover1 680:dabce2969adf 632 ble_error_t setScanInterval(uint16_t interval) {
rgrover1 680:dabce2969adf 633 return _scanningParams.setInterval(interval);
rgrover1 680:dabce2969adf 634 }
rgrover1 674:923c47bd1547 635
rgrover1 680:dabce2969adf 636 /**
rgrover1 680:dabce2969adf 637 * Setup the scanWindow parameter for GAP scanning--i.e. observer mode.
rgrover1 680:dabce2969adf 638 * @param[in] window
rgrover1 680:dabce2969adf 639 * Scan Window (in milliseconds) [valid values lie between 2.5ms and 10.24s].
rgrover1 680:dabce2969adf 640 *
rgrover1 680:dabce2969adf 641 * The scanning window divided by the interval determines the duty cycle for
rgrover1 680:dabce2969adf 642 * scanning. For example, if the interval is 100ms and the window is 10ms,
rgrover1 680:dabce2969adf 643 * then the controller will scan for 10 percent of the time. It is possible
rgrover1 680:dabce2969adf 644 * to have the interval and window set to the same value. In this case,
rgrover1 680:dabce2969adf 645 * scanning is continuous, with a change of scanning frequency once every
rgrover1 680:dabce2969adf 646 * interval.
rgrover1 680:dabce2969adf 647 *
rgrover1 680:dabce2969adf 648 * Once the scanning parameters have been configured, scanning can be
rgrover1 680:dabce2969adf 649 * enabled by using startScan().
rgrover1 680:dabce2969adf 650 */
rgrover1 680:dabce2969adf 651 ble_error_t setScanWindow(uint16_t window) {
rgrover1 680:dabce2969adf 652 return _scanningParams.setWindow(window);
rgrover1 680:dabce2969adf 653 }
rgrover1 680:dabce2969adf 654
rgrover1 680:dabce2969adf 655 /**
rgrover1 680:dabce2969adf 656 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 680:dabce2969adf 657 * @param[in] timeout
rgrover1 680:dabce2969adf 658 * Scan timeout (in seconds) between 0x0001 and 0xFFFF, 0x0000 disables timeout.
rgrover1 680:dabce2969adf 659 *
rgrover1 680:dabce2969adf 660 * Once the scanning parameters have been configured, scanning can be
rgrover1 680:dabce2969adf 661 * enabled by using startScan().
rgrover1 680:dabce2969adf 662 */
rgrover1 680:dabce2969adf 663 ble_error_t setScanTimeout(uint16_t timeout) {
rgrover1 680:dabce2969adf 664 return _scanningParams.setTimeout(timeout);
rgrover1 680:dabce2969adf 665 }
rgrover1 680:dabce2969adf 666
rgrover1 680:dabce2969adf 667 /**
rgrover1 680:dabce2969adf 668 * Setup parameters for GAP scanning--i.e. observer mode.
rgrover1 680:dabce2969adf 669 * @param[in] activeScanning
rgrover1 680:dabce2969adf 670 * Set to True if active-scanning is required. This is used to fetch the
rgrover1 680:dabce2969adf 671 * scan response from a peer if possible.
rgrover1 680:dabce2969adf 672 *
rgrover1 680:dabce2969adf 673 * Once the scanning parameters have been configured, scanning can be
rgrover1 680:dabce2969adf 674 * enabled by using startScan().
rgrover1 680:dabce2969adf 675 */
rgrover1 680:dabce2969adf 676 void setActiveScanning(bool activeScanning) {
rgrover1 680:dabce2969adf 677 _scanningParams.setActiveScanning(activeScanning);
rgrover1 680:dabce2969adf 678 }
rgrover1 680:dabce2969adf 679
rgrover1 680:dabce2969adf 680 /**
rgrover1 680:dabce2969adf 681 * Start scanning (Observer Procedure) based on the parameters currently in
rgrover1 680:dabce2969adf 682 * effect.
rgrover1 680:dabce2969adf 683 *
rgrover1 680:dabce2969adf 684 * @param[in] callback
rgrover1 680:dabce2969adf 685 * The application specific callback to be invoked upon
rgrover1 680:dabce2969adf 686 * receiving every advertisement report. This can be passed in
rgrover1 680:dabce2969adf 687 * as NULL, in which case scanning may not be enabled at all.
rgrover1 680:dabce2969adf 688 */
rgrover1 674:923c47bd1547 689 ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 690 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 691 if (callback) {
rgrover1 675:30aab0f789f6 692 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 693 onAdvertisementReport.attach(callback);
rgrover1 407:ca6b956b33d1 694 }
rgrover1 407:ca6b956b33d1 695 }
rgrover1 407:ca6b956b33d1 696
rgrover1 407:ca6b956b33d1 697 return err;
rgrover1 407:ca6b956b33d1 698 }
rgrover1 407:ca6b956b33d1 699
rgrover1 680:dabce2969adf 700 /**
rgrover1 680:dabce2969adf 701 * Same as above, but this takes an (object, method) pair for a callback.
rgrover1 680:dabce2969adf 702 */
rgrover1 407:ca6b956b33d1 703 template<typename T>
rgrover1 674:923c47bd1547 704 ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 705 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 706 if (object && callbackMember) {
rgrover1 675:30aab0f789f6 707 if ((err = startRadioScan(_scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 708 onAdvertisementReport.attach(object, callbackMember);
rgrover1 407:ca6b956b33d1 709 }
rgrover1 407:ca6b956b33d1 710 }
rgrover1 407:ca6b956b33d1 711
rgrover1 407:ca6b956b33d1 712 return err;
rgrover1 407:ca6b956b33d1 713 }
rgrover1 407:ca6b956b33d1 714
rgrover1 680:dabce2969adf 715 private:
rgrover1 680:dabce2969adf 716 ble_error_t setAdvertisingData(void) {
rgrover1 680:dabce2969adf 717 return setAdvertisingData(_advPayload, _scanResponse);
rgrover1 680:dabce2969adf 718 }
rgrover1 680:dabce2969adf 719
rgrover1 680:dabce2969adf 720 private:
rgrover1 680:dabce2969adf 721 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
rgrover1 680:dabce2969adf 722 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
rgrover1 680:dabce2969adf 723
rgrover1 680:dabce2969adf 724 public:
rgrover1 680:dabce2969adf 725 /**
rgrover1 680:dabce2969adf 726 * Accessors to read back currently active advertising params.
rgrover1 680:dabce2969adf 727 */
rgrover1 680:dabce2969adf 728 GapAdvertisingParams &getAdvertisingParams(void) {
rgrover1 680:dabce2969adf 729 return _advParams;
rgrover1 680:dabce2969adf 730 }
rgrover1 680:dabce2969adf 731 const GapAdvertisingParams &getAdvertisingParams(void) const {
rgrover1 680:dabce2969adf 732 return _advParams;
rgrover1 680:dabce2969adf 733 }
rgrover1 680:dabce2969adf 734
rgrover1 680:dabce2969adf 735 /**
rgrover1 680:dabce2969adf 736 * Setup a particular, user-constructed set of advertisement parameters for
rgrover1 680:dabce2969adf 737 * the underlying stack. It would be uncommon for this API to be used
rgrover1 680:dabce2969adf 738 * directly; there are other APIs to tweak advertisement parameters
rgrover1 680:dabce2969adf 739 * individually.
rgrover1 680:dabce2969adf 740 */
rgrover1 680:dabce2969adf 741 void setAdvertisingParams(const GapAdvertisingParams &newParams) {
rgrover1 680:dabce2969adf 742 _advParams = newParams;
rgrover1 680:dabce2969adf 743 }
rgrover1 680:dabce2969adf 744
rgrover1 669:7179b4a5aa7d 745 public:
rgrover1 567:e4b38e43de7c 746 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) = 0;
rgrover1 537:00d5affbb2b2 747
rgrover1 567:e4b38e43de7c 748 /* Event callback handlers */
rgrover1 567:e4b38e43de7c 749 void setOnTimeout(EventCallback_t callback) {onTimeout = callback;}
rgrover1 567:e4b38e43de7c 750 void setOnConnection(ConnectionEventCallback_t callback) {onConnection = callback;}
rgrover1 260:ea7f9f14cc15 751
rgrover1 260:ea7f9f14cc15 752 /**
rgrover1 260:ea7f9f14cc15 753 * Set the application callback for disconnection events.
rgrover1 260:ea7f9f14cc15 754 * @param callback
rgrover1 260:ea7f9f14cc15 755 * Pointer to the unique callback.
rgrover1 260:ea7f9f14cc15 756 */
rgrover1 567:e4b38e43de7c 757 void setOnDisconnection(DisconnectionEventCallback_t callback) {onDisconnection = callback;}
rgrover1 567:e4b38e43de7c 758
rgrover1 567:e4b38e43de7c 759 /**
rgrover1 567:e4b38e43de7c 760 * Set the application callback for radio-notification events.
rgrover1 567:e4b38e43de7c 761 * @param callback
rgrover1 567:e4b38e43de7c 762 * Handler to be executed in response to a radio notification event.
rgrover1 567:e4b38e43de7c 763 */
rgrover1 567:e4b38e43de7c 764 virtual void setOnRadioNotification(RadioNotificationEventCallback_t callback) {onRadioNotification = callback;}
rgrover1 567:e4b38e43de7c 765
rgrover1 567:e4b38e43de7c 766 /**
rgrover1 567:e4b38e43de7c 767 * To indicate that security procedure for link has started.
rgrover1 567:e4b38e43de7c 768 */
rgrover1 567:e4b38e43de7c 769 virtual void setOnSecuritySetupInitiated(SecuritySetupInitiatedCallback_t callback) {onSecuritySetupInitiated = callback;}
rgrover1 567:e4b38e43de7c 770
rgrover1 567:e4b38e43de7c 771 /**
rgrover1 567:e4b38e43de7c 772 * To indicate that security procedure for link has completed.
rgrover1 567:e4b38e43de7c 773 */
rgrover1 567:e4b38e43de7c 774 virtual void setOnSecuritySetupCompleted(SecuritySetupCompletedCallback_t callback) {onSecuritySetupCompleted = callback;}
rgrover1 567:e4b38e43de7c 775
rgrover1 567:e4b38e43de7c 776 /**
rgrover1 567:e4b38e43de7c 777 * To indicate that link with the peer is secured. For bonded devices,
rgrover1 567:e4b38e43de7c 778 * subsequent re-connections with bonded peer will result only in this callback
rgrover1 567:e4b38e43de7c 779 * when the link is secured and setup procedures will not occur unless the
rgrover1 567:e4b38e43de7c 780 * bonding information is either lost or deleted on either or both sides.
rgrover1 567:e4b38e43de7c 781 */
rgrover1 567:e4b38e43de7c 782 virtual void setOnLinkSecured(LinkSecuredCallback_t callback) {onLinkSecured = callback;}
rgrover1 567:e4b38e43de7c 783
rgrover1 567:e4b38e43de7c 784 /**
rgrover1 567:e4b38e43de7c 785 * To indicate that device context is stored persistently.
rgrover1 567:e4b38e43de7c 786 */
rgrover1 567:e4b38e43de7c 787 virtual void setOnSecurityContextStored(HandleSpecificEvent_t callback) {onSecurityContextStored = callback;}
rgrover1 567:e4b38e43de7c 788
rgrover1 567:e4b38e43de7c 789 /**
rgrover1 567:e4b38e43de7c 790 * To set the callback for when the passkey needs to be displayed on a peripheral with DISPLAY capability.
rgrover1 567:e4b38e43de7c 791 */
rgrover1 567:e4b38e43de7c 792 virtual void setOnPasskeyDisplay(PasskeyDisplayCallback_t callback) {onPasskeyDisplay = callback;}
rgrover1 544:840f428d18c7 793
rgrover1 544:840f428d18c7 794 /**
rgrover1 544:840f428d18c7 795 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 544:840f428d18c7 796 * callbacks receive no context and are therefore different from the
rgrover1 567:e4b38e43de7c 797 * onDisconnection callback.
rgrover1 544:840f428d18c7 798 * @param callback
rgrover1 544:840f428d18c7 799 * function pointer to be invoked upon disconnection; receives no context.
rgrover1 567:e4b38e43de7c 800 *
rgrover1 567:e4b38e43de7c 801 * @note the disconnection CallChain should have been merged with
rgrover1 567:e4b38e43de7c 802 * onDisconnctionCallback; but this was not possible because
rgrover1 567:e4b38e43de7c 803 * FunctionPointer (which is a building block for CallChain) doesn't
rgrover1 567:e4b38e43de7c 804 * accept variadic templates.
rgrover1 544:840f428d18c7 805 */
rgrover1 544:840f428d18c7 806 template<typename T>
rgrover1 544:840f428d18c7 807 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
rgrover1 260:ea7f9f14cc15 808
rgrover1 260:ea7f9f14cc15 809 protected:
rgrover1 349:b8b2b3973c47 810 Gap() :
rgrover1 675:30aab0f789f6 811 _advParams(),
rgrover1 675:30aab0f789f6 812 _advPayload(),
rgrover1 675:30aab0f789f6 813 _scanningParams(),
rgrover1 675:30aab0f789f6 814 _scanResponse(),
rgrover1 349:b8b2b3973c47 815 state(),
rgrover1 567:e4b38e43de7c 816 onTimeout(NULL),
rgrover1 567:e4b38e43de7c 817 onConnection(NULL),
rgrover1 567:e4b38e43de7c 818 onDisconnection(NULL),
rgrover1 567:e4b38e43de7c 819 onRadioNotification(),
rgrover1 567:e4b38e43de7c 820 onSecuritySetupInitiated(),
rgrover1 567:e4b38e43de7c 821 onSecuritySetupCompleted(),
rgrover1 567:e4b38e43de7c 822 onLinkSecured(),
rgrover1 567:e4b38e43de7c 823 onSecurityContextStored(),
rgrover1 567:e4b38e43de7c 824 onPasskeyDisplay(),
rgrover1 382:dcd0428dadb0 825 onAdvertisementReport(),
rgrover1 349:b8b2b3973c47 826 disconnectionCallChain() {
rgrover1 675:30aab0f789f6 827 _advPayload.clear();
rgrover1 675:30aab0f789f6 828 _scanResponse.clear();
rgrover1 260:ea7f9f14cc15 829 }
rgrover1 260:ea7f9f14cc15 830
rgrover1 260:ea7f9f14cc15 831 public:
rgrover1 670:5e4aecd9af5b 832 void processConnectionEvent(Handle_t handle,
rgrover1 670:5e4aecd9af5b 833 Role_t role,
rgrover1 670:5e4aecd9af5b 834 AddressType_t peerAddrType,
rgrover1 670:5e4aecd9af5b 835 const Address_t peerAddr,
rgrover1 670:5e4aecd9af5b 836 AddressType_t ownAddrType,
rgrover1 670:5e4aecd9af5b 837 const Address_t ownAddr,
rgrover1 670:5e4aecd9af5b 838 const ConnectionParams_t *connectionParams) {
rgrover1 260:ea7f9f14cc15 839 state.connected = 1;
rgrover1 567:e4b38e43de7c 840 if (onConnection) {
rgrover1 670:5e4aecd9af5b 841 ConnectionCallbackParams_t callbackParams(handle, role, peerAddrType, peerAddr, ownAddrType, ownAddr, connectionParams);
rgrover1 670:5e4aecd9af5b 842 onConnection(&callbackParams);
rgrover1 260:ea7f9f14cc15 843 }
rgrover1 260:ea7f9f14cc15 844 }
rgrover1 260:ea7f9f14cc15 845
rgrover1 260:ea7f9f14cc15 846 void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
rgrover1 260:ea7f9f14cc15 847 state.connected = 0;
rgrover1 567:e4b38e43de7c 848 if (onDisconnection) {
rgrover1 567:e4b38e43de7c 849 onDisconnection(handle, reason);
rgrover1 260:ea7f9f14cc15 850 }
rgrover1 260:ea7f9f14cc15 851 disconnectionCallChain.call();
rgrover1 260:ea7f9f14cc15 852 }
rgrover1 260:ea7f9f14cc15 853
rgrover1 567:e4b38e43de7c 854 void processSecuritySetupInitiatedEvent(Handle_t handle, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps) {
rgrover1 567:e4b38e43de7c 855 if (onSecuritySetupInitiated) {
rgrover1 567:e4b38e43de7c 856 onSecuritySetupInitiated(handle, allowBonding, requireMITM, iocaps);
rgrover1 567:e4b38e43de7c 857 }
rgrover1 567:e4b38e43de7c 858 }
rgrover1 567:e4b38e43de7c 859
rgrover1 567:e4b38e43de7c 860 void processSecuritySetupCompletedEvent(Handle_t handle, SecurityCompletionStatus_t status) {
rgrover1 567:e4b38e43de7c 861 if (onSecuritySetupCompleted) {
rgrover1 567:e4b38e43de7c 862 onSecuritySetupCompleted(handle, status);
rgrover1 567:e4b38e43de7c 863 }
rgrover1 567:e4b38e43de7c 864 }
rgrover1 567:e4b38e43de7c 865
rgrover1 567:e4b38e43de7c 866 void processLinkSecuredEvent(Handle_t handle, SecurityMode_t securityMode) {
rgrover1 567:e4b38e43de7c 867 if (onLinkSecured) {
rgrover1 567:e4b38e43de7c 868 onLinkSecured(handle, securityMode);
rgrover1 567:e4b38e43de7c 869 }
rgrover1 567:e4b38e43de7c 870 }
rgrover1 567:e4b38e43de7c 871
rgrover1 567:e4b38e43de7c 872 void processSecurityContextStoredEvent(Handle_t handle) {
rgrover1 567:e4b38e43de7c 873 if (onSecurityContextStored) {
rgrover1 567:e4b38e43de7c 874 onSecurityContextStored(handle);
rgrover1 567:e4b38e43de7c 875 }
rgrover1 567:e4b38e43de7c 876 }
rgrover1 567:e4b38e43de7c 877
rgrover1 567:e4b38e43de7c 878 void processPasskeyDisplayEvent(Handle_t handle, const Passkey_t passkey) {
rgrover1 567:e4b38e43de7c 879 if (onPasskeyDisplay) {
rgrover1 567:e4b38e43de7c 880 onPasskeyDisplay(handle, passkey);
rgrover1 567:e4b38e43de7c 881 }
rgrover1 567:e4b38e43de7c 882 }
rgrover1 567:e4b38e43de7c 883
rgrover1 680:dabce2969adf 884 void processAdvertisementReport(const Address_t peerAddr,
rgrover1 680:dabce2969adf 885 int8_t rssi,
rgrover1 680:dabce2969adf 886 bool isScanResponse,
rgrover1 680:dabce2969adf 887 GapAdvertisingParams::AdvertisingType_t type,
rgrover1 680:dabce2969adf 888 uint8_t advertisingDataLen,
rgrover1 680:dabce2969adf 889 const uint8_t *advertisingData) {
rgrover1 406:cec6778acc66 890 AdvertisementCallbackParams_t params;
rgrover1 406:cec6778acc66 891 memcpy(params.peerAddr, peerAddr, ADDR_LEN);
rgrover1 406:cec6778acc66 892 params.rssi = rssi;
rgrover1 406:cec6778acc66 893 params.isScanResponse = isScanResponse;
rgrover1 406:cec6778acc66 894 params.type = type;
rgrover1 406:cec6778acc66 895 params.advertisingDataLen = advertisingDataLen;
rgrover1 406:cec6778acc66 896 params.advertisingData = advertisingData;
rgrover1 406:cec6778acc66 897 onAdvertisementReport.call(&params);
rgrover1 382:dcd0428dadb0 898 }
rgrover1 382:dcd0428dadb0 899
rgrover1 567:e4b38e43de7c 900 void processEvent(GapEvents::gapEvent_e type) {
rgrover1 567:e4b38e43de7c 901 switch (type) {
rgrover1 567:e4b38e43de7c 902 case GapEvents::GAP_EVENT_TIMEOUT:
rgrover1 567:e4b38e43de7c 903 state.advertising = 0;
rgrover1 567:e4b38e43de7c 904 if (onTimeout) {
rgrover1 567:e4b38e43de7c 905 onTimeout();
rgrover1 567:e4b38e43de7c 906 }
rgrover1 567:e4b38e43de7c 907 break;
rgrover1 567:e4b38e43de7c 908 default:
rgrover1 567:e4b38e43de7c 909 break;
rgrover1 260:ea7f9f14cc15 910 }
rgrover1 260:ea7f9f14cc15 911 }
rgrover1 260:ea7f9f14cc15 912
rgrover1 260:ea7f9f14cc15 913 protected:
rgrover1 675:30aab0f789f6 914 GapAdvertisingParams _advParams;
rgrover1 675:30aab0f789f6 915 GapAdvertisingData _advPayload;
rgrover1 675:30aab0f789f6 916 GapScanningParams _scanningParams;
rgrover1 675:30aab0f789f6 917 GapAdvertisingData _scanResponse;
rgrover1 674:923c47bd1547 918
rgrover1 363:a3d59a6e5da0 919 GapState_t state;
rgrover1 260:ea7f9f14cc15 920
rgrover1 337:e7c2eb38f5cc 921 protected:
rgrover1 567:e4b38e43de7c 922 EventCallback_t onTimeout;
rgrover1 567:e4b38e43de7c 923 ConnectionEventCallback_t onConnection;
rgrover1 567:e4b38e43de7c 924 DisconnectionEventCallback_t onDisconnection;
rgrover1 567:e4b38e43de7c 925 RadioNotificationEventCallback_t onRadioNotification;
rgrover1 567:e4b38e43de7c 926 SecuritySetupInitiatedCallback_t onSecuritySetupInitiated;
rgrover1 567:e4b38e43de7c 927 SecuritySetupCompletedCallback_t onSecuritySetupCompleted;
rgrover1 567:e4b38e43de7c 928 LinkSecuredCallback_t onLinkSecured;
rgrover1 567:e4b38e43de7c 929 HandleSpecificEvent_t onSecurityContextStored;
rgrover1 567:e4b38e43de7c 930 PasskeyDisplayCallback_t onPasskeyDisplay;
rgrover1 385:6e66d1c6de00 931 AdvertisementReportCallback_t onAdvertisementReport;
rgrover1 363:a3d59a6e5da0 932 CallChain disconnectionCallChain;
rgrover1 260:ea7f9f14cc15 933
rgrover1 260:ea7f9f14cc15 934 private:
rgrover1 260:ea7f9f14cc15 935 /* disallow copy and assignment */
rgrover1 260:ea7f9f14cc15 936 Gap(const Gap &);
rgrover1 260:ea7f9f14cc15 937 Gap& operator=(const Gap &);
rgrover1 260:ea7f9f14cc15 938 };
rgrover1 260:ea7f9f14cc15 939
rgrover1 260:ea7f9f14cc15 940 #endif // ifndef __GAP_H__