Bike service

Fork of BLE_API by Bluetooth Low Energy

Committer:
vcoubard
Date:
Mon Jan 11 08:51:56 2016 +0000
Revision:
1104:0244fbb0324e
Parent:
1103:551f40053f40
Child:
1106:1a25c4e7407a
Synchronized with git rev 02ca65bc
Author: Andres Amaya Garcia
Make update adv payload replace previous data

Accumulate and update advertising payload now differ in their implementations.
Accumulate updates the previous value, if it is UUID then the previously added
values are kept and the new one is simple appended. In contrast, update
replaces the previous value in all cases.

Who changed what in which revision?

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