High level Bluetooth Low Energy API and radio abstraction layer

Dependents:   BLE_ANCS_SDAPI BLE_temperature BLE_HeartRate BLE_ANCS_SDAPI_IRC ... more

Overview

The BLE_API is a high level abstraction for using Bluetooth Low Energy on multiple platforms. For details and examples using the BLE_API please see the BLE_API Summary Page. Or click on the API Documentation tab above.

Supported Services

Supported services can be found in the BLE_API/services folder.

Revision:
817:7a23f308cfe1
Parent:
811:059ed1c7b128
Child:
818:61c62a287194
--- a/ble/BLE.h	Tue Sep 29 09:49:22 2015 +0100
+++ b/ble/BLE.h	Tue Sep 29 09:49:23 2015 +0100
@@ -23,8 +23,6 @@
 #include "GattClient.h"
 #include "BLEInstanceBase.h"
 
-#include "mbed_error.h"
-
 /**
  * The base class used to abstract away BLE capable radio transceivers or SOCs,
  * to enable this BLE API to work with any radio transparently.
@@ -52,9 +50,6 @@
      */
     ble_error_t shutdown(void) {
         clearAdvertisingPayload();
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->shutdown();
     }
 
@@ -65,9 +60,6 @@
      *          Note: The string is owned by the BLE_API.
      */
     const char *getVersion(void) {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getVersion();
     }
 
@@ -76,15 +68,9 @@
      * going through this accessor.
      */
     const Gap &gap() const {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getGap();
     }
     Gap &gap() {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getGap();
     }
 
@@ -93,15 +79,9 @@
      * functionality requires going through this accessor.
      */
     const GattServer& gattServer() const {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getGattServer();
     }
     GattServer& gattServer() {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getGattServer();
     }
 
@@ -110,15 +90,9 @@
      * functionality requires going through this accessor.
      */
     const GattClient& gattClient() const {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getGattClient();
     }
     GattClient& gattClient() {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getGattClient();
     }
 
@@ -128,15 +102,9 @@
      * accessor.
      */
     const SecurityManager& securityManager() const {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getSecurityManager();
     }
     SecurityManager& securityManager() {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         return transport->getSecurityManager();
     }
 
@@ -148,49 +116,9 @@
      * WFE().
      */
     void waitForEvent(void) {
-        if (!transport) {
-            error("bad handle to underlying transport");
-        }
         transport->waitForEvent();
     }
 
-public:
-    typedef unsigned InstanceID_t;
-    static const InstanceID_t DEFAULT_INSTANCE = 0;
-#ifndef YOTTA_CFG_BLE_INSTANCES_COUNT
-    static const InstanceID_t NUM_INSTANCES = 1;
-#else
-    static const InstanceID_t NUM_INSTANCES = YOTTA_CFG_BLE_INSTANCES_COUNT;
-#endif
-
-    /**
-     * Get a reference to the BLE singleton corresponding to a given interface.
-     * There is a static array of BLE singletons.
-     *
-     * @Note: Calling Instance() is preferred over constructing a BLE object
-     * directly, as it returns references to singletons.
-     *
-     * @param[in] id
-     *              Instance-ID. This should be less than NUM_INSTANCES in order
-     *              for the returned BLE singleton to be useful.
-     *
-     * @return a reference to a single object
-     */
-    static BLE &Instance(InstanceID_t id = DEFAULT_INSTANCE);
-
-    /**
-     * Constructor for a handle to a BLE instance (i.e. BLE stack). BLE handles
-     * are thin wrappers around a transport object (i.e. ptr. to
-     * BLEInstanceBase).
-     *
-     * BLE objects are are better created as singletons accessed through the
-     * Instance() method. If multiple BLE handles are constructed for the same
-     * interface (using this constructor), they will share the same underlying
-     * transport object.
-     */
-    BLE(InstanceID_t instanceID = DEFAULT_INSTANCE);
-
-
     /*
      * Deprecation alert!
      * All of the following are deprecated and may be dropped in a future
@@ -1399,12 +1327,17 @@
         return securityManager().onPasskeyDisplay(callback);
     }
 
+public:
+    BLE() : transport(createBLEInstance()) {
+        /* empty */
+    }
+
 private:
     BLE(const BLE&);
     BLE &operator=(const BLE &);
 
 private:
-    BLEInstanceBase *transport; /* the device specific backend */
+    BLEInstanceBase *const transport; /* the device specific backend */
 };
 
 typedef BLE BLEDevice; /* DEPRECATED. This type alias is retained for the sake of compatibility with older