test code 123

Dependencies:   mbed

Fork of LinkNode-Test by Qi Yao

Committer:
youkee
Date:
Fri Oct 28 13:04:10 2016 +0000
Revision:
1:b0d4fbbdb244
Parent:
0:1ad0e04b1bc5
ghhbfdd

Who changed what in which revision?

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