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:
Wed Dec 02 10:29:44 2015 +0000
Revision:
993:4d62b7967c11
Parent:
992:ca834f7ae8ed
Child:
1042:21a86ac7f5b1
Synchronized with git rev 12e27cd4
Author: Rohit Grover
Release 2.1.3
=============

* Improvements to CallChainOfFunctionPointerswithContext:
- add a `detach` function to be able to remove callbacks.
- detach function now return true if a function has been detached and
false otherwise.
- add a function call operator.
- use safe-bool idiom. see : http://www.artima.com/cppsource/safebool.html

* Add SafeBool class which allow to easily declare a safe bool operator in
c++03.

* Improvements to FunctionPointerWithContext:
- fix call propagation
- use safe bool idiom

* Add config file for generating Doxygen.

* Setup for onRadioNotification callback does not call initRadioNotification
anymore.

* GapAdvertisementData now handles replacement and appending of data fields
based on type. Some fields can be replaced with new values, and others
require the payload to be appended.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 710:b2e1a2660ec2 1 /* mbed Microcontroller Library
rgrover1 710:b2e1a2660ec2 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 710:b2e1a2660ec2 3 *
rgrover1 710:b2e1a2660ec2 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 710:b2e1a2660ec2 5 * you may not use this file except in compliance with the License.
rgrover1 710:b2e1a2660ec2 6 * You may obtain a copy of the License at
rgrover1 710:b2e1a2660ec2 7 *
rgrover1 710:b2e1a2660ec2 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 710:b2e1a2660ec2 9 *
rgrover1 710:b2e1a2660ec2 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 710:b2e1a2660ec2 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 710:b2e1a2660ec2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 710:b2e1a2660ec2 13 * See the License for the specific language governing permissions and
rgrover1 710:b2e1a2660ec2 14 * limitations under the License.
rgrover1 710:b2e1a2660ec2 15 */
rgrover1 710:b2e1a2660ec2 16
rgrover1 710:b2e1a2660ec2 17 #ifndef __GAP_ADVERTISING_PARAMS_H__
rgrover1 710:b2e1a2660ec2 18 #define __GAP_ADVERTISING_PARAMS_H__
rgrover1 710:b2e1a2660ec2 19
rgrover1 786:d6d7087d8377 20 /**
rgrover1 786:d6d7087d8377 21 * This class provides a wrapper for the core advertising parameters,
rgrover1 786:d6d7087d8377 22 * including the advertising type (Connectable Undirected,
rgrover1 993:4d62b7967c11 23 * Non Connectable Undirected and so on), as well as the advertising and
rgrover1 786:d6d7087d8377 24 * timeout intervals.
rgrover1 786:d6d7087d8377 25 */
rgrover1 710:b2e1a2660ec2 26 class GapAdvertisingParams {
rgrover1 710:b2e1a2660ec2 27 public:
rgrover1 710:b2e1a2660ec2 28 static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN = 0x0020;
rgrover1 710:b2e1a2660ec2 29 static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN_NONCON = 0x00A0;
rgrover1 710:b2e1a2660ec2 30 static const unsigned GAP_ADV_PARAMS_INTERVAL_MAX = 0x4000;
rgrover1 710:b2e1a2660ec2 31 static const unsigned GAP_ADV_PARAMS_TIMEOUT_MAX = 0x3FFF;
rgrover1 710:b2e1a2660ec2 32
rgrover1 710:b2e1a2660ec2 33 /*!
rgrover1 710:b2e1a2660ec2 34 * Encapsulates the peripheral advertising modes, which determine how
rgrover1 993:4d62b7967c11 35 * the device appears to other central devices in hearing range.
rgrover1 710:b2e1a2660ec2 36 */
rgrover1 710:b2e1a2660ec2 37 enum AdvertisingType_t {
rgrover1 710:b2e1a2660ec2 38 ADV_CONNECTABLE_UNDIRECTED, /**< Vol 3, Part C, Section 9.3.4 and Vol 6, Part B, Section 2.3.1.1 */
rgrover1 710:b2e1a2660ec2 39 ADV_CONNECTABLE_DIRECTED, /**< Vol 3, Part C, Section 9.3.3 and Vol 6, Part B, Section 2.3.1.2 */
rgrover1 710:b2e1a2660ec2 40 ADV_SCANNABLE_UNDIRECTED, /**< Include support for Scan Response payloads, see Vol 6, Part B, Section 2.3.1.4 */
rgrover1 710:b2e1a2660ec2 41 ADV_NON_CONNECTABLE_UNDIRECTED /**< Vol 3, Part C, Section 9.3.2 and Vol 6, Part B, Section 2.3.1.3 */
rgrover1 710:b2e1a2660ec2 42 };
rgrover1 993:4d62b7967c11 43 typedef enum AdvertisingType_t AdvertisingType; /* Deprecated type alias. */
rgrover1 710:b2e1a2660ec2 44
rgrover1 710:b2e1a2660ec2 45 public:
rgrover1 710:b2e1a2660ec2 46 GapAdvertisingParams(AdvertisingType_t advType = ADV_CONNECTABLE_UNDIRECTED,
rgrover1 710:b2e1a2660ec2 47 uint16_t interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON,
rgrover1 710:b2e1a2660ec2 48 uint16_t timeout = 0) : _advType(advType), _interval(interval), _timeout(timeout) {
rgrover1 993:4d62b7967c11 49 /* Interval checks. */
rgrover1 710:b2e1a2660ec2 50 if (_advType == ADV_CONNECTABLE_DIRECTED) {
rgrover1 993:4d62b7967c11 51 /* Interval must be 0 in directed connectable mode. */
rgrover1 710:b2e1a2660ec2 52 _interval = 0;
rgrover1 710:b2e1a2660ec2 53 } else if (_advType == ADV_NON_CONNECTABLE_UNDIRECTED) {
rgrover1 993:4d62b7967c11 54 /* Min interval is slightly larger than in other modes. */
rgrover1 710:b2e1a2660ec2 55 if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) {
rgrover1 710:b2e1a2660ec2 56 _interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON;
rgrover1 710:b2e1a2660ec2 57 }
rgrover1 710:b2e1a2660ec2 58 if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
rgrover1 710:b2e1a2660ec2 59 _interval = GAP_ADV_PARAMS_INTERVAL_MAX;
rgrover1 710:b2e1a2660ec2 60 }
rgrover1 710:b2e1a2660ec2 61 } else {
rgrover1 993:4d62b7967c11 62 /* Stay within interval limits. */
rgrover1 710:b2e1a2660ec2 63 if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN) {
rgrover1 710:b2e1a2660ec2 64 _interval = GAP_ADV_PARAMS_INTERVAL_MIN;
rgrover1 710:b2e1a2660ec2 65 }
rgrover1 710:b2e1a2660ec2 66 if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
rgrover1 710:b2e1a2660ec2 67 _interval = GAP_ADV_PARAMS_INTERVAL_MAX;
rgrover1 710:b2e1a2660ec2 68 }
rgrover1 710:b2e1a2660ec2 69 }
rgrover1 710:b2e1a2660ec2 70
rgrover1 993:4d62b7967c11 71 /* Timeout checks. */
rgrover1 710:b2e1a2660ec2 72 if (timeout) {
rgrover1 993:4d62b7967c11 73 /* Stay within timeout limits. */
rgrover1 710:b2e1a2660ec2 74 if (_timeout > GAP_ADV_PARAMS_TIMEOUT_MAX) {
rgrover1 710:b2e1a2660ec2 75 _timeout = GAP_ADV_PARAMS_TIMEOUT_MAX;
rgrover1 710:b2e1a2660ec2 76 }
rgrover1 710:b2e1a2660ec2 77 }
rgrover1 710:b2e1a2660ec2 78 }
rgrover1 710:b2e1a2660ec2 79
rgrover1 766:03f1a26f132f 80 static const uint16_t UNIT_0_625_MS = 625; /**< Number of microseconds in 0.625 milliseconds. */
rgrover1 766:03f1a26f132f 81 static uint16_t MSEC_TO_ADVERTISEMENT_DURATION_UNITS(uint32_t durationInMillis) {
rgrover1 766:03f1a26f132f 82 return (durationInMillis * 1000) / UNIT_0_625_MS;
rgrover1 766:03f1a26f132f 83 }
rgrover1 766:03f1a26f132f 84 static uint16_t ADVERTISEMENT_DURATION_UNITS_TO_MS(uint16_t gapUnits) {
rgrover1 766:03f1a26f132f 85 return (gapUnits * UNIT_0_625_MS) / 1000;
rgrover1 766:03f1a26f132f 86 }
rgrover1 766:03f1a26f132f 87
rgrover1 786:d6d7087d8377 88 AdvertisingType_t getAdvertisingType(void) const {
rgrover1 786:d6d7087d8377 89 return _advType;
rgrover1 786:d6d7087d8377 90 }
rgrover1 786:d6d7087d8377 91
rgrover1 786:d6d7087d8377 92 /**
rgrover1 993:4d62b7967c11 93 * @return the advertisement interval (in milliseconds).
rgrover1 786:d6d7087d8377 94 */
rgrover1 786:d6d7087d8377 95 uint16_t getInterval(void) const {
rgrover1 786:d6d7087d8377 96 return ADVERTISEMENT_DURATION_UNITS_TO_MS(_interval);
rgrover1 786:d6d7087d8377 97 }
rgrover1 786:d6d7087d8377 98
rgrover1 786:d6d7087d8377 99 /**
rgrover1 993:4d62b7967c11 100 * @return the advertisement interval in advertisement duration units (0.625ms units).
rgrover1 786:d6d7087d8377 101 */
rgrover1 786:d6d7087d8377 102 uint16_t getIntervalInADVUnits(void) const {
rgrover1 786:d6d7087d8377 103 return _interval;
rgrover1 786:d6d7087d8377 104 }
rgrover1 786:d6d7087d8377 105
rgrover1 786:d6d7087d8377 106 uint16_t getTimeout(void) const {
rgrover1 786:d6d7087d8377 107 return _timeout;
rgrover1 786:d6d7087d8377 108 }
rgrover1 710:b2e1a2660ec2 109
rgrover1 710:b2e1a2660ec2 110 void setAdvertisingType(AdvertisingType_t newAdvType) {_advType = newAdvType; }
rgrover1 786:d6d7087d8377 111 void setInterval(uint16_t newInterval) {_interval = MSEC_TO_ADVERTISEMENT_DURATION_UNITS(newInterval);}
rgrover1 710:b2e1a2660ec2 112 void setTimeout(uint16_t newTimeout) {_timeout = newTimeout; }
rgrover1 710:b2e1a2660ec2 113
rgrover1 710:b2e1a2660ec2 114 private:
rgrover1 710:b2e1a2660ec2 115 AdvertisingType_t _advType;
rgrover1 993:4d62b7967c11 116 uint16_t _interval; /* In ADV duration units (i.e. 0.625ms). */
rgrover1 993:4d62b7967c11 117 uint16_t _timeout; /* In seconds. */
rgrover1 710:b2e1a2660ec2 118 };
rgrover1 710:b2e1a2660ec2 119
rgrover1 710:b2e1a2660ec2 120 #endif // ifndef __GAP_ADVERTISING_PARAMS_H__