Igor Levkov / BLE_API

Dependents:   BLE_PowerBank_HeyFaradey

Fork of BLE_API by Bluetooth Low Energy

Committer:
rgrover1
Date:
Fri Jun 19 15:53:28 2015 +0100
Revision:
711:ea0c4bf9ec99
Parent:
710:b2e1a2660ec2
Synchronized with git rev 69726547
Author: Rohit Grover
Release 0.3.9
=============

A minor patch to fix a build error introduced by the previous
release. This has to do with certain declarations being made members
of class UUID.

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 260:ea7f9f14cc15 22 #include "GapEvents.h"
rgrover1 260:ea7f9f14cc15 23 #include "CallChain.h"
rgrover1 406:cec6778acc66 24 #include "FunctionPointerWithContext.h"
rgrover1 260:ea7f9f14cc15 25
rgrover1 260:ea7f9f14cc15 26 using namespace mbed;
rgrover1 260:ea7f9f14cc15 27
rgrover1 710:b2e1a2660ec2 28 class GapScanningParams; /* forward declaration */
rgrover1 397:9f5bfae7ea50 29
rgrover1 260:ea7f9f14cc15 30 class Gap {
rgrover1 260:ea7f9f14cc15 31 public:
rgrover1 375:9cb0b006227e 32 enum AddressType_t {
rgrover1 260:ea7f9f14cc15 33 ADDR_TYPE_PUBLIC = 0,
rgrover1 260:ea7f9f14cc15 34 ADDR_TYPE_RANDOM_STATIC,
rgrover1 260:ea7f9f14cc15 35 ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
rgrover1 260:ea7f9f14cc15 36 ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE
rgrover1 375:9cb0b006227e 37 };
rgrover1 402:0e714ad205b4 38 typedef enum AddressType_t addr_type_t; /* @Note: deprecated. Use AddressType_t instead. */
rgrover1 260:ea7f9f14cc15 39
rgrover1 260:ea7f9f14cc15 40 static const unsigned ADDR_LEN = 6;
rgrover1 375:9cb0b006227e 41 typedef uint8_t Address_t[ADDR_LEN]; /* 48-bit address, LSB format. */
rgrover1 402:0e714ad205b4 42 typedef Address_t address_t; /* @Note: deprecated. Use Address_t instead. */
rgrover1 260:ea7f9f14cc15 43
rgrover1 710:b2e1a2660ec2 44 enum AdvertisementType_t {
rgrover1 710:b2e1a2660ec2 45 ADV_IND = 0x00, /**< Connectable undirected. */
rgrover1 710:b2e1a2660ec2 46 ADV_DIRECT_IND = 0x01, /**< Connectable directed. */
rgrover1 710:b2e1a2660ec2 47 ADV_SCAN_IND = 0x02, /**< Scannable undirected. */
rgrover1 710:b2e1a2660ec2 48 ADV_NONCONN_IND = 0x03, /**< Non connectable undirected. */
rgrover1 684:448cdd97e926 49 };
rgrover1 684:448cdd97e926 50
rgrover1 260:ea7f9f14cc15 51 /**
rgrover1 260:ea7f9f14cc15 52 * Enumeration for disconnection reasons. The values for these reasons are
rgrover1 260:ea7f9f14cc15 53 * derived from Nordic's implementation; but the reasons are meant to be
rgrover1 260:ea7f9f14cc15 54 * independent of the transport. If you are returned a reason which is not
rgrover1 260:ea7f9f14cc15 55 * covered by this enumeration, then please refer to the underlying
rgrover1 260:ea7f9f14cc15 56 * transport library.
rgrover1 260:ea7f9f14cc15 57 */
rgrover1 260:ea7f9f14cc15 58 enum DisconnectionReason_t {
rgrover1 710:b2e1a2660ec2 59 REMOTE_USER_TERMINATED_CONNECTION = 0x13,
rgrover1 710:b2e1a2660ec2 60 LOCAL_HOST_TERMINATED_CONNECTION = 0x16,
rgrover1 710:b2e1a2660ec2 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 710:b2e1a2660ec2 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 710:b2e1a2660ec2 79 enum SecurityMode_t {
rgrover1 710:b2e1a2660ec2 80 SECURITY_MODE_NO_ACCESS,
rgrover1 710:b2e1a2660ec2 81 SECURITY_MODE_ENCRYPTION_OPEN_LINK, /**< require no protection, open link. */
rgrover1 710:b2e1a2660ec2 82 SECURITY_MODE_ENCRYPTION_NO_MITM, /**< require encryption, but no MITM protection. */
rgrover1 710:b2e1a2660ec2 83 SECURITY_MODE_ENCRYPTION_WITH_MITM, /**< require encryption and MITM protection. */
rgrover1 710:b2e1a2660ec2 84 SECURITY_MODE_SIGNED_NO_MITM, /**< require signing or encryption, but no MITM protection. */
rgrover1 710:b2e1a2660ec2 85 SECURITY_MODE_SIGNED_WITH_MITM, /**< require signing or encryption, and MITM protection. */
rgrover1 710:b2e1a2660ec2 86 };
rgrover1 710:b2e1a2660ec2 87
rgrover1 710:b2e1a2660ec2 88 /**
rgrover1 710:b2e1a2660ec2 89 * @brief Defines possible security status/states.
rgrover1 710:b2e1a2660ec2 90 *
rgrover1 710:b2e1a2660ec2 91 * @details Defines possible security status/states of a link when requested by getLinkSecurity().
rgrover1 710:b2e1a2660ec2 92 */
rgrover1 710:b2e1a2660ec2 93 enum LinkSecurityStatus_t {
rgrover1 710:b2e1a2660ec2 94 NOT_ENCRYPTED, /**< The link is not secured. */
rgrover1 710:b2e1a2660ec2 95 ENCRYPTION_IN_PROGRESS, /**< Link security is being established.*/
rgrover1 710:b2e1a2660ec2 96 ENCRYPTED /**< The link is secure.*/
rgrover1 670:5e4aecd9af5b 97 };
rgrover1 670:5e4aecd9af5b 98
rgrover1 710:b2e1a2660ec2 99 enum SecurityIOCapabilities_t {
rgrover1 710:b2e1a2660ec2 100 IO_CAPS_DISPLAY_ONLY = 0x00, /**< Display Only. */
rgrover1 710:b2e1a2660ec2 101 IO_CAPS_DISPLAY_YESNO = 0x01, /**< Display and Yes/No entry. */
rgrover1 710:b2e1a2660ec2 102 IO_CAPS_KEYBOARD_ONLY = 0x02, /**< Keyboard Only. */
rgrover1 710:b2e1a2660ec2 103 IO_CAPS_NONE = 0x03, /**< No I/O capabilities. */
rgrover1 710:b2e1a2660ec2 104 IO_CAPS_KEYBOARD_DISPLAY = 0x04, /**< Keyboard and Display. */
rgrover1 670:5e4aecd9af5b 105 };
rgrover1 670:5e4aecd9af5b 106
rgrover1 710:b2e1a2660ec2 107 enum SecurityCompletionStatus_t {
rgrover1 710:b2e1a2660ec2 108 SEC_STATUS_SUCCESS = 0x00, /**< Procedure completed with success. */
rgrover1 710:b2e1a2660ec2 109 SEC_STATUS_TIMEOUT = 0x01, /**< Procedure timed out. */
rgrover1 710:b2e1a2660ec2 110 SEC_STATUS_PDU_INVALID = 0x02, /**< Invalid PDU received. */
rgrover1 710:b2e1a2660ec2 111 SEC_STATUS_PASSKEY_ENTRY_FAILED = 0x81, /**< Passkey entry failed (user canceled or other). */
rgrover1 710:b2e1a2660ec2 112 SEC_STATUS_OOB_NOT_AVAILABLE = 0x82, /**< Out of Band Key not available. */
rgrover1 710:b2e1a2660ec2 113 SEC_STATUS_AUTH_REQ = 0x83, /**< Authentication requirements not met. */
rgrover1 710:b2e1a2660ec2 114 SEC_STATUS_CONFIRM_VALUE = 0x84, /**< Confirm value failed. */
rgrover1 710:b2e1a2660ec2 115 SEC_STATUS_PAIRING_NOT_SUPP = 0x85, /**< Pairing not supported. */
rgrover1 710:b2e1a2660ec2 116 SEC_STATUS_ENC_KEY_SIZE = 0x86, /**< Encryption key size. */
rgrover1 710:b2e1a2660ec2 117 SEC_STATUS_SMP_CMD_UNSUPPORTED = 0x87, /**< Unsupported SMP command. */
rgrover1 710:b2e1a2660ec2 118 SEC_STATUS_UNSPECIFIED = 0x88, /**< Unspecified reason. */
rgrover1 710:b2e1a2660ec2 119 SEC_STATUS_REPEATED_ATTEMPTS = 0x89, /**< Too little time elapsed since last attempt. */
rgrover1 710:b2e1a2660ec2 120 SEC_STATUS_INVALID_PARAMS = 0x8A, /**< Invalid parameters. */
rgrover1 670:5e4aecd9af5b 121 };
rgrover1 670:5e4aecd9af5b 122
rgrover1 710:b2e1a2660ec2 123 /**
rgrover1 710:b2e1a2660ec2 124 * Declaration of type containing a passkey to be used during pairing. This
rgrover1 710:b2e1a2660ec2 125 * is passed into initializeSecurity() to specify a pre-programmed passkey
rgrover1 710:b2e1a2660ec2 126 * for authentication instead of generating a random one.
rgrover1 710:b2e1a2660ec2 127 */
rgrover1 710:b2e1a2660ec2 128 static const unsigned PASSKEY_LEN = 6;
rgrover1 710:b2e1a2660ec2 129 typedef uint8_t Passkey_t[PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */
rgrover1 710:b2e1a2660ec2 130
rgrover1 260:ea7f9f14cc15 131 static const uint16_t UNIT_1_25_MS = 1250; /**< Number of microseconds in 1.25 milliseconds. */
rgrover1 398:9d7666c2305f 132 static const uint16_t UNIT_0_625_MS = 625; /**< Number of microseconds in 0.625 milliseconds. */
rgrover1 260:ea7f9f14cc15 133 static uint16_t MSEC_TO_GAP_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 134 return (durationInMillis * 1000) / UNIT_1_25_MS;
rgrover1 260:ea7f9f14cc15 135 }
rgrover1 260:ea7f9f14cc15 136 static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 260:ea7f9f14cc15 137 return (durationInMillis * 1000) / UNIT_0_625_MS;
rgrover1 260:ea7f9f14cc15 138 }
rgrover1 399:1a69d53f00cc 139 static uint16_t ADVERTISEMENT_DURATION_UNITS_TO_MS(uint16_t gapUnits) {
rgrover1 325:501ad8b8bbe5 140 return (gapUnits * UNIT_0_625_MS) / 1000;
rgrover1 325:501ad8b8bbe5 141 }
rgrover1 260:ea7f9f14cc15 142
rgrover1 710:b2e1a2660ec2 143 typedef void (*EventCallback_t)(void);
rgrover1 710:b2e1a2660ec2 144 typedef void (*ConnectionEventCallback_t)(Handle_t,
rgrover1 710:b2e1a2660ec2 145 AddressType_t peerAddrType, const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 146 AddressType_t ownAddrType, const Address_t ownAddr,
rgrover1 710:b2e1a2660ec2 147 const ConnectionParams_t *);
rgrover1 710:b2e1a2660ec2 148 typedef void (*HandleSpecificEvent_t)(Handle_t handle);
rgrover1 260:ea7f9f14cc15 149 typedef void (*DisconnectionEventCallback_t)(Handle_t, DisconnectionReason_t);
rgrover1 710:b2e1a2660ec2 150 typedef void (*RadioNotificationEventCallback_t) (bool radio_active); /* gets passed true for ACTIVE; false for INACTIVE. */
rgrover1 710:b2e1a2660ec2 151 typedef void (*SecuritySetupInitiatedCallback_t)(Handle_t, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps);
rgrover1 710:b2e1a2660ec2 152 typedef void (*SecuritySetupCompletedCallback_t)(Handle_t, SecurityCompletionStatus_t status);
rgrover1 710:b2e1a2660ec2 153 typedef void (*LinkSecuredCallback_t)(Handle_t handle, SecurityMode_t securityMode);
rgrover1 710:b2e1a2660ec2 154 typedef void (*PasskeyDisplayCallback_t)(Handle_t handle, const Passkey_t passkey);
rgrover1 537:00d5affbb2b2 155
rgrover1 710:b2e1a2660ec2 156 struct AdvertisementCallbackParams_t {
rgrover1 710:b2e1a2660ec2 157 Address_t peerAddr;
rgrover1 710:b2e1a2660ec2 158 int8_t rssi;
rgrover1 710:b2e1a2660ec2 159 bool isScanResponse;
rgrover1 710:b2e1a2660ec2 160 AdvertisementType_t type;
rgrover1 710:b2e1a2660ec2 161 uint8_t advertisingDataLen;
rgrover1 710:b2e1a2660ec2 162 const uint8_t *advertisingData;
rgrover1 710:b2e1a2660ec2 163 };
rgrover1 710:b2e1a2660ec2 164 typedef FunctionPointerWithContext<const AdvertisementCallbackParams_t *> AdvertisementReportCallback_t;
rgrover1 680:dabce2969adf 165
rgrover1 710:b2e1a2660ec2 166 friend class BLEDevice;
rgrover1 677:09070e7285e5 167
rgrover1 710:b2e1a2660ec2 168 private:
rgrover1 710:b2e1a2660ec2 169 /* These functions must be defined in the sub-class */
rgrover1 710:b2e1a2660ec2 170 virtual ble_error_t setAddress(AddressType_t type, const Address_t address) = 0;
rgrover1 710:b2e1a2660ec2 171 virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address) = 0;
rgrover1 710:b2e1a2660ec2 172 virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
rgrover1 710:b2e1a2660ec2 173 virtual ble_error_t startAdvertising(const GapAdvertisingParams &) = 0;
rgrover1 710:b2e1a2660ec2 174 virtual ble_error_t stopAdvertising(void) = 0;
rgrover1 710:b2e1a2660ec2 175 virtual ble_error_t stopScan() = 0;
rgrover1 710:b2e1a2660ec2 176 virtual uint16_t getMinAdvertisingInterval(void) const = 0;
rgrover1 710:b2e1a2660ec2 177 virtual uint16_t getMinNonConnectableAdvertisingInterval(void) const = 0;
rgrover1 710:b2e1a2660ec2 178 virtual uint16_t getMaxAdvertisingInterval(void) const = 0;
rgrover1 710:b2e1a2660ec2 179 virtual ble_error_t disconnect(DisconnectionReason_t reason) = 0;
rgrover1 710:b2e1a2660ec2 180 virtual ble_error_t getPreferredConnectionParams(ConnectionParams_t *params) = 0;
rgrover1 710:b2e1a2660ec2 181 virtual ble_error_t setPreferredConnectionParams(const ConnectionParams_t *params) = 0;
rgrover1 710:b2e1a2660ec2 182 virtual ble_error_t updateConnectionParams(Handle_t handle, const ConnectionParams_t *params) = 0;
rgrover1 680:dabce2969adf 183
rgrover1 710:b2e1a2660ec2 184 virtual ble_error_t purgeAllBondingState(void) = 0;
rgrover1 710:b2e1a2660ec2 185 virtual ble_error_t getLinkSecurity(Handle_t connectionHandle, LinkSecurityStatus_t *securityStatusP) = 0;
rgrover1 680:dabce2969adf 186
rgrover1 710:b2e1a2660ec2 187 virtual ble_error_t setDeviceName(const uint8_t *deviceName) = 0;
rgrover1 710:b2e1a2660ec2 188 virtual ble_error_t getDeviceName(uint8_t *deviceName, unsigned *lengthP) = 0;
rgrover1 710:b2e1a2660ec2 189 virtual ble_error_t setAppearance(uint16_t appearance) = 0;
rgrover1 710:b2e1a2660ec2 190 virtual ble_error_t getAppearance(uint16_t *appearanceP) = 0;
rgrover1 677:09070e7285e5 191
rgrover1 710:b2e1a2660ec2 192 ble_error_t startScan(const GapScanningParams &scanningParams, void (*callback)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 193 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 194 if (callback) {
rgrover1 710:b2e1a2660ec2 195 if ((err = startRadioScan(scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 196 onAdvertisementReport.attach(callback);
rgrover1 407:ca6b956b33d1 197 }
rgrover1 407:ca6b956b33d1 198 }
rgrover1 407:ca6b956b33d1 199
rgrover1 407:ca6b956b33d1 200 return err;
rgrover1 407:ca6b956b33d1 201 }
rgrover1 407:ca6b956b33d1 202
rgrover1 407:ca6b956b33d1 203 template<typename T>
rgrover1 710:b2e1a2660ec2 204 ble_error_t startScan(const GapScanningParams &scanningParams, T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
rgrover1 407:ca6b956b33d1 205 ble_error_t err = BLE_ERROR_NONE;
rgrover1 407:ca6b956b33d1 206 if (object && callbackMember) {
rgrover1 710:b2e1a2660ec2 207 if ((err = startRadioScan(scanningParams)) == BLE_ERROR_NONE) {
rgrover1 407:ca6b956b33d1 208 onAdvertisementReport.attach(object, callbackMember);
rgrover1 407:ca6b956b33d1 209 }
rgrover1 407:ca6b956b33d1 210 }
rgrover1 407:ca6b956b33d1 211
rgrover1 407:ca6b956b33d1 212 return err;
rgrover1 407:ca6b956b33d1 213 }
rgrover1 407:ca6b956b33d1 214
rgrover1 710:b2e1a2660ec2 215 protected:
rgrover1 710:b2e1a2660ec2 216 virtual ble_error_t startRadioScan(const GapScanningParams &scanningParams) = 0;
rgrover1 680:dabce2969adf 217
rgrover1 710:b2e1a2660ec2 218 /* Event callback handlers */
rgrover1 710:b2e1a2660ec2 219 void setOnTimeout(EventCallback_t callback) {onTimeout = callback;}
rgrover1 710:b2e1a2660ec2 220 void setOnConnection(ConnectionEventCallback_t callback) {onConnection = callback;}
rgrover1 260:ea7f9f14cc15 221
rgrover1 260:ea7f9f14cc15 222 /**
rgrover1 260:ea7f9f14cc15 223 * Set the application callback for disconnection events.
rgrover1 260:ea7f9f14cc15 224 * @param callback
rgrover1 260:ea7f9f14cc15 225 * Pointer to the unique callback.
rgrover1 260:ea7f9f14cc15 226 */
rgrover1 710:b2e1a2660ec2 227 void setOnDisconnection(DisconnectionEventCallback_t callback) {onDisconnection = callback;}
rgrover1 710:b2e1a2660ec2 228
rgrover1 710:b2e1a2660ec2 229 /**
rgrover1 710:b2e1a2660ec2 230 * Set the application callback for radio-notification events.
rgrover1 710:b2e1a2660ec2 231 * @param callback
rgrover1 710:b2e1a2660ec2 232 * Handler to be executed in response to a radio notification event.
rgrover1 710:b2e1a2660ec2 233 */
rgrover1 710:b2e1a2660ec2 234 virtual void setOnRadioNotification(RadioNotificationEventCallback_t callback) {onRadioNotification = callback;}
rgrover1 710:b2e1a2660ec2 235
rgrover1 710:b2e1a2660ec2 236 /**
rgrover1 710:b2e1a2660ec2 237 * To indicate that security procedure for link has started.
rgrover1 710:b2e1a2660ec2 238 */
rgrover1 710:b2e1a2660ec2 239 virtual void setOnSecuritySetupInitiated(SecuritySetupInitiatedCallback_t callback) {onSecuritySetupInitiated = callback;}
rgrover1 710:b2e1a2660ec2 240
rgrover1 710:b2e1a2660ec2 241 /**
rgrover1 710:b2e1a2660ec2 242 * To indicate that security procedure for link has completed.
rgrover1 710:b2e1a2660ec2 243 */
rgrover1 710:b2e1a2660ec2 244 virtual void setOnSecuritySetupCompleted(SecuritySetupCompletedCallback_t callback) {onSecuritySetupCompleted = callback;}
rgrover1 710:b2e1a2660ec2 245
rgrover1 710:b2e1a2660ec2 246 /**
rgrover1 710:b2e1a2660ec2 247 * To indicate that link with the peer is secured. For bonded devices,
rgrover1 710:b2e1a2660ec2 248 * subsequent re-connections with bonded peer will result only in this callback
rgrover1 710:b2e1a2660ec2 249 * when the link is secured and setup procedures will not occur unless the
rgrover1 710:b2e1a2660ec2 250 * bonding information is either lost or deleted on either or both sides.
rgrover1 710:b2e1a2660ec2 251 */
rgrover1 710:b2e1a2660ec2 252 virtual void setOnLinkSecured(LinkSecuredCallback_t callback) {onLinkSecured = callback;}
rgrover1 710:b2e1a2660ec2 253
rgrover1 710:b2e1a2660ec2 254 /**
rgrover1 710:b2e1a2660ec2 255 * To indicate that device context is stored persistently.
rgrover1 710:b2e1a2660ec2 256 */
rgrover1 710:b2e1a2660ec2 257 virtual void setOnSecurityContextStored(HandleSpecificEvent_t callback) {onSecurityContextStored = callback;}
rgrover1 710:b2e1a2660ec2 258
rgrover1 710:b2e1a2660ec2 259 /**
rgrover1 710:b2e1a2660ec2 260 * To set the callback for when the passkey needs to be displayed on a peripheral with DISPLAY capability.
rgrover1 710:b2e1a2660ec2 261 */
rgrover1 710:b2e1a2660ec2 262 virtual void setOnPasskeyDisplay(PasskeyDisplayCallback_t callback) {onPasskeyDisplay = callback;}
rgrover1 687:85b0a8f457a1 263
rgrover1 687:85b0a8f457a1 264 /**
rgrover1 687:85b0a8f457a1 265 * Append to a chain of callbacks to be invoked upon disconnection; these
rgrover1 687:85b0a8f457a1 266 * callbacks receive no context and are therefore different from the
rgrover1 710:b2e1a2660ec2 267 * onDisconnection callback.
rgrover1 687:85b0a8f457a1 268 * @param callback
rgrover1 687:85b0a8f457a1 269 * function pointer to be invoked upon disconnection; receives no context.
rgrover1 710:b2e1a2660ec2 270 *
rgrover1 710:b2e1a2660ec2 271 * @note the disconnection CallChain should have been merged with
rgrover1 710:b2e1a2660ec2 272 * onDisconnctionCallback; but this was not possible because
rgrover1 710:b2e1a2660ec2 273 * FunctionPointer (which is a building block for CallChain) doesn't
rgrover1 710:b2e1a2660ec2 274 * accept variadic templates.
rgrover1 687:85b0a8f457a1 275 */
rgrover1 687:85b0a8f457a1 276 template<typename T>
rgrover1 687:85b0a8f457a1 277 void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
rgrover1 567:e4b38e43de7c 278
rgrover1 710:b2e1a2660ec2 279 private:
rgrover1 710:b2e1a2660ec2 280 GapState_t getState(void) const {
rgrover1 710:b2e1a2660ec2 281 return state;
rgrover1 710:b2e1a2660ec2 282 }
rgrover1 567:e4b38e43de7c 283
rgrover1 260:ea7f9f14cc15 284 protected:
rgrover1 349:b8b2b3973c47 285 Gap() :
rgrover1 349:b8b2b3973c47 286 state(),
rgrover1 710:b2e1a2660ec2 287 onTimeout(NULL),
rgrover1 710:b2e1a2660ec2 288 onConnection(NULL),
rgrover1 710:b2e1a2660ec2 289 onDisconnection(NULL),
rgrover1 710:b2e1a2660ec2 290 onRadioNotification(),
rgrover1 710:b2e1a2660ec2 291 onSecuritySetupInitiated(),
rgrover1 710:b2e1a2660ec2 292 onSecuritySetupCompleted(),
rgrover1 710:b2e1a2660ec2 293 onLinkSecured(),
rgrover1 710:b2e1a2660ec2 294 onSecurityContextStored(),
rgrover1 710:b2e1a2660ec2 295 onPasskeyDisplay(),
rgrover1 382:dcd0428dadb0 296 onAdvertisementReport(),
rgrover1 349:b8b2b3973c47 297 disconnectionCallChain() {
rgrover1 710:b2e1a2660ec2 298 /* empty */
rgrover1 260:ea7f9f14cc15 299 }
rgrover1 260:ea7f9f14cc15 300
rgrover1 260:ea7f9f14cc15 301 public:
rgrover1 710:b2e1a2660ec2 302 void processConnectionEvent(Handle_t handle, AddressType_t peerAddrType, const Address_t peerAddr, AddressType_t ownAddrType, const Address_t ownAddr, const ConnectionParams_t *params) {
rgrover1 260:ea7f9f14cc15 303 state.connected = 1;
rgrover1 710:b2e1a2660ec2 304 if (onConnection) {
rgrover1 710:b2e1a2660ec2 305 onConnection(handle, peerAddrType, peerAddr, ownAddrType, ownAddr, params);
rgrover1 260:ea7f9f14cc15 306 }
rgrover1 260:ea7f9f14cc15 307 }
rgrover1 260:ea7f9f14cc15 308
rgrover1 260:ea7f9f14cc15 309 void processDisconnectionEvent(Handle_t handle, DisconnectionReason_t reason) {
rgrover1 260:ea7f9f14cc15 310 state.connected = 0;
rgrover1 710:b2e1a2660ec2 311 if (onDisconnection) {
rgrover1 710:b2e1a2660ec2 312 onDisconnection(handle, reason);
rgrover1 260:ea7f9f14cc15 313 }
rgrover1 260:ea7f9f14cc15 314 disconnectionCallChain.call();
rgrover1 260:ea7f9f14cc15 315 }
rgrover1 260:ea7f9f14cc15 316
rgrover1 710:b2e1a2660ec2 317 void processSecuritySetupInitiatedEvent(Handle_t handle, bool allowBonding, bool requireMITM, SecurityIOCapabilities_t iocaps) {
rgrover1 710:b2e1a2660ec2 318 if (onSecuritySetupInitiated) {
rgrover1 710:b2e1a2660ec2 319 onSecuritySetupInitiated(handle, allowBonding, requireMITM, iocaps);
rgrover1 710:b2e1a2660ec2 320 }
rgrover1 710:b2e1a2660ec2 321 }
rgrover1 710:b2e1a2660ec2 322
rgrover1 710:b2e1a2660ec2 323 void processSecuritySetupCompletedEvent(Handle_t handle, SecurityCompletionStatus_t status) {
rgrover1 710:b2e1a2660ec2 324 if (onSecuritySetupCompleted) {
rgrover1 710:b2e1a2660ec2 325 onSecuritySetupCompleted(handle, status);
rgrover1 710:b2e1a2660ec2 326 }
rgrover1 710:b2e1a2660ec2 327 }
rgrover1 710:b2e1a2660ec2 328
rgrover1 710:b2e1a2660ec2 329 void processLinkSecuredEvent(Handle_t handle, SecurityMode_t securityMode) {
rgrover1 710:b2e1a2660ec2 330 if (onLinkSecured) {
rgrover1 710:b2e1a2660ec2 331 onLinkSecured(handle, securityMode);
rgrover1 710:b2e1a2660ec2 332 }
rgrover1 710:b2e1a2660ec2 333 }
rgrover1 710:b2e1a2660ec2 334
rgrover1 710:b2e1a2660ec2 335 void processSecurityContextStoredEvent(Handle_t handle) {
rgrover1 710:b2e1a2660ec2 336 if (onSecurityContextStored) {
rgrover1 710:b2e1a2660ec2 337 onSecurityContextStored(handle);
rgrover1 710:b2e1a2660ec2 338 }
rgrover1 710:b2e1a2660ec2 339 }
rgrover1 710:b2e1a2660ec2 340
rgrover1 710:b2e1a2660ec2 341 void processPasskeyDisplayEvent(Handle_t handle, const Passkey_t passkey) {
rgrover1 710:b2e1a2660ec2 342 if (onPasskeyDisplay) {
rgrover1 710:b2e1a2660ec2 343 onPasskeyDisplay(handle, passkey);
rgrover1 710:b2e1a2660ec2 344 }
rgrover1 710:b2e1a2660ec2 345 }
rgrover1 710:b2e1a2660ec2 346
rgrover1 710:b2e1a2660ec2 347 void processAdvertisementReport(const Address_t peerAddr,
rgrover1 710:b2e1a2660ec2 348 int8_t rssi,
rgrover1 710:b2e1a2660ec2 349 bool isScanResponse,
rgrover1 710:b2e1a2660ec2 350 AdvertisementType_t type,
rgrover1 710:b2e1a2660ec2 351 uint8_t advertisingDataLen,
rgrover1 710:b2e1a2660ec2 352 const uint8_t *advertisingData) {
rgrover1 406:cec6778acc66 353 AdvertisementCallbackParams_t params;
rgrover1 406:cec6778acc66 354 memcpy(params.peerAddr, peerAddr, ADDR_LEN);
rgrover1 406:cec6778acc66 355 params.rssi = rssi;
rgrover1 406:cec6778acc66 356 params.isScanResponse = isScanResponse;
rgrover1 406:cec6778acc66 357 params.type = type;
rgrover1 406:cec6778acc66 358 params.advertisingDataLen = advertisingDataLen;
rgrover1 406:cec6778acc66 359 params.advertisingData = advertisingData;
rgrover1 406:cec6778acc66 360 onAdvertisementReport.call(&params);
rgrover1 382:dcd0428dadb0 361 }
rgrover1 382:dcd0428dadb0 362
rgrover1 710:b2e1a2660ec2 363 void processEvent(GapEvents::gapEvent_e type) {
rgrover1 710:b2e1a2660ec2 364 switch (type) {
rgrover1 710:b2e1a2660ec2 365 case GapEvents::GAP_EVENT_TIMEOUT:
rgrover1 710:b2e1a2660ec2 366 state.advertising = 0;
rgrover1 710:b2e1a2660ec2 367 if (onTimeout) {
rgrover1 710:b2e1a2660ec2 368 onTimeout();
rgrover1 710:b2e1a2660ec2 369 }
rgrover1 710:b2e1a2660ec2 370 break;
rgrover1 710:b2e1a2660ec2 371 default:
rgrover1 710:b2e1a2660ec2 372 break;
rgrover1 260:ea7f9f14cc15 373 }
rgrover1 260:ea7f9f14cc15 374 }
rgrover1 260:ea7f9f14cc15 375
rgrover1 260:ea7f9f14cc15 376 protected:
rgrover1 363:a3d59a6e5da0 377 GapState_t state;
rgrover1 260:ea7f9f14cc15 378
rgrover1 337:e7c2eb38f5cc 379 protected:
rgrover1 710:b2e1a2660ec2 380 EventCallback_t onTimeout;
rgrover1 710:b2e1a2660ec2 381 ConnectionEventCallback_t onConnection;
rgrover1 710:b2e1a2660ec2 382 DisconnectionEventCallback_t onDisconnection;
rgrover1 710:b2e1a2660ec2 383 RadioNotificationEventCallback_t onRadioNotification;
rgrover1 710:b2e1a2660ec2 384 SecuritySetupInitiatedCallback_t onSecuritySetupInitiated;
rgrover1 710:b2e1a2660ec2 385 SecuritySetupCompletedCallback_t onSecuritySetupCompleted;
rgrover1 710:b2e1a2660ec2 386 LinkSecuredCallback_t onLinkSecured;
rgrover1 710:b2e1a2660ec2 387 HandleSpecificEvent_t onSecurityContextStored;
rgrover1 710:b2e1a2660ec2 388 PasskeyDisplayCallback_t onPasskeyDisplay;
rgrover1 385:6e66d1c6de00 389 AdvertisementReportCallback_t onAdvertisementReport;
rgrover1 363:a3d59a6e5da0 390 CallChain disconnectionCallChain;
rgrover1 260:ea7f9f14cc15 391
rgrover1 260:ea7f9f14cc15 392 private:
rgrover1 260:ea7f9f14cc15 393 /* disallow copy and assignment */
rgrover1 260:ea7f9f14cc15 394 Gap(const Gap &);
rgrover1 260:ea7f9f14cc15 395 Gap& operator=(const Gap &);
rgrover1 260:ea7f9f14cc15 396 };
rgrover1 260:ea7f9f14cc15 397
rgrover1 260:ea7f9f14cc15 398 #endif // ifndef __GAP_H__