prova

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Wed Apr 06 19:13:46 2016 +0100
Revision:
1131:692ddf04fc42
Parent:
1116:9cb51490b3f7
Child:
1135:22aada733dbd
Synchronized with git rev 13bf70b6
Author: Rohit Grover
Release 2.1.5
=============

A minor release to separate the concept of minlen and len in
GattCharacteristic. Also contains some improvements to documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 1131:692ddf04fc42 1 /* mbed Microcontroller Library
vcoubard 1131:692ddf04fc42 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 1131:692ddf04fc42 3 *
vcoubard 1131:692ddf04fc42 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 1131:692ddf04fc42 5 * you may not use this file except in compliance with the License.
vcoubard 1131:692ddf04fc42 6 * You may obtain a copy of the License at
vcoubard 1131:692ddf04fc42 7 *
vcoubard 1131:692ddf04fc42 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 1131:692ddf04fc42 9 *
vcoubard 1131:692ddf04fc42 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 1131:692ddf04fc42 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 1131:692ddf04fc42 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 1131:692ddf04fc42 13 * See the License for the specific language governing permissions and
vcoubard 1131:692ddf04fc42 14 * limitations under the License.
vcoubard 1131:692ddf04fc42 15 */
vcoubard 1131:692ddf04fc42 16
vcoubard 1131:692ddf04fc42 17 #include "ble/DiscoveredCharacteristic.h"
vcoubard 1131:692ddf04fc42 18 #include "ble/GattClient.h"
vcoubard 1131:692ddf04fc42 19
vcoubard 1131:692ddf04fc42 20 ble_error_t
vcoubard 1131:692ddf04fc42 21 DiscoveredCharacteristic::read(uint16_t offset) const
vcoubard 1131:692ddf04fc42 22 {
vcoubard 1131:692ddf04fc42 23 if (!props.read()) {
vcoubard 1131:692ddf04fc42 24 return BLE_ERROR_OPERATION_NOT_PERMITTED;
vcoubard 1131:692ddf04fc42 25 }
vcoubard 1131:692ddf04fc42 26
vcoubard 1131:692ddf04fc42 27 if (!gattc) {
vcoubard 1131:692ddf04fc42 28 return BLE_ERROR_INVALID_STATE;
vcoubard 1131:692ddf04fc42 29 }
vcoubard 1131:692ddf04fc42 30
vcoubard 1131:692ddf04fc42 31 return gattc->read(connHandle, valueHandle, offset);
vcoubard 1131:692ddf04fc42 32 }
vcoubard 1131:692ddf04fc42 33
vcoubard 1131:692ddf04fc42 34 struct OneShotReadCallback {
vcoubard 1131:692ddf04fc42 35 static void launch(GattClient* client, Gap::Handle_t connHandle,
vcoubard 1131:692ddf04fc42 36 GattAttribute::Handle_t handle, const GattClient::ReadCallback_t& cb) {
vcoubard 1131:692ddf04fc42 37 OneShotReadCallback* oneShot = new OneShotReadCallback(client, connHandle, handle, cb);
vcoubard 1131:692ddf04fc42 38 oneShot->attach();
vcoubard 1131:692ddf04fc42 39 // delete will be made when this callback is called
vcoubard 1131:692ddf04fc42 40 }
vcoubard 1131:692ddf04fc42 41
vcoubard 1131:692ddf04fc42 42 private:
vcoubard 1131:692ddf04fc42 43 OneShotReadCallback(GattClient* client, Gap::Handle_t connHandle,
vcoubard 1131:692ddf04fc42 44 GattAttribute::Handle_t handle, const GattClient::ReadCallback_t& cb) :
vcoubard 1131:692ddf04fc42 45 _client(client),
vcoubard 1131:692ddf04fc42 46 _connHandle(connHandle),
vcoubard 1131:692ddf04fc42 47 _handle(handle),
vcoubard 1131:692ddf04fc42 48 _callback(cb) { }
vcoubard 1131:692ddf04fc42 49
vcoubard 1131:692ddf04fc42 50 void attach() {
vcoubard 1131:692ddf04fc42 51 _client->onDataRead(makeFunctionPointer(this, &OneShotReadCallback::call));
vcoubard 1131:692ddf04fc42 52 }
vcoubard 1131:692ddf04fc42 53
vcoubard 1131:692ddf04fc42 54 void call(const GattReadCallbackParams* params) {
vcoubard 1131:692ddf04fc42 55 // verifiy that it is the right characteristic on the right connection
vcoubard 1131:692ddf04fc42 56 if (params->connHandle == _connHandle && params->handle == _handle) {
vcoubard 1131:692ddf04fc42 57 _callback(params);
vcoubard 1131:692ddf04fc42 58 _client->onDataRead().detach(makeFunctionPointer(this, &OneShotReadCallback::call));
vcoubard 1131:692ddf04fc42 59 delete this;
vcoubard 1131:692ddf04fc42 60 }
vcoubard 1131:692ddf04fc42 61 }
vcoubard 1131:692ddf04fc42 62
vcoubard 1131:692ddf04fc42 63 GattClient* _client;
vcoubard 1131:692ddf04fc42 64 Gap::Handle_t _connHandle;
vcoubard 1131:692ddf04fc42 65 GattAttribute::Handle_t _handle;
vcoubard 1131:692ddf04fc42 66 GattClient::ReadCallback_t _callback;
vcoubard 1131:692ddf04fc42 67 };
vcoubard 1131:692ddf04fc42 68
vcoubard 1131:692ddf04fc42 69 ble_error_t DiscoveredCharacteristic::read(uint16_t offset, const GattClient::ReadCallback_t& onRead) const {
vcoubard 1131:692ddf04fc42 70 ble_error_t error = read(offset);
vcoubard 1131:692ddf04fc42 71 if (error) {
vcoubard 1131:692ddf04fc42 72 return error;
vcoubard 1131:692ddf04fc42 73 }
vcoubard 1131:692ddf04fc42 74
vcoubard 1131:692ddf04fc42 75 OneShotReadCallback::launch(gattc, connHandle, valueHandle, onRead);
vcoubard 1131:692ddf04fc42 76
vcoubard 1131:692ddf04fc42 77 return error;
vcoubard 1131:692ddf04fc42 78 }
vcoubard 1131:692ddf04fc42 79
vcoubard 1131:692ddf04fc42 80 ble_error_t
vcoubard 1131:692ddf04fc42 81 DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value) const
vcoubard 1131:692ddf04fc42 82 {
vcoubard 1131:692ddf04fc42 83 if (!props.write()) {
vcoubard 1131:692ddf04fc42 84 return BLE_ERROR_OPERATION_NOT_PERMITTED;
vcoubard 1131:692ddf04fc42 85 }
vcoubard 1131:692ddf04fc42 86
vcoubard 1131:692ddf04fc42 87 if (!gattc) {
vcoubard 1131:692ddf04fc42 88 return BLE_ERROR_INVALID_STATE;
vcoubard 1131:692ddf04fc42 89 }
vcoubard 1131:692ddf04fc42 90
vcoubard 1131:692ddf04fc42 91 return gattc->write(GattClient::GATT_OP_WRITE_REQ, connHandle, valueHandle, length, value);
vcoubard 1131:692ddf04fc42 92 }
vcoubard 1131:692ddf04fc42 93
vcoubard 1131:692ddf04fc42 94 ble_error_t
vcoubard 1131:692ddf04fc42 95 DiscoveredCharacteristic::writeWoResponse(uint16_t length, const uint8_t *value) const
vcoubard 1131:692ddf04fc42 96 {
vcoubard 1131:692ddf04fc42 97 if (!props.writeWoResp()) {
vcoubard 1131:692ddf04fc42 98 return BLE_ERROR_OPERATION_NOT_PERMITTED;
vcoubard 1131:692ddf04fc42 99 }
vcoubard 1131:692ddf04fc42 100
vcoubard 1131:692ddf04fc42 101 if (!gattc) {
vcoubard 1131:692ddf04fc42 102 return BLE_ERROR_INVALID_STATE;
vcoubard 1131:692ddf04fc42 103 }
vcoubard 1131:692ddf04fc42 104
vcoubard 1131:692ddf04fc42 105 return gattc->write(GattClient::GATT_OP_WRITE_CMD, connHandle, valueHandle, length, value);
vcoubard 1131:692ddf04fc42 106 }
vcoubard 1131:692ddf04fc42 107
vcoubard 1131:692ddf04fc42 108 struct OneShotWriteCallback {
vcoubard 1131:692ddf04fc42 109 static void launch(GattClient* client, Gap::Handle_t connHandle,
vcoubard 1131:692ddf04fc42 110 GattAttribute::Handle_t handle, const GattClient::WriteCallback_t& cb) {
vcoubard 1131:692ddf04fc42 111 OneShotWriteCallback* oneShot = new OneShotWriteCallback(client, connHandle, handle, cb);
vcoubard 1131:692ddf04fc42 112 oneShot->attach();
vcoubard 1131:692ddf04fc42 113 // delete will be made when this callback is called
vcoubard 1131:692ddf04fc42 114 }
vcoubard 1131:692ddf04fc42 115
vcoubard 1131:692ddf04fc42 116 private:
vcoubard 1131:692ddf04fc42 117 OneShotWriteCallback(GattClient* client, Gap::Handle_t connHandle,
vcoubard 1131:692ddf04fc42 118 GattAttribute::Handle_t handle, const GattClient::WriteCallback_t& cb) :
vcoubard 1131:692ddf04fc42 119 _client(client),
vcoubard 1131:692ddf04fc42 120 _connHandle(connHandle),
vcoubard 1131:692ddf04fc42 121 _handle(handle),
vcoubard 1131:692ddf04fc42 122 _callback(cb) { }
vcoubard 1131:692ddf04fc42 123
vcoubard 1131:692ddf04fc42 124 void attach() {
vcoubard 1131:692ddf04fc42 125 _client->onDataWritten(makeFunctionPointer(this, &OneShotWriteCallback::call));
vcoubard 1131:692ddf04fc42 126 }
vcoubard 1131:692ddf04fc42 127
vcoubard 1131:692ddf04fc42 128 void call(const GattWriteCallbackParams* params) {
vcoubard 1131:692ddf04fc42 129 // verifiy that it is the right characteristic on the right connection
vcoubard 1131:692ddf04fc42 130 if (params->connHandle == _connHandle && params->handle == _handle) {
vcoubard 1131:692ddf04fc42 131 _callback(params);
vcoubard 1131:692ddf04fc42 132 _client->onDataWritten().detach(makeFunctionPointer(this, &OneShotWriteCallback::call));
vcoubard 1131:692ddf04fc42 133 delete this;
vcoubard 1131:692ddf04fc42 134 }
vcoubard 1131:692ddf04fc42 135 }
vcoubard 1131:692ddf04fc42 136
vcoubard 1131:692ddf04fc42 137 GattClient* _client;
vcoubard 1131:692ddf04fc42 138 Gap::Handle_t _connHandle;
vcoubard 1131:692ddf04fc42 139 GattAttribute::Handle_t _handle;
vcoubard 1131:692ddf04fc42 140 GattClient::WriteCallback_t _callback;
vcoubard 1131:692ddf04fc42 141 };
vcoubard 1131:692ddf04fc42 142
vcoubard 1131:692ddf04fc42 143 ble_error_t DiscoveredCharacteristic::write(uint16_t length, const uint8_t *value, const GattClient::WriteCallback_t& onRead) const {
vcoubard 1131:692ddf04fc42 144 ble_error_t error = write(length, value);
vcoubard 1131:692ddf04fc42 145 if (error) {
vcoubard 1131:692ddf04fc42 146 return error;
vcoubard 1131:692ddf04fc42 147 }
vcoubard 1131:692ddf04fc42 148
vcoubard 1131:692ddf04fc42 149 OneShotWriteCallback::launch(gattc, connHandle, valueHandle, onRead);
vcoubard 1131:692ddf04fc42 150
vcoubard 1131:692ddf04fc42 151 return error;
vcoubard 1131:692ddf04fc42 152 }
vcoubard 1131:692ddf04fc42 153
vcoubard 1131:692ddf04fc42 154 ble_error_t
vcoubard 1131:692ddf04fc42 155 DiscoveredCharacteristic::discoverDescriptors(DescriptorCallback_t callback, const UUID &matchingUUID) const
vcoubard 1131:692ddf04fc42 156 {
vcoubard 1131:692ddf04fc42 157 return BLE_ERROR_NOT_IMPLEMENTED; /* TODO: this needs to be filled in. */
rgrover1 712:b04b5db36865 158 }