High level Bluetooth Low Energy API and radio abstraction layer

Fork of BLE_API by Bluetooth Low Energy

Revision:
857:7f578be2d01d
Parent:
855:98b96c377015
Child:
858:38a4963a455e
diff -r 06bd11d11f46 -r 7f578be2d01d ble/BLE.h
--- a/ble/BLE.h	Mon Nov 02 09:09:06 2015 +0000
+++ b/ble/BLE.h	Mon Nov 02 09:09:06 2015 +0000
@@ -21,6 +21,7 @@
 #include "Gap.h"
 #include "GattServer.h"
 #include "GattClient.h"
+#include "BLEInstanceBase.h"
 
 #ifdef YOTTA_CFG_MBED_OS
 #include "mbed-drivers/mbed_error.h"
@@ -28,9 +29,6 @@
 #include "mbed_error.h"
 #endif
 
-/* forward declaration for the implementation class */
-class BLEInstanceBase;
-
 /**
  * The base class used to abstract away BLE capable radio transceivers or SOCs,
  * to enable this BLE API to work with any radio transparently.
@@ -38,20 +36,6 @@
 class BLE
 {
 public:
-    typedef unsigned InstanceID_t; /** The type returned by BLE::getInstanceID(). */
-
-    /**
-     * The function signature for callbacks for initialization completion.
-     * @param  ble
-     *             A reference to the BLE instance being initialized.
-     * @param  error
-     *             This captures the result of initialization. It is set to
-     *             BLE_ERROR_NONE if initialization completed successfully. Else
-     *             the error value is implementation specific.
-     *
-     */
-    typedef void (*InitializationCompleteCallback_t)(BLE &ble, ble_error_t error);
-
     /**
      * Initialize the BLE controller. This should be called before using
      * anything else in the BLE_API.
@@ -62,44 +46,21 @@
      * system startup. It may not be safe to call init() from global static
      * context where ordering is compiler specific and can't be guaranteed--it
      * is safe to call BLE::init() from within main().
-     *
-     * @param  callback
-     *           A callback for when initialization completes for a BLE
-     *           instance. This is an optional parameter, if no callback is
-     *           setup the application can still determine the status of
-     *           initialization using BLE::hasInitialized() (see below).
-     *
-     * @return  BLE_ERROR_NONE if the initialization procedure was started
-     *     successfully.
-     *
-     * @note The underlying stack must invoke the initialization completion
-     *     callback in response to init(). In some cases, initialization is
-     *     instantaneous (or blocking); if so, it is acceptable for the stack-
-     *     specific implementation of init() to invoke the completion callback
-     *     directly--i.e. within its own context.
-     *
-     * @note Nearly all BLE APIs would return
-     *     BLE_ERROR_INITIALIZATION_INCOMPLETE if used on an instance before the
-     *     corresponding transport is initialized.
      */
-    ble_error_t init(InitializationCompleteCallback_t callback = NULL);
-
-    /**
-     * @return true if initialization has completed for the underlying BLE
-     *     transport.
-     *
-     * The application can setup a callback to signal completion of
-     * initialization when using init(). Otherwise, this method can be used to
-     * poll the state of initialization.
-     */
-    bool hasInitialized(void) const;
+    ble_error_t init();
 
     /**
      * Purge the BLE stack of GATT and GAP state. init() must be called
      * afterwards to re-instate services and GAP state. This API offers a way to
      * repopulate the GATT database with new services and characteristics.
      */
-    ble_error_t shutdown(void);
+    ble_error_t shutdown(void) {
+        clearAdvertisingPayload();
+        if (!transport) {
+            error("bad handle to underlying transport");
+        }
+        return transport->shutdown();
+    }
 
     /**
      * This call allows the application to get the BLE stack version information.
@@ -107,36 +68,81 @@
      * @return  A pointer to a const string representing the version.
      *          Note: The string is owned by the BLE_API.
      */
-    const char *getVersion(void);
+    const char *getVersion(void) {
+        if (!transport) {
+            error("bad handle to underlying transport");
+        }
+        return transport->getVersion();
+    }
 
     /*
      * Accessors to GAP. Please refer to Gap.h. All GAP related functionality requires
      * going through this accessor.
      */
-    const Gap &gap() const;
-    Gap &gap();
+    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();
+    }
 
     /*
      * Accessors to GATT Server. Please refer to GattServer.h. All GATTServer related
      * functionality requires going through this accessor.
      */
-    const GattServer& gattServer() const;
-    GattServer& gattServer();
+    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();
+    }
 
     /*
      * Accessors to GATT Client. Please refer to GattClient.h. All GATTClient related
      * functionality requires going through this accessor.
      */
-    const GattClient& gattClient() const;
-    GattClient& gattClient();
+    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();
+    }
 
     /*
      * Accessors to Security Manager. Please refer to SecurityManager.h. All
      * SecurityManager related functionality requires going through this
      * accessor.
      */
-    const SecurityManager& securityManager() const;
-    SecurityManager& securityManager();
+    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();
+    }
 
     /**
      * Yield control to the BLE stack or to other tasks waiting for events. This
@@ -145,9 +151,15 @@
      * returning (to service the stack). This is not always interchangeable with
      * WFE().
      */
-    void waitForEvent(void);
+    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;
@@ -182,12 +194,6 @@
      */
     BLE(InstanceID_t instanceID = DEFAULT_INSTANCE);
 
-    /**
-     * Fetch the ID of a BLE instance. Typically there would only be the DEFAULT_INSTANCE.
-     */
-    InstanceID_t getInstanceID(void) const {
-        return instanceID;
-    }
 
     /*
      * Deprecation alert!
@@ -1392,7 +1398,6 @@
     BLE &operator=(const BLE &);
 
 private:
-    InstanceID_t     instanceID;
     BLEInstanceBase *transport; /* the device specific backend */
 };