Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add onShutdown to register callbacks #146

Merged
merged 2 commits into from
Dec 17, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion ble/Gap.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,9 @@ class Gap {

typedef FunctionPointerWithContext<bool> RadioNotificationEventCallback_t;

typedef FunctionPointerWithContext<const Gap *> GapShutdownCallback_t;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure that Gap should be const here, the user will want to remove its own callback from the shutdown callback.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing this out. Once the callback is executed it is not removed from the callback chain. In my opinion the best approach is to add code to the reset() functions in every class clearing the callback chain which would effectively reset state.

typedef CallChainOfFunctionPointersWithContext<const Gap *> GapShutdownCallbackChain_t;

/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
Expand Down Expand Up @@ -993,9 +996,43 @@ class Gap {
radioNotificationCallback.attach(tptr, mptr);
}

/**
* Setup a callback to be invoked to notify the user application that the
* Gap instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the Gap instance is shutdown.
*
* @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 onShutdown().detach(callback)
*/
void onShutdown(const GapShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
GapShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

public:
/**
* Clear all Gap state of the associated object.
* Notify all registered onShutdown callbacks that the Gap instance is
* about to be shutdown and clear all Gap state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -1008,6 +1045,10 @@ class Gap {
* scan parameters to default values.
*/
virtual ble_error_t reset(void) {
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

/* Clear Gap state */
state.advertising = 0;
state.connected = 0;
Expand Down Expand Up @@ -1104,6 +1145,9 @@ class Gap {
ConnectionEventCallbackChain_t connectionCallChain;
DisconnectionEventCallbackChain_t disconnectionCallChain;

private:
GapShutdownCallbackChain_t shutdownCallChain;

private:
/* Disallow copy and assignment. */
Gap(const Gap &);
Expand Down
49 changes: 45 additions & 4 deletions ble/GattClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ class GattClient {
typedef FunctionPointerWithContext<const GattHVXCallbackParams*> HVXCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattHVXCallbackParams*> HVXCallbackChain_t;

typedef FunctionPointerWithContext<const GattClient *> GattClientShutdownCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattClient *> GattClientShutdownCallbackChain_t;

/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
Expand Down Expand Up @@ -314,6 +317,37 @@ class GattClient {
onHVXCallbackChain.add(callback);
}

/**
* Setup a callback to be invoked to notify the user application that the
* GattClient instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the GattClient is shutdown.
*
* @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 onShutdown().detach(callback)
*/
void onShutdown(const GattClientShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
GattClientShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

/**
* @brief provide access to the callchain of HVX callbacks
Expand All @@ -327,7 +361,9 @@ class GattClient {

public:
/**
* Clear all GattClient state of the associated object.
* Notify all registered onShutdown callbacks that the GattClient is
* about to be shutdown and clear all GattClient state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -338,6 +374,10 @@ class GattClient {
* @return BLE_ERROR_NONE on success.
*/
virtual ble_error_t reset(void) {
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

onDataReadCallbackChain.clear();
onDataWriteCallbackChain.clear();
onHVXCallbackChain.clear();
Expand Down Expand Up @@ -367,9 +407,10 @@ class GattClient {
}

protected:
ReadCallbackChain_t onDataReadCallbackChain;
WriteCallbackChain_t onDataWriteCallbackChain;
HVXCallbackChain_t onHVXCallbackChain;
ReadCallbackChain_t onDataReadCallbackChain;
WriteCallbackChain_t onDataWriteCallbackChain;
HVXCallbackChain_t onHVXCallbackChain;
GattClientShutdownCallbackChain_t shutdownCallChain;

private:
/* Disallow copy and assignment. */
Expand Down
58 changes: 50 additions & 8 deletions ble/GattServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ class GattServer {
typedef FunctionPointerWithContext<const GattReadCallbackParams*> DataReadCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams *> DataReadCallbackChain_t;

typedef FunctionPointerWithContext<const GattServer *> GattServerShutdownCallback_t;
typedef CallChainOfFunctionPointersWithContext<const GattServer *> GattServerShutdownCallbackChain_t;

typedef FunctionPointerWithContext<GattAttribute::Handle_t> EventCallback_t;

protected:
Expand Down Expand Up @@ -341,6 +344,38 @@ class GattServer {
return dataReadCallChain;
}

/**
* Setup a callback to be invoked to notify the user application that the
* GattServer instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the GattServer is shutdown.
*
* @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 onShutdown().detach(callback)
*/
void onShutdown(const GattServerShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
GattServerShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

/**
* Set up a callback for when notifications or indications are enabled for a
* characteristic on the local GATT server.
Expand Down Expand Up @@ -397,7 +432,9 @@ class GattServer {

public:
/**
* Clear all GattServer state of the associated object.
* Notify all registered onShutdown callbacks that the GattServer is
* about to be shutdown and clear all GattServer state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -408,7 +445,11 @@ class GattServer {
* @return BLE_ERROR_NONE on success.
*/
virtual ble_error_t reset(void) {
serviceCount = 0;
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

serviceCount = 0;
characteristicCount = 0;

dataSentCallChain.clear();
Expand All @@ -426,12 +467,13 @@ class GattServer {
uint8_t characteristicCount;

private:
DataSentCallbackChain_t dataSentCallChain;
DataWrittenCallbackChain_t dataWrittenCallChain;
DataReadCallbackChain_t dataReadCallChain;
EventCallback_t updatesEnabledCallback;
EventCallback_t updatesDisabledCallback;
EventCallback_t confirmationReceivedCallback;
DataSentCallbackChain_t dataSentCallChain;
DataWrittenCallbackChain_t dataWrittenCallChain;
DataReadCallbackChain_t dataReadCallChain;
GattServerShutdownCallbackChain_t shutdownCallChain;
EventCallback_t updatesEnabledCallback;
EventCallback_t updatesDisabledCallback;
EventCallback_t confirmationReceivedCallback;

private:
/* Disallow copy and assignment. */
Expand Down
47 changes: 46 additions & 1 deletion ble/SecurityManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <stdint.h>

#include "Gap.h"
#include "CallChainOfFunctionPointersWithContext.h"

class SecurityManager {
public:
Expand Down Expand Up @@ -82,6 +83,9 @@ class SecurityManager {
typedef void (*LinkSecuredCallback_t)(Gap::Handle_t handle, SecurityMode_t securityMode);
typedef void (*PasskeyDisplayCallback_t)(Gap::Handle_t handle, const Passkey_t passkey);

typedef FunctionPointerWithContext<const SecurityManager *> SecurityManagerShutdownCallback_t;
typedef CallChainOfFunctionPointersWithContext<const SecurityManager *> SecurityManagerShutdownCallbackChain_t;

/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
Expand Down Expand Up @@ -161,6 +165,38 @@ class SecurityManager {

/* Event callback handlers. */
public:
/**
* Setup a callback to be invoked to notify the user application that the
* SecurityManager instance is about to shutdown (possibly as a result of a call
* to BLE::shutdown()).
*
* @Note: It is possible to chain together multiple onShutdown callbacks
* (potentially from different modules of an application) to be notified
* before the SecurityManager is shutdown.
*
* @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 onShutdown().detach(callback)
*/
void onShutdown(const SecurityManagerShutdownCallback_t& callback) {
shutdownCallChain.add(callback);
}
template <typename T>
void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
shutdownCallChain.add(objPtr, memberPtr);
}

/**
* @brief provide access to the callchain of shutdown event callbacks
* It is possible to register callbacks using onShutdown().add(callback);
* It is possible to unregister callbacks using onShutdown().detach(callback)
* @return The shutdown event callbacks chain
*/
SecurityManagerShutdownCallbackChain_t& onShutdown() {
return shutdownCallChain;
}

/**
* To indicate that a security procedure for the link has started.
*/
Expand Down Expand Up @@ -233,7 +269,9 @@ class SecurityManager {

public:
/**
* Clear all SecurityManager state of the associated object.
* Notify all registered onShutdown callbacks that the SecurityManager is
* about to be shutdown and clear all SecurityManager state of the
* associated object.
*
* This function is meant to be overridden in the platform-specific
* sub-class. Nevertheless, the sub-class is only expected to reset its
Expand All @@ -244,6 +282,10 @@ class SecurityManager {
* @return BLE_ERROR_NONE on success.
*/
virtual ble_error_t reset(void) {
/* Notify that the instance is about to shutdown */
shutdownCallChain.call(this);
shutdownCallChain.clear();

securitySetupInitiatedCallback = NULL;
securitySetupCompletedCallback = NULL;
linkSecuredCallback = NULL;
Expand All @@ -259,6 +301,9 @@ class SecurityManager {
LinkSecuredCallback_t linkSecuredCallback;
HandleSpecificEvent_t securityContextStoredCallback;
PasskeyDisplayCallback_t passkeyDisplayCallback;

private:
SecurityManagerShutdownCallbackChain_t shutdownCallChain;
};

#endif /*__SECURITY_MANAGER_H__*/