Fork of ble-x-nucleo-idb0xa1 with changes required by BleStarMbed

Dependents:   ble-star-mbed

Committer:
lorevee
Date:
Tue Feb 20 11:07:16 2018 +0000
Revision:
0:ac0b0725c6fa
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lorevee 0:ac0b0725c6fa 1 /* mbed Microcontroller Library
lorevee 0:ac0b0725c6fa 2 * Copyright (c) 2006-2013 ARM Limited
lorevee 0:ac0b0725c6fa 3 *
lorevee 0:ac0b0725c6fa 4 * Licensed under the Apache License, Version 2.0 (the "License");
lorevee 0:ac0b0725c6fa 5 * you may not use this file except in compliance with the License.
lorevee 0:ac0b0725c6fa 6 * You may obtain a copy of the License at
lorevee 0:ac0b0725c6fa 7 *
lorevee 0:ac0b0725c6fa 8 * http://www.apache.org/licenses/LICENSE-2.0
lorevee 0:ac0b0725c6fa 9 *
lorevee 0:ac0b0725c6fa 10 * Unless required by applicable law or agreed to in writing, software
lorevee 0:ac0b0725c6fa 11 * distributed under the License is distributed on an "AS IS" BASIS,
lorevee 0:ac0b0725c6fa 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
lorevee 0:ac0b0725c6fa 13 * See the License for the specific language governing permissions and
lorevee 0:ac0b0725c6fa 14 * limitations under the License.
lorevee 0:ac0b0725c6fa 15 */
lorevee 0:ac0b0725c6fa 16 /**
lorevee 0:ac0b0725c6fa 17 ******************************************************************************
lorevee 0:ac0b0725c6fa 18 * @file BlueNRGGattServer.cpp
lorevee 0:ac0b0725c6fa 19 * @author STMicroelectronics
lorevee 0:ac0b0725c6fa 20 * @brief Implementation of BlueNRG BLE_API GattServer Class
lorevee 0:ac0b0725c6fa 21 ******************************************************************************
lorevee 0:ac0b0725c6fa 22 * @copy
lorevee 0:ac0b0725c6fa 23 *
lorevee 0:ac0b0725c6fa 24 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
lorevee 0:ac0b0725c6fa 25 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
lorevee 0:ac0b0725c6fa 26 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
lorevee 0:ac0b0725c6fa 27 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
lorevee 0:ac0b0725c6fa 28 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
lorevee 0:ac0b0725c6fa 29 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
lorevee 0:ac0b0725c6fa 30 *
lorevee 0:ac0b0725c6fa 31 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
lorevee 0:ac0b0725c6fa 32 */
lorevee 0:ac0b0725c6fa 33
lorevee 0:ac0b0725c6fa 34 /** @defgroup BlueNRGGATTClient
lorevee 0:ac0b0725c6fa 35 * @brief BlueNRG BLE_API GattClient Adaptation
lorevee 0:ac0b0725c6fa 36 * @{
lorevee 0:ac0b0725c6fa 37 */
lorevee 0:ac0b0725c6fa 38
lorevee 0:ac0b0725c6fa 39 #include "BlueNRGGattClient.h"
lorevee 0:ac0b0725c6fa 40 #ifdef YOTTA_CFG_MBED_OS
lorevee 0:ac0b0725c6fa 41 #include "mbed-drivers/mbed.h"
lorevee 0:ac0b0725c6fa 42 #else
lorevee 0:ac0b0725c6fa 43 #include "mbed.h"
lorevee 0:ac0b0725c6fa 44 #endif
lorevee 0:ac0b0725c6fa 45 #include "BlueNRGGap.h"
lorevee 0:ac0b0725c6fa 46 #include "ble_utils.h"
lorevee 0:ac0b0725c6fa 47 #include "ble_debug.h"
lorevee 0:ac0b0725c6fa 48
lorevee 0:ac0b0725c6fa 49 #include <new>
lorevee 0:ac0b0725c6fa 50 #include <assert.h>
lorevee 0:ac0b0725c6fa 51
lorevee 0:ac0b0725c6fa 52 ble_error_t BlueNRGGattClient::createGattConnectionClient(Gap::Handle_t connectionHandle)
lorevee 0:ac0b0725c6fa 53 {
lorevee 0:ac0b0725c6fa 54 if(MAX_ACTIVE_CONNECTIONS <= _numConnections) {
lorevee 0:ac0b0725c6fa 55 return BLE_ERROR_OPERATION_NOT_PERMITTED;
lorevee 0:ac0b0725c6fa 56 }
lorevee 0:ac0b0725c6fa 57
lorevee 0:ac0b0725c6fa 58 for(uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) {
lorevee 0:ac0b0725c6fa 59
lorevee 0:ac0b0725c6fa 60 if(_connectionPool[i] == NULL) {
lorevee 0:ac0b0725c6fa 61 BlueNRGGattConnectionClient *gattConnectionClient = new(std::nothrow) BlueNRGGattConnectionClient(this, connectionHandle);
lorevee 0:ac0b0725c6fa 62
lorevee 0:ac0b0725c6fa 63 if (gattConnectionClient == NULL) {
lorevee 0:ac0b0725c6fa 64 return BLE_ERROR_NO_MEM;
lorevee 0:ac0b0725c6fa 65 }
lorevee 0:ac0b0725c6fa 66
lorevee 0:ac0b0725c6fa 67 _connectionPool[i] = gattConnectionClient;
lorevee 0:ac0b0725c6fa 68 _connectionPool[i]->onServiceDiscoveryTermination(terminationCallback);
lorevee 0:ac0b0725c6fa 69 _numConnections++;
lorevee 0:ac0b0725c6fa 70
lorevee 0:ac0b0725c6fa 71 PRINTF("createGattConnectionClient: _connectionPool index=%d\r\n", i);
lorevee 0:ac0b0725c6fa 72 PRINTF("createGattConnectionClient: succesfully added new gattConnectionClient (_numConnections=%d)\r\n", _numConnections);
lorevee 0:ac0b0725c6fa 73 break;
lorevee 0:ac0b0725c6fa 74 }
lorevee 0:ac0b0725c6fa 75 }
lorevee 0:ac0b0725c6fa 76
lorevee 0:ac0b0725c6fa 77 return BLE_ERROR_NONE;
lorevee 0:ac0b0725c6fa 78 }
lorevee 0:ac0b0725c6fa 79
lorevee 0:ac0b0725c6fa 80 ble_error_t BlueNRGGattClient::removeGattConnectionClient(Gap::Handle_t connectionHandle, uint8_t reason)
lorevee 0:ac0b0725c6fa 81 {
lorevee 0:ac0b0725c6fa 82
lorevee 0:ac0b0725c6fa 83 PRINTF("removeGattConnectionClient: connectionHandle=%d reason=0x%x\r\n", connectionHandle, reason);
lorevee 0:ac0b0725c6fa 84
lorevee 0:ac0b0725c6fa 85 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) {
lorevee 0:ac0b0725c6fa 86 PRINTF("removeGattConnectionClient: _connectionPool[%d]->_connectionHandle=%d\r\n", i, _connectionPool[i]->_connectionHandle);
lorevee 0:ac0b0725c6fa 87
lorevee 0:ac0b0725c6fa 88 if(_connectionPool[i]->_connectionHandle == connectionHandle) {
lorevee 0:ac0b0725c6fa 89 PRINTF("removeGattConnectionClient: Found gattConnectionClient\r\n");
lorevee 0:ac0b0725c6fa 90 delete _connectionPool[i];
lorevee 0:ac0b0725c6fa 91 _connectionPool[i] = NULL;
lorevee 0:ac0b0725c6fa 92
lorevee 0:ac0b0725c6fa 93 _numConnections--;
lorevee 0:ac0b0725c6fa 94 PRINTF("removeGattConnectionClient: succesfully removed gattConnectionClient (_numConnections=%d)\r\n", _numConnections);
lorevee 0:ac0b0725c6fa 95
lorevee 0:ac0b0725c6fa 96 break;
lorevee 0:ac0b0725c6fa 97
lorevee 0:ac0b0725c6fa 98 } else {
lorevee 0:ac0b0725c6fa 99 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 100 }
lorevee 0:ac0b0725c6fa 101 }
lorevee 0:ac0b0725c6fa 102
lorevee 0:ac0b0725c6fa 103 return BLE_ERROR_NONE;
lorevee 0:ac0b0725c6fa 104 }
lorevee 0:ac0b0725c6fa 105
lorevee 0:ac0b0725c6fa 106 BlueNRGGattConnectionClient * BlueNRGGattClient::getGattConnectionClient(Gap::Handle_t connectionHandle) {
lorevee 0:ac0b0725c6fa 107 PRINTF("getGattConnectionClient\r\n");
lorevee 0:ac0b0725c6fa 108
lorevee 0:ac0b0725c6fa 109 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) {
lorevee 0:ac0b0725c6fa 110 PRINTF("getGattConnectionClient: _connectionPool[%d]->_connectionHandle=%d\r\n", i, _connectionPool[i]->_connectionHandle);
lorevee 0:ac0b0725c6fa 111
lorevee 0:ac0b0725c6fa 112 if(_connectionPool[i]->_connectionHandle == connectionHandle) {
lorevee 0:ac0b0725c6fa 113 PRINTF("getGattConnectionClient: Found gattConnectionClient\r\n");
lorevee 0:ac0b0725c6fa 114 return _connectionPool[i];
lorevee 0:ac0b0725c6fa 115 }
lorevee 0:ac0b0725c6fa 116 }
lorevee 0:ac0b0725c6fa 117
lorevee 0:ac0b0725c6fa 118 return NULL;
lorevee 0:ac0b0725c6fa 119 }
lorevee 0:ac0b0725c6fa 120
lorevee 0:ac0b0725c6fa 121 void BlueNRGGattClient::gattProcedureCompleteCB(Gap::Handle_t connectionHandle, uint8_t error_code) {
lorevee 0:ac0b0725c6fa 122
lorevee 0:ac0b0725c6fa 123 if(error_code != BLE_STATUS_SUCCESS) {
lorevee 0:ac0b0725c6fa 124 return;
lorevee 0:ac0b0725c6fa 125 }
lorevee 0:ac0b0725c6fa 126
lorevee 0:ac0b0725c6fa 127 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 128
lorevee 0:ac0b0725c6fa 129 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 130
lorevee 0:ac0b0725c6fa 131 gattConnectionClient->gattProcedureCompleteCB(error_code);
lorevee 0:ac0b0725c6fa 132 }
lorevee 0:ac0b0725c6fa 133
lorevee 0:ac0b0725c6fa 134 void BlueNRGGattClient::primaryServicesCB(Gap::Handle_t connectionHandle,
lorevee 0:ac0b0725c6fa 135 uint8_t event_data_length,
lorevee 0:ac0b0725c6fa 136 uint8_t attribute_data_length,
lorevee 0:ac0b0725c6fa 137 uint8_t *attribute_data_list) {
lorevee 0:ac0b0725c6fa 138
lorevee 0:ac0b0725c6fa 139 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 140
lorevee 0:ac0b0725c6fa 141 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 142
lorevee 0:ac0b0725c6fa 143 gattConnectionClient->primaryServicesCB(event_data_length,
lorevee 0:ac0b0725c6fa 144 attribute_data_length,
lorevee 0:ac0b0725c6fa 145 attribute_data_list);
lorevee 0:ac0b0725c6fa 146 }
lorevee 0:ac0b0725c6fa 147
lorevee 0:ac0b0725c6fa 148 void BlueNRGGattClient::primaryServiceCB(Gap::Handle_t connectionHandle,
lorevee 0:ac0b0725c6fa 149 uint8_t event_data_length,
lorevee 0:ac0b0725c6fa 150 uint8_t *handles_info_list) {
lorevee 0:ac0b0725c6fa 151
lorevee 0:ac0b0725c6fa 152 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 153
lorevee 0:ac0b0725c6fa 154 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 155
lorevee 0:ac0b0725c6fa 156 gattConnectionClient->primaryServiceCB(event_data_length,
lorevee 0:ac0b0725c6fa 157 handles_info_list);
lorevee 0:ac0b0725c6fa 158 }
lorevee 0:ac0b0725c6fa 159
lorevee 0:ac0b0725c6fa 160 ble_error_t BlueNRGGattClient::findServiceChars(Gap::Handle_t connectionHandle) {
lorevee 0:ac0b0725c6fa 161
lorevee 0:ac0b0725c6fa 162 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 163
lorevee 0:ac0b0725c6fa 164 if(gattConnectionClient != NULL) {
lorevee 0:ac0b0725c6fa 165 return gattConnectionClient->findServiceChars();
lorevee 0:ac0b0725c6fa 166 } else {
lorevee 0:ac0b0725c6fa 167 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 168 }
lorevee 0:ac0b0725c6fa 169 }
lorevee 0:ac0b0725c6fa 170
lorevee 0:ac0b0725c6fa 171 void BlueNRGGattClient::serviceCharsCB(Gap::Handle_t connectionHandle,
lorevee 0:ac0b0725c6fa 172 uint8_t event_data_length,
lorevee 0:ac0b0725c6fa 173 uint8_t handle_value_pair_length,
lorevee 0:ac0b0725c6fa 174 uint8_t *handle_value_pair) {
lorevee 0:ac0b0725c6fa 175
lorevee 0:ac0b0725c6fa 176 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 177
lorevee 0:ac0b0725c6fa 178 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 179
lorevee 0:ac0b0725c6fa 180 gattConnectionClient->serviceCharsCB(event_data_length,
lorevee 0:ac0b0725c6fa 181 handle_value_pair_length,
lorevee 0:ac0b0725c6fa 182 handle_value_pair);
lorevee 0:ac0b0725c6fa 183 }
lorevee 0:ac0b0725c6fa 184
lorevee 0:ac0b0725c6fa 185 void BlueNRGGattClient::serviceCharByUUIDCB(Gap::Handle_t connectionHandle,
lorevee 0:ac0b0725c6fa 186 uint8_t event_data_length,
lorevee 0:ac0b0725c6fa 187 uint16_t attr_handle,
lorevee 0:ac0b0725c6fa 188 uint8_t *attr_value) {
lorevee 0:ac0b0725c6fa 189
lorevee 0:ac0b0725c6fa 190 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 191
lorevee 0:ac0b0725c6fa 192 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 193
lorevee 0:ac0b0725c6fa 194 gattConnectionClient->serviceCharByUUIDCB(event_data_length,
lorevee 0:ac0b0725c6fa 195 attr_handle,
lorevee 0:ac0b0725c6fa 196 attr_value);
lorevee 0:ac0b0725c6fa 197 }
lorevee 0:ac0b0725c6fa 198
lorevee 0:ac0b0725c6fa 199 void BlueNRGGattClient::discAllCharacDescCB(Gap::Handle_t connHandle,
lorevee 0:ac0b0725c6fa 200 uint8_t event_data_length,
lorevee 0:ac0b0725c6fa 201 uint8_t format,
lorevee 0:ac0b0725c6fa 202 uint8_t *handle_uuid_pair) {
lorevee 0:ac0b0725c6fa 203
lorevee 0:ac0b0725c6fa 204 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle);
lorevee 0:ac0b0725c6fa 205
lorevee 0:ac0b0725c6fa 206 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 207
lorevee 0:ac0b0725c6fa 208 gattConnectionClient->discAllCharacDescCB(event_data_length,
lorevee 0:ac0b0725c6fa 209 format,
lorevee 0:ac0b0725c6fa 210 handle_uuid_pair);
lorevee 0:ac0b0725c6fa 211 }
lorevee 0:ac0b0725c6fa 212
lorevee 0:ac0b0725c6fa 213 void BlueNRGGattClient::charReadCB(Gap::Handle_t connHandle,
lorevee 0:ac0b0725c6fa 214 uint8_t event_data_length,
lorevee 0:ac0b0725c6fa 215 uint8_t* attribute_value) {
lorevee 0:ac0b0725c6fa 216
lorevee 0:ac0b0725c6fa 217 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle);
lorevee 0:ac0b0725c6fa 218
lorevee 0:ac0b0725c6fa 219 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 220
lorevee 0:ac0b0725c6fa 221 gattConnectionClient->charReadCB(event_data_length,
lorevee 0:ac0b0725c6fa 222 attribute_value);
lorevee 0:ac0b0725c6fa 223 }
lorevee 0:ac0b0725c6fa 224
lorevee 0:ac0b0725c6fa 225 void BlueNRGGattClient::charWritePrepareCB(Gap::Handle_t connHandle,
lorevee 0:ac0b0725c6fa 226 uint8_t event_data_length,
lorevee 0:ac0b0725c6fa 227 uint16_t attribute_handle,
lorevee 0:ac0b0725c6fa 228 uint16_t offset,
lorevee 0:ac0b0725c6fa 229 uint8_t *part_attr_value) {
lorevee 0:ac0b0725c6fa 230
lorevee 0:ac0b0725c6fa 231 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle);
lorevee 0:ac0b0725c6fa 232
lorevee 0:ac0b0725c6fa 233 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 234
lorevee 0:ac0b0725c6fa 235 gattConnectionClient->charWritePrepareCB(event_data_length,
lorevee 0:ac0b0725c6fa 236 attribute_handle,
lorevee 0:ac0b0725c6fa 237 offset,
lorevee 0:ac0b0725c6fa 238 part_attr_value);
lorevee 0:ac0b0725c6fa 239 }
lorevee 0:ac0b0725c6fa 240
lorevee 0:ac0b0725c6fa 241 void BlueNRGGattClient::charWriteExecCB(Gap::Handle_t connHandle,
lorevee 0:ac0b0725c6fa 242 uint8_t event_data_length) {
lorevee 0:ac0b0725c6fa 243
lorevee 0:ac0b0725c6fa 244 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connHandle);
lorevee 0:ac0b0725c6fa 245
lorevee 0:ac0b0725c6fa 246 assert(gattConnectionClient != NULL);
lorevee 0:ac0b0725c6fa 247
lorevee 0:ac0b0725c6fa 248 gattConnectionClient->charWriteExecCB(event_data_length);
lorevee 0:ac0b0725c6fa 249 }
lorevee 0:ac0b0725c6fa 250
lorevee 0:ac0b0725c6fa 251 ble_error_t BlueNRGGattClient::launchServiceDiscovery(Gap::Handle_t connectionHandle,
lorevee 0:ac0b0725c6fa 252 ServiceDiscovery::ServiceCallback_t sc,
lorevee 0:ac0b0725c6fa 253 ServiceDiscovery::CharacteristicCallback_t cc,
lorevee 0:ac0b0725c6fa 254 const UUID &matchingServiceUUID,
lorevee 0:ac0b0725c6fa 255 const UUID &matchingCharacteristicUUIDIn)
lorevee 0:ac0b0725c6fa 256 {
lorevee 0:ac0b0725c6fa 257 PRINTF("BlueNRGGattClient launchServiceDiscovery\n\r");
lorevee 0:ac0b0725c6fa 258
lorevee 0:ac0b0725c6fa 259 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 260
lorevee 0:ac0b0725c6fa 261 if(gattConnectionClient != NULL) {
lorevee 0:ac0b0725c6fa 262 return gattConnectionClient->launchServiceDiscovery(sc, cc, matchingServiceUUID, matchingCharacteristicUUIDIn);
lorevee 0:ac0b0725c6fa 263 } else {
lorevee 0:ac0b0725c6fa 264 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 265 }
lorevee 0:ac0b0725c6fa 266 }
lorevee 0:ac0b0725c6fa 267
lorevee 0:ac0b0725c6fa 268 ble_error_t BlueNRGGattClient::discoverServices(Gap::Handle_t connectionHandle,
lorevee 0:ac0b0725c6fa 269 ServiceDiscovery::ServiceCallback_t callback,
lorevee 0:ac0b0725c6fa 270 const UUID &matchingServiceUUID)
lorevee 0:ac0b0725c6fa 271 {
lorevee 0:ac0b0725c6fa 272 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 273
lorevee 0:ac0b0725c6fa 274 if(gattConnectionClient != NULL) {
lorevee 0:ac0b0725c6fa 275
lorevee 0:ac0b0725c6fa 276 return gattConnectionClient->discoverServices(callback, matchingServiceUUID);
lorevee 0:ac0b0725c6fa 277
lorevee 0:ac0b0725c6fa 278 } else {
lorevee 0:ac0b0725c6fa 279 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 280 }
lorevee 0:ac0b0725c6fa 281 }
lorevee 0:ac0b0725c6fa 282
lorevee 0:ac0b0725c6fa 283 ble_error_t BlueNRGGattClient::discoverServices(Gap::Handle_t connectionHandle,
lorevee 0:ac0b0725c6fa 284 ServiceDiscovery::ServiceCallback_t callback,
lorevee 0:ac0b0725c6fa 285 GattAttribute::Handle_t startHandle,
lorevee 0:ac0b0725c6fa 286 GattAttribute::Handle_t endHandle)
lorevee 0:ac0b0725c6fa 287 {
lorevee 0:ac0b0725c6fa 288 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(connectionHandle);
lorevee 0:ac0b0725c6fa 289
lorevee 0:ac0b0725c6fa 290 if(gattConnectionClient != NULL) {
lorevee 0:ac0b0725c6fa 291
lorevee 0:ac0b0725c6fa 292 return gattConnectionClient->discoverServices(callback, startHandle, endHandle);
lorevee 0:ac0b0725c6fa 293
lorevee 0:ac0b0725c6fa 294 } else {
lorevee 0:ac0b0725c6fa 295 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 296 }
lorevee 0:ac0b0725c6fa 297 }
lorevee 0:ac0b0725c6fa 298
lorevee 0:ac0b0725c6fa 299 bool BlueNRGGattClient::isServiceDiscoveryActive(void) const
lorevee 0:ac0b0725c6fa 300 {
lorevee 0:ac0b0725c6fa 301 bool isSDActive = false;
lorevee 0:ac0b0725c6fa 302
lorevee 0:ac0b0725c6fa 303 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) {
lorevee 0:ac0b0725c6fa 304 if (_connectionPool[i]) {
lorevee 0:ac0b0725c6fa 305 isSDActive |= _connectionPool[i]->isServiceDiscoveryActive();
lorevee 0:ac0b0725c6fa 306 }
lorevee 0:ac0b0725c6fa 307 }
lorevee 0:ac0b0725c6fa 308
lorevee 0:ac0b0725c6fa 309 return isSDActive;
lorevee 0:ac0b0725c6fa 310 }
lorevee 0:ac0b0725c6fa 311
lorevee 0:ac0b0725c6fa 312 void BlueNRGGattClient::terminateServiceDiscovery(void)
lorevee 0:ac0b0725c6fa 313 {
lorevee 0:ac0b0725c6fa 314 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) {
lorevee 0:ac0b0725c6fa 315 if (_connectionPool[i]) {
lorevee 0:ac0b0725c6fa 316 _connectionPool[i]->terminateServiceDiscovery();
lorevee 0:ac0b0725c6fa 317 }
lorevee 0:ac0b0725c6fa 318 }
lorevee 0:ac0b0725c6fa 319 }
lorevee 0:ac0b0725c6fa 320
lorevee 0:ac0b0725c6fa 321 void BlueNRGGattClient::onServiceDiscoveryTermination(ServiceDiscovery::TerminationCallback_t callback) {
lorevee 0:ac0b0725c6fa 322 terminationCallback = callback;
lorevee 0:ac0b0725c6fa 323 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; ++i) {
lorevee 0:ac0b0725c6fa 324 if (_connectionPool[i]) {
lorevee 0:ac0b0725c6fa 325 _connectionPool[i]->onServiceDiscoveryTermination(callback);
lorevee 0:ac0b0725c6fa 326 }
lorevee 0:ac0b0725c6fa 327 }
lorevee 0:ac0b0725c6fa 328 }
lorevee 0:ac0b0725c6fa 329
lorevee 0:ac0b0725c6fa 330 ble_error_t BlueNRGGattClient::read(Gap::Handle_t connHandle, GattAttribute::Handle_t attributeHandle, uint16_t offset) const
lorevee 0:ac0b0725c6fa 331 {
lorevee 0:ac0b0725c6fa 332 BlueNRGGattConnectionClient *gattConnectionClient = const_cast<BlueNRGGattClient*>(this)->getGattConnectionClient(connHandle);
lorevee 0:ac0b0725c6fa 333
lorevee 0:ac0b0725c6fa 334 if(gattConnectionClient != NULL) {
lorevee 0:ac0b0725c6fa 335
lorevee 0:ac0b0725c6fa 336 return gattConnectionClient->read(attributeHandle, offset);
lorevee 0:ac0b0725c6fa 337
lorevee 0:ac0b0725c6fa 338 } else {
lorevee 0:ac0b0725c6fa 339 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 340 }
lorevee 0:ac0b0725c6fa 341 }
lorevee 0:ac0b0725c6fa 342
lorevee 0:ac0b0725c6fa 343 ble_error_t BlueNRGGattClient::write(GattClient::WriteOp_t cmd,
lorevee 0:ac0b0725c6fa 344 Gap::Handle_t connHandle,
lorevee 0:ac0b0725c6fa 345 GattAttribute::Handle_t attributeHandle,
lorevee 0:ac0b0725c6fa 346 size_t length,
lorevee 0:ac0b0725c6fa 347 const uint8_t *value) const
lorevee 0:ac0b0725c6fa 348 {
lorevee 0:ac0b0725c6fa 349 BlueNRGGattConnectionClient *gattConnectionClient = const_cast<BlueNRGGattClient*>(this)->getGattConnectionClient(connHandle);
lorevee 0:ac0b0725c6fa 350
lorevee 0:ac0b0725c6fa 351 if(gattConnectionClient != NULL) {
lorevee 0:ac0b0725c6fa 352
lorevee 0:ac0b0725c6fa 353 return gattConnectionClient->write(cmd, attributeHandle, length, value);
lorevee 0:ac0b0725c6fa 354
lorevee 0:ac0b0725c6fa 355 } else {
lorevee 0:ac0b0725c6fa 356 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 357 }
lorevee 0:ac0b0725c6fa 358 }
lorevee 0:ac0b0725c6fa 359
lorevee 0:ac0b0725c6fa 360 ble_error_t BlueNRGGattClient::discoverCharacteristicDescriptors(
lorevee 0:ac0b0725c6fa 361 const DiscoveredCharacteristic& characteristic,
lorevee 0:ac0b0725c6fa 362 const CharacteristicDescriptorDiscovery::DiscoveryCallback_t& discoveryCallback,
lorevee 0:ac0b0725c6fa 363 const CharacteristicDescriptorDiscovery::TerminationCallback_t& terminationCallback)
lorevee 0:ac0b0725c6fa 364 {
lorevee 0:ac0b0725c6fa 365 BlueNRGGattConnectionClient *gattConnectionClient = getGattConnectionClient(characteristic.getConnectionHandle());
lorevee 0:ac0b0725c6fa 366
lorevee 0:ac0b0725c6fa 367 if(gattConnectionClient != NULL) {
lorevee 0:ac0b0725c6fa 368
lorevee 0:ac0b0725c6fa 369 return gattConnectionClient->discoverCharacteristicDescriptors(characteristic, discoveryCallback, terminationCallback);
lorevee 0:ac0b0725c6fa 370
lorevee 0:ac0b0725c6fa 371 } else {
lorevee 0:ac0b0725c6fa 372 return BLE_ERROR_INTERNAL_STACK_FAILURE;
lorevee 0:ac0b0725c6fa 373 }
lorevee 0:ac0b0725c6fa 374 }
lorevee 0:ac0b0725c6fa 375
lorevee 0:ac0b0725c6fa 376 /**************************************************************************/
lorevee 0:ac0b0725c6fa 377 /*!
lorevee 0:ac0b0725c6fa 378 @brief Clear BlueNRGGattClient's state.
lorevee 0:ac0b0725c6fa 379
lorevee 0:ac0b0725c6fa 380 @returns ble_error_t
lorevee 0:ac0b0725c6fa 381
lorevee 0:ac0b0725c6fa 382 @retval BLE_ERROR_NONE
lorevee 0:ac0b0725c6fa 383 Everything executed properly
lorevee 0:ac0b0725c6fa 384 */
lorevee 0:ac0b0725c6fa 385 /**************************************************************************/
lorevee 0:ac0b0725c6fa 386 ble_error_t BlueNRGGattClient::reset(void)
lorevee 0:ac0b0725c6fa 387 {
lorevee 0:ac0b0725c6fa 388 PRINTF("BlueNRGGattClient::reset\n");
lorevee 0:ac0b0725c6fa 389
lorevee 0:ac0b0725c6fa 390 for (uint8_t i = 0; i < MAX_ACTIVE_CONNECTIONS; i++) {
lorevee 0:ac0b0725c6fa 391 if(_connectionPool[i] != NULL) {
lorevee 0:ac0b0725c6fa 392 _connectionPool[i]->reset();
lorevee 0:ac0b0725c6fa 393
lorevee 0:ac0b0725c6fa 394 delete _connectionPool[i];
lorevee 0:ac0b0725c6fa 395 _connectionPool[i] = NULL;
lorevee 0:ac0b0725c6fa 396
lorevee 0:ac0b0725c6fa 397 _numConnections--;
lorevee 0:ac0b0725c6fa 398 }
lorevee 0:ac0b0725c6fa 399 }
lorevee 0:ac0b0725c6fa 400
lorevee 0:ac0b0725c6fa 401 return BLE_ERROR_NONE;
lorevee 0:ac0b0725c6fa 402 }
lorevee 0:ac0b0725c6fa 403