High level Bluetooth Low Energy API and radio abstraction layer
Fork of BLE_API by
Revision 931:97e69faa4a5c, committed 2015-11-26
- Comitter:
- rgrover1
- Date:
- Thu Nov 26 12:52:05 2015 +0000
- Parent:
- 930:d6883d67fcb3
- Child:
- 932:68a113707ba5
- Commit message:
- Synchronized with git rev 381345fe
Author: Vincent Coubard
Allow user of GattClient to call write on a discovered characteristic with
the continuation function
Changed in this revision
--- a/ble/DiscoveredCharacteristic.h Thu Nov 26 12:52:05 2015 +0000 +++ b/ble/DiscoveredCharacteristic.h Thu Nov 26 12:52:05 2015 +0000 @@ -137,6 +137,11 @@ */ ble_error_t write(uint16_t length, const uint8_t *value) const; + /** + * Same as above but register the callback wich will be called once the data has been written + */ + ble_error_t write(uint16_t length, const uint8_t *value, const GattClient::WriteCallback_t& onRead) const; + void setupLongUUID(UUID::LongUUIDBytes_t longUUID) { uuid.setupLong(longUUID); }
--- a/source/DiscoveredCharacteristic.cpp Thu Nov 26 12:52:05 2015 +0000 +++ b/source/DiscoveredCharacteristic.cpp Thu Nov 26 12:52:05 2015 +0000 @@ -31,7 +31,6 @@ return gattc->read(connHandle, valueHandle, offset); } - struct OneShotReadCallback { static void launch(GattClient* client, Gap::Handle_t connHandle, GattAttribute::Handle_t handle,const GattClient::ReadCallback_t& cb) { @@ -45,7 +44,7 @@ GattAttribute::Handle_t handle, const GattClient::ReadCallback_t& cb) : _client(client), _connHandle(connHandle), - _handle(handle), + _handle(handle), _callback(cb) { } void attach() { @@ -54,7 +53,7 @@ void call(const GattReadCallbackParams* params) { // verifiy that it is the right characteristic on the right connection - if(params->connHandle == _connHandle && params->handle == _handle) { + if (params->connHandle == _connHandle && params->handle == _handle) { _callback(params); _client->onDataRead().detach(makeFunctionPointer(this, &OneShotReadCallback::call)); delete this; @@ -69,7 +68,7 @@ ble_error_t DiscoveredCharacteristic::read(uint16_t offset, const GattClient::ReadCallback_t& onRead) const { ble_error_t error = read(offset); - if(error) { + if (error) { return error; } @@ -78,9 +77,6 @@ return error; } - - - ble_error_t DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value) const { @@ -109,6 +105,52 @@ return gattc->write(GattClient::GATT_OP_WRITE_CMD, connHandle, valueHandle, length, value); } +struct OneShotWriteCallback { + static void launch(GattClient* client, Gap::Handle_t connHandle, + GattAttribute::Handle_t handle,const GattClient::WriteCallback_t& cb) { + OneShotWriteCallback* oneShot = new OneShotWriteCallback(client, connHandle, handle, cb); + oneShot->attach(); + // delete will be made when this callback is called + } + +private: + OneShotWriteCallback(GattClient* client, Gap::Handle_t connHandle, + GattAttribute::Handle_t handle, const GattClient::WriteCallback_t& cb) : + _client(client), + _connHandle(connHandle), + _handle(handle), + _callback(cb) { } + + void attach() { + _client->onDataWritten(makeFunctionPointer(this, &OneShotWriteCallback::call)); + } + + void call(const GattWriteCallbackParams* params) { + // verifiy that it is the right characteristic on the right connection + if (params->connHandle == _connHandle && params->handle == _handle) { + _callback(params); + _client->onDataWritten().detach(makeFunctionPointer(this, &OneShotWriteCallback::call)); + delete this; + } + } + + GattClient* _client; + Gap::Handle_t _connHandle; + GattAttribute::Handle_t _handle; + GattClient::WriteCallback_t _callback; +}; + +ble_error_t DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value, const GattClient::WriteCallback_t& onRead) const { + ble_error_t error = write(length, value); + if (error) { + return error; + } + + OneShotWriteCallback::launch(gattc, connHandle, valueHandle, onRead); + + return error; +} + ble_error_t DiscoveredCharacteristic::discoverDescriptors(DescriptorCallback_t callback, const UUID &matchingUUID) const {