High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Revision:
531:bdcd44b03974
Parent:
527:493185cebc03
Child:
532:a709cfc1500d
diff -r 00800f9ffbfb -r bdcd44b03974 public/Gap.h
--- a/public/Gap.h	Fri Jun 19 15:52:07 2015 +0100
+++ b/public/Gap.h	Fri Jun 19 15:52:07 2015 +0100
@@ -17,6 +17,9 @@
 #ifndef __GAP_H__
 #define __GAP_H__
 
+#include "GapAdvertisingData.h"
+#include "GapAdvertisingParams.h"
+#include "GapScanningParams.h"
 #include "GapEvents.h"
 #include "CallChain.h"
 #include "FunctionPointerWithContext.h"
@@ -199,10 +202,8 @@
 
 public:
     /* These functions must be defined in the sub-class */
-    virtual ble_error_t setAddress(AddressType_t type,  const Address_t address)                  = 0;
+    virtual ble_error_t setAddress(AddressType_t type,  const Address_t address)                   = 0;
     virtual ble_error_t getAddress(AddressType_t *typeP, Address_t address)                        = 0;
-    virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
-    virtual ble_error_t startAdvertising(const GapAdvertisingParams &)                             = 0;
     virtual ble_error_t stopAdvertising(void)                                                      = 0;
     virtual ble_error_t stopScan()                                                                 = 0;
     virtual uint16_t    getMinAdvertisingInterval(void) const                                      = 0;
@@ -228,7 +229,25 @@
     virtual ble_error_t setTxPower(int8_t txPower)                            = 0;
     virtual void        getPermittedTxPowerValues(const int8_t **, size_t *)  = 0;
 
-    ble_error_t startScan(const GapScanningParams &scanningParams, void (*callback)(const AdvertisementCallbackParams_t *params)) {
+    ble_error_t startAdvertising(void) {
+        return startAdvertising(advParams);
+    }
+
+    ble_error_t setAdvertisingData(void) {
+        if (needToSetAdvPayload) {
+            needToSetAdvPayload = false;
+            return setAdvertisingData(advPayload, scanResponse);
+        }
+
+        return BLE_ERROR_NONE;
+    }
+
+private:
+    virtual ble_error_t setAdvertisingData(const GapAdvertisingData &, const GapAdvertisingData &) = 0;
+    virtual ble_error_t startAdvertising(const GapAdvertisingParams &)                             = 0;
+
+public:
+    ble_error_t startScan(void (*callback)(const AdvertisementCallbackParams_t *params)) {
         ble_error_t err = BLE_ERROR_NONE;
         if (callback) {
             if ((err = startRadioScan(scanningParams)) == BLE_ERROR_NONE) {
@@ -240,7 +259,7 @@
     }
 
     template<typename T>
-    ble_error_t startScan(const GapScanningParams &scanningParams, T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
+    ble_error_t startScan(T *object, void (T::*callbackMember)(const AdvertisementCallbackParams_t *params)) {
         ble_error_t err = BLE_ERROR_NONE;
         if (object && callbackMember) {
             if ((err = startRadioScan(scanningParams)) == BLE_ERROR_NONE) {
@@ -315,6 +334,39 @@
     template<typename T>
     void addToDisconnectionCallChain(T *tptr, void (T::*mptr)(void)) {disconnectionCallChain.add(tptr, mptr);}
 
+    GapAdvertisingParams &getAdvParams(void) {
+        return advParams;
+    }
+    const GapAdvertisingParams &getAdvParams(void) const {
+        return advParams;
+    }
+    void setAdvParams(const GapAdvertisingParams &newParams) {
+        advParams = newParams;
+    }
+
+    GapAdvertisingData &getAdvPayload(void) {
+        needToSetAdvPayload = true;
+        return advPayload;
+    }
+    const GapAdvertisingData &getAdvPayload(void) const {
+        return advPayload;
+    }
+
+    GapAdvertisingData &getScanResponse(void) {
+        needToSetAdvPayload = true;
+        return scanResponse;
+    }
+    const GapAdvertisingData &getScanResponse(void) const {
+        return scanResponse;
+    }
+
+    GapScanningParams &getScanningParams(void) {
+        return scanningParams;
+    }
+    const GapScanningParams &getScanningParams(void) const {
+        return scanningParams;
+    }
+
 public:
     GapState_t getState(void) const {
         return state;
@@ -322,6 +374,11 @@
 
 protected:
     Gap() :
+        advParams(),
+        advPayload(),
+        needToSetAdvPayload(true),
+        scanningParams(),
+        scanResponse(),
         state(),
         onTimeout(NULL),
         onConnection(NULL),
@@ -334,7 +391,8 @@
         onPasskeyDisplay(),
         onAdvertisementReport(),
         disconnectionCallChain() {
-        /* empty */
+        advPayload.clear();
+        scanResponse.clear();
     }
 
 public:
@@ -420,6 +478,16 @@
     }
 
 protected:
+    GapAdvertisingParams             advParams;
+    GapAdvertisingData               advPayload;
+    /* Accumulation of AD structures in the advertisement payload should
+     * eventually result in a call to the target's setAdvertisingData() before
+     * the server begins advertising. This flag marks the status of the pending update.*/
+    bool                             needToSetAdvPayload;
+
+    GapScanningParams                scanningParams;
+    GapAdvertisingData               scanResponse;
+
     GapState_t                       state;
 
 protected: