Wang Xinglu / BLE_API

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Revision:
41:7ae5c71cd44c
Parent:
40:d405c9b1419d
Child:
42:06e75fee52cf
diff -r d405c9b1419d -r 7ae5c71cd44c hw/BLEDevice.h
--- a/hw/BLEDevice.h	Thu May 22 15:02:40 2014 +0100
+++ b/hw/BLEDevice.h	Fri May 23 08:56:31 2014 +0100
@@ -22,18 +22,27 @@
 #include "hw/Gap.h"
 #include "hw/GattServer.h"
 
-/**************************************************************************/
-/*!
-    \brief
-    The base class used to abstract away BLE capable radio transceivers
-    or SOCs, to enable this BLE API to work with any radio transparently.
-*/
-/**************************************************************************/
+class BLEDeviceInstanceBase; /* forward declaration */
+
+/**
+ * BLEDevice uses composition to hide an interface object encapsulating the
+ * backend transport.
+ *
+ * The following API is used to create the singleton interface object. An
+ * implementation for this function must be provided by the device-specific
+ * library, otherwise there will be a linker error.
+ */
+extern BLEDeviceInstanceBase *createBLEDeviceInstance(void);
+
+/**
+ * The base class used to abstract away BLE capable radio transceivers or SOCs,
+ * to enable this BLE API to work with any radio transparently.
+ */
 class BLEDevice
 {
 public:
-    virtual ble_error_t init()        = 0;
-    virtual ble_error_t reset(void)   = 0;
+    ble_error_t init();
+    ble_error_t reset(void);
 
     /* GAP specific APIs */
 public:
@@ -50,41 +59,72 @@
     ble_error_t stopAdvertising(void);
     ble_error_t disconnect(void);
 
-public: /* TODO: to be made private soon */
+public:
+    BLEDevice() : transport(createBLEDeviceInstance()) {
+        /* empty */
+    }
+
+private:
+    BLEDeviceInstanceBase *transport;
+};
+
+/**
+ *  The interface for the transport object to be created by the target library's
+ *  createBLEDeviceInstance().
+ */
+class BLEDeviceInstanceBase
+{
+public:
     virtual Gap&        getGap()        = 0;
     virtual GattServer& getGattServer() = 0;
+    virtual ble_error_t init(void)      = 0;
+    virtual ble_error_t reset(void)     = 0;
 };
 
+
+/* BLEDevice methods. Most of these simply forward the calls to the underlying
+ * transport.*/
+
+inline ble_error_t
+BLEDevice::init() {
+    return transport->init();
+}
+
+inline ble_error_t
+BLEDevice::reset(void) {
+    return transport->reset();
+}
+
 inline ble_error_t
 BLEDevice::setAddress(Gap::addr_type_t type, const uint8_t address[6]) {
-    return getGap().setAddress(type, address);
+    return transport->getGap().setAddress(type, address);
 }
 
 inline ble_error_t
 BLEDevice::setAdvertisingData(const GapAdvertisingData &ADStructures,
                               const GapAdvertisingData &scanResponse) {
-    return getGap().setAdvertisingData(ADStructures, scanResponse);
+    return transport->getGap().setAdvertisingData(ADStructures, scanResponse);
 }
 
 inline ble_error_t
 BLEDevice::setAdvertisingData(const GapAdvertisingData &ADStructures) {
     GapAdvertisingData scanResponse;
-    return getGap().setAdvertisingData(ADStructures, scanResponse);
+    return transport->getGap().setAdvertisingData(ADStructures, scanResponse);
 }
 
 inline ble_error_t
 BLEDevice::startAdvertising(GapAdvertisingParams &advParams) {
-    return getGap().startAdvertising(advParams);
+    return transport->getGap().startAdvertising(advParams);
 }
 
 inline ble_error_t
 BLEDevice::stopAdvertising(void) {
-    return getGap().stopAdvertising();
+    return transport->getGap().stopAdvertising();
 }
 
 inline ble_error_t
 BLEDevice::disconnect(void) {
-    return getGap().disconnect();
+    return transport->getGap().disconnect();
 }
 
 #endif // ifndef __BLE_DEVICE_H__