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:
Thu Jul 02 09:06:11 2015 +0100
Revision:
716:11b41f651697
Parent:
710:b2e1a2660ec2
Child:
766:03f1a26f132f
Synchronized with git rev d80fec88
Author: Rohit Grover
Release 0.4.0
=============

This is a major release which introduces the GATT Client functionality. It
also aligns BLE_API with builds using our new package manager: yotta
(https://github.com/armmbed/yotta).

Many APIs have seen some redesign. We encourage our users to pay attention to
the changes and migrate appropriately over time. We've also taken care to
ensure that existing code continues to work the same way. There's more
documentation in the form of comment headers for APIs to explain proper usage;
in many cases comment headers suggest alternative use of APIs.

Enhancements
~~~~~~~~~~~~

* Introduce GattClient. This includes functionality for service-discovery,
connections, and attribute-reads and writes. You'll find a demo program for
LEDBlinker on the mbed.org Bluetooth team page to use the new APIs. Some of
the GATT client functionality hasn't been implemented yet, but the APIs have
been added.

* Most APIs in the abstract base classes like Gap and GattServer return
BLE_ERROR_NOT_IMPLEMENTED. Previously many APIs were pure-virtual, which did
not permit partial ports to compile.

* We've added a new abstract base class for SecurityManager. All security
related APIs have been moved into that.

* BLEDevice has been renamed as BLE. A deprecated alias for BLEDevice is
available to support existing code.

* There has been a major cleanup of APIs under BLE. APIs have now been
categorized as belonging to Gap, GattServer, GattClient, or SecurityManager.
There are accessors to get references for Gap, GattServer, GattClient, and
SecurityManager. A former call to ble.setAddress(...) is now expected to be
achieved with ble.gap().setAddress(...).

* We've cleaned up our APIs, and this has resulted in dropping some APIs like
BLE::reset().

* We've also dropped GattServer::initializeGattDatabase(). THis was added at
some point to support controllers where a commit point was needed to
indicate when the application had finished constructing the GATT database.
This API would get called internally before Gap::startAdvertising(). We now
expect the underlying port to do the equivalent of initializeGattDatabase()
implicitly upon Gap::startAdvertising().

* The callback for BLE.onTimeout() now receives a TimeoutSource_t to indicate
the cause of the timeout. This is perhaps the only breaking API change. We
expect it to have very little disruptive effect.

* We've added a version of Gap::disconnect() which takes a connection handle.
The previous API (which did not take a connection handle) has been
deprecated; it will still work for situations where there's only a single
active connection. We hold on to that API to allow existing code to migrate
to the new API.

Bugfixes
~~~~~~~~

* None.

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 710:b2e1a2660ec2 20 /**************************************************************************/
rgrover1 710:b2e1a2660ec2 21 /*!
rgrover1 710:b2e1a2660ec2 22 \brief
rgrover1 710:b2e1a2660ec2 23 This class provides a wrapper for the core advertising parameters,
rgrover1 710:b2e1a2660ec2 24 including the advertising type (Connectable Undirected,
rgrover1 710:b2e1a2660ec2 25 Non Connectable Undirected, etc.), as well as the advertising and
rgrover1 710:b2e1a2660ec2 26 timeout intervals.
rgrover1 710:b2e1a2660ec2 27
rgrover1 710:b2e1a2660ec2 28 \par
rgrover1 710:b2e1a2660ec2 29 See the following for more information on advertising types:
rgrover1 710:b2e1a2660ec2 30
rgrover1 710:b2e1a2660ec2 31 \li \c Bluetooth Core Specification 4.0 (Vol. 6), Part B, Section 2.3.1
rgrover1 710:b2e1a2660ec2 32 \li \c Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 9.3
rgrover1 710:b2e1a2660ec2 33 */
rgrover1 710:b2e1a2660ec2 34 /**************************************************************************/
rgrover1 710:b2e1a2660ec2 35 class GapAdvertisingParams {
rgrover1 710:b2e1a2660ec2 36 public:
rgrover1 710:b2e1a2660ec2 37 static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN = 0x0020;
rgrover1 710:b2e1a2660ec2 38 static const unsigned GAP_ADV_PARAMS_INTERVAL_MIN_NONCON = 0x00A0;
rgrover1 710:b2e1a2660ec2 39 static const unsigned GAP_ADV_PARAMS_INTERVAL_MAX = 0x4000;
rgrover1 710:b2e1a2660ec2 40 static const unsigned GAP_ADV_PARAMS_TIMEOUT_MAX = 0x3FFF;
rgrover1 710:b2e1a2660ec2 41
rgrover1 710:b2e1a2660ec2 42 /*!
rgrover1 710:b2e1a2660ec2 43 * Encapsulates the peripheral advertising modes, which determine how
rgrover1 710:b2e1a2660ec2 44 * the device appears to other central devices in hearing range
rgrover1 710:b2e1a2660ec2 45 */
rgrover1 710:b2e1a2660ec2 46 enum AdvertisingType_t {
rgrover1 710:b2e1a2660ec2 47 ADV_CONNECTABLE_UNDIRECTED, /**< Vol 3, Part C, Section 9.3.4 and Vol 6, Part B, Section 2.3.1.1 */
rgrover1 710:b2e1a2660ec2 48 ADV_CONNECTABLE_DIRECTED, /**< Vol 3, Part C, Section 9.3.3 and Vol 6, Part B, Section 2.3.1.2 */
rgrover1 710:b2e1a2660ec2 49 ADV_SCANNABLE_UNDIRECTED, /**< Include support for Scan Response payloads, see Vol 6, Part B, Section 2.3.1.4 */
rgrover1 710:b2e1a2660ec2 50 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 51 };
rgrover1 710:b2e1a2660ec2 52 typedef enum AdvertisingType_t AdvertisingType; /* deprecated type alias. */
rgrover1 710:b2e1a2660ec2 53
rgrover1 710:b2e1a2660ec2 54 public:
rgrover1 710:b2e1a2660ec2 55 GapAdvertisingParams(AdvertisingType_t advType = ADV_CONNECTABLE_UNDIRECTED,
rgrover1 710:b2e1a2660ec2 56 uint16_t interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON,
rgrover1 710:b2e1a2660ec2 57 uint16_t timeout = 0) : _advType(advType), _interval(interval), _timeout(timeout) {
rgrover1 710:b2e1a2660ec2 58 /* Interval checks */
rgrover1 710:b2e1a2660ec2 59 if (_advType == ADV_CONNECTABLE_DIRECTED) {
rgrover1 710:b2e1a2660ec2 60 /* Interval must be 0 in directed connectable mode */
rgrover1 710:b2e1a2660ec2 61 _interval = 0;
rgrover1 710:b2e1a2660ec2 62 } else if (_advType == ADV_NON_CONNECTABLE_UNDIRECTED) {
rgrover1 710:b2e1a2660ec2 63 /* Min interval is slightly larger than in other modes */
rgrover1 710:b2e1a2660ec2 64 if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) {
rgrover1 710:b2e1a2660ec2 65 _interval = GAP_ADV_PARAMS_INTERVAL_MIN_NONCON;
rgrover1 710:b2e1a2660ec2 66 }
rgrover1 710:b2e1a2660ec2 67 if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
rgrover1 710:b2e1a2660ec2 68 _interval = GAP_ADV_PARAMS_INTERVAL_MAX;
rgrover1 710:b2e1a2660ec2 69 }
rgrover1 710:b2e1a2660ec2 70 } else {
rgrover1 710:b2e1a2660ec2 71 /* Stay within interval limits */
rgrover1 710:b2e1a2660ec2 72 if (_interval < GAP_ADV_PARAMS_INTERVAL_MIN) {
rgrover1 710:b2e1a2660ec2 73 _interval = GAP_ADV_PARAMS_INTERVAL_MIN;
rgrover1 710:b2e1a2660ec2 74 }
rgrover1 710:b2e1a2660ec2 75 if (_interval > GAP_ADV_PARAMS_INTERVAL_MAX) {
rgrover1 710:b2e1a2660ec2 76 _interval = GAP_ADV_PARAMS_INTERVAL_MAX;
rgrover1 710:b2e1a2660ec2 77 }
rgrover1 710:b2e1a2660ec2 78 }
rgrover1 710:b2e1a2660ec2 79
rgrover1 710:b2e1a2660ec2 80 /* Timeout checks */
rgrover1 710:b2e1a2660ec2 81 if (timeout) {
rgrover1 710:b2e1a2660ec2 82 /* Stay within timeout limits */
rgrover1 710:b2e1a2660ec2 83 if (_timeout > GAP_ADV_PARAMS_TIMEOUT_MAX) {
rgrover1 710:b2e1a2660ec2 84 _timeout = GAP_ADV_PARAMS_TIMEOUT_MAX;
rgrover1 710:b2e1a2660ec2 85 }
rgrover1 710:b2e1a2660ec2 86 }
rgrover1 710:b2e1a2660ec2 87 }
rgrover1 710:b2e1a2660ec2 88
rgrover1 710:b2e1a2660ec2 89 AdvertisingType_t getAdvertisingType(void) const {return _advType; }
rgrover1 710:b2e1a2660ec2 90 uint16_t getInterval(void) const {return _interval;}
rgrover1 710:b2e1a2660ec2 91 uint16_t getTimeout(void) const {return _timeout; }
rgrover1 710:b2e1a2660ec2 92
rgrover1 710:b2e1a2660ec2 93 void setAdvertisingType(AdvertisingType_t newAdvType) {_advType = newAdvType; }
rgrover1 710:b2e1a2660ec2 94 void setInterval(uint16_t newInterval) {_interval = newInterval;}
rgrover1 710:b2e1a2660ec2 95 void setTimeout(uint16_t newTimeout) {_timeout = newTimeout; }
rgrover1 710:b2e1a2660ec2 96
rgrover1 710:b2e1a2660ec2 97 private:
rgrover1 710:b2e1a2660ec2 98 AdvertisingType_t _advType;
rgrover1 710:b2e1a2660ec2 99 uint16_t _interval;
rgrover1 710:b2e1a2660ec2 100 uint16_t _timeout;
rgrover1 710:b2e1a2660ec2 101 };
rgrover1 710:b2e1a2660ec2 102
rgrover1 710:b2e1a2660ec2 103 #endif // ifndef __GAP_ADVERTISING_PARAMS_H__