nuBorn Medical / Mbed 2 deprecated mbed-os-example-ble-master

Dependencies:   mbed

Committer:
bpd227
Date:
Fri Jun 29 01:19:08 2018 +0000
Revision:
0:599bc564478b
first

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bpd227 0:599bc564478b 1 /* mbed Microcontroller Library
bpd227 0:599bc564478b 2 * Copyright (c) 2006-2013 ARM Limited
bpd227 0:599bc564478b 3 *
bpd227 0:599bc564478b 4 * Licensed under the Apache License, Version 2.0 (the "License");
bpd227 0:599bc564478b 5 * you may not use this file except in compliance with the License.
bpd227 0:599bc564478b 6 * You may obtain a copy of the License at
bpd227 0:599bc564478b 7 *
bpd227 0:599bc564478b 8 * http://www.apache.org/licenses/LICENSE-2.0
bpd227 0:599bc564478b 9 *
bpd227 0:599bc564478b 10 * Unless required by applicable law or agreed to in writing, software
bpd227 0:599bc564478b 11 * distributed under the License is distributed on an "AS IS" BASIS,
bpd227 0:599bc564478b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bpd227 0:599bc564478b 13 * See the License for the specific language governing permissions and
bpd227 0:599bc564478b 14 * limitations under the License.
bpd227 0:599bc564478b 15 */
bpd227 0:599bc564478b 16 /**
bpd227 0:599bc564478b 17 ******************************************************************************
bpd227 0:599bc564478b 18 * @file BlueNRGGattServer.cpp
bpd227 0:599bc564478b 19 * @author STMicroelectronics
bpd227 0:599bc564478b 20 * @brief Implementation of BlueNRG BLE_API GattServer Class
bpd227 0:599bc564478b 21 ******************************************************************************
bpd227 0:599bc564478b 22 * @copy
bpd227 0:599bc564478b 23 *
bpd227 0:599bc564478b 24 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
bpd227 0:599bc564478b 25 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
bpd227 0:599bc564478b 26 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
bpd227 0:599bc564478b 27 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
bpd227 0:599bc564478b 28 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
bpd227 0:599bc564478b 29 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
bpd227 0:599bc564478b 30 *
bpd227 0:599bc564478b 31 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
bpd227 0:599bc564478b 32 */
bpd227 0:599bc564478b 33
bpd227 0:599bc564478b 34 /** @defgroup BlueNRGGattConnectionClient
bpd227 0:599bc564478b 35 * @brief BlueNRG GattConnectionClient Adaptation
bpd227 0:599bc564478b 36 * @{
bpd227 0:599bc564478b 37 */
bpd227 0:599bc564478b 38
bpd227 0:599bc564478b 39 #include "BlueNRGGattConnectionClient.h"
bpd227 0:599bc564478b 40 #ifdef YOTTA_CFG_MBED_OS
bpd227 0:599bc564478b 41 #include "mbed-drivers/mbed.h"
bpd227 0:599bc564478b 42 #else
bpd227 0:599bc564478b 43 #include "mbed.h"
bpd227 0:599bc564478b 44 #endif
bpd227 0:599bc564478b 45 #include "BlueNRGGap.h"
bpd227 0:599bc564478b 46 #include "BlueNRGGattClient.h"
bpd227 0:599bc564478b 47 #include "ble_utils.h"
bpd227 0:599bc564478b 48 #include "ble_debug.h"
bpd227 0:599bc564478b 49
bpd227 0:599bc564478b 50 // #define PRINTF printf
bpd227 0:599bc564478b 51
bpd227 0:599bc564478b 52 static uint8_t props_mask[] = {
bpd227 0:599bc564478b 53 0x01,
bpd227 0:599bc564478b 54 0x02,
bpd227 0:599bc564478b 55 0x04,
bpd227 0:599bc564478b 56 0x08,
bpd227 0:599bc564478b 57 0x10,
bpd227 0:599bc564478b 58 0x20,
bpd227 0:599bc564478b 59 0x40,
bpd227 0:599bc564478b 60 0x80
bpd227 0:599bc564478b 61 };
bpd227 0:599bc564478b 62
bpd227 0:599bc564478b 63 void BlueNRGGattConnectionClient::gattProcedureCompleteCB(uint8_t error_code)
bpd227 0:599bc564478b 64 {
bpd227 0:599bc564478b 65 if(error_code != BLE_STATUS_SUCCESS) {
bpd227 0:599bc564478b 66 _currentState = GATT_IDLE;
bpd227 0:599bc564478b 67 return;
bpd227 0:599bc564478b 68 }
bpd227 0:599bc564478b 69
bpd227 0:599bc564478b 70 // Service Discovery complete
bpd227 0:599bc564478b 71 /*
bpd227 0:599bc564478b 72 if(_currentState != GATT_IDLE &&
bpd227 0:599bc564478b 73 _currentState != GATT_DISCOVERY_TERMINATED &&
bpd227 0:599bc564478b 74 _currentState != GATT_WRITE_CHAR &&
bpd227 0:599bc564478b 75 _currentState != GATT_READ_CHAR) {
bpd227 0:599bc564478b 76 */
bpd227 0:599bc564478b 77 if(_currentState == GATT_SERVICE_DISCOVERY) {
bpd227 0:599bc564478b 78 findServiceChars();
bpd227 0:599bc564478b 79 return;
bpd227 0:599bc564478b 80 }
bpd227 0:599bc564478b 81
bpd227 0:599bc564478b 82 if(_currentState == GATT_CHAR_DESC_DISCOVERY) {
bpd227 0:599bc564478b 83 _currentState = GATT_IDLE;
bpd227 0:599bc564478b 84 if(charDescTerminationCallback != NULL) {
bpd227 0:599bc564478b 85 CharacteristicDescriptorDiscovery::TerminationCallbackParams_t params = {
bpd227 0:599bc564478b 86 _characteristic,
bpd227 0:599bc564478b 87 BLE_ERROR_NONE
bpd227 0:599bc564478b 88 };
bpd227 0:599bc564478b 89 charDescTerminationCallback(&params);
bpd227 0:599bc564478b 90 }
bpd227 0:599bc564478b 91 return;
bpd227 0:599bc564478b 92 }
bpd227 0:599bc564478b 93
bpd227 0:599bc564478b 94 // Read complete
bpd227 0:599bc564478b 95 if(_currentState == GATT_READ_CHAR) {
bpd227 0:599bc564478b 96 _currentState = GATT_IDLE;
bpd227 0:599bc564478b 97 BlueNRGGattClient::getInstance().processReadResponse(&readCBParams);
bpd227 0:599bc564478b 98 free((void*)(readCBParams.data));
bpd227 0:599bc564478b 99 readCBParams.data = NULL;
bpd227 0:599bc564478b 100 return;
bpd227 0:599bc564478b 101 }
bpd227 0:599bc564478b 102
bpd227 0:599bc564478b 103 // Write complete
bpd227 0:599bc564478b 104 if(_currentState == GATT_WRITE_CHAR) {
bpd227 0:599bc564478b 105 _currentState = GATT_IDLE;
bpd227 0:599bc564478b 106 BlueNRGGattClient::getInstance().processWriteResponse(&writeCBParams);
bpd227 0:599bc564478b 107 return;
bpd227 0:599bc564478b 108 }
bpd227 0:599bc564478b 109 }
bpd227 0:599bc564478b 110
bpd227 0:599bc564478b 111 void BlueNRGGattConnectionClient::primaryServicesCB(uint8_t event_data_length,
bpd227 0:599bc564478b 112 uint8_t attribute_data_length,
bpd227 0:599bc564478b 113 uint8_t *attribute_data_list)
bpd227 0:599bc564478b 114 {
bpd227 0:599bc564478b 115 GattAttribute::Handle_t startHandle, endHandle;
bpd227 0:599bc564478b 116 UUID uuid;
bpd227 0:599bc564478b 117 uint8_t i, offset, numAttr;
bpd227 0:599bc564478b 118
bpd227 0:599bc564478b 119 numAttr = (event_data_length - 1) / attribute_data_length;
bpd227 0:599bc564478b 120
bpd227 0:599bc564478b 121 offset = 0;
bpd227 0:599bc564478b 122 for (i=0; i<numAttr; i++) {
bpd227 0:599bc564478b 123 startHandle = attribute_data_list[offset];
bpd227 0:599bc564478b 124 endHandle = attribute_data_list[offset+2];
bpd227 0:599bc564478b 125
bpd227 0:599bc564478b 126 // UUID Type
bpd227 0:599bc564478b 127 if (attribute_data_length == 6) {
bpd227 0:599bc564478b 128
bpd227 0:599bc564478b 129 PRINTF("UUID_TYPE_16\n\r");
bpd227 0:599bc564478b 130 uuid = attribute_data_list[offset+5]<<8|attribute_data_list[offset+4];
bpd227 0:599bc564478b 131 PRINTF("S UUID-%X attrs[%u %u]\r\n", uuid.getShortUUID(), startHandle, endHandle);
bpd227 0:599bc564478b 132
bpd227 0:599bc564478b 133 } else {
bpd227 0:599bc564478b 134
bpd227 0:599bc564478b 135 PRINTF("UUID_TYPE_128\n\r");
bpd227 0:599bc564478b 136 uuid.setupLong(attribute_data_list+offset+4, UUID::LSB);
bpd227 0:599bc564478b 137
bpd227 0:599bc564478b 138 #ifdef DEBUG
bpd227 0:599bc564478b 139 PRINTF("S UUID-");
bpd227 0:599bc564478b 140 const uint8_t *longUUIDBytes = uuid.getBaseUUID();
bpd227 0:599bc564478b 141 for (unsigned j = 0; j < UUID::LENGTH_OF_LONG_UUID; j++) {
bpd227 0:599bc564478b 142 PRINTF("%02x", longUUIDBytes[j]);
bpd227 0:599bc564478b 143 }
bpd227 0:599bc564478b 144 #endif
bpd227 0:599bc564478b 145 PRINTF(" attrs[%u %u]\r\n", startHandle, endHandle);
bpd227 0:599bc564478b 146
bpd227 0:599bc564478b 147 }
bpd227 0:599bc564478b 148
bpd227 0:599bc564478b 149 PRINTF("Setup serviceIndex = %d\n\r", _numServices);
bpd227 0:599bc564478b 150 discoveredService[_numServices].setup(uuid, startHandle, endHandle);
bpd227 0:599bc564478b 151
bpd227 0:599bc564478b 152 _numServices++;
bpd227 0:599bc564478b 153
bpd227 0:599bc564478b 154 offset += attribute_data_length;
bpd227 0:599bc564478b 155 }
bpd227 0:599bc564478b 156
bpd227 0:599bc564478b 157 PRINTF("!!!Service Discovery complete (numAttr=%u)!!!\n\r", numAttr);
bpd227 0:599bc564478b 158
bpd227 0:599bc564478b 159 }
bpd227 0:599bc564478b 160
bpd227 0:599bc564478b 161 void BlueNRGGattConnectionClient::primaryServiceCB(uint8_t event_data_length, uint8_t *handles_info_list)
bpd227 0:599bc564478b 162 {
bpd227 0:599bc564478b 163 GattAttribute::Handle_t startHandle, endHandle;
bpd227 0:599bc564478b 164 UUID uuid;
bpd227 0:599bc564478b 165 uint8_t i, offset, numHandlePairs;
bpd227 0:599bc564478b 166
bpd227 0:599bc564478b 167 numHandlePairs = (event_data_length - 1) / 2;
bpd227 0:599bc564478b 168
bpd227 0:599bc564478b 169 offset = 0;
bpd227 0:599bc564478b 170 for (i=0; i<numHandlePairs; i++) {
bpd227 0:599bc564478b 171 startHandle = handles_info_list[offset];
bpd227 0:599bc564478b 172 endHandle = handles_info_list[offset+2];
bpd227 0:599bc564478b 173
bpd227 0:599bc564478b 174 PRINTF("primaryServiceCB attrs[%u %u]\r\n", startHandle, endHandle);
bpd227 0:599bc564478b 175
bpd227 0:599bc564478b 176
bpd227 0:599bc564478b 177 if (_matchingServiceUUID.shortOrLong() == UUID::UUID_TYPE_SHORT) {
bpd227 0:599bc564478b 178 PRINTF("S UUID-%x attrs[%u %u]\r\n", _matchingServiceUUID.getShortUUID(), startHandle, endHandle);
bpd227 0:599bc564478b 179 uuid = _matchingServiceUUID.getShortUUID();
bpd227 0:599bc564478b 180 } else {
bpd227 0:599bc564478b 181 #ifdef DEBUG
bpd227 0:599bc564478b 182 PRINTF("S UUID-");
bpd227 0:599bc564478b 183 const uint8_t *longUUIDBytes = _matchingServiceUUID.getBaseUUID();
bpd227 0:599bc564478b 184 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
bpd227 0:599bc564478b 185 PRINTF("%02x", longUUIDBytes[i]);
bpd227 0:599bc564478b 186 }
bpd227 0:599bc564478b 187 #endif
bpd227 0:599bc564478b 188 PRINTF(" attrs[%u %u]\r\n", startHandle, endHandle);
bpd227 0:599bc564478b 189 uuid.setupLong(_matchingServiceUUID.getBaseUUID(), UUID::MSB);
bpd227 0:599bc564478b 190 }
bpd227 0:599bc564478b 191
bpd227 0:599bc564478b 192 discoveredService[i].setup(uuid, startHandle, endHandle);
bpd227 0:599bc564478b 193
bpd227 0:599bc564478b 194 _numServices++;
bpd227 0:599bc564478b 195
bpd227 0:599bc564478b 196 offset += 4;
bpd227 0:599bc564478b 197 }
bpd227 0:599bc564478b 198 }
bpd227 0:599bc564478b 199
bpd227 0:599bc564478b 200 void BlueNRGGattConnectionClient::serviceCharsCB(uint8_t event_data_length,
bpd227 0:599bc564478b 201 uint8_t handle_value_pair_length,
bpd227 0:599bc564478b 202 uint8_t *handle_value_pair)
bpd227 0:599bc564478b 203 {
bpd227 0:599bc564478b 204 // Charac Handle (2), Charac Properties(1), Charac Value Handle(2), Charac UUID(2/16)
bpd227 0:599bc564478b 205
bpd227 0:599bc564478b 206 GattAttribute::Handle_t declHandle, valueHandle, lastHandle;
bpd227 0:599bc564478b 207 UUID uuid;
bpd227 0:599bc564478b 208 uint8_t i, numChar, offset;
bpd227 0:599bc564478b 209
bpd227 0:599bc564478b 210 numChar = (event_data_length - 1) / handle_value_pair_length;
bpd227 0:599bc564478b 211
bpd227 0:599bc564478b 212 PRINTF("event_data_length=%d handle_value_pair_length=%d numChar=%d\n\r", event_data_length, handle_value_pair_length, numChar);
bpd227 0:599bc564478b 213
bpd227 0:599bc564478b 214 offset = 0;
bpd227 0:599bc564478b 215 for (i=0; i<numChar; i++) {
bpd227 0:599bc564478b 216 // UUID Type
bpd227 0:599bc564478b 217 if (handle_value_pair_length == 7) {
bpd227 0:599bc564478b 218 PRINTF("Char UUID_TYPE_16\n\r");
bpd227 0:599bc564478b 219 uuid = handle_value_pair[offset+6]<<8|handle_value_pair[offset+5];
bpd227 0:599bc564478b 220 PRINTF("C UUID-%X\r\n", uuid.getShortUUID());
bpd227 0:599bc564478b 221 } else {
bpd227 0:599bc564478b 222 PRINTF("Char UUID_TYPE_128\n\r");
bpd227 0:599bc564478b 223 uuid.setupLong(handle_value_pair+offset+5, UUID::LSB);
bpd227 0:599bc564478b 224 #ifdef DEBUG
bpd227 0:599bc564478b 225 PRINTF("C UUID-");
bpd227 0:599bc564478b 226 const uint8_t *longUUIDBytes = uuid.getBaseUUID();
bpd227 0:599bc564478b 227 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
bpd227 0:599bc564478b 228 PRINTF("%02X", longUUIDBytes[i]);
bpd227 0:599bc564478b 229 }
bpd227 0:599bc564478b 230 PRINTF("\r\n");
bpd227 0:599bc564478b 231 #endif
bpd227 0:599bc564478b 232 }
bpd227 0:599bc564478b 233
bpd227 0:599bc564478b 234 // Properties
bpd227 0:599bc564478b 235 DiscoveredCharacteristic::Properties_t p;
bpd227 0:599bc564478b 236
bpd227 0:599bc564478b 237 p._broadcast = (props_mask[0] & handle_value_pair[offset+2]);
bpd227 0:599bc564478b 238 p._read = (props_mask[1] & handle_value_pair[offset+2])>>1;
bpd227 0:599bc564478b 239 p._writeWoResp = (props_mask[2] & handle_value_pair[offset+2])>>2;
bpd227 0:599bc564478b 240 p._write = (props_mask[3] & handle_value_pair[offset+2])>>3;
bpd227 0:599bc564478b 241 p._notify = (props_mask[4] & handle_value_pair[offset+2])>>4;
bpd227 0:599bc564478b 242 p._indicate = (props_mask[5] & handle_value_pair[offset+2])>>5;
bpd227 0:599bc564478b 243 p._authSignedWrite = (props_mask[6] & handle_value_pair[offset+2])>>6;
bpd227 0:599bc564478b 244 PRINTF("p._broadcast=%d\n\r", p._broadcast);
bpd227 0:599bc564478b 245 PRINTF("p._read=%d\n\r", p._read);
bpd227 0:599bc564478b 246 PRINTF("p._writeWoResp=%d\n\r", p._writeWoResp);
bpd227 0:599bc564478b 247 PRINTF("p._write=%d\n\r", p._write);
bpd227 0:599bc564478b 248 PRINTF("p._notify=%d\n\r", p._notify);
bpd227 0:599bc564478b 249 PRINTF("p._indicate=%d\n\r", p._indicate);
bpd227 0:599bc564478b 250 PRINTF("p._authSignedWrite=%d\n\r", p._authSignedWrite);
bpd227 0:599bc564478b 251
bpd227 0:599bc564478b 252 /*
bpd227 0:599bc564478b 253 uint8_t props = handle_value_pair[offset+2];
bpd227 0:599bc564478b 254 PRINTF("CHAR PROPS: %d\n\r", props);
bpd227 0:599bc564478b 255 */
bpd227 0:599bc564478b 256
bpd227 0:599bc564478b 257 // Handles
bpd227 0:599bc564478b 258 declHandle = handle_value_pair[offset];
bpd227 0:599bc564478b 259 valueHandle = handle_value_pair[offset+3];
bpd227 0:599bc564478b 260 lastHandle = valueHandle+1;
bpd227 0:599bc564478b 261 PRINTF("declHandle: %u valueHandle=%u lastHandle=%u\n\r", declHandle, valueHandle, lastHandle);
bpd227 0:599bc564478b 262
bpd227 0:599bc564478b 263 discoveredChar[_numChars].setup(_gattClient,
bpd227 0:599bc564478b 264 _connectionHandle,
bpd227 0:599bc564478b 265 uuid,
bpd227 0:599bc564478b 266 p,
bpd227 0:599bc564478b 267 declHandle,
bpd227 0:599bc564478b 268 valueHandle,
bpd227 0:599bc564478b 269 lastHandle);
bpd227 0:599bc564478b 270
bpd227 0:599bc564478b 271 if (_numChars != 0) {
bpd227 0:599bc564478b 272 discoveredChar[_numChars - 1].setLastHandle(declHandle - 1);
bpd227 0:599bc564478b 273
bpd227 0:599bc564478b 274 if(characteristicDiscoveryCallback) {
bpd227 0:599bc564478b 275 characteristicDiscoveryCallback(&discoveredChar[_numChars - 1]);
bpd227 0:599bc564478b 276 }
bpd227 0:599bc564478b 277 }
bpd227 0:599bc564478b 278
bpd227 0:599bc564478b 279 _numChars++;
bpd227 0:599bc564478b 280
bpd227 0:599bc564478b 281 offset += handle_value_pair_length;
bpd227 0:599bc564478b 282 }
bpd227 0:599bc564478b 283 }
bpd227 0:599bc564478b 284
bpd227 0:599bc564478b 285 void BlueNRGGattConnectionClient::serviceCharByUUIDCB(uint8_t event_data_length,
bpd227 0:599bc564478b 286 uint16_t attr_handle,
bpd227 0:599bc564478b 287 uint8_t *attr_value)
bpd227 0:599bc564478b 288 {
bpd227 0:599bc564478b 289 // Charac Properties(1), Charac Value Handle(2), Charac UUID(2/16)
bpd227 0:599bc564478b 290 GattAttribute::Handle_t declHandle, valueHandle, lastHandle;
bpd227 0:599bc564478b 291 UUID uuid;
bpd227 0:599bc564478b 292
bpd227 0:599bc564478b 293 PRINTF("serviceCharByUUIDCB\n\r");
bpd227 0:599bc564478b 294
bpd227 0:599bc564478b 295 // UUID Type
bpd227 0:599bc564478b 296 if (event_data_length == 7) {
bpd227 0:599bc564478b 297 PRINTF("Char UUID_TYPE_16\n\r");
bpd227 0:599bc564478b 298 uuid = attr_value[4]<<8|attr_value[3];
bpd227 0:599bc564478b 299 PRINTF("C UUID-%X\r\n", uuid.getShortUUID());
bpd227 0:599bc564478b 300 } else {
bpd227 0:599bc564478b 301 PRINTF("Char UUID_TYPE_128\n\r");
bpd227 0:599bc564478b 302 uuid.setupLong(attr_value+3, UUID::LSB);
bpd227 0:599bc564478b 303 #ifdef DEBUG
bpd227 0:599bc564478b 304 PRINTF("C UUID-");
bpd227 0:599bc564478b 305 const uint8_t *longUUIDBytes = uuid.getBaseUUID();
bpd227 0:599bc564478b 306 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
bpd227 0:599bc564478b 307 PRINTF("%02X", longUUIDBytes[i]);
bpd227 0:599bc564478b 308 }
bpd227 0:599bc564478b 309 PRINTF("\r\n");
bpd227 0:599bc564478b 310 #endif
bpd227 0:599bc564478b 311 }
bpd227 0:599bc564478b 312
bpd227 0:599bc564478b 313 // Properties
bpd227 0:599bc564478b 314 DiscoveredCharacteristic::Properties_t p;
bpd227 0:599bc564478b 315
bpd227 0:599bc564478b 316 p._broadcast = (props_mask[0] & attr_value[0]);
bpd227 0:599bc564478b 317 p._read = (props_mask[1] & attr_value[0])>>1;
bpd227 0:599bc564478b 318 p._writeWoResp = (props_mask[2] & attr_value[0])>>2;
bpd227 0:599bc564478b 319 p._write = (props_mask[3] & attr_value[0])>>3;
bpd227 0:599bc564478b 320 p._notify = (props_mask[4] & attr_value[0])>>4;
bpd227 0:599bc564478b 321 p._indicate = (props_mask[5] & attr_value[0])>>5;
bpd227 0:599bc564478b 322 p._authSignedWrite = (props_mask[6] & attr_value[0])>>6;
bpd227 0:599bc564478b 323 PRINTF("p._broadcast=%d\n\r", p._broadcast);
bpd227 0:599bc564478b 324 PRINTF("p._read=%d\n\r", p._read);
bpd227 0:599bc564478b 325 PRINTF("p._writeWoResp=%d\n\r", p._writeWoResp);
bpd227 0:599bc564478b 326 PRINTF("p._write=%d\n\r", p._write);
bpd227 0:599bc564478b 327 PRINTF("p._notify=%d\n\r", p._notify);
bpd227 0:599bc564478b 328 PRINTF("p._indicate=%d\n\r", p._indicate);
bpd227 0:599bc564478b 329 PRINTF("p._authSignedWrite=%d\n\r", p._authSignedWrite);
bpd227 0:599bc564478b 330
bpd227 0:599bc564478b 331 /*
bpd227 0:599bc564478b 332 uint8_t props = attr_value[0];
bpd227 0:599bc564478b 333 PRINTF("CHAR PROPS: %d\n\r", props);
bpd227 0:599bc564478b 334 */
bpd227 0:599bc564478b 335
bpd227 0:599bc564478b 336 // Handles
bpd227 0:599bc564478b 337 declHandle = attr_handle;
bpd227 0:599bc564478b 338 valueHandle = attr_value[1];
bpd227 0:599bc564478b 339 lastHandle = valueHandle+1;
bpd227 0:599bc564478b 340
bpd227 0:599bc564478b 341 discoveredChar[_numChars].setup(_gattClient,
bpd227 0:599bc564478b 342 _connectionHandle,
bpd227 0:599bc564478b 343 uuid,
bpd227 0:599bc564478b 344 p,
bpd227 0:599bc564478b 345 declHandle,
bpd227 0:599bc564478b 346 valueHandle,
bpd227 0:599bc564478b 347 lastHandle);
bpd227 0:599bc564478b 348
bpd227 0:599bc564478b 349 // update the last handle and call the characteristic discovery callback for previous char
bpd227 0:599bc564478b 350 if (_numChars != 0) {
bpd227 0:599bc564478b 351 discoveredChar[_numChars - 1].setLastHandle(declHandle - 1);
bpd227 0:599bc564478b 352
bpd227 0:599bc564478b 353 if(characteristicDiscoveryCallback) {
bpd227 0:599bc564478b 354 characteristicDiscoveryCallback(&discoveredChar[_numChars - 1]);
bpd227 0:599bc564478b 355 }
bpd227 0:599bc564478b 356 }
bpd227 0:599bc564478b 357
bpd227 0:599bc564478b 358 _numChars++;
bpd227 0:599bc564478b 359 }
bpd227 0:599bc564478b 360
bpd227 0:599bc564478b 361 ble_error_t BlueNRGGattConnectionClient::findServiceChars(void)
bpd227 0:599bc564478b 362 {
bpd227 0:599bc564478b 363 PRINTF("findServiceChars\n\r");
bpd227 0:599bc564478b 364
bpd227 0:599bc564478b 365 tBleStatus ret;
bpd227 0:599bc564478b 366 uint8_t uuid_type = UUID_TYPE_16;
bpd227 0:599bc564478b 367 uint8_t short_uuid[2];
bpd227 0:599bc564478b 368 uint8_t *uuid = NULL;
bpd227 0:599bc564478b 369
bpd227 0:599bc564478b 370 DiscoveredService *service;
bpd227 0:599bc564478b 371
bpd227 0:599bc564478b 372 // complete the discovery of the last characteristic of the previous service.
bpd227 0:599bc564478b 373 // Its last handle wasn't known before this point
bpd227 0:599bc564478b 374 // update the handle and call the characteristic discovery callback.
bpd227 0:599bc564478b 375 if (_servIndex != 0 && _numChars != 0) {
bpd227 0:599bc564478b 376 discoveredChar[_numChars - 1].setLastHandle(discoveredService[_servIndex - 1].getEndHandle());
bpd227 0:599bc564478b 377
bpd227 0:599bc564478b 378 if(characteristicDiscoveryCallback) {
bpd227 0:599bc564478b 379 characteristicDiscoveryCallback(&discoveredChar[_numChars - 1]);
bpd227 0:599bc564478b 380 }
bpd227 0:599bc564478b 381 }
bpd227 0:599bc564478b 382
bpd227 0:599bc564478b 383 _numChars = 0;
bpd227 0:599bc564478b 384
bpd227 0:599bc564478b 385 // We finished chars discovery for all services
bpd227 0:599bc564478b 386 if(_servIndex >= _numServices) {
bpd227 0:599bc564478b 387 PRINTF("!!!We finished chars discovery for all services!!!\n\r");
bpd227 0:599bc564478b 388 //_currentState = GATT_CHARS_DISCOVERY_COMPLETE;
bpd227 0:599bc564478b 389
bpd227 0:599bc564478b 390 terminateServiceDiscovery();
bpd227 0:599bc564478b 391
bpd227 0:599bc564478b 392 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 393 }
bpd227 0:599bc564478b 394
bpd227 0:599bc564478b 395 service = &discoveredService[_servIndex];
bpd227 0:599bc564478b 396 /*
bpd227 0:599bc564478b 397 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
bpd227 0:599bc564478b 398 PRINTF("S UUID-%X\r\n", service->getUUID().getShortUUID());
bpd227 0:599bc564478b 399 } else {
bpd227 0:599bc564478b 400 PRINTF("S UUID-");
bpd227 0:599bc564478b 401 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
bpd227 0:599bc564478b 402 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
bpd227 0:599bc564478b 403 PRINTF("%02X", longUUIDBytes[i]);
bpd227 0:599bc564478b 404 }
bpd227 0:599bc564478b 405 PRINTF("\r\n");
bpd227 0:599bc564478b 406 }
bpd227 0:599bc564478b 407 */
bpd227 0:599bc564478b 408
bpd227 0:599bc564478b 409 if(serviceDiscoveryCallback) {
bpd227 0:599bc564478b 410 serviceDiscoveryCallback(service);
bpd227 0:599bc564478b 411 }
bpd227 0:599bc564478b 412
bpd227 0:599bc564478b 413 PRINTF("findServiceChars (_servIndex=%d)\n\r", _servIndex);
bpd227 0:599bc564478b 414 //ret = aci_gatt_disc_all_charac_of_serv(connectionHandle, service->getStartHandle(), service->getEndHandle());
bpd227 0:599bc564478b 415
bpd227 0:599bc564478b 416 if(_matchingCharacteristicUUIDIn == BLE_UUID_UNKNOWN) {
bpd227 0:599bc564478b 417 PRINTF("findServiceChars (BLE_UUID_UNKNOWN)\n\r");
bpd227 0:599bc564478b 418 ret = aci_gatt_disc_all_charac_of_serv(_connectionHandle, service->getStartHandle(), service->getEndHandle());
bpd227 0:599bc564478b 419 } else {
bpd227 0:599bc564478b 420
bpd227 0:599bc564478b 421 uint8_t type = _matchingCharacteristicUUIDIn.shortOrLong();
bpd227 0:599bc564478b 422
bpd227 0:599bc564478b 423 if(type == UUID::UUID_TYPE_SHORT) {
bpd227 0:599bc564478b 424 STORE_LE_16(short_uuid, _matchingCharacteristicUUIDIn.getShortUUID());
bpd227 0:599bc564478b 425
bpd227 0:599bc564478b 426 uuid_type = UUID_TYPE_16;
bpd227 0:599bc564478b 427 uuid = short_uuid;
bpd227 0:599bc564478b 428 #ifdef DEBUG
bpd227 0:599bc564478b 429 PRINTF("findServiceChars C UUID-");
bpd227 0:599bc564478b 430 for(unsigned i = 0; i < 2; i++) {
bpd227 0:599bc564478b 431 PRINTF("%02X", short_uuid[i]);
bpd227 0:599bc564478b 432 }
bpd227 0:599bc564478b 433 PRINTF("\n\r");
bpd227 0:599bc564478b 434 #endif
bpd227 0:599bc564478b 435 } else if(type==UUID::UUID_TYPE_LONG) {
bpd227 0:599bc564478b 436
bpd227 0:599bc564478b 437 uuid_type = UUID_TYPE_128;
bpd227 0:599bc564478b 438 uuid = (unsigned char*)_matchingCharacteristicUUIDIn.getBaseUUID();
bpd227 0:599bc564478b 439 #ifdef DEBUG
bpd227 0:599bc564478b 440 PRINTF("(findServiceChars) C UUID-");
bpd227 0:599bc564478b 441 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
bpd227 0:599bc564478b 442 PRINTF("%02X", uuid[i]);
bpd227 0:599bc564478b 443 }
bpd227 0:599bc564478b 444 PRINTF("\r\n");
bpd227 0:599bc564478b 445 #endif
bpd227 0:599bc564478b 446 }
bpd227 0:599bc564478b 447
bpd227 0:599bc564478b 448 ret = aci_gatt_disc_charac_by_uuid(_connectionHandle,
bpd227 0:599bc564478b 449 service->getStartHandle(),
bpd227 0:599bc564478b 450 service->getEndHandle(),
bpd227 0:599bc564478b 451 uuid_type,
bpd227 0:599bc564478b 452 uuid);
bpd227 0:599bc564478b 453 }
bpd227 0:599bc564478b 454
bpd227 0:599bc564478b 455 if(ret == BLE_STATUS_SUCCESS) {
bpd227 0:599bc564478b 456 _servIndex++;
bpd227 0:599bc564478b 457 }
bpd227 0:599bc564478b 458
bpd227 0:599bc564478b 459 PRINTF("findServiceChars ret=%d\n\r", ret);
bpd227 0:599bc564478b 460
bpd227 0:599bc564478b 461 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 462 }
bpd227 0:599bc564478b 463
bpd227 0:599bc564478b 464 ble_error_t BlueNRGGattConnectionClient::launchServiceDiscovery(ServiceDiscovery::ServiceCallback_t sc,
bpd227 0:599bc564478b 465 ServiceDiscovery::CharacteristicCallback_t cc,
bpd227 0:599bc564478b 466 const UUID &matchingServiceUUID,
bpd227 0:599bc564478b 467 const UUID &matchingCharacteristicUUIDIn)
bpd227 0:599bc564478b 468 {
bpd227 0:599bc564478b 469 PRINTF("BlueNRGGattConnectionClient launchServiceDiscovery\n\r");
bpd227 0:599bc564478b 470
bpd227 0:599bc564478b 471 tBleStatus ret;
bpd227 0:599bc564478b 472 uint8_t uuid_type = UUID_TYPE_16;
bpd227 0:599bc564478b 473 uint8_t short_uuid[2];
bpd227 0:599bc564478b 474 uint8_t *uuid = NULL;
bpd227 0:599bc564478b 475 unsigned j;
bpd227 0:599bc564478b 476
bpd227 0:599bc564478b 477 if(isServiceDiscoveryActive()) {
bpd227 0:599bc564478b 478 return BLE_ERROR_OPERATION_NOT_PERMITTED;
bpd227 0:599bc564478b 479 }
bpd227 0:599bc564478b 480
bpd227 0:599bc564478b 481 if(!sc && !cc) {
bpd227 0:599bc564478b 482 // nothing to do
bpd227 0:599bc564478b 483 PRINTF("BlueNRGGattConnectionClient launchServiceDiscovery: nothing to do\n\r");
bpd227 0:599bc564478b 484 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 485 }
bpd227 0:599bc564478b 486
bpd227 0:599bc564478b 487 serviceDiscoveryCallback = sc;
bpd227 0:599bc564478b 488 characteristicDiscoveryCallback = cc;
bpd227 0:599bc564478b 489 _matchingServiceUUID = matchingServiceUUID;
bpd227 0:599bc564478b 490 _matchingCharacteristicUUIDIn = matchingCharacteristicUUIDIn;
bpd227 0:599bc564478b 491
bpd227 0:599bc564478b 492 //reset services
bpd227 0:599bc564478b 493 _numServices = 0;
bpd227 0:599bc564478b 494 _numChars = 0;
bpd227 0:599bc564478b 495 _servIndex = 0;
bpd227 0:599bc564478b 496 for(j = 0; j < BLE_TOTAL_DISCOVERED_SERVICES; j++) {
bpd227 0:599bc564478b 497 discoveredService[j].setup(BLE_UUID_UNKNOWN, GattAttribute::INVALID_HANDLE, GattAttribute::INVALID_HANDLE);
bpd227 0:599bc564478b 498 }
bpd227 0:599bc564478b 499
bpd227 0:599bc564478b 500 if(matchingServiceUUID == BLE_UUID_UNKNOWN) {
bpd227 0:599bc564478b 501
bpd227 0:599bc564478b 502 // Wildcard: search for all services
bpd227 0:599bc564478b 503 PRINTF("Wildcard: search for all services\r\n");
bpd227 0:599bc564478b 504 ret = aci_gatt_disc_all_prim_services((uint16_t)_connectionHandle);
bpd227 0:599bc564478b 505
bpd227 0:599bc564478b 506 } else {
bpd227 0:599bc564478b 507 PRINTF("search for specific services\r\n");
bpd227 0:599bc564478b 508
bpd227 0:599bc564478b 509 uint8_t type = matchingServiceUUID.shortOrLong();
bpd227 0:599bc564478b 510
bpd227 0:599bc564478b 511 if(type == UUID::UUID_TYPE_SHORT) {
bpd227 0:599bc564478b 512 STORE_LE_16(short_uuid, matchingServiceUUID.getShortUUID());
bpd227 0:599bc564478b 513 #ifdef DEBUG
bpd227 0:599bc564478b 514 PRINTF("BlueNRGGattConnectionClient launchServiceDiscovery short_uuid=0x");
bpd227 0:599bc564478b 515 for(j = 0; j < 2; j++) {
bpd227 0:599bc564478b 516 PRINTF("%02X", short_uuid[j]);
bpd227 0:599bc564478b 517 }
bpd227 0:599bc564478b 518 PRINTF("\n\r");
bpd227 0:599bc564478b 519 #endif
bpd227 0:599bc564478b 520
bpd227 0:599bc564478b 521 uuid_type = UUID_TYPE_16;
bpd227 0:599bc564478b 522 uuid = short_uuid;
bpd227 0:599bc564478b 523
bpd227 0:599bc564478b 524 } else if(type==UUID::UUID_TYPE_LONG) {
bpd227 0:599bc564478b 525
bpd227 0:599bc564478b 526 uuid_type = UUID_TYPE_128;
bpd227 0:599bc564478b 527 uuid = (unsigned char*)matchingServiceUUID.getBaseUUID();
bpd227 0:599bc564478b 528
bpd227 0:599bc564478b 529 #ifdef DEBUG
bpd227 0:599bc564478b 530 PRINTF("BlueNRGGattConnectionClient launchServiceDiscovery base_uuid=0x");
bpd227 0:599bc564478b 531 for(j = 0; j < 16; j++) {
bpd227 0:599bc564478b 532 PRINTF("%02X", uuid[j]);
bpd227 0:599bc564478b 533 }
bpd227 0:599bc564478b 534 PRINTF("\n\r");
bpd227 0:599bc564478b 535 #endif
bpd227 0:599bc564478b 536 }
bpd227 0:599bc564478b 537
bpd227 0:599bc564478b 538 // search for specific service by UUID
bpd227 0:599bc564478b 539 ret = aci_gatt_disc_prim_service_by_uuid((uint16_t)_connectionHandle, uuid_type, uuid);
bpd227 0:599bc564478b 540 }
bpd227 0:599bc564478b 541
bpd227 0:599bc564478b 542 if(ret == BLE_STATUS_SUCCESS) {
bpd227 0:599bc564478b 543 _currentState = GATT_SERVICE_DISCOVERY;
bpd227 0:599bc564478b 544 }
bpd227 0:599bc564478b 545
bpd227 0:599bc564478b 546 PRINTF("BlueNRGGattConnectionClient launchServiceDiscovery ret=%d\n\r", ret);
bpd227 0:599bc564478b 547
bpd227 0:599bc564478b 548 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 549 }
bpd227 0:599bc564478b 550
bpd227 0:599bc564478b 551 ble_error_t BlueNRGGattConnectionClient::discoverServices(ServiceDiscovery::ServiceCallback_t callback,
bpd227 0:599bc564478b 552 const UUID &matchingServiceUUID)
bpd227 0:599bc564478b 553 {
bpd227 0:599bc564478b 554 /* avoid compiler warnings about unused variables */
bpd227 0:599bc564478b 555 (void)callback;
bpd227 0:599bc564478b 556 (void)matchingServiceUUID;
bpd227 0:599bc564478b 557
bpd227 0:599bc564478b 558 return BLE_ERROR_NOT_IMPLEMENTED;
bpd227 0:599bc564478b 559 }
bpd227 0:599bc564478b 560
bpd227 0:599bc564478b 561 ble_error_t BlueNRGGattConnectionClient::discoverServices(ServiceDiscovery::ServiceCallback_t callback,
bpd227 0:599bc564478b 562 GattAttribute::Handle_t startHandle,
bpd227 0:599bc564478b 563 GattAttribute::Handle_t endHandle)
bpd227 0:599bc564478b 564 {
bpd227 0:599bc564478b 565 /* avoid compiler warnings about unused variables */
bpd227 0:599bc564478b 566 (void)callback;
bpd227 0:599bc564478b 567 (void)startHandle;
bpd227 0:599bc564478b 568 (void)endHandle;
bpd227 0:599bc564478b 569
bpd227 0:599bc564478b 570 return BLE_ERROR_NOT_IMPLEMENTED;
bpd227 0:599bc564478b 571 }
bpd227 0:599bc564478b 572
bpd227 0:599bc564478b 573 bool BlueNRGGattConnectionClient::isServiceDiscoveryActive(void) const
bpd227 0:599bc564478b 574 {
bpd227 0:599bc564478b 575 if(_currentState == GATT_SERVICE_DISCOVERY) {
bpd227 0:599bc564478b 576 return true;
bpd227 0:599bc564478b 577 }
bpd227 0:599bc564478b 578
bpd227 0:599bc564478b 579 return false;
bpd227 0:599bc564478b 580 }
bpd227 0:599bc564478b 581
bpd227 0:599bc564478b 582 void BlueNRGGattConnectionClient::terminateServiceDiscovery(void)
bpd227 0:599bc564478b 583 {
bpd227 0:599bc564478b 584 _currentState = GATT_IDLE;//GATT_DISCOVERY_TERMINATED;
bpd227 0:599bc564478b 585
bpd227 0:599bc564478b 586 if (terminationCallback) {
bpd227 0:599bc564478b 587 terminationCallback(_connectionHandle);
bpd227 0:599bc564478b 588 }
bpd227 0:599bc564478b 589 }
bpd227 0:599bc564478b 590
bpd227 0:599bc564478b 591 void BlueNRGGattConnectionClient::charReadCB(uint8_t event_data_length, uint8_t* attribute_value)
bpd227 0:599bc564478b 592 {
bpd227 0:599bc564478b 593 // copy the data read, they will be forwarded to the user once the procedure
bpd227 0:599bc564478b 594 // has completed
bpd227 0:599bc564478b 595 readCBParams.connHandle = _connectionHandle;
bpd227 0:599bc564478b 596 readCBParams.offset = 0;
bpd227 0:599bc564478b 597 readCBParams.len = event_data_length;
bpd227 0:599bc564478b 598 readCBParams.data = static_cast<uint8_t*>(malloc(event_data_length));
bpd227 0:599bc564478b 599 memcpy((void*)(readCBParams.data), attribute_value, event_data_length);
bpd227 0:599bc564478b 600 }
bpd227 0:599bc564478b 601
bpd227 0:599bc564478b 602 ble_error_t BlueNRGGattConnectionClient::read(GattAttribute::Handle_t attributeHandle, uint16_t offset) const
bpd227 0:599bc564478b 603 {
bpd227 0:599bc564478b 604 /* avoid compiler warnings about unused variables */
bpd227 0:599bc564478b 605 (void)offset;
bpd227 0:599bc564478b 606
bpd227 0:599bc564478b 607 tBleStatus ret;
bpd227 0:599bc564478b 608
bpd227 0:599bc564478b 609 BlueNRGGattConnectionClient *gattc = const_cast<BlueNRGGattConnectionClient*>(this);
bpd227 0:599bc564478b 610
bpd227 0:599bc564478b 611 // Save the attribute_handle not provided by evt_att_read_resp
bpd227 0:599bc564478b 612 gattc->readCBParams.handle = attributeHandle;
bpd227 0:599bc564478b 613
bpd227 0:599bc564478b 614 ret = aci_gatt_read_charac_val(_connectionHandle, attributeHandle);
bpd227 0:599bc564478b 615
bpd227 0:599bc564478b 616 if(ret == BLE_STATUS_SUCCESS) {
bpd227 0:599bc564478b 617 gattc->_currentState = GATT_READ_CHAR;
bpd227 0:599bc564478b 618 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 619 }
bpd227 0:599bc564478b 620 switch (ret) {
bpd227 0:599bc564478b 621 case ERR_CONTROLLER_BUSY:
bpd227 0:599bc564478b 622 return BLE_STACK_BUSY;
bpd227 0:599bc564478b 623 default:
bpd227 0:599bc564478b 624 return BLE_ERROR_INVALID_STATE;
bpd227 0:599bc564478b 625 }
bpd227 0:599bc564478b 626 }
bpd227 0:599bc564478b 627
bpd227 0:599bc564478b 628 void BlueNRGGattConnectionClient::charWritePrepareCB(uint8_t event_data_length,
bpd227 0:599bc564478b 629 uint16_t attribute_handle,
bpd227 0:599bc564478b 630 uint16_t offset,
bpd227 0:599bc564478b 631 uint8_t *part_attr_value)
bpd227 0:599bc564478b 632 {
bpd227 0:599bc564478b 633 // Update the write response params
bpd227 0:599bc564478b 634 writeCBParams.handle = attribute_handle;
bpd227 0:599bc564478b 635 writeCBParams.offset = offset;
bpd227 0:599bc564478b 636 writeCBParams.len = event_data_length-4; //(?)
bpd227 0:599bc564478b 637 writeCBParams.data = part_attr_value;
bpd227 0:599bc564478b 638
bpd227 0:599bc564478b 639 BlueNRGGattClient::getInstance().processWriteResponse(&writeCBParams);
bpd227 0:599bc564478b 640 }
bpd227 0:599bc564478b 641
bpd227 0:599bc564478b 642 void BlueNRGGattConnectionClient::charWriteExecCB(uint8_t event_data_length)
bpd227 0:599bc564478b 643 {
bpd227 0:599bc564478b 644 /* avoid compiler warnings about unused variables */
bpd227 0:599bc564478b 645 (void)event_data_length;
bpd227 0:599bc564478b 646
bpd227 0:599bc564478b 647 writeCBParams.connHandle = _connectionHandle;
bpd227 0:599bc564478b 648
bpd227 0:599bc564478b 649 BlueNRGGattClient::getInstance().processWriteResponse(&writeCBParams);
bpd227 0:599bc564478b 650 }
bpd227 0:599bc564478b 651
bpd227 0:599bc564478b 652 ble_error_t BlueNRGGattConnectionClient::write(GattClient::WriteOp_t cmd,
bpd227 0:599bc564478b 653 GattAttribute::Handle_t attributeHandle,
bpd227 0:599bc564478b 654 size_t length,
bpd227 0:599bc564478b 655 const uint8_t *value) const
bpd227 0:599bc564478b 656 {
bpd227 0:599bc564478b 657 /* avoid compiler warnings about unused variables */
bpd227 0:599bc564478b 658 (void)cmd;
bpd227 0:599bc564478b 659
bpd227 0:599bc564478b 660 tBleStatus ret;
bpd227 0:599bc564478b 661
bpd227 0:599bc564478b 662 BlueNRGGattConnectionClient *gattc = const_cast<BlueNRGGattConnectionClient*>(this);
bpd227 0:599bc564478b 663
bpd227 0:599bc564478b 664 // We save the write response params (used by the callback) because
bpd227 0:599bc564478b 665 // when the aci_gatt_write_charac_value() is used the only event received is the EVT_BLUE_GATT_PROCEDURE_COMPLETE
bpd227 0:599bc564478b 666 gattc->writeCBParams.connHandle = _connectionHandle;
bpd227 0:599bc564478b 667 gattc->writeCBParams.writeOp = GattWriteCallbackParams::OP_WRITE_CMD;
bpd227 0:599bc564478b 668 gattc->writeCBParams.handle = attributeHandle;
bpd227 0:599bc564478b 669 gattc->writeCBParams.offset = 0;
bpd227 0:599bc564478b 670 gattc->writeCBParams.len = length;
bpd227 0:599bc564478b 671 gattc->writeCBParams.data = value;
bpd227 0:599bc564478b 672
bpd227 0:599bc564478b 673 ret = aci_gatt_write_charac_value(_connectionHandle, attributeHandle, length, const_cast<uint8_t *>(value));
bpd227 0:599bc564478b 674
bpd227 0:599bc564478b 675 if (ret == BLE_STATUS_SUCCESS) {
bpd227 0:599bc564478b 676 gattc->_currentState = GATT_WRITE_CHAR;
bpd227 0:599bc564478b 677 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 678 }
bpd227 0:599bc564478b 679 switch (ret) {
bpd227 0:599bc564478b 680 case ERR_CONTROLLER_BUSY:
bpd227 0:599bc564478b 681 return BLE_STACK_BUSY;
bpd227 0:599bc564478b 682 default:
bpd227 0:599bc564478b 683 return BLE_ERROR_INVALID_STATE;
bpd227 0:599bc564478b 684 }
bpd227 0:599bc564478b 685
bpd227 0:599bc564478b 686 }
bpd227 0:599bc564478b 687
bpd227 0:599bc564478b 688 void BlueNRGGattConnectionClient::discAllCharacDescCB(uint8_t event_data_length,
bpd227 0:599bc564478b 689 uint8_t format,
bpd227 0:599bc564478b 690 uint8_t *handle_uuid_pair) {
bpd227 0:599bc564478b 691 GattAttribute::Handle_t attHandle;
bpd227 0:599bc564478b 692 UUID uuid;
bpd227 0:599bc564478b 693 uint8_t i, numCharacDesc, offset, handle_uuid_length;
bpd227 0:599bc564478b 694
bpd227 0:599bc564478b 695 handle_uuid_length = 4; //Handle + UUID_16
bpd227 0:599bc564478b 696 if (format == 2)
bpd227 0:599bc564478b 697 handle_uuid_length = 18; //Handle + UUID_128
bpd227 0:599bc564478b 698
bpd227 0:599bc564478b 699 numCharacDesc = (event_data_length - 1) / handle_uuid_length;
bpd227 0:599bc564478b 700
bpd227 0:599bc564478b 701 offset = 0;
bpd227 0:599bc564478b 702
bpd227 0:599bc564478b 703 PRINTF("\r\ncharacteristic descriptor discovered: data length %u, format %u\r\n",
bpd227 0:599bc564478b 704 event_data_length, format);
bpd227 0:599bc564478b 705
bpd227 0:599bc564478b 706
bpd227 0:599bc564478b 707 for (i=0; i<numCharacDesc; i++) {
bpd227 0:599bc564478b 708 memcpy(&attHandle, handle_uuid_pair + offset, sizeof(attHandle));
bpd227 0:599bc564478b 709
bpd227 0:599bc564478b 710 // UUID Type
bpd227 0:599bc564478b 711 if (handle_uuid_length == 4) {
bpd227 0:599bc564478b 712
bpd227 0:599bc564478b 713 PRINTF("UUID_TYPE_16\n\r");
bpd227 0:599bc564478b 714 uuid = handle_uuid_pair[offset+3]<<8|handle_uuid_pair[offset+2];
bpd227 0:599bc564478b 715 PRINTF("D UUID-%X attHandle=%u\r\n", uuid.getShortUUID(), attHandle);
bpd227 0:599bc564478b 716
bpd227 0:599bc564478b 717 } else {
bpd227 0:599bc564478b 718
bpd227 0:599bc564478b 719 PRINTF("UUID_TYPE_128\n\r");
bpd227 0:599bc564478b 720 uuid.setupLong(handle_uuid_pair+offset+2, UUID::LSB);
bpd227 0:599bc564478b 721 #ifdef DEBUG
bpd227 0:599bc564478b 722 PRINTF("D UUID-");
bpd227 0:599bc564478b 723 const uint8_t *longUUIDBytes = uuid.getBaseUUID();
bpd227 0:599bc564478b 724 for (unsigned j = 0; j < UUID::LENGTH_OF_LONG_UUID; j++) {
bpd227 0:599bc564478b 725 PRINTF("%02x", longUUIDBytes[j]);
bpd227 0:599bc564478b 726 }
bpd227 0:599bc564478b 727 #endif
bpd227 0:599bc564478b 728 }
bpd227 0:599bc564478b 729
bpd227 0:599bc564478b 730 if(charDescDiscoveryCallback != NULL) {
bpd227 0:599bc564478b 731 CharacteristicDescriptorDiscovery::DiscoveryCallbackParams_t params = {
bpd227 0:599bc564478b 732 _characteristic,
bpd227 0:599bc564478b 733 DiscoveredCharacteristicDescriptor(
bpd227 0:599bc564478b 734 _characteristic.getGattClient(),
bpd227 0:599bc564478b 735 _connectionHandle,
bpd227 0:599bc564478b 736 attHandle,
bpd227 0:599bc564478b 737 uuid
bpd227 0:599bc564478b 738 )
bpd227 0:599bc564478b 739 };
bpd227 0:599bc564478b 740 charDescDiscoveryCallback(&params);
bpd227 0:599bc564478b 741 }
bpd227 0:599bc564478b 742
bpd227 0:599bc564478b 743 _numCharDesc++;
bpd227 0:599bc564478b 744
bpd227 0:599bc564478b 745 offset += handle_uuid_length;
bpd227 0:599bc564478b 746 }
bpd227 0:599bc564478b 747 }
bpd227 0:599bc564478b 748
bpd227 0:599bc564478b 749 ble_error_t BlueNRGGattConnectionClient::discoverCharacteristicDescriptors(
bpd227 0:599bc564478b 750 const DiscoveredCharacteristic& characteristic,
bpd227 0:599bc564478b 751 const CharacteristicDescriptorDiscovery::DiscoveryCallback_t& discoveryCallback,
bpd227 0:599bc564478b 752 const CharacteristicDescriptorDiscovery::TerminationCallback_t& terminationCallback) {
bpd227 0:599bc564478b 753
bpd227 0:599bc564478b 754 tBleStatus ret;
bpd227 0:599bc564478b 755
bpd227 0:599bc564478b 756 if(_currentState != GATT_IDLE) {
bpd227 0:599bc564478b 757 return BLE_ERROR_OPERATION_NOT_PERMITTED;
bpd227 0:599bc564478b 758 }
bpd227 0:599bc564478b 759
bpd227 0:599bc564478b 760 charDescDiscoveryCallback = discoveryCallback;
bpd227 0:599bc564478b 761 charDescTerminationCallback = terminationCallback;
bpd227 0:599bc564478b 762
bpd227 0:599bc564478b 763 GattAttribute::Handle_t valueHandle = characteristic.getValueHandle();
bpd227 0:599bc564478b 764 GattAttribute::Handle_t lastHandle = characteristic.getLastHandle();
bpd227 0:599bc564478b 765
bpd227 0:599bc564478b 766 PRINTF("Starting aci_gatt_disc_all_charac_descriptors... [%u : %u]\n\r", valueHandle, lastHandle);
bpd227 0:599bc564478b 767 ret = aci_gatt_disc_all_charac_descriptors(_connectionHandle, valueHandle, lastHandle);
bpd227 0:599bc564478b 768
bpd227 0:599bc564478b 769 if (ret == BLE_STATUS_SUCCESS) {
bpd227 0:599bc564478b 770 _currentState = GATT_CHAR_DESC_DISCOVERY;
bpd227 0:599bc564478b 771 _characteristic = characteristic;
bpd227 0:599bc564478b 772 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 773 }
bpd227 0:599bc564478b 774 switch (ret) {
bpd227 0:599bc564478b 775 case BLE_STATUS_INVALID_PARAMS:
bpd227 0:599bc564478b 776 return BLE_ERROR_INVALID_PARAM;
bpd227 0:599bc564478b 777 default:
bpd227 0:599bc564478b 778 return BLE_ERROR_OPERATION_NOT_PERMITTED;
bpd227 0:599bc564478b 779 }
bpd227 0:599bc564478b 780 }
bpd227 0:599bc564478b 781
bpd227 0:599bc564478b 782 /**************************************************************************/
bpd227 0:599bc564478b 783 /*!
bpd227 0:599bc564478b 784 @brief Clear BlueNRGGattServer's state.
bpd227 0:599bc564478b 785
bpd227 0:599bc564478b 786 @returns ble_error_t
bpd227 0:599bc564478b 787
bpd227 0:599bc564478b 788 @retval BLE_ERROR_NONE
bpd227 0:599bc564478b 789 Everything executed properly
bpd227 0:599bc564478b 790 */
bpd227 0:599bc564478b 791 /**************************************************************************/
bpd227 0:599bc564478b 792 ble_error_t BlueNRGGattConnectionClient::reset(void) {
bpd227 0:599bc564478b 793 PRINTF("BlueNRGGattConnectionClient::reset\n");
bpd227 0:599bc564478b 794
bpd227 0:599bc564478b 795 /* Clear all state, including private members */
bpd227 0:599bc564478b 796
bpd227 0:599bc564478b 797 _currentState = GATT_IDLE;
bpd227 0:599bc564478b 798 _matchingServiceUUID = BLE_UUID_UNKNOWN;
bpd227 0:599bc564478b 799 _matchingCharacteristicUUIDIn = BLE_UUID_UNKNOWN;
bpd227 0:599bc564478b 800
bpd227 0:599bc564478b 801 _numServices = 0;
bpd227 0:599bc564478b 802 _servIndex = 0;
bpd227 0:599bc564478b 803 _numChars = 0;
bpd227 0:599bc564478b 804 _numCharDesc = 0;
bpd227 0:599bc564478b 805
bpd227 0:599bc564478b 806 /* Clear class members */
bpd227 0:599bc564478b 807 memset(discoveredService, 0, sizeof(discoveredService));
bpd227 0:599bc564478b 808 memset(discoveredChar, 0, sizeof(discoveredChar));
bpd227 0:599bc564478b 809
bpd227 0:599bc564478b 810 // free response if allocated
bpd227 0:599bc564478b 811 if(readCBParams.data) {
bpd227 0:599bc564478b 812 free((void*)(readCBParams.data));
bpd227 0:599bc564478b 813 }
bpd227 0:599bc564478b 814
bpd227 0:599bc564478b 815 return BLE_ERROR_NONE;
bpd227 0:599bc564478b 816 }