Lancaster University's fork of the mbed BLE API. Lives on github, https://github.com/lancaster-university/BLE_API

Dependents:   microbit-dal microbit-dal microbit-ble-open microbit-dal ... more

Fork of BLE_API by Bluetooth Low Energy

Revision:
1140:dd2f69fad8c6
Parent:
1138:6aabbb5f81e6
--- a/ble/GattServer.h	Wed Apr 06 18:40:39 2016 +0100
+++ b/ble/GattServer.h	Wed Apr 06 18:40:40 2016 +0100
@@ -39,6 +39,9 @@
     typedef FunctionPointerWithContext<const GattServer *> GattServerShutdownCallback_t;
     typedef CallChainOfFunctionPointersWithContext<const GattServer *> GattServerShutdownCallbackChain_t;
 
+    typedef FunctionPointerWithContext<const GattSysAttrMissingCallbackParams*> SysAttrMissingCallback_t;
+    typedef CallChainOfFunctionPointersWithContext<const GattSysAttrMissingCallbackParams*> SysAttrMissingCallbackChain_t;
+
     typedef FunctionPointerWithContext<GattAttribute::Handle_t> EventCallback_t;
 
 protected:
@@ -48,6 +51,7 @@
         dataSentCallChain(),
         dataWrittenCallChain(),
         dataReadCallChain(),
+        sysAttrMissingCallChain(),
         updatesEnabledCallback(NULL),
         updatesDisabledCallback(NULL),
         confirmationReceivedCallback(NULL) {
@@ -317,6 +321,36 @@
     }
 
     /**
+     * Set up a callback for when asystem descriptor (CCCD) is missing.
+     * This may be raised in response to a BLE profile change om a bonded connection.
+     * This callback provides the opportunity for user applications to restore
+     * CCCD state at the appropriate time.
+     *
+     * @Note: It is possible to chain together multiple onSysAttrMissing callbacks
+     * (potentially from different modules of an application), although it is unlikely
+     * that this will be beneficial.
+     *
+     * @Note: It is also possible to set up a callback into a member function of
+     * some object.
+     *
+     * @Note It is possible to unregister a callback using onSysAttrMissing().detach(callback)
+     */
+    void onSysAttrMissing(const SysAttrMissingCallback_t& callback) {sysAttrMissingCallChain.add(callback);}
+    template <typename T>
+    void onSysAttrMissing(T *objPtr, void (T::*memberPtr)(const GattSysAttrMissingCallbackParams* connectionHandle)) {
+        sysAttrMissingCallChain.add(objPtr, memberPtr);
+    }
+
+    /**
+     * @brief provide access to the callchain of data written event callbacks
+     * It is possible to register callbacks using onDataWritten().add(callback);
+     * It is possible to unregister callbacks using onDataWritten().detach(callback)
+     * @return The data written event callbacks chain
+     */
+    SysAttrMissingCallbackChain_t& onSysAttrMissing() {
+        return sysAttrMissingCallChain;
+    }
+    /**
      * Setup a callback to be invoked on the peripheral when an attribute is
      * being read by a remote client.
      *
@@ -417,6 +451,10 @@
 
     /* Entry points for the underlying stack to report events back to the user. */
 protected:
+    void handleSysAttrMissingEvent(const GattSysAttrMissingCallbackParams *params) {
+        sysAttrMissingCallChain.call(params);
+    }
+
     void handleDataWrittenEvent(const GattWriteCallbackParams *params) {
         dataWrittenCallChain.call(params);
     }
@@ -476,6 +514,7 @@
         dataSentCallChain.clear();
         dataWrittenCallChain.clear();
         dataReadCallChain.clear();
+        sysAttrMissingCallChain.clear();
         updatesEnabledCallback       = NULL;
         updatesDisabledCallback      = NULL;
         confirmationReceivedCallback = NULL;
@@ -491,6 +530,7 @@
     DataSentCallbackChain_t           dataSentCallChain;
     DataWrittenCallbackChain_t        dataWrittenCallChain;
     DataReadCallbackChain_t           dataReadCallChain;
+    SysAttrMissingCallbackChain_t     sysAttrMissingCallChain;
     GattServerShutdownCallbackChain_t shutdownCallChain;
     EventCallback_t                   updatesEnabledCallback;
     EventCallback_t                   updatesDisabledCallback;