Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
mridup
Date:
Fri Oct 17 08:30:47 2014 +0000
Revision:
59:68e45913b2c4
Parent:
58:027c65a54097
Child:
64:6d7b775c3f6d
Further Code Cleanup. Replacing HAL_Delay() with mbed wait_us() in BlueNRG_Reset().

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 2:a2b623661316 1 /* mbed Microcontroller Library
hemddabral 58:027c65a54097 2 * Copyright (c) 2006-2013 ARM Limited
hemddabral 58:027c65a54097 3 *
hemddabral 58:027c65a54097 4 * Licensed under the Apache License, Version 2.0 (the "License");
hemddabral 58:027c65a54097 5 * you may not use this file except in compliance with the License.
hemddabral 58:027c65a54097 6 * You may obtain a copy of the License at
hemddabral 58:027c65a54097 7 *
hemddabral 58:027c65a54097 8 * http://www.apache.org/licenses/LICENSE-2.0
hemddabral 58:027c65a54097 9 *
hemddabral 58:027c65a54097 10 * Unless required by applicable law or agreed to in writing, software
hemddabral 58:027c65a54097 11 * distributed under the License is distributed on an "AS IS" BASIS,
hemddabral 58:027c65a54097 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
hemddabral 58:027c65a54097 13 * See the License for the specific language governing permissions and
hemddabral 58:027c65a54097 14 * limitations under the License.
hemddabral 58:027c65a54097 15 */
mridup 2:a2b623661316 16
mridup 2:a2b623661316 17 #include "BlueNRGGattServer.h"
mridup 2:a2b623661316 18 #include "mbed.h"
mridup 2:a2b623661316 19 #include "BlueNRGGap.h"
mridup 17:63059fcb8db2 20 #include "Utils.h"
hemddabral 58:027c65a54097 21
mridup 2:a2b623661316 22 /**************************************************************************/
mridup 2:a2b623661316 23 /*!
mridup 2:a2b623661316 24 @brief Adds a new service to the GATT table on the peripheral
mridup 2:a2b623661316 25
mridup 2:a2b623661316 26 @returns ble_error_t
mridup 2:a2b623661316 27
mridup 2:a2b623661316 28 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 29 Everything executed properly
mridup 2:a2b623661316 30
mridup 2:a2b623661316 31 @section EXAMPLE
mridup 2:a2b623661316 32
mridup 2:a2b623661316 33 @code
mridup 2:a2b623661316 34
mridup 2:a2b623661316 35 @endcode
mridup 2:a2b623661316 36 */
mridup 2:a2b623661316 37 /**************************************************************************/
mridup 2:a2b623661316 38 ble_error_t BlueNRGGattServer::addService(GattService &service)
mridup 2:a2b623661316 39 {
mridup 2:a2b623661316 40 /* ToDo: Make sure we don't overflow the array, etc. */
mridup 2:a2b623661316 41 /* ToDo: Make sure this service UUID doesn't already exist (?) */
mridup 2:a2b623661316 42 /* ToDo: Basic validation */
mridup 5:31dedfa19a12 43
mridup 5:31dedfa19a12 44 tBleStatus ret;
mridup 50:898acb5227fc 45 uint8_t type;
mridup 50:898acb5227fc 46 uint16_t short_uuid;
mridup 50:898acb5227fc 47 uint8_t primary_short_uuid[2];
mridup 50:898acb5227fc 48 uint8_t primary_base_uuid[16];
mridup 50:898acb5227fc 49 uint8_t char_base_uuid[16];
mridup 50:898acb5227fc 50 const uint8_t *base_uuid;
mridup 50:898acb5227fc 51 const uint8_t *base_char_uuid;
hemddabral 58:027c65a54097 52
mridup 50:898acb5227fc 53 type = (service.getUUID()).shortOrLong();
mridup 50:898acb5227fc 54 DEBUG("AddService(): Type:%d\n\r", type);
mridup 5:31dedfa19a12 55
mridup 5:31dedfa19a12 56 /* Add the service to the BlueNRG */
mridup 50:898acb5227fc 57 short_uuid = (service.getUUID()).getShortUUID();
mridup 50:898acb5227fc 58 STORE_LE_16(primary_short_uuid, short_uuid);
mridup 9:dbc2cfe5c24f 59
mridup 50:898acb5227fc 60 if(type==UUID::UUID_TYPE_LONG) {
hemddabral 52:94638d2461c1 61 base_uuid = (service.getUUID()).getBaseUUID();
hemddabral 52:94638d2461c1 62
hemddabral 52:94638d2461c1 63 COPY_UUID_128(primary_base_uuid, base_uuid[15],base_uuid[14],base_uuid[13],base_uuid[12],base_uuid[11],base_uuid[10],base_uuid[9],
hemddabral 58:027c65a54097 64 base_uuid[8],base_uuid[7],base_uuid[6],base_uuid[5],base_uuid[4],primary_short_uuid[1],primary_short_uuid[0],base_uuid[1],base_uuid[0]);
mridup 50:898acb5227fc 65 }
mridup 7:55ac052585db 66
mridup 50:898acb5227fc 67 if(type==UUID::UUID_TYPE_SHORT) {
mridup 50:898acb5227fc 68 ret = aci_gatt_add_serv(UUID_TYPE_16, primary_short_uuid, PRIMARY_SERVICE, 7,
hemddabral 58:027c65a54097 69 &servHandle);
mridup 50:898acb5227fc 70 }
mridup 50:898acb5227fc 71 else if(type==UUID::UUID_TYPE_LONG) {
mridup 50:898acb5227fc 72 ret = aci_gatt_add_serv(UUID_TYPE_128, primary_base_uuid, PRIMARY_SERVICE, 7,
hemddabral 58:027c65a54097 73 &servHandle);
mridup 50:898acb5227fc 74 }
hemddabral 52:94638d2461c1 75
hemddabral 51:963982e7c17c 76 service.setHandle(servHandle);
hemddabral 52:94638d2461c1 77 //serviceHandleVector.push_back(servHandle);
hemddabral 52:94638d2461c1 78 DEBUG("added servHandle handle =%u\n\r", servHandle);
hemddabral 52:94638d2461c1 79 tHalUint16 bleCharacteristic;
mridup 2:a2b623661316 80
mridup 59:68e45913b2c4 81 //iterate to include all characteristics
mridup 7:55ac052585db 82 for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
hemddabral 51:963982e7c17c 83 GattCharacteristic *p_char = service.getCharacteristic(i);
hemddabral 54:bae48224c2f9 84 uint16_t char_uuid = (p_char->getValueAttribute().getUUID()).getShortUUID();
hemddabral 51:963982e7c17c 85
hemddabral 51:963982e7c17c 86 uint8_t int_8_uuid[2];
hemddabral 51:963982e7c17c 87 STORE_LE_16(int_8_uuid, char_uuid);
hemddabral 51:963982e7c17c 88
hemddabral 51:963982e7c17c 89 if(type==UUID::UUID_TYPE_LONG) {
hemddabral 54:bae48224c2f9 90 base_char_uuid = (p_char->getValueAttribute().getUUID()).getBaseUUID();
hemddabral 52:94638d2461c1 91
hemddabral 52:94638d2461c1 92 COPY_UUID_128(char_base_uuid, base_char_uuid[15],base_char_uuid[14],base_char_uuid[13],base_char_uuid[12],base_char_uuid[11],base_char_uuid[10],base_char_uuid[9],
hemddabral 58:027c65a54097 93 base_char_uuid[8],base_char_uuid[7],base_char_uuid[6],base_char_uuid[5],base_char_uuid[4],int_8_uuid[1],int_8_uuid[0],base_char_uuid[1],base_char_uuid[0]);
mridup 21:daebaf11a520 94 }
mridup 59:68e45913b2c4 95
hemddabral 52:94638d2461c1 96 DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
hemddabral 52:94638d2461c1 97 /*
hemddabral 52:94638d2461c1 98 * Gatt_Evt_Mask -> HardCoded (0)
hemddabral 52:94638d2461c1 99 * Encryption_Key_Size -> Hardcoded (16)
hemddabral 52:94638d2461c1 100 * isVariable (variable length value field) -> Hardcoded (1)
hemddabral 52:94638d2461c1 101 */
hemddabral 52:94638d2461c1 102 tGattServerEvent Gatt_Evt_Mask = 0x0;
hemddabral 58:027c65a54097 103
hemddabral 52:94638d2461c1 104 if((p_char->getProperties() &
hemddabral 58:027c65a54097 105 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
hemddabral 58:027c65a54097 106 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
hemddabral 58:027c65a54097 107 DEBUG("Setting up Gatt GATT_SERVER_ATTR_WRITE Mask\n\r");
hemddabral 58:027c65a54097 108 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_SERVER_ATTR_WRITE;
hemddabral 58:027c65a54097 109 }
hemddabral 52:94638d2461c1 110 if((p_char->getProperties() &
hemddabral 58:027c65a54097 111 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
hemddabral 58:027c65a54097 112 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
hemddabral 58:027c65a54097 113 DEBUG("Setting up Gatt GATT_INTIMATE_APPL_WHEN_READ_N_WAIT Mask\n\r");
hemddabral 58:027c65a54097 114 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_INTIMATE_APPL_WHEN_READ_N_WAIT;
hemddabral 58:027c65a54097 115 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
hemddabral 52:94638d2461c1 116
hemddabral 52:94638d2461c1 117 if(type==UUID::UUID_TYPE_SHORT) {
hemddabral 54:bae48224c2f9 118 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
hemddabral 58:027c65a54097 119 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
hemddabral 58:027c65a54097 120 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
hemddabral 52:94638d2461c1 121 }
hemddabral 52:94638d2461c1 122 else if(type==UUID::UUID_TYPE_LONG) {
hemddabral 54:bae48224c2f9 123 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
hemddabral 58:027c65a54097 124 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
hemddabral 58:027c65a54097 125 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
hemddabral 52:94638d2461c1 126 }
hemddabral 52:94638d2461c1 127 /* Update the characteristic handle */
hemddabral 52:94638d2461c1 128 uint16_t charHandle = characteristicCount;
hemddabral 52:94638d2461c1 129
hemddabral 52:94638d2461c1 130 bleCharHanldeMap.insert(std::pair<tHalUint16, tHalUint16>(bleCharacteristic, servHandle));
hemddabral 52:94638d2461c1 131
hemddabral 52:94638d2461c1 132 p_characteristics[characteristicCount++] = p_char;
hemddabral 54:bae48224c2f9 133 p_char->getValueAttribute().setHandle(bleCharacteristic); //Set the characteristic count as the corresponding char handle
hemddabral 52:94638d2461c1 134 DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
hemddabral 52:94638d2461c1 135
hemddabral 54:bae48224c2f9 136 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
hemddabral 58:027c65a54097 137 updateValue(p_char->getValueAttribute().getHandle(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */);
mridup 7:55ac052585db 138 }
hemddabral 53:8c10d592ca49 139
hemddabral 53:8c10d592ca49 140 // add descriptors now
hemddabral 53:8c10d592ca49 141 uint16_t descHandle = 0;
hemddabral 53:8c10d592ca49 142 for(uint8_t descIndex=0; descIndex<p_char->getDescriptorCount(); descIndex++) {
hemddabral 58:027c65a54097 143 GattAttribute *descriptor = p_char->getDescriptor(descIndex);
hemddabral 58:027c65a54097 144 uint16_t shortUUID = descriptor->getUUID().getShortUUID();
hemddabral 58:027c65a54097 145 const tHalUint8 uuidArray[] = {(shortUUID>>8)&0xFF, (shortUUID&0xFF)};
hemddabral 58:027c65a54097 146 ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(),
hemddabral 58:027c65a54097 147 CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(),
hemddabral 58:027c65a54097 148 descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_SERVER_ATTR_READ_WRITE,
hemddabral 58:027c65a54097 149 MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
hemddabral 58:027c65a54097 150 if(ret==(tBleStatus)0) {
hemddabral 58:027c65a54097 151 DEBUG("Descriptor added successfully, descriptor handle=%d\n\r", descHandle);
hemddabral 58:027c65a54097 152 descriptor->setHandle(descHandle);
hemddabral 58:027c65a54097 153 }
hemddabral 53:8c10d592ca49 154 }
mridup 7:55ac052585db 155 }
hemddabral 58:027c65a54097 156
mridup 5:31dedfa19a12 157 serviceCount++;
mridup 7:55ac052585db 158
mridup 7:55ac052585db 159 //FIXME: There is no GattService pointer array in GattServer.
mridup 7:55ac052585db 160 // There should be one? (Only the user is aware of GattServices!) Report to forum.
hemddabral 58:027c65a54097 161
mridup 2:a2b623661316 162 return BLE_ERROR_NONE;
mridup 2:a2b623661316 163 }
mridup 2:a2b623661316 164
mridup 2:a2b623661316 165 /**************************************************************************/
mridup 2:a2b623661316 166 /*!
mridup 2:a2b623661316 167 @brief Reads the value of a characteristic, based on the service
mridup 2:a2b623661316 168 and characteristic index fields
mridup 2:a2b623661316 169
mridup 2:a2b623661316 170 @param[in] charHandle
mridup 2:a2b623661316 171 The handle of the GattCharacteristic to read from
mridup 2:a2b623661316 172 @param[in] buffer
mridup 2:a2b623661316 173 Buffer to hold the the characteristic's value
mridup 2:a2b623661316 174 (raw byte array in LSB format)
mridup 2:a2b623661316 175 @param[in] len
mridup 2:a2b623661316 176 The number of bytes read into the buffer
mridup 2:a2b623661316 177
mridup 2:a2b623661316 178 @returns ble_error_t
mridup 2:a2b623661316 179
mridup 2:a2b623661316 180 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 181 Everything executed properly
mridup 2:a2b623661316 182
mridup 2:a2b623661316 183 @section EXAMPLE
mridup 2:a2b623661316 184
mridup 2:a2b623661316 185 @code
mridup 2:a2b623661316 186
mridup 2:a2b623661316 187 @endcode
mridup 2:a2b623661316 188 */
mridup 2:a2b623661316 189 /**************************************************************************/
mridup 2:a2b623661316 190 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
mridup 2:a2b623661316 191 {
mridup 27:b4c21a9e8b39 192 DEBUG("ReadValue() Not Supported\n\r");
mridup 2:a2b623661316 193 return BLE_ERROR_NONE;
mridup 2:a2b623661316 194 }
mridup 2:a2b623661316 195
mridup 2:a2b623661316 196 /**************************************************************************/
mridup 2:a2b623661316 197 /*!
mridup 2:a2b623661316 198 @brief Updates the value of a characteristic, based on the service
mridup 2:a2b623661316 199 and characteristic index fields
mridup 2:a2b623661316 200
mridup 2:a2b623661316 201 @param[in] charHandle
mridup 2:a2b623661316 202 The handle of the GattCharacteristic to write to
mridup 2:a2b623661316 203 @param[in] buffer
mridup 2:a2b623661316 204 Data to use when updating the characteristic's value
mridup 2:a2b623661316 205 (raw byte array in LSB format)
mridup 2:a2b623661316 206 @param[in] len
mridup 2:a2b623661316 207 The number of bytes in buffer
mridup 2:a2b623661316 208
mridup 2:a2b623661316 209 @returns ble_error_t
mridup 2:a2b623661316 210
mridup 2:a2b623661316 211 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 212 Everything executed properly
mridup 2:a2b623661316 213
mridup 2:a2b623661316 214 @section EXAMPLE
mridup 2:a2b623661316 215
mridup 2:a2b623661316 216 @code
mridup 2:a2b623661316 217
mridup 2:a2b623661316 218 @endcode
mridup 2:a2b623661316 219 */
mridup 2:a2b623661316 220 /**************************************************************************/
mridup 2:a2b623661316 221 ble_error_t BlueNRGGattServer::updateValue(uint16_t charHandle, uint8_t buffer[], uint16_t len, bool localOnly)
mridup 2:a2b623661316 222 {
hemddabral 58:027c65a54097 223 tBleStatus ret;
hemddabral 58:027c65a54097 224 tHalUint8 buff[2];
mridup 2:a2b623661316 225
hemddabral 58:027c65a54097 226 DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second);
hemddabral 58:027c65a54097 227
hemddabral 58:027c65a54097 228 ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
hemddabral 58:027c65a54097 229
hemddabral 58:027c65a54097 230 if (ret != BLE_STATUS_SUCCESS){
hemddabral 58:027c65a54097 231 DEBUG("Error while updating characteristic.\n\r") ;
hemddabral 58:027c65a54097 232 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
hemddabral 58:027c65a54097 233 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
mridup 17:63059fcb8db2 234 }
mridup 30:555e6697b368 235
hemddabral 58:027c65a54097 236 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
hemddabral 58:027c65a54097 237 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
hemddabral 58:027c65a54097 238 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
hemddabral 58:027c65a54097 239 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
hemddabral 58:027c65a54097 240 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
hemddabral 58:027c65a54097 241 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT, charHandle);
hemddabral 58:027c65a54097 242 }
hemddabral 58:027c65a54097 243
hemddabral 58:027c65a54097 244 return BLE_ERROR_NONE;
mridup 2:a2b623661316 245 }
mridup 23:72e56ddfad5b 246
mridup 26:047d45ea379e 247 /**************************************************************************/
mridup 26:047d45ea379e 248 /*!
mridup 26:047d45ea379e 249 @brief Reads a value according to the handle provided
mridup 26:047d45ea379e 250
mridup 26:047d45ea379e 251 @param[in] charHandle
mridup 27:b4c21a9e8b39 252 The handle of the GattCharacteristic to read from
mridup 26:047d45ea379e 253
mridup 26:047d45ea379e 254 @returns ble_error_t
mridup 26:047d45ea379e 255
mridup 26:047d45ea379e 256 @retval BLE_ERROR_NONE
mridup 26:047d45ea379e 257 Everything executed properly
mridup 26:047d45ea379e 258
mridup 26:047d45ea379e 259 @section EXAMPLE
mridup 26:047d45ea379e 260
mridup 26:047d45ea379e 261 @code
mridup 26:047d45ea379e 262
mridup 26:047d45ea379e 263 @endcode
mridup 26:047d45ea379e 264 */
mridup 26:047d45ea379e 265 /**************************************************************************/
mridup 26:047d45ea379e 266 ble_error_t BlueNRGGattServer::Read_Request_CB(tHalUint16 handle)
mridup 26:047d45ea379e 267 {
mridup 26:047d45ea379e 268 //signed short refvalue;
mridup 26:047d45ea379e 269 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
mridup 26:047d45ea379e 270
mridup 26:047d45ea379e 271 //EXIT:
mridup 26:047d45ea379e 272 if(gapConnectionHandle != 0)
mridup 26:047d45ea379e 273 aci_gatt_allow_read(gapConnectionHandle);
mridup 26:047d45ea379e 274 }
mridup 26:047d45ea379e 275
mridup 27:b4c21a9e8b39 276 /**************************************************************************/
mridup 27:b4c21a9e8b39 277 /*!
mridup 27:b4c21a9e8b39 278 @brief Returns the GattCharacteristic according to the handle provided
mridup 27:b4c21a9e8b39 279
mridup 27:b4c21a9e8b39 280 @param[in] charHandle
mridup 27:b4c21a9e8b39 281 The handle of the GattCharacteristic
mridup 27:b4c21a9e8b39 282
mridup 27:b4c21a9e8b39 283 @returns ble_error_t
mridup 27:b4c21a9e8b39 284
mridup 27:b4c21a9e8b39 285 @retval BLE_ERROR_NONE
mridup 27:b4c21a9e8b39 286 Everything executed properly
mridup 27:b4c21a9e8b39 287
mridup 27:b4c21a9e8b39 288 @section EXAMPLE
mridup 27:b4c21a9e8b39 289
mridup 27:b4c21a9e8b39 290 @code
mridup 27:b4c21a9e8b39 291
mridup 27:b4c21a9e8b39 292 @endcode
mridup 27:b4c21a9e8b39 293 */
mridup 27:b4c21a9e8b39 294 /**************************************************************************/
mridup 28:edeb91b415c6 295 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(tHalUint16 attrHandle)
mridup 27:b4c21a9e8b39 296 {
hemddabral 52:94638d2461c1 297 GattCharacteristic *p_char = NULL;
mridup 27:b4c21a9e8b39 298 int i;
mridup 30:555e6697b368 299 uint16_t handle;
hemddabral 58:027c65a54097 300
mridup 30:555e6697b368 301 //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
mridup 27:b4c21a9e8b39 302 for(i=0; i<characteristicCount; i++)
mridup 27:b4c21a9e8b39 303 {
hemddabral 54:bae48224c2f9 304 handle = p_characteristics[i]->getValueAttribute().getHandle();
mridup 29:1870b03aa25b 305
mridup 29:1870b03aa25b 306 if(i==characteristicCount-1)//Last Characteristic check
mridup 27:b4c21a9e8b39 307 {
mridup 29:1870b03aa25b 308 if(attrHandle>=bleCharacteristicHandles[handle])
mridup 29:1870b03aa25b 309 {
mridup 29:1870b03aa25b 310 p_char = p_characteristics[i];
hemddabral 52:94638d2461c1 311 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 312 break;
hemddabral 58:027c65a54097 313 }
mridup 29:1870b03aa25b 314 }
mridup 29:1870b03aa25b 315 else {
mridup 29:1870b03aa25b 316 //Testing if attribute handle is between two Characteristic Handles
mridup 30:555e6697b368 317 if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
mridup 29:1870b03aa25b 318 {
mridup 29:1870b03aa25b 319 p_char = p_characteristics[i];
mridup 29:1870b03aa25b 320 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 321 break;
mridup 29:1870b03aa25b 322 } else continue;
mridup 27:b4c21a9e8b39 323 }
mridup 27:b4c21a9e8b39 324 }
hemddabral 58:027c65a54097 325
mridup 27:b4c21a9e8b39 326 return p_char;
mridup 27:b4c21a9e8b39 327 }
hemddabral 37:07487777d9c6 328
hemddabral 37:07487777d9c6 329