Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
hemddabral
Date:
Thu Apr 02 10:02:59 2015 +0000
Revision:
67:23f9772ef7bf
Parent:
66:8c8813dd8e79
GAP and GATTServer virtual function implementation

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 64:6d7b775c3f6d 16 /**
mridup 64:6d7b775c3f6d 17 ******************************************************************************
mridup 64:6d7b775c3f6d 18 * @file BlueNRGGattServer.cpp
mridup 64:6d7b775c3f6d 19 * @author STMicroelectronics
mridup 64:6d7b775c3f6d 20 * @brief Implementation of BlueNRG BLE_API GattServer Class
mridup 64:6d7b775c3f6d 21 ******************************************************************************
mridup 64:6d7b775c3f6d 22 * @copy
mridup 64:6d7b775c3f6d 23 *
mridup 64:6d7b775c3f6d 24 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
mridup 64:6d7b775c3f6d 25 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
mridup 64:6d7b775c3f6d 26 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
mridup 64:6d7b775c3f6d 27 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
mridup 64:6d7b775c3f6d 28 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
mridup 64:6d7b775c3f6d 29 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
mridup 64:6d7b775c3f6d 30 *
mridup 64:6d7b775c3f6d 31 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
mridup 64:6d7b775c3f6d 32 */
mridup 64:6d7b775c3f6d 33
mridup 64:6d7b775c3f6d 34
mridup 64:6d7b775c3f6d 35 /** @defgroup BlueNRGGATTSERVER
mridup 64:6d7b775c3f6d 36 * @brief BlueNRG BLE_API GattServer Adaptation
mridup 64:6d7b775c3f6d 37 * @{
mridup 64:6d7b775c3f6d 38 */
mridup 64:6d7b775c3f6d 39
mridup 2:a2b623661316 40 #include "BlueNRGGattServer.h"
mridup 2:a2b623661316 41 #include "mbed.h"
mridup 2:a2b623661316 42 #include "BlueNRGGap.h"
mridup 17:63059fcb8db2 43 #include "Utils.h"
hemddabral 58:027c65a54097 44
mridup 2:a2b623661316 45 /**************************************************************************/
mridup 2:a2b623661316 46 /*!
mridup 2:a2b623661316 47 @brief Adds a new service to the GATT table on the peripheral
mridup 2:a2b623661316 48
mridup 64:6d7b775c3f6d 49 @params[in] service
mridup 64:6d7b775c3f6d 50 Pointer to instance of the Gatt Server to add
mridup 64:6d7b775c3f6d 51
mridup 2:a2b623661316 52 @returns ble_error_t
mridup 2:a2b623661316 53
mridup 2:a2b623661316 54 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 55 Everything executed properly
mridup 2:a2b623661316 56
mridup 2:a2b623661316 57 @section EXAMPLE
mridup 2:a2b623661316 58
mridup 2:a2b623661316 59 @code
mridup 2:a2b623661316 60
mridup 2:a2b623661316 61 @endcode
mridup 2:a2b623661316 62 */
mridup 2:a2b623661316 63 /**************************************************************************/
mridup 2:a2b623661316 64 ble_error_t BlueNRGGattServer::addService(GattService &service)
mridup 2:a2b623661316 65 {
mridup 2:a2b623661316 66 /* ToDo: Make sure we don't overflow the array, etc. */
mridup 2:a2b623661316 67 /* ToDo: Make sure this service UUID doesn't already exist (?) */
mridup 2:a2b623661316 68 /* ToDo: Basic validation */
mridup 5:31dedfa19a12 69
mridup 5:31dedfa19a12 70 tBleStatus ret;
mridup 50:898acb5227fc 71 uint8_t type;
mridup 50:898acb5227fc 72 uint16_t short_uuid;
mridup 50:898acb5227fc 73 uint8_t primary_short_uuid[2];
mridup 50:898acb5227fc 74 uint8_t primary_base_uuid[16];
mridup 50:898acb5227fc 75 uint8_t char_base_uuid[16];
mridup 50:898acb5227fc 76 const uint8_t *base_uuid;
mridup 50:898acb5227fc 77 const uint8_t *base_char_uuid;
hemddabral 58:027c65a54097 78
mridup 50:898acb5227fc 79 type = (service.getUUID()).shortOrLong();
mridup 50:898acb5227fc 80 DEBUG("AddService(): Type:%d\n\r", type);
mridup 5:31dedfa19a12 81
mridup 5:31dedfa19a12 82 /* Add the service to the BlueNRG */
mridup 50:898acb5227fc 83 short_uuid = (service.getUUID()).getShortUUID();
mridup 50:898acb5227fc 84 STORE_LE_16(primary_short_uuid, short_uuid);
mridup 9:dbc2cfe5c24f 85
mridup 50:898acb5227fc 86 if(type==UUID::UUID_TYPE_LONG) {
hemddabral 52:94638d2461c1 87 base_uuid = (service.getUUID()).getBaseUUID();
hemddabral 52:94638d2461c1 88
hemddabral 52:94638d2461c1 89 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 90 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 91 }
mridup 7:55ac052585db 92
mridup 50:898acb5227fc 93 if(type==UUID::UUID_TYPE_SHORT) {
mridup 50:898acb5227fc 94 ret = aci_gatt_add_serv(UUID_TYPE_16, primary_short_uuid, PRIMARY_SERVICE, 7,
hemddabral 58:027c65a54097 95 &servHandle);
mridup 50:898acb5227fc 96 }
mridup 50:898acb5227fc 97 else if(type==UUID::UUID_TYPE_LONG) {
mridup 50:898acb5227fc 98 ret = aci_gatt_add_serv(UUID_TYPE_128, primary_base_uuid, PRIMARY_SERVICE, 7,
hemddabral 58:027c65a54097 99 &servHandle);
mridup 50:898acb5227fc 100 }
hemddabral 52:94638d2461c1 101
hemddabral 51:963982e7c17c 102 service.setHandle(servHandle);
hemddabral 52:94638d2461c1 103 //serviceHandleVector.push_back(servHandle);
hemddabral 52:94638d2461c1 104 DEBUG("added servHandle handle =%u\n\r", servHandle);
hemddabral 52:94638d2461c1 105 tHalUint16 bleCharacteristic;
mridup 2:a2b623661316 106
mridup 59:68e45913b2c4 107 //iterate to include all characteristics
mridup 7:55ac052585db 108 for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
hemddabral 51:963982e7c17c 109 GattCharacteristic *p_char = service.getCharacteristic(i);
hemddabral 54:bae48224c2f9 110 uint16_t char_uuid = (p_char->getValueAttribute().getUUID()).getShortUUID();
hemddabral 51:963982e7c17c 111
hemddabral 51:963982e7c17c 112 uint8_t int_8_uuid[2];
hemddabral 51:963982e7c17c 113 STORE_LE_16(int_8_uuid, char_uuid);
hemddabral 51:963982e7c17c 114
hemddabral 51:963982e7c17c 115 if(type==UUID::UUID_TYPE_LONG) {
hemddabral 54:bae48224c2f9 116 base_char_uuid = (p_char->getValueAttribute().getUUID()).getBaseUUID();
hemddabral 52:94638d2461c1 117
hemddabral 52:94638d2461c1 118 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 119 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 120 }
mridup 59:68e45913b2c4 121
hemddabral 52:94638d2461c1 122 DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
hemddabral 52:94638d2461c1 123 /*
hemddabral 52:94638d2461c1 124 * Gatt_Evt_Mask -> HardCoded (0)
hemddabral 52:94638d2461c1 125 * Encryption_Key_Size -> Hardcoded (16)
hemddabral 52:94638d2461c1 126 * isVariable (variable length value field) -> Hardcoded (1)
hemddabral 52:94638d2461c1 127 */
hemddabral 52:94638d2461c1 128 tGattServerEvent Gatt_Evt_Mask = 0x0;
hemddabral 58:027c65a54097 129
hemddabral 52:94638d2461c1 130 if((p_char->getProperties() &
hemddabral 58:027c65a54097 131 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
hemddabral 58:027c65a54097 132 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
hemddabral 58:027c65a54097 133 DEBUG("Setting up Gatt GATT_SERVER_ATTR_WRITE Mask\n\r");
hemddabral 58:027c65a54097 134 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_SERVER_ATTR_WRITE;
hemddabral 58:027c65a54097 135 }
hemddabral 52:94638d2461c1 136 if((p_char->getProperties() &
hemddabral 58:027c65a54097 137 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
hemddabral 58:027c65a54097 138 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
hemddabral 58:027c65a54097 139 DEBUG("Setting up Gatt GATT_INTIMATE_APPL_WHEN_READ_N_WAIT Mask\n\r");
hemddabral 58:027c65a54097 140 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_INTIMATE_APPL_WHEN_READ_N_WAIT;
hemddabral 58:027c65a54097 141 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
hemddabral 52:94638d2461c1 142
hemddabral 52:94638d2461c1 143 if(type==UUID::UUID_TYPE_SHORT) {
hemddabral 54:bae48224c2f9 144 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
hemddabral 58:027c65a54097 145 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
hemddabral 58:027c65a54097 146 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
hemddabral 52:94638d2461c1 147 }
hemddabral 52:94638d2461c1 148 else if(type==UUID::UUID_TYPE_LONG) {
hemddabral 54:bae48224c2f9 149 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
hemddabral 58:027c65a54097 150 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
hemddabral 58:027c65a54097 151 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
hemddabral 52:94638d2461c1 152 }
hemddabral 52:94638d2461c1 153 /* Update the characteristic handle */
hemddabral 52:94638d2461c1 154 uint16_t charHandle = characteristicCount;
hemddabral 52:94638d2461c1 155
hemddabral 52:94638d2461c1 156 bleCharHanldeMap.insert(std::pair<tHalUint16, tHalUint16>(bleCharacteristic, servHandle));
hemddabral 52:94638d2461c1 157
hemddabral 52:94638d2461c1 158 p_characteristics[characteristicCount++] = p_char;
hemddabral 54:bae48224c2f9 159 p_char->getValueAttribute().setHandle(bleCharacteristic); //Set the characteristic count as the corresponding char handle
hemddabral 52:94638d2461c1 160 DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
hemddabral 52:94638d2461c1 161
hemddabral 54:bae48224c2f9 162 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
hemddabral 58:027c65a54097 163 updateValue(p_char->getValueAttribute().getHandle(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */);
mridup 7:55ac052585db 164 }
hemddabral 53:8c10d592ca49 165
hemddabral 53:8c10d592ca49 166 // add descriptors now
hemddabral 53:8c10d592ca49 167 uint16_t descHandle = 0;
hemddabral 53:8c10d592ca49 168 for(uint8_t descIndex=0; descIndex<p_char->getDescriptorCount(); descIndex++) {
hemddabral 58:027c65a54097 169 GattAttribute *descriptor = p_char->getDescriptor(descIndex);
hemddabral 58:027c65a54097 170 uint16_t shortUUID = descriptor->getUUID().getShortUUID();
hemddabral 58:027c65a54097 171 const tHalUint8 uuidArray[] = {(shortUUID>>8)&0xFF, (shortUUID&0xFF)};
hemddabral 58:027c65a54097 172 ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(),
hemddabral 58:027c65a54097 173 CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(),
hemddabral 58:027c65a54097 174 descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_SERVER_ATTR_READ_WRITE,
hemddabral 58:027c65a54097 175 MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
hemddabral 58:027c65a54097 176 if(ret==(tBleStatus)0) {
hemddabral 58:027c65a54097 177 DEBUG("Descriptor added successfully, descriptor handle=%d\n\r", descHandle);
hemddabral 58:027c65a54097 178 descriptor->setHandle(descHandle);
hemddabral 58:027c65a54097 179 }
hemddabral 53:8c10d592ca49 180 }
mridup 7:55ac052585db 181 }
hemddabral 58:027c65a54097 182
mridup 5:31dedfa19a12 183 serviceCount++;
mridup 7:55ac052585db 184
mridup 7:55ac052585db 185 //FIXME: There is no GattService pointer array in GattServer.
mridup 7:55ac052585db 186 // There should be one? (Only the user is aware of GattServices!) Report to forum.
hemddabral 58:027c65a54097 187
mridup 2:a2b623661316 188 return BLE_ERROR_NONE;
mridup 2:a2b623661316 189 }
mridup 2:a2b623661316 190
mridup 2:a2b623661316 191 /**************************************************************************/
mridup 2:a2b623661316 192 /*!
mridup 2:a2b623661316 193 @brief Reads the value of a characteristic, based on the service
mridup 2:a2b623661316 194 and characteristic index fields
mridup 2:a2b623661316 195
mridup 2:a2b623661316 196 @param[in] charHandle
mridup 2:a2b623661316 197 The handle of the GattCharacteristic to read from
mridup 2:a2b623661316 198 @param[in] buffer
mridup 2:a2b623661316 199 Buffer to hold the the characteristic's value
mridup 2:a2b623661316 200 (raw byte array in LSB format)
mridup 64:6d7b775c3f6d 201 @param[in] lengthP
mridup 2:a2b623661316 202 The number of bytes read into the buffer
mridup 2:a2b623661316 203
mridup 2:a2b623661316 204 @returns ble_error_t
mridup 2:a2b623661316 205
mridup 2:a2b623661316 206 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 207 Everything executed properly
mridup 2:a2b623661316 208
mridup 2:a2b623661316 209 @section EXAMPLE
mridup 2:a2b623661316 210
mridup 2:a2b623661316 211 @code
mridup 2:a2b623661316 212
mridup 2:a2b623661316 213 @endcode
mridup 2:a2b623661316 214 */
mridup 2:a2b623661316 215 /**************************************************************************/
mridup 2:a2b623661316 216 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
mridup 2:a2b623661316 217 {
mridup 27:b4c21a9e8b39 218 DEBUG("ReadValue() Not Supported\n\r");
mridup 2:a2b623661316 219 return BLE_ERROR_NONE;
mridup 2:a2b623661316 220 }
mridup 2:a2b623661316 221
mridup 2:a2b623661316 222 /**************************************************************************/
mridup 2:a2b623661316 223 /*!
mridup 2:a2b623661316 224 @brief Updates the value of a characteristic, based on the service
mridup 2:a2b623661316 225 and characteristic index fields
mridup 2:a2b623661316 226
mridup 2:a2b623661316 227 @param[in] charHandle
mridup 2:a2b623661316 228 The handle of the GattCharacteristic to write to
mridup 2:a2b623661316 229 @param[in] buffer
mridup 2:a2b623661316 230 Data to use when updating the characteristic's value
mridup 2:a2b623661316 231 (raw byte array in LSB format)
mridup 2:a2b623661316 232 @param[in] len
mridup 2:a2b623661316 233 The number of bytes in buffer
mridup 2:a2b623661316 234
mridup 2:a2b623661316 235 @returns ble_error_t
mridup 2:a2b623661316 236
mridup 2:a2b623661316 237 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 238 Everything executed properly
mridup 2:a2b623661316 239
mridup 2:a2b623661316 240 @section EXAMPLE
mridup 2:a2b623661316 241
mridup 2:a2b623661316 242 @code
mridup 2:a2b623661316 243
mridup 2:a2b623661316 244 @endcode
mridup 2:a2b623661316 245 */
mridup 2:a2b623661316 246 /**************************************************************************/
mridup 2:a2b623661316 247 ble_error_t BlueNRGGattServer::updateValue(uint16_t charHandle, uint8_t buffer[], uint16_t len, bool localOnly)
mridup 2:a2b623661316 248 {
hemddabral 58:027c65a54097 249 tBleStatus ret;
hemddabral 58:027c65a54097 250 tHalUint8 buff[2];
mridup 2:a2b623661316 251
hemddabral 58:027c65a54097 252 DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second);
hemddabral 58:027c65a54097 253
hemddabral 58:027c65a54097 254 ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
hemddabral 58:027c65a54097 255
hemddabral 58:027c65a54097 256 if (ret != BLE_STATUS_SUCCESS){
hemddabral 58:027c65a54097 257 DEBUG("Error while updating characteristic.\n\r") ;
hemddabral 58:027c65a54097 258 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
hemddabral 58:027c65a54097 259 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
mridup 17:63059fcb8db2 260 }
mridup 30:555e6697b368 261
hemddabral 58:027c65a54097 262 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
hemddabral 58:027c65a54097 263 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
hemddabral 58:027c65a54097 264 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
hemddabral 58:027c65a54097 265 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
hemddabral 58:027c65a54097 266 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
hemddabral 58:027c65a54097 267 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT, charHandle);
hemddabral 58:027c65a54097 268 }
hemddabral 58:027c65a54097 269
hemddabral 58:027c65a54097 270 return BLE_ERROR_NONE;
mridup 2:a2b623661316 271 }
mridup 23:72e56ddfad5b 272
mridup 26:047d45ea379e 273 /**************************************************************************/
mridup 26:047d45ea379e 274 /*!
mridup 26:047d45ea379e 275 @brief Reads a value according to the handle provided
mridup 26:047d45ea379e 276
mridup 26:047d45ea379e 277 @param[in] charHandle
mridup 27:b4c21a9e8b39 278 The handle of the GattCharacteristic to read from
mridup 26:047d45ea379e 279
mridup 26:047d45ea379e 280 @returns ble_error_t
mridup 26:047d45ea379e 281
mridup 26:047d45ea379e 282 @retval BLE_ERROR_NONE
mridup 26:047d45ea379e 283 Everything executed properly
mridup 26:047d45ea379e 284
mridup 26:047d45ea379e 285 @section EXAMPLE
mridup 26:047d45ea379e 286
mridup 26:047d45ea379e 287 @code
mridup 26:047d45ea379e 288
mridup 26:047d45ea379e 289 @endcode
mridup 26:047d45ea379e 290 */
mridup 26:047d45ea379e 291 /**************************************************************************/
mridup 26:047d45ea379e 292 ble_error_t BlueNRGGattServer::Read_Request_CB(tHalUint16 handle)
mridup 26:047d45ea379e 293 {
mridup 26:047d45ea379e 294 //signed short refvalue;
mridup 26:047d45ea379e 295 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
mridup 26:047d45ea379e 296
mridup 26:047d45ea379e 297 //EXIT:
mridup 26:047d45ea379e 298 if(gapConnectionHandle != 0)
mridup 26:047d45ea379e 299 aci_gatt_allow_read(gapConnectionHandle);
mridup 26:047d45ea379e 300 }
mridup 26:047d45ea379e 301
mridup 27:b4c21a9e8b39 302 /**************************************************************************/
mridup 27:b4c21a9e8b39 303 /*!
mridup 27:b4c21a9e8b39 304 @brief Returns the GattCharacteristic according to the handle provided
mridup 27:b4c21a9e8b39 305
mridup 27:b4c21a9e8b39 306 @param[in] charHandle
mridup 27:b4c21a9e8b39 307 The handle of the GattCharacteristic
mridup 27:b4c21a9e8b39 308
mridup 27:b4c21a9e8b39 309 @returns ble_error_t
mridup 27:b4c21a9e8b39 310
mridup 27:b4c21a9e8b39 311 @retval BLE_ERROR_NONE
mridup 27:b4c21a9e8b39 312 Everything executed properly
mridup 27:b4c21a9e8b39 313
mridup 27:b4c21a9e8b39 314 @section EXAMPLE
mridup 27:b4c21a9e8b39 315
mridup 27:b4c21a9e8b39 316 @code
mridup 27:b4c21a9e8b39 317
mridup 27:b4c21a9e8b39 318 @endcode
mridup 27:b4c21a9e8b39 319 */
mridup 27:b4c21a9e8b39 320 /**************************************************************************/
mridup 28:edeb91b415c6 321 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(tHalUint16 attrHandle)
mridup 27:b4c21a9e8b39 322 {
hemddabral 52:94638d2461c1 323 GattCharacteristic *p_char = NULL;
mridup 27:b4c21a9e8b39 324 int i;
mridup 30:555e6697b368 325 uint16_t handle;
hemddabral 58:027c65a54097 326
mridup 30:555e6697b368 327 //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
mridup 27:b4c21a9e8b39 328 for(i=0; i<characteristicCount; i++)
mridup 27:b4c21a9e8b39 329 {
hemddabral 54:bae48224c2f9 330 handle = p_characteristics[i]->getValueAttribute().getHandle();
mridup 29:1870b03aa25b 331
mridup 29:1870b03aa25b 332 if(i==characteristicCount-1)//Last Characteristic check
mridup 27:b4c21a9e8b39 333 {
mridup 29:1870b03aa25b 334 if(attrHandle>=bleCharacteristicHandles[handle])
mridup 29:1870b03aa25b 335 {
mridup 29:1870b03aa25b 336 p_char = p_characteristics[i];
hemddabral 52:94638d2461c1 337 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 338 break;
hemddabral 58:027c65a54097 339 }
mridup 29:1870b03aa25b 340 }
mridup 29:1870b03aa25b 341 else {
mridup 29:1870b03aa25b 342 //Testing if attribute handle is between two Characteristic Handles
mridup 30:555e6697b368 343 if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
mridup 29:1870b03aa25b 344 {
mridup 29:1870b03aa25b 345 p_char = p_characteristics[i];
mridup 29:1870b03aa25b 346 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 347 break;
mridup 29:1870b03aa25b 348 } else continue;
mridup 27:b4c21a9e8b39 349 }
mridup 27:b4c21a9e8b39 350 }
hemddabral 58:027c65a54097 351
mridup 27:b4c21a9e8b39 352 return p_char;
mridup 27:b4c21a9e8b39 353 }
hemddabral 37:07487777d9c6 354
mridup 66:8c8813dd8e79 355 void BlueNRGGattServer::HCIDataWrittenEvent(const GattCharacteristicWriteCBParams *params) {
mridup 66:8c8813dd8e79 356 this->handleDataWrittenEvent(params);
mridup 66:8c8813dd8e79 357 }
mridup 66:8c8813dd8e79 358
mridup 66:8c8813dd8e79 359 void BlueNRGGattServer::HCIDataReadEvent(const GattCharacteristicReadCBParams *params) {
mridup 66:8c8813dd8e79 360 this->handleDataReadEvent(params);
mridup 66:8c8813dd8e79 361 }
hemddabral 37:07487777d9c6 362
mridup 66:8c8813dd8e79 363 void BlueNRGGattServer::HCIEvent(GattServerEvents::gattEvent_e type, uint16_t charHandle) {
mridup 66:8c8813dd8e79 364 this->handleEvent(type, charHandle);
mridup 66:8c8813dd8e79 365 }
mridup 66:8c8813dd8e79 366
mridup 66:8c8813dd8e79 367 void BlueNRGGattServer::HCIDataSentEvent(unsigned count) {
mridup 66:8c8813dd8e79 368 this->handleDataSentEvent(count);
mridup 66:8c8813dd8e79 369 }
mridup 66:8c8813dd8e79 370
mridup 66:8c8813dd8e79 371
hemddabral 67:23f9772ef7bf 372 ble_error_t BlueNRGGattServer::initializeGATTDatabase(void) {
hemddabral 67:23f9772ef7bf 373 // <TODO>
hemddabral 67:23f9772ef7bf 374 return (ble_error_t)0;
hemddabral 67:23f9772ef7bf 375 }