From 381345fe65b821f83266441de5bfed2fb2772ace Mon Sep 17 00:00:00 2001 From: Vincent Coubard Date: Mon, 23 Nov 2015 10:54:25 +0000 Subject: [PATCH] Allow user of GattClient to call write on a discovered characteristic with the continuation function --- ble/DiscoveredCharacteristic.h | 5 +++ source/DiscoveredCharacteristic.cpp | 56 +++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/ble/DiscoveredCharacteristic.h b/ble/DiscoveredCharacteristic.h index 62f7c7a..583a8de 100644 --- a/ble/DiscoveredCharacteristic.h +++ b/ble/DiscoveredCharacteristic.h @@ -137,6 +137,11 @@ public: */ 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); } diff --git a/source/DiscoveredCharacteristic.cpp b/source/DiscoveredCharacteristic.cpp index 5d7e777..b037c13 100644 --- a/source/DiscoveredCharacteristic.cpp +++ b/source/DiscoveredCharacteristic.cpp @@ -31,7 +31,6 @@ DiscoveredCharacteristic::read(uint16_t offset) const 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 @@ private: 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 @@ private: 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 @@ private: 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 @@ ble_error_t DiscoveredCharacteristic::read(uint16_t offset, const GattClient::Re return error; } - - - ble_error_t DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value) const { @@ -109,6 +105,52 @@ DiscoveredCharacteristic::writeWoResponse(uint16_t length, const uint8_t *value) 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 {