Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
apalmieri
Date:
Mon Jul 27 11:10:19 2015 +0000
Revision:
97:a89d28ad6092
Parent:
95:e1f7ce04e71b
Child:
105:332f93cd06b7
Fix bug on searching Char by handle

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Silvio Lucio Oliva 70:d20d30f59b1c 1 /* mbed Microcontroller Library
Silvio Lucio Oliva 70:d20d30f59b1c 2 * Copyright (c) 2006-2013 ARM Limited
Silvio Lucio Oliva 70:d20d30f59b1c 3 *
Silvio Lucio Oliva 70:d20d30f59b1c 4 * Licensed under the Apache License, Version 2.0 (the "License");
Silvio Lucio Oliva 70:d20d30f59b1c 5 * you may not use this file except in compliance with the License.
Silvio Lucio Oliva 70:d20d30f59b1c 6 * You may obtain a copy of the License at
Silvio Lucio Oliva 70:d20d30f59b1c 7 *
Silvio Lucio Oliva 70:d20d30f59b1c 8 * http://www.apache.org/licenses/LICENSE-2.0
Silvio Lucio Oliva 70:d20d30f59b1c 9 *
Silvio Lucio Oliva 70:d20d30f59b1c 10 * Unless required by applicable law or agreed to in writing, software
Silvio Lucio Oliva 70:d20d30f59b1c 11 * distributed under the License is distributed on an "AS IS" BASIS,
Silvio Lucio Oliva 70:d20d30f59b1c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Silvio Lucio Oliva 70:d20d30f59b1c 13 * See the License for the specific language governing permissions and
Silvio Lucio Oliva 70:d20d30f59b1c 14 * limitations under the License.
Silvio Lucio Oliva 70:d20d30f59b1c 15 */
Silvio Lucio Oliva 70:d20d30f59b1c 16 /**
Silvio Lucio Oliva 70:d20d30f59b1c 17 ******************************************************************************
Silvio Lucio Oliva 70:d20d30f59b1c 18 * @file BlueNRGGattServer.cpp
Silvio Lucio Oliva 70:d20d30f59b1c 19 * @author STMicroelectronics
Silvio Lucio Oliva 70:d20d30f59b1c 20 * @brief Implementation of BlueNRG BLE_API GattServer Class
Silvio Lucio Oliva 70:d20d30f59b1c 21 ******************************************************************************
Silvio Lucio Oliva 70:d20d30f59b1c 22 * @copy
Silvio Lucio Oliva 70:d20d30f59b1c 23 *
Silvio Lucio Oliva 70:d20d30f59b1c 24 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Silvio Lucio Oliva 70:d20d30f59b1c 25 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
Silvio Lucio Oliva 70:d20d30f59b1c 26 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
Silvio Lucio Oliva 70:d20d30f59b1c 27 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
Silvio Lucio Oliva 70:d20d30f59b1c 28 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
Silvio Lucio Oliva 70:d20d30f59b1c 29 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Silvio Lucio Oliva 70:d20d30f59b1c 30 *
Silvio Lucio Oliva 70:d20d30f59b1c 31 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
Silvio Lucio Oliva 70:d20d30f59b1c 32 */
Silvio Lucio Oliva 70:d20d30f59b1c 33
Silvio Lucio Oliva 70:d20d30f59b1c 34
Silvio Lucio Oliva 70:d20d30f59b1c 35 // ANDREA: Changed some types (e.g., tHalUint8 --> uint8_t)
Silvio Lucio Oliva 70:d20d30f59b1c 36
Silvio Lucio Oliva 70:d20d30f59b1c 37 /** @defgroup BlueNRGGATTSERVER
Silvio Lucio Oliva 70:d20d30f59b1c 38 * @brief BlueNRG BLE_API GattServer Adaptation
Silvio Lucio Oliva 70:d20d30f59b1c 39 * @{
Silvio Lucio Oliva 70:d20d30f59b1c 40 */
Silvio Lucio Oliva 70:d20d30f59b1c 41
Silvio Lucio Oliva 70:d20d30f59b1c 42 #include "BlueNRGGattServer.h"
Silvio Lucio Oliva 70:d20d30f59b1c 43 #include "mbed.h"
Silvio Lucio Oliva 70:d20d30f59b1c 44 #include "BlueNRGGap.h"
Silvio Lucio Oliva 70:d20d30f59b1c 45 #include "Utils.h"
Silvio Lucio Oliva 70:d20d30f59b1c 46
Silvio Lucio Oliva 70:d20d30f59b1c 47 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 48 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 49 @brief Adds a new service to the GATT table on the peripheral
Silvio Lucio Oliva 70:d20d30f59b1c 50
Silvio Lucio Oliva 70:d20d30f59b1c 51 @params[in] service
Silvio Lucio Oliva 70:d20d30f59b1c 52 Pointer to instance of the Gatt Server to add
Silvio Lucio Oliva 70:d20d30f59b1c 53
Silvio Lucio Oliva 70:d20d30f59b1c 54 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 55
Silvio Lucio Oliva 70:d20d30f59b1c 56 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 57 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 58
Silvio Lucio Oliva 70:d20d30f59b1c 59 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 60
Silvio Lucio Oliva 70:d20d30f59b1c 61 @code
Silvio Lucio Oliva 70:d20d30f59b1c 62
Silvio Lucio Oliva 70:d20d30f59b1c 63 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 64 */
Silvio Lucio Oliva 70:d20d30f59b1c 65 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 66 ble_error_t BlueNRGGattServer::addService(GattService &service)
Silvio Lucio Oliva 70:d20d30f59b1c 67 {
Silvio Lucio Oliva 70:d20d30f59b1c 68 /* ToDo: Make sure we don't overflow the array, etc. */
Silvio Lucio Oliva 70:d20d30f59b1c 69 /* ToDo: Make sure this service UUID doesn't already exist (?) */
Silvio Lucio Oliva 70:d20d30f59b1c 70 /* ToDo: Basic validation */
Silvio Lucio Oliva 70:d20d30f59b1c 71
Silvio Lucio Oliva 70:d20d30f59b1c 72 tBleStatus ret;
Silvio Lucio Oliva 70:d20d30f59b1c 73 uint8_t type;
Silvio Lucio Oliva 70:d20d30f59b1c 74 uint16_t short_uuid;
Silvio Lucio Oliva 70:d20d30f59b1c 75 uint8_t primary_short_uuid[2];
Silvio Lucio Oliva 70:d20d30f59b1c 76 uint8_t primary_base_uuid[16];
Silvio Lucio Oliva 70:d20d30f59b1c 77 uint8_t char_base_uuid[16];
Silvio Lucio Oliva 70:d20d30f59b1c 78 const uint8_t *base_uuid;
Silvio Lucio Oliva 70:d20d30f59b1c 79 const uint8_t *base_char_uuid;
Silvio Lucio Oliva 70:d20d30f59b1c 80
Andrea Palmieri 73:142f3ded2091 81 uint8_t charsCount = 0;
Andrea Palmieri 73:142f3ded2091 82 uint8_t maxAttrRecords = 0;
Andrea Palmieri 73:142f3ded2091 83
Silvio Lucio Oliva 70:d20d30f59b1c 84 type = (service.getUUID()).shortOrLong();
Silvio Lucio Oliva 70:d20d30f59b1c 85 DEBUG("AddService(): Type:%d\n\r", type);
Silvio Lucio Oliva 70:d20d30f59b1c 86
Silvio Lucio Oliva 70:d20d30f59b1c 87 /* Add the service to the BlueNRG */
Silvio Lucio Oliva 70:d20d30f59b1c 88 short_uuid = (service.getUUID()).getShortUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 89 STORE_LE_16(primary_short_uuid, short_uuid);
Silvio Lucio Oliva 70:d20d30f59b1c 90
Silvio Lucio Oliva 70:d20d30f59b1c 91 if(type==UUID::UUID_TYPE_LONG) {
Silvio Lucio Oliva 70:d20d30f59b1c 92 base_uuid = (service.getUUID()).getBaseUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 93
Silvio Lucio Oliva 70:d20d30f59b1c 94 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],
Silvio Lucio Oliva 70:d20d30f59b1c 95 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]);
Silvio Lucio Oliva 70:d20d30f59b1c 96 }
Andrea Palmieri 73:142f3ded2091 97
Andrea Palmieri 73:142f3ded2091 98 charsCount = service.getCharacteristicCount();
Andrea Palmieri 73:142f3ded2091 99 //1(service record)+2records*char+1record*char_desc
Andrea Palmieri 73:142f3ded2091 100 maxAttrRecords = 1+3*charsCount;
Andrea Palmieri 73:142f3ded2091 101
Silvio Lucio Oliva 70:d20d30f59b1c 102 if(type==UUID::UUID_TYPE_SHORT) {
Andrea Palmieri 73:142f3ded2091 103 ret = aci_gatt_add_serv(UUID_TYPE_16,
Andrea Palmieri 73:142f3ded2091 104 primary_short_uuid,
Andrea Palmieri 73:142f3ded2091 105 PRIMARY_SERVICE,
Andrea Palmieri 73:142f3ded2091 106 maxAttrRecords/*7*/,
Andrea Palmieri 73:142f3ded2091 107 &servHandle);
Andrea Palmieri 73:142f3ded2091 108 DEBUG("aci_gatt_add_serv UUID_TYPE_LONG ret=%d\n\r", ret);
Silvio Lucio Oliva 70:d20d30f59b1c 109 }
Silvio Lucio Oliva 70:d20d30f59b1c 110 else if(type==UUID::UUID_TYPE_LONG) {
Andrea Palmieri 73:142f3ded2091 111 ret = aci_gatt_add_serv(UUID_TYPE_128,
Andrea Palmieri 73:142f3ded2091 112 primary_base_uuid,
Andrea Palmieri 73:142f3ded2091 113 PRIMARY_SERVICE,
Andrea Palmieri 73:142f3ded2091 114 maxAttrRecords/*7*/,
Andrea Palmieri 73:142f3ded2091 115 &servHandle);
Andrea Palmieri 73:142f3ded2091 116 DEBUG("aci_gatt_add_serv UUID_TYPE_LONG ret=%d\n\r", ret);
Silvio Lucio Oliva 70:d20d30f59b1c 117 }
Silvio Lucio Oliva 70:d20d30f59b1c 118
Silvio Lucio Oliva 70:d20d30f59b1c 119 service.setHandle(servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 120 //serviceHandleVector.push_back(servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 121 DEBUG("added servHandle handle =%u\n\r", servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 122 uint16_t bleCharacteristic;
Silvio Lucio Oliva 70:d20d30f59b1c 123
Silvio Lucio Oliva 70:d20d30f59b1c 124 //iterate to include all characteristics
Andrea Palmieri 73:142f3ded2091 125 for (uint8_t i = 0; i < charsCount; i++) {
Silvio Lucio Oliva 70:d20d30f59b1c 126 GattCharacteristic *p_char = service.getCharacteristic(i);
Silvio Lucio Oliva 70:d20d30f59b1c 127 uint16_t char_uuid = (p_char->getValueAttribute().getUUID()).getShortUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 128
Silvio Lucio Oliva 70:d20d30f59b1c 129 uint8_t int_8_uuid[2];
Silvio Lucio Oliva 70:d20d30f59b1c 130 STORE_LE_16(int_8_uuid, char_uuid);
Silvio Lucio Oliva 70:d20d30f59b1c 131
Silvio Lucio Oliva 70:d20d30f59b1c 132 if(type==UUID::UUID_TYPE_LONG) {
Silvio Lucio Oliva 70:d20d30f59b1c 133 base_char_uuid = (p_char->getValueAttribute().getUUID()).getBaseUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 134
Silvio Lucio Oliva 70:d20d30f59b1c 135 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],
Silvio Lucio Oliva 70:d20d30f59b1c 136 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]);
Silvio Lucio Oliva 70:d20d30f59b1c 137 }
Silvio Lucio Oliva 70:d20d30f59b1c 138
Silvio Lucio Oliva 70:d20d30f59b1c 139 DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
Silvio Lucio Oliva 70:d20d30f59b1c 140 /*
Silvio Lucio Oliva 70:d20d30f59b1c 141 * Gatt_Evt_Mask -> HardCoded (0)
Silvio Lucio Oliva 70:d20d30f59b1c 142 * Encryption_Key_Size -> Hardcoded (16)
Silvio Lucio Oliva 70:d20d30f59b1c 143 * isVariable (variable length value field) -> Hardcoded (1)
Silvio Lucio Oliva 70:d20d30f59b1c 144 */
Silvio Lucio Oliva 70:d20d30f59b1c 145 uint8_t Gatt_Evt_Mask = 0x0;
Andrea Palmieri 73:142f3ded2091 146
Silvio Lucio Oliva 70:d20d30f59b1c 147 if((p_char->getProperties() &
Silvio Lucio Oliva 70:d20d30f59b1c 148 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
Silvio Lucio Oliva 70:d20d30f59b1c 149 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
Silvio Lucio Oliva 70:d20d30f59b1c 150 DEBUG("Setting up Gatt GATT_NOTIFY_ATTRIBUTE_WRITE Mask\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 151 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_NOTIFY_ATTRIBUTE_WRITE;
Silvio Lucio Oliva 70:d20d30f59b1c 152 }
Silvio Lucio Oliva 70:d20d30f59b1c 153 if((p_char->getProperties() &
Silvio Lucio Oliva 70:d20d30f59b1c 154 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
Silvio Lucio Oliva 70:d20d30f59b1c 155 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
Silvio Lucio Oliva 70:d20d30f59b1c 156 DEBUG("Setting up Gatt GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP Mask\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 157 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP;
Silvio Lucio Oliva 70:d20d30f59b1c 158 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
Andrea Palmieri 73:142f3ded2091 159
Silvio Lucio Oliva 70:d20d30f59b1c 160 if(type==UUID::UUID_TYPE_SHORT) {
Andrea Palmieri 73:142f3ded2091 161 ret = aci_gatt_add_char(service.getHandle(),
Andrea Palmieri 73:142f3ded2091 162 UUID_TYPE_16,
Andrea Palmieri 73:142f3ded2091 163 int_8_uuid,
Andrea Palmieri 73:142f3ded2091 164 p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
Andrea Palmieri 73:142f3ded2091 165 p_char->getProperties(),
Andrea Palmieri 73:142f3ded2091 166 ATTR_PERMISSION_NONE,
Andrea Palmieri 73:142f3ded2091 167 Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
Andrea Palmieri 73:142f3ded2091 168 16 /*Encryption_Key_Size*/,
Andrea Palmieri 73:142f3ded2091 169 1 /*isVariable*/,
Andrea Palmieri 73:142f3ded2091 170 &bleCharacteristic);
Andrea Palmieri 73:142f3ded2091 171
Andrea Palmieri 73:142f3ded2091 172 DEBUG("aci_gatt_add_char UUID_TYPE_16 props=%d MaxLength=%d ret=%d\n\r", p_char->getProperties(), p_char->getValueAttribute().getMaxLength(), ret);
Andrea Palmieri 73:142f3ded2091 173
Andrea Palmieri 73:142f3ded2091 174 } else if(type==UUID::UUID_TYPE_LONG) {
Andrea Palmieri 73:142f3ded2091 175 ret = aci_gatt_add_char(service.getHandle(),
Andrea Palmieri 73:142f3ded2091 176 UUID_TYPE_128,
Andrea Palmieri 73:142f3ded2091 177 char_base_uuid,
Andrea Palmieri 73:142f3ded2091 178 p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
Andrea Palmieri 73:142f3ded2091 179 p_char->getProperties(),
Andrea Palmieri 73:142f3ded2091 180 ATTR_PERMISSION_NONE,
Andrea Palmieri 73:142f3ded2091 181 Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
Andrea Palmieri 73:142f3ded2091 182 16 /*Encryption_Key_Size*/,
Andrea Palmieri 73:142f3ded2091 183 1 /*isVariable*/,
Andrea Palmieri 73:142f3ded2091 184 &bleCharacteristic);
Andrea Palmieri 73:142f3ded2091 185
Andrea Palmieri 73:142f3ded2091 186 DEBUG("aci_gatt_add_char UUID_TYPE_128 props=%d MaxLength=%d ret=%d\n\r", p_char->getProperties(), p_char->getValueAttribute().getMaxLength(), ret);
Silvio Lucio Oliva 70:d20d30f59b1c 187 }
Andrea Palmieri 73:142f3ded2091 188
Silvio Lucio Oliva 70:d20d30f59b1c 189 /* Update the characteristic handle */
Andrea Palmieri 77:332b416123b4 190 //uint16_t charHandle = characteristicCount;
Silvio Lucio Oliva 70:d20d30f59b1c 191
Silvio Lucio Oliva 70:d20d30f59b1c 192 bleCharHanldeMap.insert(std::pair<uint16_t, uint16_t>(bleCharacteristic, servHandle));
Silvio Lucio Oliva 70:d20d30f59b1c 193
Silvio Lucio Oliva 70:d20d30f59b1c 194 p_characteristics[characteristicCount++] = p_char;
Silvio Lucio Oliva 70:d20d30f59b1c 195 p_char->getValueAttribute().setHandle(bleCharacteristic); //Set the characteristic count as the corresponding char handle
Silvio Lucio Oliva 70:d20d30f59b1c 196 DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
Andrea Palmieri 73:142f3ded2091 197
Silvio Lucio Oliva 70:d20d30f59b1c 198 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
Andrea Palmieri 77:332b416123b4 199 write(p_char->getValueAttribute().getHandle(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */);
Silvio Lucio Oliva 70:d20d30f59b1c 200 }
Andrea Palmieri 73:142f3ded2091 201
Silvio Lucio Oliva 70:d20d30f59b1c 202 // add descriptors now
Silvio Lucio Oliva 70:d20d30f59b1c 203 uint16_t descHandle = 0;
apalmieri 84:2beeb1cc9d57 204 DEBUG("p_char->getDescriptorCount()=%d\n\r", p_char->getDescriptorCount());
apalmieri 84:2beeb1cc9d57 205
Silvio Lucio Oliva 70:d20d30f59b1c 206 for(uint8_t descIndex=0; descIndex<p_char->getDescriptorCount(); descIndex++) {
Silvio Lucio Oliva 70:d20d30f59b1c 207 GattAttribute *descriptor = p_char->getDescriptor(descIndex);
Silvio Lucio Oliva 70:d20d30f59b1c 208 uint16_t shortUUID = descriptor->getUUID().getShortUUID();
apalmieri 95:e1f7ce04e71b 209 const uint8_t uuidArray[] = {(shortUUID>>8)&0xFF, (shortUUID&0xFF)};
Silvio Lucio Oliva 70:d20d30f59b1c 210 ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(),
Silvio Lucio Oliva 70:d20d30f59b1c 211 CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(),
Silvio Lucio Oliva 70:d20d30f59b1c 212 descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_NOTIFY_ATTRIBUTE_WRITE,
Silvio Lucio Oliva 70:d20d30f59b1c 213 MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
apalmieri 84:2beeb1cc9d57 214 DEBUG("Adding Descriptor descriptor handle=%d ret=%d\n\r", descHandle, ret);
Silvio Lucio Oliva 70:d20d30f59b1c 215 if(ret==(tBleStatus)0) {
Silvio Lucio Oliva 70:d20d30f59b1c 216 DEBUG("Descriptor added successfully, descriptor handle=%d\n\r", descHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 217 descriptor->setHandle(descHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 218 }
Silvio Lucio Oliva 70:d20d30f59b1c 219 }
Andrea Palmieri 73:142f3ded2091 220
Silvio Lucio Oliva 70:d20d30f59b1c 221 }
Silvio Lucio Oliva 70:d20d30f59b1c 222
Silvio Lucio Oliva 70:d20d30f59b1c 223 serviceCount++;
Silvio Lucio Oliva 70:d20d30f59b1c 224
Silvio Lucio Oliva 70:d20d30f59b1c 225 //FIXME: There is no GattService pointer array in GattServer.
Silvio Lucio Oliva 70:d20d30f59b1c 226 // There should be one? (Only the user is aware of GattServices!) Report to forum.
Silvio Lucio Oliva 70:d20d30f59b1c 227
Silvio Lucio Oliva 70:d20d30f59b1c 228 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 229 }
Silvio Lucio Oliva 70:d20d30f59b1c 230
Silvio Lucio Oliva 70:d20d30f59b1c 231 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 232 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 233 @brief Reads the value of a characteristic, based on the service
Silvio Lucio Oliva 70:d20d30f59b1c 234 and characteristic index fields
Silvio Lucio Oliva 70:d20d30f59b1c 235
Silvio Lucio Oliva 70:d20d30f59b1c 236 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 237 The handle of the GattCharacteristic to read from
Silvio Lucio Oliva 70:d20d30f59b1c 238 @param[in] buffer
Silvio Lucio Oliva 70:d20d30f59b1c 239 Buffer to hold the the characteristic's value
Silvio Lucio Oliva 70:d20d30f59b1c 240 (raw byte array in LSB format)
Silvio Lucio Oliva 70:d20d30f59b1c 241 @param[in] lengthP
Silvio Lucio Oliva 70:d20d30f59b1c 242 The number of bytes read into the buffer
Silvio Lucio Oliva 70:d20d30f59b1c 243
Silvio Lucio Oliva 70:d20d30f59b1c 244 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 245
Silvio Lucio Oliva 70:d20d30f59b1c 246 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 247 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 248
Silvio Lucio Oliva 70:d20d30f59b1c 249 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 250
Silvio Lucio Oliva 70:d20d30f59b1c 251 @code
Silvio Lucio Oliva 70:d20d30f59b1c 252
Silvio Lucio Oliva 70:d20d30f59b1c 253 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 254 */
Silvio Lucio Oliva 70:d20d30f59b1c 255 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 256 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
Silvio Lucio Oliva 70:d20d30f59b1c 257 {
Silvio Lucio Oliva 70:d20d30f59b1c 258 DEBUG("ReadValue() Not Supported\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 259 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 260 }
Silvio Lucio Oliva 70:d20d30f59b1c 261
Silvio Lucio Oliva 70:d20d30f59b1c 262 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 263 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 264 @brief Updates the value of a characteristic, based on the service
Silvio Lucio Oliva 70:d20d30f59b1c 265 and characteristic index fields
Silvio Lucio Oliva 70:d20d30f59b1c 266
Silvio Lucio Oliva 70:d20d30f59b1c 267 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 268 The handle of the GattCharacteristic to write to
Silvio Lucio Oliva 70:d20d30f59b1c 269 @param[in] buffer
Silvio Lucio Oliva 70:d20d30f59b1c 270 Data to use when updating the characteristic's value
Silvio Lucio Oliva 70:d20d30f59b1c 271 (raw byte array in LSB format)
Silvio Lucio Oliva 70:d20d30f59b1c 272 @param[in] len
Silvio Lucio Oliva 70:d20d30f59b1c 273 The number of bytes in buffer
Silvio Lucio Oliva 70:d20d30f59b1c 274
Silvio Lucio Oliva 70:d20d30f59b1c 275 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 276
Silvio Lucio Oliva 70:d20d30f59b1c 277 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 278 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 279
Silvio Lucio Oliva 70:d20d30f59b1c 280 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 281
Silvio Lucio Oliva 70:d20d30f59b1c 282 @code
Silvio Lucio Oliva 70:d20d30f59b1c 283
Silvio Lucio Oliva 70:d20d30f59b1c 284 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 285 */
Silvio Lucio Oliva 70:d20d30f59b1c 286 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 287 // <<<ANDREA>>>
Silvio Lucio Oliva 70:d20d30f59b1c 288 ble_error_t BlueNRGGattServer::readValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) {
Silvio Lucio Oliva 70:d20d30f59b1c 289 // Empty by now
Silvio Lucio Oliva 70:d20d30f59b1c 290 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 291 }
Silvio Lucio Oliva 70:d20d30f59b1c 292
Andrea Palmieri 77:332b416123b4 293 ble_error_t BlueNRGGattServer::write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly) {
Silvio Lucio Oliva 70:d20d30f59b1c 294 // Empty by now
Silvio Lucio Oliva 70:d20d30f59b1c 295 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 296 }
Silvio Lucio Oliva 70:d20d30f59b1c 297
Andrea Palmieri 77:332b416123b4 298 ble_error_t BlueNRGGattServer::write(GattAttribute::Handle_t charHandle, const uint8_t buffer[], uint16_t len, bool localOnly)
Silvio Lucio Oliva 70:d20d30f59b1c 299 {
Silvio Lucio Oliva 70:d20d30f59b1c 300 tBleStatus ret;
Andrea Palmieri 77:332b416123b4 301 //uint8_t buff[2];
Silvio Lucio Oliva 70:d20d30f59b1c 302
Silvio Lucio Oliva 70:d20d30f59b1c 303 DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u len=%d\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second, len);
Silvio Lucio Oliva 70:d20d30f59b1c 304 /*
Silvio Lucio Oliva 70:d20d30f59b1c 305 for(int i=0; i<6; i++) {
Silvio Lucio Oliva 70:d20d30f59b1c 306 DEBUG("buffer[%d]=%d\n\r", i, buffer[i]);
Silvio Lucio Oliva 70:d20d30f59b1c 307 }
Silvio Lucio Oliva 70:d20d30f59b1c 308 */
Silvio Lucio Oliva 70:d20d30f59b1c 309 ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
Silvio Lucio Oliva 70:d20d30f59b1c 310
Silvio Lucio Oliva 70:d20d30f59b1c 311 if (ret != BLE_STATUS_SUCCESS){
apalmieri 97:a89d28ad6092 312 DEBUG("Error while updating characteristic (ret=0x%x).\n\r", ret) ;
Silvio Lucio Oliva 70:d20d30f59b1c 313 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
Silvio Lucio Oliva 70:d20d30f59b1c 314 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
Silvio Lucio Oliva 70:d20d30f59b1c 315 }
Silvio Lucio Oliva 70:d20d30f59b1c 316
Silvio Lucio Oliva 70:d20d30f59b1c 317 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
Silvio Lucio Oliva 70:d20d30f59b1c 318 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
Silvio Lucio Oliva 70:d20d30f59b1c 319 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 320 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
Silvio Lucio Oliva 70:d20d30f59b1c 321 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
apalmieri 97:a89d28ad6092 322 DEBUG("Generate event after updating\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 323 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT, charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 324 }
Silvio Lucio Oliva 70:d20d30f59b1c 325
Silvio Lucio Oliva 70:d20d30f59b1c 326 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 327 }
Silvio Lucio Oliva 70:d20d30f59b1c 328
Silvio Lucio Oliva 70:d20d30f59b1c 329 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 330 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 331 @brief Reads a value according to the handle provided
Silvio Lucio Oliva 70:d20d30f59b1c 332
Silvio Lucio Oliva 70:d20d30f59b1c 333 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 334 The handle of the GattCharacteristic to read from
Silvio Lucio Oliva 70:d20d30f59b1c 335
Silvio Lucio Oliva 70:d20d30f59b1c 336 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 337
Silvio Lucio Oliva 70:d20d30f59b1c 338 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 339 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 340
Silvio Lucio Oliva 70:d20d30f59b1c 341 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 342
Silvio Lucio Oliva 70:d20d30f59b1c 343 @code
Silvio Lucio Oliva 70:d20d30f59b1c 344
Silvio Lucio Oliva 70:d20d30f59b1c 345 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 346 */
Silvio Lucio Oliva 70:d20d30f59b1c 347 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 348 ble_error_t BlueNRGGattServer::Read_Request_CB(uint16_t handle)
Silvio Lucio Oliva 70:d20d30f59b1c 349 {
Silvio Lucio Oliva 70:d20d30f59b1c 350 //signed short refvalue;
Silvio Lucio Oliva 70:d20d30f59b1c 351 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
Silvio Lucio Oliva 70:d20d30f59b1c 352
Andrea Palmieri 77:332b416123b4 353 GattReadCallbackParams readParams;
Andrea Palmieri 77:332b416123b4 354 readParams.handle = handle;
Silvio Lucio Oliva 70:d20d30f59b1c 355
Silvio Lucio Oliva 70:d20d30f59b1c 356 //DEBUG("readParams.charHandle = %d\n\r", readParams.charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 357 HCIDataReadEvent(&readParams);
Silvio Lucio Oliva 70:d20d30f59b1c 358
Silvio Lucio Oliva 70:d20d30f59b1c 359 //EXIT:
Silvio Lucio Oliva 70:d20d30f59b1c 360 if(gapConnectionHandle != 0){
Silvio Lucio Oliva 70:d20d30f59b1c 361 //DEBUG("Calling aci_gatt_allow_read\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 362 aci_gatt_allow_read(gapConnectionHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 363 }
Andrea Palmieri 77:332b416123b4 364
Andrea Palmieri 77:332b416123b4 365 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 366 }
Silvio Lucio Oliva 70:d20d30f59b1c 367
Silvio Lucio Oliva 70:d20d30f59b1c 368 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 369 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 370 @brief Returns the GattCharacteristic according to the handle provided
Silvio Lucio Oliva 70:d20d30f59b1c 371
Silvio Lucio Oliva 70:d20d30f59b1c 372 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 373 The handle of the GattCharacteristic
Silvio Lucio Oliva 70:d20d30f59b1c 374
Silvio Lucio Oliva 70:d20d30f59b1c 375 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 376
Silvio Lucio Oliva 70:d20d30f59b1c 377 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 378 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 379
Silvio Lucio Oliva 70:d20d30f59b1c 380 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 381
Silvio Lucio Oliva 70:d20d30f59b1c 382 @code
Silvio Lucio Oliva 70:d20d30f59b1c 383
Silvio Lucio Oliva 70:d20d30f59b1c 384 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 385 */
Silvio Lucio Oliva 70:d20d30f59b1c 386 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 387 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(uint16_t attrHandle)
Silvio Lucio Oliva 70:d20d30f59b1c 388 {
Silvio Lucio Oliva 70:d20d30f59b1c 389 GattCharacteristic *p_char = NULL;
Silvio Lucio Oliva 70:d20d30f59b1c 390 int i;
apalmieri 97:a89d28ad6092 391 uint16_t handle, handle_1;
Silvio Lucio Oliva 70:d20d30f59b1c 392
apalmieri 97:a89d28ad6092 393 DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received %d\n\r",attrHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 394 for(i=0; i<characteristicCount; i++)
Silvio Lucio Oliva 70:d20d30f59b1c 395 {
Silvio Lucio Oliva 70:d20d30f59b1c 396 handle = p_characteristics[i]->getValueAttribute().getHandle();
apalmieri 97:a89d28ad6092 397 DEBUG("handle(%d)=%d\n\r", i, handle);
Silvio Lucio Oliva 70:d20d30f59b1c 398 if(i==characteristicCount-1)//Last Characteristic check
Silvio Lucio Oliva 70:d20d30f59b1c 399 {
apalmieri 97:a89d28ad6092 400 if(attrHandle>=handle)
Silvio Lucio Oliva 70:d20d30f59b1c 401 {
Silvio Lucio Oliva 70:d20d30f59b1c 402 p_char = p_characteristics[i];
apalmieri 97:a89d28ad6092 403 DEBUG("Found Characteristic Properties 0x%x (handle=%d)\n\r",p_char->getProperties(), handle);
Silvio Lucio Oliva 70:d20d30f59b1c 404 break;
Silvio Lucio Oliva 70:d20d30f59b1c 405 }
Silvio Lucio Oliva 70:d20d30f59b1c 406 }
Silvio Lucio Oliva 70:d20d30f59b1c 407 else {
apalmieri 97:a89d28ad6092 408 handle_1 = p_characteristics[i+1]->getValueAttribute().getHandle();
Silvio Lucio Oliva 70:d20d30f59b1c 409 //Testing if attribute handle is between two Characteristic Handles
apalmieri 97:a89d28ad6092 410 if(attrHandle>=handle && attrHandle<handle_1)
Silvio Lucio Oliva 70:d20d30f59b1c 411 {
Silvio Lucio Oliva 70:d20d30f59b1c 412 p_char = p_characteristics[i];
apalmieri 97:a89d28ad6092 413 DEBUG("Found Characteristic Properties 0x%x (handle=%d handle_1=%d)\n\r",p_char->getProperties(), handle, handle_1);
Silvio Lucio Oliva 70:d20d30f59b1c 414 break;
Silvio Lucio Oliva 70:d20d30f59b1c 415 } else continue;
Silvio Lucio Oliva 70:d20d30f59b1c 416 }
Silvio Lucio Oliva 70:d20d30f59b1c 417 }
Silvio Lucio Oliva 70:d20d30f59b1c 418
Silvio Lucio Oliva 70:d20d30f59b1c 419 return p_char;
Silvio Lucio Oliva 70:d20d30f59b1c 420 }
Silvio Lucio Oliva 70:d20d30f59b1c 421
Andrea Palmieri 77:332b416123b4 422 void BlueNRGGattServer::HCIDataWrittenEvent(const GattWriteCallbackParams *params) {
Silvio Lucio Oliva 70:d20d30f59b1c 423 this->handleDataWrittenEvent(params);
Silvio Lucio Oliva 70:d20d30f59b1c 424 }
Silvio Lucio Oliva 70:d20d30f59b1c 425
Andrea Palmieri 77:332b416123b4 426 void BlueNRGGattServer::HCIDataReadEvent(const GattReadCallbackParams *params) {
Andrea Palmieri 73:142f3ded2091 427 DEBUG("Called HCIDataReadEvent\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 428 this->handleDataReadEvent(params);
Silvio Lucio Oliva 70:d20d30f59b1c 429 }
Silvio Lucio Oliva 70:d20d30f59b1c 430
Silvio Lucio Oliva 70:d20d30f59b1c 431 void BlueNRGGattServer::HCIEvent(GattServerEvents::gattEvent_e type, uint16_t charHandle) {
Silvio Lucio Oliva 70:d20d30f59b1c 432 this->handleEvent(type, charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 433 }
Silvio Lucio Oliva 70:d20d30f59b1c 434
Silvio Lucio Oliva 70:d20d30f59b1c 435 void BlueNRGGattServer::HCIDataSentEvent(unsigned count) {
Silvio Lucio Oliva 70:d20d30f59b1c 436 this->handleDataSentEvent(count);
Silvio Lucio Oliva 70:d20d30f59b1c 437 }
Silvio Lucio Oliva 70:d20d30f59b1c 438
Silvio Lucio Oliva 70:d20d30f59b1c 439
Silvio Lucio Oliva 70:d20d30f59b1c 440 ble_error_t BlueNRGGattServer::initializeGATTDatabase(void) {
Silvio Lucio Oliva 70:d20d30f59b1c 441 // <TODO>
Silvio Lucio Oliva 70:d20d30f59b1c 442 return (ble_error_t)0;
Silvio Lucio Oliva 70:d20d30f59b1c 443 }