Rahul Dahiya / Mbed OS STM32F7 Ethernet
Committer:
rahul_dahiya
Date:
Wed Jan 15 15:57:15 2020 +0530
Revision:
0:fb8047b156bb
STM32F7 LWIP

Who changed what in which revision?

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