High level Bluetooth Low Energy API and radio abstraction layer
Fork of BLE_API by
Diff: source/DiscoveredCharacteristic.cpp
- Revision:
- 964:9d12fedb6d69
- Parent:
- 963:d111d9454aa9
- Child:
- 966:9451b90bbb66
diff -r d111d9454aa9 -r 9d12fedb6d69 source/DiscoveredCharacteristic.cpp --- a/source/DiscoveredCharacteristic.cpp Thu Nov 26 12:52:34 2015 +0000 +++ b/source/DiscoveredCharacteristic.cpp Thu Nov 26 12:52:34 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 {