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.
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 &);