High level Bluetooth Low Energy API and radio abstraction layer
Fork of BLE_API by
Diff: ble/GattClient.h
- Revision:
- 1164:7e84487d45fc
- Parent:
- 1156:e1ea38b576c6
- Child:
- 1179:4ab722f8dca0
diff -r 7a1cfb9ae86e -r 7e84487d45fc ble/GattClient.h --- a/ble/GattClient.h Wed Apr 06 19:14:51 2016 +0100 +++ b/ble/GattClient.h Wed Apr 06 19:14:53 2016 +0100 @@ -28,21 +28,52 @@ class GattClient { public: + /** + * Type for the registered callbacks added to the data read callchain. + * Refer to GattClient::onDataRead(). + */ typedef FunctionPointerWithContext<const GattReadCallbackParams*> ReadCallback_t; + /** + * Type for the data read event callchain. Refer to GattClient::onDataRead(). + */ typedef CallChainOfFunctionPointersWithContext<const GattReadCallbackParams*> ReadCallbackChain_t; + /** + * Enumerator for write operations. + */ enum WriteOp_t { GATT_OP_WRITE_REQ = 0x01, /**< Write request. */ GATT_OP_WRITE_CMD = 0x02, /**< Write command. */ }; + /** + * Type for the registered callbacks added to the data write callchain. + * Refer to GattClient::onDataWrite(). + */ typedef FunctionPointerWithContext<const GattWriteCallbackParams*> WriteCallback_t; + /** + * Type for the data write event callchain. Refer to GattClient::onDataWrite(). + */ typedef CallChainOfFunctionPointersWithContext<const GattWriteCallbackParams*> WriteCallbackChain_t; + /** + * Type for the registered callbacks added to the update event callchain. + * Refer to GattClient::onHVX(). + */ typedef FunctionPointerWithContext<const GattHVXCallbackParams*> HVXCallback_t; + /** + * Type for the update event callchain. Refer to GattClient::onHVX(). + */ typedef CallChainOfFunctionPointersWithContext<const GattHVXCallbackParams*> HVXCallbackChain_t; + /** + * Type for the registered callbacks added to the shutdown callchain. + * Refer to GattClient::onShutdown(). + */ typedef FunctionPointerWithContext<const GattClient *> GattClientShutdownCallback_t; + /** + * Type for the shutdown event callchain. Refer to GattClient::onShutown(). + */ typedef CallChainOfFunctionPointersWithContext<const GattClient *> GattClientShutdownCallbackChain_t; /* @@ -56,40 +87,40 @@ * will be invoked at the end. Service discovery can be terminated prematurely, * if needed, using terminateServiceDiscovery(). * - * @param connectionHandle - * Handle for the connection with the peer. - * @param sc - * This is the application callback for a matching service. Taken as - * NULL by default. Note: service discovery may still be active - * when this callback is issued; calling asynchronous BLE-stack - * APIs from within this application callback might cause the - * stack to abort service discovery. If this becomes an issue, it - * may be better to make a local copy of the discoveredService and - * wait for service discovery to terminate before operating on the - * service. - * @param cc - * This is the application callback for a matching characteristic. - * Taken as NULL by default. Note: service discovery may still be - * active when this callback is issued; calling asynchronous - * BLE-stack APIs from within this application callback might cause - * the stack to abort service discovery. If this becomes an issue, - * it may be better to make a local copy of the discoveredCharacteristic - * and wait for service discovery to terminate before operating on the - * characteristic. - * @param matchingServiceUUID - * UUID-based filter for specifying a service in which the application is - * interested. By default it is set as the wildcard UUID_UNKNOWN, - * in which case it matches all services. If characteristic-UUID - * filter (below) is set to the wildcard value, then a service - * callback will be invoked for the matching service (or for every - * service if the service filter is a wildcard). - * @param matchingCharacteristicUUIDIn - * UUID-based filter for specifying characteristic in which the application - * is interested. By default it is set as the wildcard UUID_UKNOWN - * to match against any characteristic. If both service-UUID - * filter and characteristic-UUID filter are used with non-wildcard - * values, then only a single characteristic callback is - * invoked for the matching characteristic. + * @param[in] connectionHandle + * Handle for the connection with the peer. + * @param[in] sc + * This is the application callback for a matching service. Taken as + * NULL by default. Note: service discovery may still be active + * when this callback is issued; calling asynchronous BLE-stack + * APIs from within this application callback might cause the + * stack to abort service discovery. If this becomes an issue, it + * may be better to make a local copy of the discoveredService and + * wait for service discovery to terminate before operating on the + * service. + * @param[in] cc + * This is the application callback for a matching characteristic. + * Taken as NULL by default. Note: service discovery may still be + * active when this callback is issued; calling asynchronous + * BLE-stack APIs from within this application callback might cause + * the stack to abort service discovery. If this becomes an issue, + * it may be better to make a local copy of the discoveredCharacteristic + * and wait for service discovery to terminate before operating on the + * characteristic. + * @param[in] matchingServiceUUID + * UUID-based filter for specifying a service in which the application is + * interested. By default it is set as the wildcard UUID_UNKNOWN, + * in which case it matches all services. If characteristic-UUID + * filter (below) is set to the wildcard value, then a service + * callback will be invoked for the matching service (or for every + * service if the service filter is a wildcard). + * @param[in] matchingCharacteristicUUIDIn + * UUID-based filter for specifying characteristic in which the application + * is interested. By default it is set as the wildcard UUID_UKNOWN + * to match against any characteristic. If both service-UUID + * filter and characteristic-UUID filter are used with non-wildcard + * values, then only a single characteristic callback is + * invoked for the matching characteristic. * * @note Using wildcard values for both service-UUID and characteristic- * UUID will result in complete service discovery: callbacks being @@ -126,20 +157,21 @@ * at the end. Service discovery can be terminated prematurely, if needed, * using terminateServiceDiscovery(). * - * @param connectionHandle - * Handle for the connection with the peer. - * @param sc - * This is the application callback for a matching service. Note: service discovery may still be active - * when this callback is issued; calling asynchronous BLE-stack - * APIs from within this application callback might cause the - * stack to abort service discovery. If this becomes an issue, it - * may be better to make a local copy of the discoveredService and - * wait for service discovery to terminate before operating on the - * service. - * @param matchingServiceUUID - * UUID-based filter for specifying a service in which the application is - * interested. By default it is set as the wildcard UUID_UNKNOWN, - * in which case it matches all services. + * @param[in] connectionHandle + * Handle for the connection with the peer. + * @param[in] callback + * This is the application callback for a matching service. + * Note: service discovery may still be active + * when this callback is issued; calling asynchronous BLE-stack + * APIs from within this application callback might cause the + * stack to abort service discovery. If this becomes an issue, it + * may be better to make a local copy of the discoveredService and + * wait for service discovery to terminate before operating on the + * service. + * @param[in] matchingServiceUUID + * UUID-based filter for specifying a service in which the application is + * interested. By default it is set as the wildcard UUID_UNKNOWN, + * in which case it matches all services. * * @return * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error. @@ -162,18 +194,19 @@ * at the end. Service discovery can be terminated prematurely, if needed, * using terminateServiceDiscovery(). * - * @param connectionHandle - * Handle for the connection with the peer. - * @param sc - * This is the application callback for a matching service. Note: service discovery may still be active - * when this callback is issued; calling asynchronous BLE-stack - * APIs from within this application callback might cause the - * stack to abort service discovery. If this becomes an issue, it - * may be better to make a local copy of the discoveredService and - * wait for service discovery to terminate before operating on the - * service. - * @param startHandle, endHandle - * Handle range within which to limit the search. + * @param[in] connectionHandle + * Handle for the connection with the peer. + * @param[in] callback + * This is the application callback for a matching service. + * Note: service discovery may still be active + * when this callback is issued; calling asynchronous BLE-stack + * APIs from within this application callback might cause the + * stack to abort service discovery. If this becomes an issue, it + * may be better to make a local copy of the discoveredService and + * wait for service discovery to terminate before operating on the + * service. + * @param[in] startHandle, endHandle + * Handle range within which to limit the search. * * @return * BLE_ERROR_NONE if service discovery is launched successfully; else an appropriate error. @@ -192,7 +225,9 @@ } /** - * Is service-discovery currently active? + * Check if service-discovery is currently active. + * + * @return true if service-discovery is active, false otherwise. */ virtual bool isServiceDiscoveryActive(void) const { return false; /* Requesting action from porters: override this API if this capability is supported. */ @@ -206,7 +241,19 @@ /* Requesting action from porters: override this API if this capability is supported. */ } - /* Initiate a GATT Client read procedure by attribute-handle. */ + /** + * Initiate a GATT Client read procedure by attribute-handle. + * + * @param[in] connHandle + * Handle for the connection with the peer. + * @param[in] attributeHandle + * Handle of the attribute to read data from. + * @param[in] offset + * The offset from the start of the attribute value to be read. + * + * @return + * BLE_ERROR_NONE if read procedure was successfully started. + */ virtual ble_error_t read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const { /* Avoid compiler warnings about unused variables. */ (void)connHandle; @@ -231,6 +278,9 @@ * Length of the new value. * @param[in] value * New value being written. + * + * @return + * BLE_ERROR_NONE if write procedure was successfully started. */ virtual ble_error_t write(GattClient::WriteOp_t cmd, Gap::Handle_t connHandle, @@ -251,18 +301,28 @@ public: /** * Set up a callback for read response events. - * It is possible to remove registered callbacks using - * onDataRead().detach(callbackToRemove) + * + * @param[in] callback + * Event handler being registered. + * + * @note It is possible to chain together multiple onDataRead callbacks + * (potentially from different modules of an application). + * + * @note It is possible to unregister a callback using + * onDataRead().detach(callbackToRemove). */ void onDataRead(ReadCallback_t callback) { onDataReadCallbackChain.add(callback); } /** - * @brief provide access to the callchain of read callbacks - * It is possible to register callbacks using onDataRead().add(callback); - * It is possible to unregister callbacks using onDataRead().detach(callback) - * @return The read callbacks chain + * @brief Provide access to the callchain of read event callbacks. + * + * @return A reference to the read event callback chain. + * + * @note It is possible to register callbacks using onDataRead().add(callback). + * + * @note It is possible to unregister callbacks using onDataRead().detach(callback). */ ReadCallbackChain_t& onDataRead() { return onDataReadCallbackChain; @@ -270,19 +330,27 @@ /** * Set up a callback for write response events. - * It is possible to remove registered callbacks using + * + * @param[in] callback + * Event handler being registered. + * + * @note It is possible to remove registered callbacks using * onDataWritten().detach(callbackToRemove). - * @Note: Write commands (issued using writeWoResponse) don't generate a response. + * + * @note Write commands (issued using writeWoResponse) don't generate a response. */ void onDataWritten(WriteCallback_t callback) { onDataWriteCallbackChain.add(callback); } /** - * @brief provide access to the callchain of data written 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 callbacks chain + * @brief Provide access to the callchain of data written callbacks. + * + * @return A reference to the data written callbacks chain. + * + * @note It is possible to register callbacks using onDataWritten().add(callback). + * + * @note It is possible to unregister callbacks using onDataWritten().detach(callback). */ WriteCallbackChain_t& onDataWritten() { return onDataWriteCallbackChain; @@ -290,10 +358,13 @@ /** * Set up a callback for write response events. - * @Note: Write commands (issued using writeWoResponse) don't generate a response. + * + * @param[in] callback + * Event handler being registered. * - * @note: This API is now *deprecated* and will be dropped in the future. - * Please use onDataWritten() instead. + * @note Write commands (issued using writeWoResponse) don't generate a response. + * + * @deprecated Please use GattServer::onDataWritten() instead. */ void onDataWrite(WriteCallback_t callback) { onDataWritten(callback); @@ -301,6 +372,9 @@ /** * Set up a callback for when serviceDiscovery terminates. + * + * @param[in] callback + * Event handler being registered. */ virtual void onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) { (void)callback; /* Avoid compiler warnings about ununsed variables. */ @@ -309,18 +383,21 @@ } /** - * @brief launch discovery of descriptors for a given characteristic + * @brief Launch discovery of descriptors for a given characteristic. + * * @details This function will discover all descriptors available for a - * specific characteristic. + * specific characteristic. * - * @param characteristic[in] The characteristic targeted by this discovery - * procedure - * @param discoveryCallback[in] User function called each time a descriptor - * is found during the procedure. - * @param terminationCallback[in] User provided function which will be called - * once the discovery procedure is terminating. This will get called when all - * the descriptors have been discovered or if an error occur during the discovery - * procedure. + * @param[in] characteristic + * The characteristic targeted by this discovery procedure. + * @param[in] discoveryCallback + * User function called each time a descriptor is found during + * the procedure. + * @param[in] terminationCallback + * User provided function which will be called once the + * discovery procedure is terminating. This will get called + * when all the descriptors have been discovered or if an + * error occur during the discovery procedure. * * @return * BLE_ERROR_NONE if characteristic descriptor discovery is launched @@ -338,10 +415,14 @@ } /** - * @brief Indicate if the discovery of characteristic descriptors is active for a given characteristic - * or not. - * @param characteristic[in] The characteristic concerned by the descriptors discovery. - * @return true if a descriptors discovery is active for the characteristic in input; otherwise false. + * @brief Indicate if the discovery of characteristic descriptors is active + * for a given characteristic or not. + * + * @param[in] characteristic + * The characteristic concerned by the descriptors discovery. + * + * @return true if a descriptors discovery is active for the characteristic + * in input; otherwise false. */ virtual bool isCharacteristicDescriptorDiscoveryActive(const DiscoveredCharacteristic& characteristic) const { @@ -351,10 +432,13 @@ /** * @brief Terminate an ongoing characteristic descriptor discovery. + * * @details This should result in an invocation of the TerminationCallback if - * the characteristic descriptor discovery is active. - * @param characteristic[in] The characteristic on which the running descriptors - * discovery should be stopped. + * the characteristic descriptor discovery is active. + * + * @param[in] characteristic + * The characteristic on which the running descriptors + * discovery should be stopped. */ virtual void terminateCharacteristicDescriptorDiscovery(const DiscoveredCharacteristic& characteristic) { /* Requesting action from porter(s): override this API if this capability is supported. */ @@ -362,10 +446,12 @@ } /** - * Set up a callback for when the GATT client receives an update event + * Set up a callback for when the GATT Client receives an update event * corresponding to a change in the value of a characteristic on the remote - * GATT server. - * It is possible to remove registered callbacks using onHVX().detach(callbackToRemove). + * GATT Server. + * + * @note It is possible to unregister callbacks using + * onHVX().detach(callbackToRemove). */ void onHVX(HVXCallback_t callback) { onHVXCallbackChain.add(callback); @@ -376,38 +462,60 @@ * 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. + * @param[in] callback + * Event handler being registered. * - * @Note: It is also possible to set up a callback into a member function of - * some object. + * @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 possible to unregister a callback using onShutdown().detach(callback) + * @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); } + + /** + * Same as GattClient::onShutdown(), but allows the possibility to add an object + * reference and member function as handler for shutdown event + * callbacks. + * + * @param[in] objPtr + * Pointer to the object of a class defining the member callback + * function (@p memberPtr). + * @param[in] memberPtr + * The member callback (within the context of an object) to be + * invoked. + */ 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 + * @brief Provide access to the callchain of shutdown event callbacks. + * + * @return A reference to the shutdown event callbacks chain. + * + * @note It is possible to register callbacks using onShutdown().add(callback). + * + * @note It is possible to unregister callbacks using onShutdown().detach(callback). */ GattClientShutdownCallbackChain_t& onShutdown() { return shutdownCallChain; } /** - * @brief provide access to the callchain of HVX callbacks - * It is possible to register callbacks using onHVX().add(callback); - * It is possible to unregister callbacks using onHVX().detach(callback) - * @return The HVX callbacks chain + * @brief provide access to the callchain of HVX callbacks. + * + * @return A reference to the HVX callbacks chain. + * + * @note It is possible to register callbacks using onHVX().add(callback). + * + * @note It is possible to unregister callbacks using onHVX().detach(callback). */ HVXCallbackChain_t& onHVX() { return onHVXCallbackChain; @@ -446,14 +554,41 @@ /* Entry points for the underlying stack to report events back to the user. */ public: + /** + * Helper function that notifies all registered handlers of an occurrence + * of a data read event. This function is meant to be called from the + * BLE stack specific implementation when a data read event occurs. + * + * @param[in] params + * The data read parameters passed to the registered + * handlers. + */ void processReadResponse(const GattReadCallbackParams *params) { onDataReadCallbackChain(params); } + /** + * Helper function that notifies all registered handlers of an occurrence + * of a data written event. This function is meant to be called from the + * BLE stack specific implementation when a data written event occurs. + * + * @param[in] params + * The data written parameters passed to the registered + * handlers. + */ void processWriteResponse(const GattWriteCallbackParams *params) { onDataWriteCallbackChain(params); } + /** + * Helper function that notifies all registered handlers of an occurrence + * of an update event. This function is meant to be called from the + * BLE stack specific implementation when an update event occurs. + * + * @param[in] params + * The update event parameters passed to the registered + * handlers. + */ void processHVXEvent(const GattHVXCallbackParams *params) { if (onHVXCallbackChain) { onHVXCallbackChain(params); @@ -461,9 +596,25 @@ } protected: + /** + * Callchain containing all registered callback handlers for data read + * events. + */ ReadCallbackChain_t onDataReadCallbackChain; + /** + * Callchain containing all registered callback handlers for data write + * events. + */ WriteCallbackChain_t onDataWriteCallbackChain; + /** + * Callchain containing all registered callback handlers for update + * events. + */ HVXCallbackChain_t onHVXCallbackChain; + /** + * Callchain containing all registered callback handlers for shutdown + * events. + */ GattClientShutdownCallbackChain_t shutdownCallChain; private: @@ -472,4 +623,4 @@ GattClient& operator=(const GattClient &); }; -#endif // ifndef __GATT_CLIENT_H__ \ No newline at end of file +#endif /* ifndef __GATT_CLIENT_H__ */ \ No newline at end of file