Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: LinkNode_SimpleChatwithSerial
Fork of BLE_API by
Diff: ble/BLE.h
- Revision:
- 881:853f1df9e30a
- Parent:
- 879:4de7fb4da6ca
- Child:
- 882:a4e00d3d7bcb
diff -r af79236bf22c -r 853f1df9e30a ble/BLE.h
--- a/ble/BLE.h Tue Nov 03 13:21:03 2015 +0000
+++ b/ble/BLE.h Tue Nov 03 13:21:03 2015 +0000
@@ -22,6 +22,8 @@
#include "GattServer.h"
#include "GattClient.h"
+#include "ble/FunctionPointerWithContext.h"
+
#ifdef YOTTA_CFG_MBED_OS
#include "mbed-drivers/mbed_error.h"
#else
@@ -41,16 +43,28 @@
typedef unsigned InstanceID_t; /** The type returned by BLE::getInstanceID(). */
/**
- * The function signature for callbacks for initialization completion.
+ * The context provided to init-completion-callbacks (see init() below).
+ *
* @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);
+ struct InitializationCompleteCallbackContext {
+ BLE& ble; /* Reference to the BLE object which has been initialized */
+ ble_error_t error; /* Error status of the initialization. It is set to BLE_ERROR_NONE initialization completed successfully. */
+ };
+
+ /**
+ * The signature for function-pointer like callbacks for initialization-completion.
+ *
+ * @note There are two versions of init(). In addition to the simple
+ * function-pointer, init() can also take a <Object, member> tuple as its
+ * callback target. In case of the latter, the following declaration doesn't apply.
+ */
+ typedef void (*InitializationCompleteCallback_t)(InitializationCompleteCallbackContext *context);
/**
* Initialize the BLE controller. This should be called before using
@@ -63,7 +77,7 @@
* context where ordering is compiler specific and can't be guaranteed--it
* is safe to call BLE::init() from within main().
*
- * @param callback
+ * @param initCompleteCallback
* 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
@@ -72,17 +86,36 @@
* @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 If init() returns BLE_ERROR_NONE, the underlying stack must invoke
+ * the initialization completion callback at some point.
+ *
+ * @note 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.
+ *
+ * @note There are two versions of init(). In addition to the simple
+ * function-pointer, init() can also take an <Object, member> tuple as its
+ * callback target.
*/
- ble_error_t init(InitializationCompleteCallback_t callback = NULL);
+ ble_error_t init(InitializationCompleteCallback_t initCompleteCallback = NULL) {
+ FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(initCompleteCallback);
+ initImplementation(callback);
+ }
+
+ /**
+ * An alternate declaration for init(). This one takes an <Object, member> tuple as its
+ * callback target.
+ */
+ template<typename T>
+ ble_error_t init(T *object, void (T::*initCompleteCallback)(InitializationCompleteCallbackContext *context)) {
+ FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback(object, initCompleteCallback);
+ initImplementation(callback);
+ }
/**
* @return true if initialization has completed for the underlying BLE
@@ -1388,6 +1421,15 @@
}
private:
+ /**
+ * Implementation of init() [internal to BLE_API].
+ *
+ * The implementation is separated into a private method because it isn't
+ * suitable to be included in the header.
+ */
+ ble_error_t initImplementation(FunctionPointerWithContext<InitializationCompleteCallbackContext *> callback);
+
+private:
BLE(const BLE&);
BLE &operator=(const BLE &);
